4343static dispatch_semaphore_t vsyncSema = NULL ;
4444
4545@interface OpenGLView : NSOpenGLView
46+ #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000
4647@property (nonatomic , strong ) CADisplayLink *displayLink;
48+ #endif
4749@end
4850
51+ #if __MAC_OS_X_VERSION_MIN_REQUIRED < 140000
52+ static CVDisplayLinkRef cvDisplayLink = NULL ;
53+ static CVReturn DisplayLinkCallback (CVDisplayLinkRef displayLink,
54+ const CVTimeStamp *now,
55+ const CVTimeStamp *outputTime,
56+ CVOptionFlags flagsIn,
57+ CVOptionFlags *flagsOut,
58+ void *displayLinkContext);
59+ #endif
4960@implementation OpenGLView
5061- (BOOL )acceptsFirstResponder
5162{
@@ -54,10 +65,14 @@ - (BOOL)acceptsFirstResponder
5465- (void )createDisplayLink
5566{
5667 vsyncSema = dispatch_semaphore_create (0 );
57- self.displayLink = [self displayLinkWithTarget: self
58- selector: @selector (waitVSync )];
59- [self .displayLink addToRunLoop: [NSRunLoop currentRunLoop ]
60- forMode: NSDefaultRunLoopMode ];
68+ #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000
69+ self.displayLink = [self displayLinkWithTarget: self selector: @selector (waitVSync )];
70+ [self .displayLink addToRunLoop: [NSRunLoop currentRunLoop ] forMode: NSDefaultRunLoopMode ];
71+ #else
72+ CVDisplayLinkCreateWithActiveCGDisplays (&cvDisplayLink);
73+ CVDisplayLinkSetOutputCallback (cvDisplayLink, &DisplayLinkCallback, (__bridge void *)self);
74+ CVDisplayLinkStart (cvDisplayLink);
75+ #endif
6176}
6277
6378- (void )waitVSync
@@ -67,14 +82,33 @@ - (void)waitVSync
6782
6883- (void )dealloc
6984{
70- [self .displayLink invalidate ];
71- self.displayLink = nil ;
85+ #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000
86+ [self .displayLink invalidate ];
87+ self.displayLink = nil ;
88+ #else
89+ CVDisplayLinkStop (cvDisplayLink);
90+ CVDisplayLinkRelease (cvDisplayLink);
91+ #endif
7292 dispatch_release (vsyncSema);
7393 [super dealloc ];
7494}
7595
7696@end
7797
98+ #if __MAC_OS_X_VERSION_MIN_REQUIRED < 140000
99+ static CVReturn DisplayLinkCallback (CVDisplayLinkRef displayLink,
100+ const CVTimeStamp *now,
101+ const CVTimeStamp *outputTime,
102+ CVOptionFlags flagsIn,
103+ CVOptionFlags *flagsOut,
104+ void *displayLinkContext)
105+ {
106+ OpenGLView *self = (__bridge OpenGLView *)displayLinkContext;
107+ [self waitVSync ];
108+ return kCVReturnSuccess ;
109+ }
110+ #endif
111+
78112extern char **_NSGetProgname (void );
79113
80114static void create_menu_bar (void )
0 commit comments