| Summary: | Add support for loading menus from a nib/xib instead of building a hardcoded minimum set | ||
|---|---|---|---|
| Product: | SDL | Reporter: | Eric Shepherd (:sheppy) <sheppy> |
| Component: | video | Assignee: | Sam Lantinga <slouken> |
| Status: | RESOLVED FIXED | QA Contact: | Sam Lantinga <slouken> |
| Severity: | normal | ||
| Priority: | P2 | CC: | sezeroz |
| Version: | HG 2.1 | ||
| Hardware: | x86 | ||
| OS: | Mac OS X (All) | ||
| Attachments: | Patch to support optional MainMenu nib file | ||
This is a great change, thanks! https://hg.libsdl.org/SDL/rev/a72231930f12 loadNibNamed:owner:topLevelObjects is available on 10.8 and newer. There is an issue report here about an app failing to function on 10.7 and earlier: https://discourse.libsdl.org/t/28179 Maybe something like the following??
diff a/src/video/cocoa/SDL_cocoaevents.m b/src/video/cocoa/SDL_cocoaevents.m
--- a/src/video/cocoa/SDL_cocoaevents.m
+++ b/src/video/cocoa/SDL_cocoaevents.m
@@ -33,6 +33,9 @@
#ifndef kIOPMAssertPreventUserIdleDisplaySleep
#define kIOPMAssertPreventUserIdleDisplaySleep kIOPMAssertionTypePreventUserIdleDisplaySleep
#endif
+#ifndef NSAppKitVersionNumber10_8
+#define NSAppKitVersionNumber10_8 1187
+#endif
@interface SDLApplication : NSApplication
@@ -306,7 +309,10 @@ LoadMainMenuNibIfAvailable(void)
NSDictionary *infoDict;
NSString *mainNibFileName;
bool success = false;
-
+
+ if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_8) {
+ return false;
+ }
infoDict = [[NSBundle mainBundle] infoDictionary];
if (infoDict) {
mainNibFileName = [infoDict valueForKey:@"NSMainNibFile"];
Reopening for comment #2 PING? Applied https://hg.libsdl.org/SDL/rev/d04d0a1e9caf Re-closing as fixed. |
Created attachment 4071 [details] Patch to support optional MainMenu nib file Currently, SDL on Cocoa macOS creates a rudimentary menu bar programmatically if none is already present when the app is registered during setup. SDL could be much more easily and flexibly used on macOS if upon finding that no menus are currently in place, it first looked for the application's main menu nib or xib file and, if found, loaded that instead of programmatically building the menus. This would then let developers simply drop in a nib file with a menu bar defined in it and it would be installed and used automatically. Attached is a patch that does just this. It changes the SDL_cocoaevents.m file to: * In Cocoa_RegisterApp(), before calling CreateApplicationMenus(), it calls a new function, LoadMainMenuNibIfAvailable(), which attempts to load and install the main menu nib file, using the nib name fetched from the Info.plist file. If that succeeds, LoadMainMenuNibIfAvailable() returns true; otherwise false. * If LMMNIA() returns false, CreateApplicationMenus() is called to programmatically build the menus as before. * Otherwise, we're done, and using the menus from the nib/xib file! I made these changes to support a project I'm working on, and felt they were useful enough to be worth offering them for uplift. They should have zero impact on existing projects' behavior, but make Cocoa SDL development miles easier.