XQuartz: Added window_item_modifiers defaults item (and option to localization) to change the modifier keys used for the windows menu.

(cherry picked from commit e4110861d3)
(cherry picked from commit fcfc05482a)
This commit is contained in:
Jeremy Huddleston 2008-08-20 09:21:44 -07:00
parent bdc277c9b3
commit 6c5612c2e1
8 changed files with 77 additions and 45 deletions

View File

@ -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"

View File

@ -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];

View File

@ -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];

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
/*

View File

@ -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);