#if defined(OS_MACOS) #include #include #include #include #include #include #include #include #include #define GLFW_EXPOSE_NATIVE_COCOA #include #include #import #import void errorMessageMacos(const char *cMessage) { CFStringRef strMessage = CFStringCreateWithCString(NULL, cMessage, kCFStringEncodingUTF8); CFUserNotificationDisplayAlert(0, kCFUserNotificationStopAlertLevel, NULL, NULL, NULL, strMessage, NULL, NULL, NULL, NULL, NULL); } void openFile(const char *path); void registerFont(const char *fontName, const char *fontPath); void openWebpageMacos(const char *url) { CFURLRef urlRef = CFURLCreateWithBytes(NULL, (uint8_t*)(url), strlen(url), kCFStringEncodingASCII, NULL); LSOpenCFURLRef(urlRef, NULL); CFRelease(urlRef); } bool isMacosSystemDarkModeEnabled(void) { NSString * appleInterfaceStyle = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"]; if (appleInterfaceStyle && [appleInterfaceStyle length] > 0) { return [[appleInterfaceStyle lowercaseString] containsString:@"dark"]; } else { return false; } } float getBackingScaleFactor(void) { return [[NSScreen mainScreen] backingScaleFactor]; } void setupMacosWindowStyle(GLFWwindow *window, bool borderlessWindowMode) { NSWindow* cocoaWindow = glfwGetCocoaWindow(window); cocoaWindow.titleVisibility = NSWindowTitleHidden; if (borderlessWindowMode) { cocoaWindow.titlebarAppearsTransparent = YES; cocoaWindow.styleMask |= NSWindowStyleMaskFullSizeContentView; [cocoaWindow setOpaque:NO]; [cocoaWindow setHasShadow:YES]; [cocoaWindow setBackgroundColor:[NSColor colorWithWhite: 0 alpha: 0.001f]]; } } bool isMacosFullScreenModeEnabled(GLFWwindow *window) { NSWindow* cocoaWindow = glfwGetCocoaWindow(window); return (cocoaWindow.styleMask & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen; } void enumerateFontsMacos(void) { CFArrayRef fontDescriptors = CTFontManagerCopyAvailableFontFamilyNames(); CFIndex count = CFArrayGetCount(fontDescriptors); for (CFIndex i = 0; i < count; i++) { CFStringRef fontName = (CFStringRef)CFArrayGetValueAtIndex(fontDescriptors, i); // Get font path CFDictionaryRef attributes = (__bridge CFDictionaryRef)@{ (__bridge NSString *)kCTFontNameAttribute : (__bridge NSString *)fontName }; CTFontDescriptorRef descriptor = CTFontDescriptorCreateWithAttributes(attributes); CFURLRef fontURL = CTFontDescriptorCopyAttribute(descriptor, kCTFontURLAttribute); CFStringRef fontPath = CFURLCopyFileSystemPath(fontURL, kCFURLPOSIXPathStyle); registerFont([(__bridge NSString *)fontName UTF8String], [(__bridge NSString *)fontPath UTF8String]); CFRelease(descriptor); CFRelease(fontURL); } CFRelease(fontDescriptors); } void macosHandleTitlebarDoubleClickGesture(GLFWwindow *window) { NSWindow* cocoaWindow = glfwGetCocoaWindow(window); // Consult user preferences: "System Settings -> Desktop & Dock -> Double-click a window's title bar to" NSString* action = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleActionOnDoubleClick"]; if (action == nil || [action isEqualToString:@"None"]) { // Nothing to do } else if ([action isEqualToString:@"Minimize"]) { if ([cocoaWindow isMiniaturizable]) { [cocoaWindow miniaturize:nil]; } } else if ([action isEqualToString:@"Maximize"]) { // `[NSWindow zoom:_ sender]` takes over pumping the main runloop for the duration of the resize, // and would interfere with our renderer's frame logic. Schedule it for the next frame CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, ^{ if ([cocoaWindow isZoomable]) { [cocoaWindow zoom:nil]; } }); } } bool macosIsWindowBeingResizedByUser(GLFWwindow *window) { NSWindow* cocoaWindow = glfwGetCocoaWindow(window); return cocoaWindow.inLiveResize; } @interface HexDocument : NSDocument @end @implementation HexDocument - (BOOL) readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError { NSString* urlString = [url absoluteString]; const char* utf8String = [urlString UTF8String]; const char *prefix = "file://"; if (strncmp(utf8String, prefix, strlen(prefix)) == 0) utf8String += strlen(prefix); openFile(utf8String); return YES; } @end #endif