diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Document.xib b/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Document.xib
index 7b26bd57f..8effec6d7 100644
--- a/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Document.xib
+++ b/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Document.xib
@@ -17,9 +17,20 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OSBindings/Mac/Clock Signal/OpenGLView.m b/OSBindings/Mac/Clock Signal/OpenGLView.m
index e4475dee1..023353c6f 100644
--- a/OSBindings/Mac/Clock Signal/OpenGLView.m
+++ b/OSBindings/Mac/Clock Signal/OpenGLView.m
@@ -13,15 +13,38 @@
CVDisplayLinkRef displayLink;
}
-- (instancetype)initWithCoder:(nonnull NSCoder *)coder
+- (void)prepareOpenGL
{
- self = [super initWithCoder:coder];
+ // Synchronize buffer swaps with vertical refresh rate
+ GLint swapInt = 1;
+ [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
- if(self)
- {
- }
+ // Create a display link capable of being used with all active displays
+ CVDisplayLinkCreateWithActiveCGDisplays(&displayLink);
+
+ // Set the renderer output callback function
+ CVDisplayLinkSetOutputCallback(displayLink, &MyDisplayLinkCallback, (__bridge void * __nullable)(self));
+
+ // Set the display link for the current renderer
+ CGLContextObj cglContext = [[self openGLContext] CGLContextObj];
+ CGLPixelFormatObj cglPixelFormat = [[self pixelFormat] CGLPixelFormatObj];
+ CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(displayLink, cglContext, cglPixelFormat);
+
+ // Activate the display link
+ CVDisplayLinkStart(displayLink);
+}
- return self;
+// This is the renderer output callback function
+static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext)
+{
+ [(__bridge CSOpenGLView *)displayLinkContext setNeedsDisplay:YES];
+ return kCVReturnSuccess;
+}
+
+- (void)dealloc
+{
+ // Release the display link
+ CVDisplayLinkRelease(displayLink);
}
@end