// 19 may 2017 #import "uipriv_darwin.h" // functions and constants FROM THE FUTURE! // note: for constants, dlsym() returns the address of the constant itself, as if we had done &constantName // added in OS X 10.10; we need 10.8 CFStringRef *uiprivFUTURE_kCTFontOpenTypeFeatureTag = NULL; CFStringRef *uiprivFUTURE_kCTFontOpenTypeFeatureValue = NULL; // added in OS X 10.12; we need 10.8 CFStringRef *uiprivFUTURE_kCTBackgroundColorAttributeName = NULL; // note that we treat any error as "the symbols aren't there" (and don't care if dlclose() failed) void uiprivLoadFutures(void) { void *handle; // dlsym() walks the dependency chain, so opening the current process should be sufficient handle = dlopen(NULL, RTLD_LAZY); if (handle == NULL) return; #define GET(var, fn) *((void **) (&var)) = dlsym(handle, #fn) GET(uiprivFUTURE_kCTFontOpenTypeFeatureTag, kCTFontOpenTypeFeatureTag); GET(uiprivFUTURE_kCTFontOpenTypeFeatureValue, kCTFontOpenTypeFeatureValue); GET(uiprivFUTURE_kCTBackgroundColorAttributeName, kCTBackgroundColorAttributeName); dlclose(handle); } // wrappers for methods that exist in the future that we can check for with respondsToSelector: // keep them in one place for convenience // apparently only added in 10.9; we need 10.8 void uiprivFUTURE_NSLayoutConstraint_setIdentifier(NSLayoutConstraint *constraint, NSString *identifier) { id cid = (id) constraint; if ([constraint respondsToSelector:@selector(setIdentifier:)]) [cid setIdentifier:identifier]; } // added in 10.11; we need 10.8 // return whether this was done because we recreate its effects if not (see winmoveresize.m) BOOL uiprivFUTURE_NSWindow_performWindowDragWithEvent(NSWindow *w, NSEvent *initialEvent) { id cw = (id) w; if ([w respondsToSelector:@selector(performWindowDragWithEvent:)]) { [cw performWindowDragWithEvent:initialEvent]; return YES; } return NO; }