diff --git a/hw/xquartz/X11Application.h b/hw/xquartz/X11Application.h index 22a8728a8..5d040de26 100644 --- a/hw/xquartz/X11Application.h +++ b/hw/xquartz/X11Application.h @@ -92,6 +92,7 @@ extern int quartzHasRoot, quartzEnableRootless; #define PREFS_FAKE_BUTTON2 "fake_button2" #define PREFS_FAKE_BUTTON3 "fake_button3" #define PREFS_APPKIT_MODIFIERS "appkit_modifiers" +#define PREFS_WINDOW_ITEM_MODIFIERS "window_item_modifiers" #define PREFS_ROOTLESS "rootless" #define PREFS_FULLSCREEN_HOTKEYS "fullscreen_hotkeys" #define PREFS_SWAP_ALT_META "swap_alt_meta" diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index a5d412259..eeffd8c18 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -608,6 +608,7 @@ static NSMutableArray * cfarray_to_nsarray (CFArrayRef in) { - (void) read_defaults { + NSString *nsstr; const char *tem; quartzUseSysBeep = [self prefs_get_boolean:@PREFS_SYSBEEP @@ -631,13 +632,26 @@ static NSMutableArray * cfarray_to_nsarray (CFArrayRef in) { fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL]; fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL]; - if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2); - if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3); + if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2, TRUE); + if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3, TRUE); } tem = [self prefs_get_string:@PREFS_APPKIT_MODIFIERS default:NULL]; - if (tem != NULL) darwinAppKitModMask = DarwinParseModifierList(tem); + if (tem != NULL) darwinAppKitModMask = DarwinParseModifierList(tem, TRUE); + tem = [self prefs_get_string:@PREFS_WINDOW_ITEM_MODIFIERS default:NULL]; + if (tem != NULL) { + windowItemModMask = DarwinParseModifierList(tem, FALSE); + } else { + nsstr = NSLocalizedString (@"window item modifiers", @"window item modifiers"); + if(nsstr != NULL) { + tem = [nsstr UTF8String]; + if((tem != NULL) && strcmp(tem, "window item modifiers")) { + windowItemModMask = DarwinParseModifierList(tem, FALSE); + } + } + } + X11EnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS default:X11EnableKeyEquivalents]; diff --git a/hw/xquartz/X11Controller.m b/hw/xquartz/X11Controller.m index 107d8ee9b..682a6922a 100644 --- a/hw/xquartz/X11Controller.m +++ b/hw/xquartz/X11Controller.m @@ -129,7 +129,7 @@ NSMenu *menu; NSMenuItem *item; int first, count, i; - + menu = [window_separator menu]; first = [menu indexOfItem:window_separator] + 1; count = [list count]; @@ -142,14 +142,18 @@ item = (NSMenuItem *) [menu addItemWithTitle:name action:@selector (item_selected:) keyEquivalent:shortcut]; + + [item setKeyEquivalentModifierMask:(NSUInteger) windowItemModMask]; [item setTarget:self]; [item setTag:i]; [item setEnabled:YES]; - + item = (NSMenuItem *) [dock_menu insertItemWithTitle:name action:@selector (item_selected:) keyEquivalent:shortcut atIndex:i]; + + [item setKeyEquivalentModifierMask:(NSUInteger) windowItemModMask]; [item setTarget:self]; [item setTag:i]; [item setEnabled:YES]; diff --git a/hw/xquartz/bundle/Resources/English.lproj/Localizable.strings b/hw/xquartz/bundle/Resources/English.lproj/Localizable.strings index 63a135255..439bb6bcb 100644 Binary files a/hw/xquartz/bundle/Resources/English.lproj/Localizable.strings and b/hw/xquartz/bundle/Resources/English.lproj/Localizable.strings differ diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c index 9e322d97c..8107beb9f 100644 --- a/hw/xquartz/darwin.c +++ b/hw/xquartz/darwin.c @@ -103,7 +103,7 @@ int darwinDesiredRefresh = -1; char *darwinKeymapFile = "USA.keymapping"; int darwinSyncKeymap = FALSE; -// modifier masks for faking mouse buttons +// modifier masks for faking mouse buttons - ANY of these bits trigger it (not all) #ifdef NX_DEVICELCMDKEYMASK int darwinFakeMouse2Mask = NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK; int darwinFakeMouse3Mask = NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK; @@ -113,7 +113,10 @@ int darwinFakeMouse3Mask = NX_COMMANDMASK; #endif // Modifier mask for overriding event delivery to appkit (might be useful to set this to rcommand for input menu -int darwinAppKitModMask = 0; +int darwinAppKitModMask = 0; // Any of these bits + +// Modifier mask for items in the Window menu (0 and -1 cause shortcuts to be disabled) +int windowItemModMask = NX_COMMANDMASK; // devices DeviceIntPtr darwinPointer = NULL; @@ -491,8 +494,7 @@ static char * DarwinFindLibraryFile( * DarwinParseModifierList * Parse a list of modifier names and return a corresponding modifier mask */ -int DarwinParseModifierList( - const char *constmodifiers) // string containing list of modifier names +int DarwinParseModifierList(const char *constmodifiers, int separatelr) { int result = 0; @@ -504,7 +506,7 @@ int DarwinParseModifierList( while (p) { modifier = strsep(&p, " ,+&|/"); // allow lots of separators - nxkey = DarwinModifierStringToNXMask(modifier); + nxkey = DarwinModifierStringToNXMask(modifier, separatelr); if(nxkey) result |= nxkey; else @@ -725,7 +727,7 @@ int ddxProcessArgument( int argc, char *argv[], int i ) if (!strcasecmp(argv[i+1], "none") || !strcmp(argv[i+1], "")) darwinFakeMouse2Mask = 0; else - darwinFakeMouse2Mask = DarwinParseModifierList(argv[i+1]); + darwinFakeMouse2Mask = DarwinParseModifierList(argv[i+1], 1); ErrorF("Modifier mask to fake mouse button 2 = 0x%x\n", darwinFakeMouse2Mask); return 2; @@ -738,7 +740,7 @@ int ddxProcessArgument( int argc, char *argv[], int i ) if (!strcasecmp(argv[i+1], "none") || !strcmp(argv[i+1], "")) darwinFakeMouse3Mask = 0; else - darwinFakeMouse3Mask = DarwinParseModifierList(argv[i+1]); + darwinFakeMouse3Mask = DarwinParseModifierList(argv[i+1], 1); ErrorF("Modifier mask to fake mouse button 3 = 0x%x\n", darwinFakeMouse3Mask); return 2; diff --git a/hw/xquartz/darwin.h b/hw/xquartz/darwin.h index c570dad0a..fd1c6d52b 100644 --- a/hw/xquartz/darwin.h +++ b/hw/xquartz/darwin.h @@ -55,7 +55,7 @@ typedef struct { // From darwin.c void DarwinPrintBanner(void); -int DarwinParseModifierList(const char *constmodifiers); +int DarwinParseModifierList(const char *constmodifiers, int separatelr); void DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo); void xf86SetRootClip (ScreenPtr pScreen, int enable); @@ -80,6 +80,7 @@ extern int darwinFakeButtons; extern int darwinFakeMouse2Mask; extern int darwinFakeMouse3Mask; extern int darwinAppKitModMask; +extern int windowItemModMask; extern char *darwinKeymapFile; extern int darwinSyncKeymap; extern unsigned int darwinDesiredWidth, darwinDesiredHeight; diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c index a7f924882..629d15d25 100644 --- a/hw/xquartz/quartzKeyboard.c +++ b/hw/xquartz/quartzKeyboard.c @@ -1045,39 +1045,49 @@ int DarwinModifierNXKeyToNXMask(int key) { * DarwinModifierStringToNXMask * Returns 0 if string is not a known modifier. */ -int DarwinModifierStringToNXMask(const char *str) { +int DarwinModifierStringToNXMask(const char *str, int separatelr) { #ifdef NX_DEVICELSHIFTKEYMASK - if (!strcasecmp(str, "shift")) return NX_DEVICELSHIFTKEYMASK | NX_DEVICERSHIFTKEYMASK; - else if (!strcasecmp(str, "control")) return NX_DEVICELCTLKEYMASK | NX_DEVICERCTLKEYMASK; - else if (!strcasecmp(str, "option")) return NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK; - else if (!strcasecmp(str, "command")) return NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK; - else if (!strcasecmp(str, "lshift")) return NX_DEVICELSHIFTKEYMASK; - else if (!strcasecmp(str, "rshift")) return NX_DEVICERSHIFTKEYMASK; - else if (!strcasecmp(str, "lcontrol")) return NX_DEVICELCTLKEYMASK; - else if (!strcasecmp(str, "rcontrol")) return NX_DEVICERCTLKEYMASK; - else if (!strcasecmp(str, "loption")) return NX_DEVICELALTKEYMASK; - else if (!strcasecmp(str, "roption")) return NX_DEVICERALTKEYMASK; - else if (!strcasecmp(str, "lcommand")) return NX_DEVICELCMDKEYMASK; - else if (!strcasecmp(str, "rcommand")) return NX_DEVICERCMDKEYMASK; -#else - if (!strcasecmp(str, "shift")) return NX_SHIFTMASK; - else if (!strcasecmp(str, "control")) return NX_CONTROLMASK; - else if (!strcasecmp(str, "option")) return NX_ALTERNATEMASK; - else if (!strcasecmp(str, "command")) return NX_COMMANDMASK; - else if (!strcasecmp(str, "lshift")) return NX_SHIFTMASK; - else if (!strcasecmp(str, "rshift")) return NX_SHIFTMASK; - else if (!strcasecmp(str, "lcontrol")) return NX_CONTROLMASK; - else if (!strcasecmp(str, "rcontrol")) return NX_CONTROLMASK; - else if (!strcasecmp(str, "loption")) return NX_ALTERNATEMASK; - else if (!strcasecmp(str, "roption")) return NX_ALTERNATEMASK; - else if (!strcasecmp(str, "lcommand")) return NX_COMMANDMASK; - else if (!strcasecmp(str, "rcommand")) return NX_COMMANDMASK; + if(separatelr) { + if (!strcasecmp(str, "shift")) return NX_DEVICELSHIFTKEYMASK | NX_DEVICERSHIFTKEYMASK; + if (!strcasecmp(str, "control")) return NX_DEVICELCTLKEYMASK | NX_DEVICERCTLKEYMASK; + if (!strcasecmp(str, "option")) return NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK; + if (!strcasecmp(str, "alt")) return NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK; + if (!strcasecmp(str, "command")) return NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK; + if (!strcasecmp(str, "lshift")) return NX_DEVICELSHIFTKEYMASK; + if (!strcasecmp(str, "rshift")) return NX_DEVICERSHIFTKEYMASK; + if (!strcasecmp(str, "lcontrol")) return NX_DEVICELCTLKEYMASK; + if (!strcasecmp(str, "rcontrol")) return NX_DEVICERCTLKEYMASK; + if (!strcasecmp(str, "loption")) return NX_DEVICELALTKEYMASK; + if (!strcasecmp(str, "roption")) return NX_DEVICERALTKEYMASK; + if (!strcasecmp(str, "lalt")) return NX_DEVICELALTKEYMASK; + if (!strcasecmp(str, "ralt")) return NX_DEVICERALTKEYMASK; + if (!strcasecmp(str, "lcommand")) return NX_DEVICELCMDKEYMASK; + if (!strcasecmp(str, "rcommand")) return NX_DEVICERCMDKEYMASK; + } else { #endif - else if (!strcasecmp(str, "lock")) return NX_ALPHASHIFTMASK; - else if (!strcasecmp(str, "fn")) return NX_SECONDARYFNMASK; - else if (!strcasecmp(str, "help")) return NX_HELPMASK; - else if (!strcasecmp(str, "numlock")) return NX_NUMERICPADMASK; - else return 0; + if (!strcasecmp(str, "shift")) return NX_SHIFTMASK; + if (!strcasecmp(str, "control")) return NX_CONTROLMASK; + if (!strcasecmp(str, "option")) return NX_ALTERNATEMASK; + if (!strcasecmp(str, "alt")) return NX_ALTERNATEMASK; + if (!strcasecmp(str, "command")) return NX_COMMANDMASK; + if (!strcasecmp(str, "lshift")) return NX_SHIFTMASK; + if (!strcasecmp(str, "rshift")) return NX_SHIFTMASK; + if (!strcasecmp(str, "lcontrol")) return NX_CONTROLMASK; + if (!strcasecmp(str, "rcontrol")) return NX_CONTROLMASK; + if (!strcasecmp(str, "loption")) return NX_ALTERNATEMASK; + if (!strcasecmp(str, "roption")) return NX_ALTERNATEMASK; + if (!strcasecmp(str, "lalt")) return NX_ALTERNATEMASK; + if (!strcasecmp(str, "ralt")) return NX_ALTERNATEMASK; + if (!strcasecmp(str, "lcommand")) return NX_COMMANDMASK; + if (!strcasecmp(str, "rcommand")) return NX_COMMANDMASK; +#ifdef NX_DEVICELSHIFTKEYMASK + } +#endif + if (!strcasecmp(str, "lock")) return NX_ALPHASHIFTMASK; + if (!strcasecmp(str, "fn")) return NX_SECONDARYFNMASK; + if (!strcasecmp(str, "help")) return NX_HELPMASK; + if (!strcasecmp(str, "numlock")) return NX_NUMERICPADMASK; + return 0; } /* diff --git a/hw/xquartz/quartzKeyboard.h b/hw/xquartz/quartzKeyboard.h index 3a892ba7b..d62a79d8e 100644 --- a/hw/xquartz/quartzKeyboard.h +++ b/hw/xquartz/quartzKeyboard.h @@ -57,7 +57,7 @@ int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide); int DarwinModifierNXKeyToNXKeycode(int key, int side); int DarwinModifierNXKeyToNXMask(int key); int DarwinModifierNXMaskToNXKey(int mask); -int DarwinModifierStringToNXMask(const char *string); +int DarwinModifierStringToNXMask(const char *string, int separatelr); /* Provided for darwin.c */ void DarwinKeyboardInit(DeviceIntPtr pDev);