xserver: Branch 'master' - 6 commits

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Wed Aug 20 10:00:46 PDT 2008


 hw/xquartz/X11Application.h                                   |    2 
 hw/xquartz/X11Application.m                                   |  319 +++++-----
 hw/xquartz/X11Controller.m                                    |   13 
 hw/xquartz/bundle/Info.plist                                  |    6 
 hw/xquartz/bundle/Resources/English.lproj/Localizable.strings |binary
 hw/xquartz/darwin.c                                           |   28 
 hw/xquartz/darwin.h                                           |    4 
 hw/xquartz/darwinEvents.c                                     |  134 +---
 hw/xquartz/quartzKeyboard.c                                   |  110 +--
 hw/xquartz/quartzKeyboard.h                                   |    2 
 10 files changed, 329 insertions(+), 289 deletions(-)

New commits:
commit f1f44940f10b0209946ec0f08104a372d7d945a0
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Aug 20 09:50:54 2008 -0700

    XQuartz: Support windowItemModMask=0 or -1 to disable window shortcuts.
    (cherry picked from commit 81187364e512606a6aebb95ab2967d9d420f57f2)
    (cherry picked from commit f2ec79e4a159dec6481691e4dd615db01770dd7a)

diff --git a/hw/xquartz/X11Controller.m b/hw/xquartz/X11Controller.m
index 682a692..19a4d2b 100644
--- a/hw/xquartz/X11Controller.m
+++ b/hw/xquartz/X11Controller.m
@@ -139,7 +139,10 @@
 		
       name = [[list objectAtIndex:i] objectAtIndex:0];
       shortcut = [[list objectAtIndex:i] objectAtIndex:1];
-		
+        
+      if(windowItemModMask == 0 || windowItemModMask == -1)
+          shortcut = @"";
+
       item = (NSMenuItem *) [menu addItemWithTitle:name action:@selector
 				  (item_selected:) keyEquivalent:shortcut];
 
commit 6c5612c2e1df1e89388ffff97251f5328558f8e8
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Aug 20 09:21:44 2008 -0700

    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 e4110861d307a55d9032cb83cf024ec1f294e8d7)
    (cherry picked from commit fcfc05482a88696cb713c7a2ddfcf935ae8378a6)

diff --git a/hw/xquartz/X11Application.h b/hw/xquartz/X11Application.h
index 22a8728..5d040de 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 a5d4122..eeffd8c 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 107d8ee..682a692 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 63a1352..439bb6b 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 9e322d9..8107beb 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 c570dad..fd1c6d5 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 a7f9248..629d15d 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
+        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
-    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, "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 3a892ba..d62a79d 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);
commit bdc277c9b3dc6b3b95f74b20a49ce163c5fae980
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Aug 20 09:58:48 2008 -0700

    XQuartz: Just cleaned up formatting of event processing code... no "meat" changed...
    (cherry picked from commit 745bc8ab387d6794f47d8b9dca33b4c81f6dd39c)
    (cherry picked from commit a28a2be52478a1557a363140f7bd70ececf144dc)

diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index 0d0fae4..a5d4122 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -77,7 +77,7 @@ struct message_struct {
 
 static mach_port_t _port;
 
-static void send_nsevent (NSEventType type, NSEvent *e);
+static void send_nsevent(NSEvent *e);
 
 /* Quartz mode initialization routine. This is often dynamically loaded
    but is statically linked into this X server. */
@@ -192,113 +192,117 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
 }
 
 - (void) sendEvent:(NSEvent *)e {
- 	NSEventType type;
-	OSX_BOOL for_appkit, for_x;
-
-	type = [e type];
-
-	/* By default pass down the responder chain and to X. */
-	for_appkit = YES;
-	for_x = YES;
+    NSEventType type;
+    OSX_BOOL for_appkit, for_x;
+    
+    type = [e type];
+    
+    /* By default pass down the responder chain and to X. */
+    for_appkit = YES;
+    for_x = YES;
     
-    if(darwinAppKitModMask & [e modifierFlags]) {
-        [super sendEvent:e];
-        return;
+    switch ([e type]) {
+        case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown:
+        case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp:
+            if ([e window] != nil) {
+                /* Pointer event has an (AppKit) window. Probably something for the kit. */
+                for_x = NO;
+                if (_x_active) [self activateX:NO];
+            } else if ([self modalWindow] == nil) {
+                /* Must be an X window. Tell appkit it doesn't have focus. */
+                for_appkit = NO;
+                
+                if ([self isActive]) {
+                    [self deactivate];
+                    if (!_x_active && quartzProcs->IsX11Window([e window],
+                                                               [e windowNumber]))
+                        [self activateX:YES];
+                }
+            }
+            break;
+            
+        case NSKeyDown: case NSKeyUp:
+            if(darwinAppKitModMask & [e modifierFlags]) {
+                /* Override to force sending to Appkit */
+                for_x = NO;
+            } else if (_x_active) {
+                static int swallow_up;
+                
+                /* No kit window is focused, so send it to X. */
+                for_appkit = NO;
+                if ([e type] == NSKeyDown) {
+                    /* Before that though, see if there are any global
+                     shortcuts bound to it. */
+                    
+                    if (X11EnableKeyEquivalents
+                        && [[self mainMenu] performKeyEquivalent:e]) {
+                        swallow_up = [e keyCode];
+                        for_x = NO;
+                    } else if (!quartzEnableRootless
+                               && ([e modifierFlags] & ALL_KEY_MASKS)
+                               == (NSCommandKeyMask | NSAlternateKeyMask)
+                               && ([e keyCode] == 0 /*a*/
+                                   || [e keyCode] == 53 /*Esc*/)) {
+                        swallow_up = 0;
+                        for_x = NO;
+#ifdef DARWIN_DDX_MISSING
+                        DarwinSendDDXEvent(kXquartzToggleFullscreen, 0);
+#endif
+                    }
+                } else {
+                    /* If we saw a key equivalent on the down, don't pass
+                     the up through to X. */
+                    
+                    if (swallow_up != 0 && [e keyCode] == swallow_up) {
+                        swallow_up = 0;
+                        for_x = NO;
+                    }
+                }
+            } else {
+                for_x = NO;
+            }
+            break;
+            
+        case NSFlagsChanged:
+            /* Don't tell X11 about modifiers changing while it's not active */
+            if (!_x_active)
+                for_x = NO;
+            break;
+            
+        case NSAppKitDefined:
+            switch ([e subtype]) {
+                case NSApplicationActivatedEventType:
+                    for_x = NO;
+                    if ([self modalWindow] == nil) {
+                        for_appkit = NO;
+                        
+                        /* FIXME: hack to avoid having to pass the event to appkit,
+                         which would cause it to raise one of its windows. */
+                        _appFlags._active = YES;
+                        
+                        [self activateX:YES];
+                        if ([e data2] & 0x10) 
+                            DarwinSendDDXEvent(kXquartzBringAllToFront, 0);
+                    }
+                    break;
+                    
+                case 18: /* ApplicationDidReactivate */
+                    if (quartzHasRoot) for_appkit = NO;
+                    break;
+                    
+                case NSApplicationDeactivatedEventType:
+                    for_x = NO;
+                    [self activateX:NO];
+                    break;
+            }
+            break;
+            
+        default: break; /* for gcc */
     }
-  
-	switch (type) {
-		case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown:
-		case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp:
-		if ([e window] != nil) {
-			/* Pointer event has an (AppKit) window. Probably something for the kit. */
-			for_x = NO;
-			if (_x_active) [self activateX:NO];
-		} else if ([self modalWindow] == nil) {
-			/* Must be an X window. Tell appkit it doesn't have focus. */
-			for_appkit = NO;
-
-			if ([self isActive]) {
-				[self deactivate];
-				if (!_x_active && quartzProcs->IsX11Window([e window],
-					[e windowNumber]))
-					[self activateX:YES];
-			}
-		}
-		break;
-
-		case NSKeyDown: case NSKeyUp:
-		if (_x_active) {
-			static int swallow_up;
-
-			/* No kit window is focused, so send it to X. */
-			for_appkit = NO;
-			if (type == NSKeyDown) {
-				/* Before that though, see if there are any global
-				shortcuts bound to it. */
-
-					if (X11EnableKeyEquivalents
-						&& [[self mainMenu] performKeyEquivalent:e]) {
-							swallow_up = [e keyCode];
-							for_x = NO;
-					} else if (!quartzEnableRootless
-						&& ([e modifierFlags] & ALL_KEY_MASKS)
-						== (NSCommandKeyMask | NSAlternateKeyMask)
-						&& ([e keyCode] == 0 /*a*/
-							|| [e keyCode] == 53 /*Esc*/)) {
-						swallow_up = 0;
-						for_x = NO;
-					}
-			} else {
-			/* If we saw a key equivalent on the down, don't pass
-	   			the up through to X. */
-
-				if (swallow_up != 0 && [e keyCode] == swallow_up) {
-					swallow_up = 0;
-					for_x = NO;
-				}
-			}
-    		} else for_x = NO;
-    	break;
-
-		case NSFlagsChanged:
-			/* For the l33t X users who remap modifier keys to normal keysyms. */
-			if (!_x_active) for_x = NO;
-		break;
-
-		case NSAppKitDefined:
-		switch ([e subtype]) {
-			case NSApplicationActivatedEventType:
-      		for_x = NO;
-			if ([self modalWindow] == nil) {
-				for_appkit = NO;
-
-				/* FIXME: hack to avoid having to pass the event to appkit,
-	   			which would cause it to raise one of its windows. */
-				_appFlags._active = YES;
-
-				[self activateX:YES];
-				if ([e data2] & 0x10) 
-                    DarwinSendDDXEvent(kXquartzBringAllToFront, 0);
-			}
-			break;
-
-			case 18: /* ApplicationDidReactivate */
-				if (quartzHasRoot) for_appkit = NO;
-			break;
-
-			case NSApplicationDeactivatedEventType:
-				for_x = NO;
-				[self activateX:NO];
-			break;
-		}
-	break;
- 
-	default: break; /* for gcc */
-	}
-
-	if (for_appkit) [super sendEvent:e];
-
-	if (for_x) send_nsevent (type, e);
+    
+    if (for_appkit) [super sendEvent:e];
+    
+    if (for_x) send_nsevent(e);
 }
 
 - (void) set_window_menu:(NSArray *)list {
@@ -843,7 +847,7 @@ convert_flags (unsigned int nsflags) {
 
 extern int darwin_modifier_flags; // darwinEvents.c
 
-static void send_nsevent (NSEventType type, NSEvent *e) {
+static void send_nsevent(NSEvent *e) {
 	NSRect screen;
 	NSPoint location;
 	NSWindow *window;
@@ -859,7 +863,7 @@ static void send_nsevent (NSEventType type, NSEvent *e) {
 		NSRect frame = [window frame];
 		pointer_x = location.x + frame.origin.x;
 		pointer_y = (((screen.origin.y + screen.size.height)
-			- location.y) - frame.origin.y);
+                      - location.y) - frame.origin.y);
 	} else {
 		pointer_x = location.x;
 		pointer_y = (screen.origin.y + screen.size.height) - location.y;
@@ -875,8 +879,8 @@ static void send_nsevent (NSEventType type, NSEvent *e) {
      */
     if(darwin_modifier_flags != [e modifierFlags])
         DarwinUpdateModKeys([e modifierFlags]);
-    
-	switch (type) {
+
+	switch ([e type]) {
 		case NSMouseMoved:        ev_button=0; ev_type=MotionNotify;  goto check_subtype;
 		case NSLeftMouseDown:     ev_button=1; ev_type=ButtonPress;   goto check_subtype;
 		case NSOtherMouseDown:    ev_button=2; ev_type=ButtonPress;   goto check_subtype;
@@ -887,8 +891,8 @@ static void send_nsevent (NSEventType type, NSEvent *e) {
 		case NSLeftMouseDragged:  ev_button=1; ev_type=MotionNotify;  goto check_subtype;
 		case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify;  goto check_subtype;
 		case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify;  goto check_subtype;
-		
-check_subtype:
+
+        check_subtype:
 			if ([e subtype] != NSTabletPointEventSubtype) 
                 goto handle_mouse;
 			// fall through to get tablet data
@@ -897,27 +901,25 @@ check_subtype:
             pressure = [e pressure];
 			tilt_x   = [e tilt].x;
 			tilt_y   = [e tilt].y; 
-            goto handle_mouse;
 			// fall through to normal mouse handling
-
-handle_mouse:
-		DarwinSendPointerEvents(ev_type, ev_button, pointer_x, pointer_y,
-			pressure, tilt_x, tilt_y);
-		break;
+        handle_mouse:
+            DarwinSendPointerEvents(ev_type, ev_button, pointer_x, pointer_y,
+                                    pressure, tilt_x, tilt_y);
+            break;
 
 		case NSTabletProximity:
 			DarwinSendProximityEvents([e isEnteringProximity]?ProximityIn:ProximityOut,
-				pointer_x, pointer_y);
-		break;
+                                      pointer_x, pointer_y);
+            break;
 
 		case NSScrollWheel:
 			DarwinSendScrollEvents([e deltaX], [e deltaY], pointer_x, pointer_y,
-				pressure, tilt_x, tilt_y);
-		break;
+                                   pressure, tilt_x, tilt_y);
+            break;
 
 		case NSKeyDown: case NSKeyUp:
-            DarwinSendKeyboardEvents((type == NSKeyDown)?KeyPress:KeyRelease, [e keyCode]);
-		break;
+            DarwinSendKeyboardEvents(([e type] == NSKeyDown) ? KeyPress : KeyRelease, [e keyCode]);
+            break;
 
         default: break; /* for gcc */
 	}	
commit ed42108920cc695b96ed57bf9dcfea1470e74669
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Aug 19 02:02:11 2008 -0700

    XQuartz: Added appkit_modifiers defaults option which users can set to 'rcommand' to get access to the input menu with right command
    (cherry picked from commit 02af74d7a5a7225f408915254c40856159dc7f19)
    (cherry picked from commit 2da32894dff8340f6ca7c980277fca7ec835a193)

diff --git a/hw/xquartz/X11Application.h b/hw/xquartz/X11Application.h
index 8e7fed2..22a8728 100644
--- a/hw/xquartz/X11Application.h
+++ b/hw/xquartz/X11Application.h
@@ -91,6 +91,7 @@ extern int quartzHasRoot, quartzEnableRootless;
 #define PREFS_NO_QUIT_ALERT         "no_quit_alert"
 #define PREFS_FAKE_BUTTON2          "fake_button2"
 #define PREFS_FAKE_BUTTON3          "fake_button3"
+#define PREFS_APPKIT_MODIFIERS      "appkit_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 5ba22db..0d0fae4 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -200,6 +200,11 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
 	/* By default pass down the responder chain and to X. */
 	for_appkit = YES;
 	for_x = YES;
+    
+    if(darwinAppKitModMask & [e modifierFlags]) {
+        [super sendEvent:e];
+        return;
+    }
   
 	switch (type) {
 		case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown:
@@ -617,14 +622,17 @@ static NSMutableArray * cfarray_to_nsarray (CFArrayRef in) {
     darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS
                          default:darwinFakeButtons];
     if (darwinFakeButtons) {
-      const char *fake2, *fake3;
-      
-      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);
+        const char *fake2, *fake3;
+
+        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);
     }
+
+    tem = [self prefs_get_string:@PREFS_APPKIT_MODIFIERS default:NULL];
+    if (tem != NULL) darwinAppKitModMask = DarwinParseModifierList(tem);
 	
     X11EnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS
                                default:X11EnableKeyEquivalents];
diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c
index 2c8cafe..9e322d9 100644
--- a/hw/xquartz/darwin.c
+++ b/hw/xquartz/darwin.c
@@ -112,6 +112,9 @@ int                     darwinFakeMouse2Mask = NX_ALTERNATEMASK;
 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;
+
 // devices
 DeviceIntPtr            darwinPointer = NULL;
 DeviceIntPtr            darwinTablet = NULL;
diff --git a/hw/xquartz/darwin.h b/hw/xquartz/darwin.h
index bdf0046..c570dad 100644
--- a/hw/xquartz/darwin.h
+++ b/hw/xquartz/darwin.h
@@ -79,6 +79,7 @@ extern int              darwinMouseAccelChange;
 extern int              darwinFakeButtons;
 extern int              darwinFakeMouse2Mask;
 extern int              darwinFakeMouse3Mask;
+extern int              darwinAppKitModMask;
 extern char            *darwinKeymapFile;
 extern int              darwinSyncKeymap;
 extern unsigned int     darwinDesiredWidth, darwinDesiredHeight;
commit be06961312e2111778bfd97b2c8a927acc61f43d
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Aug 20 09:56:06 2008 -0700

    XQuartz: More input fixes
    stuck-modifier fixes (capslock)
    3button-emulation now doesn't send the modifier key with the click
    Added other options to fake_button2 and fake_button3 defaults options:
    	({l,r}{control,alt,command,shift})
    (cherry picked from commit 8fb6a1cf44c35a20dfb0c05c9824f94898f88da7)
    (cherry picked from commit ae9c1b3cfb3874b4d1251681c24bda91c398bcab)

diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index 5a1f0e8..5ba22db 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -833,6 +833,8 @@ convert_flags (unsigned int nsflags) {
     return xflags;
 }
 
+extern int darwin_modifier_flags; // darwinEvents.c
+
 static void send_nsevent (NSEventType type, NSEvent *e) {
 	NSRect screen;
 	NSPoint location;
@@ -859,26 +861,34 @@ static void send_nsevent (NSEventType type, NSEvent *e) {
 	tilt_x = 0;
 	tilt_y = 0;
 
+    /* We don't receive modifier key events while out of focus, and 3button
+     * emulation mucks this up, so we need to check our modifier flag state
+     * on every event... ugg
+     */
+    if(darwin_modifier_flags != [e modifierFlags])
+        DarwinUpdateModKeys([e modifierFlags]);
+    
 	switch (type) {
-		case NSMouseMoved: ev_button=0; ev_type=MotionNotify; goto check_subtype;
-		case NSLeftMouseDown:    ev_button=1; ev_type=ButtonPress; goto check_subtype;
-		case NSOtherMouseDown:   ev_button=2; ev_type=ButtonPress; goto check_subtype;
-		case NSRightMouseDown:   ev_button=3; ev_type=ButtonPress; goto check_subtype;
-		case NSLeftMouseUp:      ev_button=1; ev_type=ButtonRelease; goto check_subtype;
-		case NSOtherMouseUp:     ev_button=2; ev_type=ButtonRelease; goto check_subtype;
-		case NSRightMouseUp:     ev_button=3; ev_type=ButtonRelease; goto check_subtype;
-		case NSLeftMouseDragged:  ev_button=1; ev_type=MotionNotify; goto check_subtype;
-		case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify; goto check_subtype;
-		case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify; goto check_subtype;
+		case NSMouseMoved:        ev_button=0; ev_type=MotionNotify;  goto check_subtype;
+		case NSLeftMouseDown:     ev_button=1; ev_type=ButtonPress;   goto check_subtype;
+		case NSOtherMouseDown:    ev_button=2; ev_type=ButtonPress;   goto check_subtype;
+		case NSRightMouseDown:    ev_button=3; ev_type=ButtonPress;   goto check_subtype;
+		case NSLeftMouseUp:       ev_button=1; ev_type=ButtonRelease; goto check_subtype;
+		case NSOtherMouseUp:      ev_button=2; ev_type=ButtonRelease; goto check_subtype;
+		case NSRightMouseUp:      ev_button=3; ev_type=ButtonRelease; goto check_subtype;
+		case NSLeftMouseDragged:  ev_button=1; ev_type=MotionNotify;  goto check_subtype;
+		case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify;  goto check_subtype;
+		case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify;  goto check_subtype;
 		
 check_subtype:
 			if ([e subtype] != NSTabletPointEventSubtype) 
                 goto handle_mouse;
 			// fall through to get tablet data
+
 		case NSTabletPoint:
-			pressure = [e pressure];
-			tilt_x = [e tilt].x;
-			tilt_y = [e tilt].y; 
+            pressure = [e pressure];
+			tilt_x   = [e tilt].x;
+			tilt_y   = [e tilt].y; 
             goto handle_mouse;
 			// fall through to normal mouse handling
 
@@ -901,9 +911,6 @@ handle_mouse:
             DarwinSendKeyboardEvents((type == NSKeyDown)?KeyPress:KeyRelease, [e keyCode]);
 		break;
 
-		case NSFlagsChanged:
-			DarwinUpdateModKeys([e modifierFlags]);
-		break;
-		default: break; /* for gcc */
+        default: break; /* for gcc */
 	}	
 }
diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c
index 50dcbbf..2c8cafe 100644
--- a/hw/xquartz/darwin.c
+++ b/hw/xquartz/darwin.c
@@ -104,8 +104,13 @@ char                    *darwinKeymapFile = "USA.keymapping";
 int                     darwinSyncKeymap = FALSE;
 
 // modifier masks for faking mouse buttons
+#ifdef NX_DEVICELCMDKEYMASK
+int                     darwinFakeMouse2Mask = NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK;
+int                     darwinFakeMouse3Mask = NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK;
+#else
 int                     darwinFakeMouse2Mask = NX_ALTERNATEMASK;
 int                     darwinFakeMouse3Mask = NX_COMMANDMASK;
+#endif
 
 // devices
 DeviceIntPtr            darwinPointer = NULL;
@@ -140,7 +145,7 @@ const int NUMFORMATS = sizeof(formats)/sizeof(formats[0]);
 #define XORG_RELEASE "?"
 #endif
 
-const char *__crashreporter_info__ = "X.Org X Server " XSERVER_VERSION "Build Date: " BUILD_DATE;
+const char *__crashreporter_info__ = "X.Org X Server " XSERVER_VERSION " Build Date: " BUILD_DATE;
 
 void DDXRingBell(int volume, int pitch, int duration) {
   // FIXME -- make some noise, yo
@@ -496,9 +501,9 @@ int DarwinParseModifierList(
 
         while (p) {
             modifier = strsep(&p, " ,+&|/"); // allow lots of separators
-            nxkey = DarwinModifierStringToNXKey(modifier);
-            if (nxkey != -1)
-                result |= DarwinModifierNXKeyToNXMask(nxkey);
+            nxkey = DarwinModifierStringToNXMask(modifier);
+            if(nxkey)
+                result |= nxkey;
             else
                 ErrorF("fakebuttons: Unknown modifier \"%s\"\n", modifier);
         }
diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 2b8e8de..cb4a214 100644
--- a/hw/xquartz/darwinEvents.c
+++ b/hw/xquartz/darwinEvents.c
@@ -30,6 +30,8 @@ used in advertising or otherwise to promote the sale, use or other dealings
 in this Software without prior written authorization from The Open Group.
  */
 
+#include "sanitizedCarbon.h"
+
 #ifdef HAVE_DIX_CONFIG_H
 #include <dix-config.h>
 #endif
@@ -77,7 +79,7 @@ in this Software without prior written authorization from The Open Group.
 /* FIXME: Abstract this better */
 void QuartzModeEQInit(void);
 
-static int modifier_flags = 0;  // last known modifier state
+int darwin_modifier_flags = 0;  // last known modifier state
 
 #define FD_ADD_MAX 128
 static int fd_add[FD_ADD_MAX];
@@ -139,89 +141,55 @@ static inline void darwinEvents_unlock(void) {
 }
 
 /*
- * DarwinPressModifierMask
- * Press or release the given modifier key, specified by its mask (one of NX_*MASK constants)
+ * DarwinPressModifierKey
+ * Press or release the given modifier key (one of NX_MODIFIERKEY_* constants)
  */
-static void DarwinPressModifierMask(int pressed, int mask) {
-    int keycode;
-    int key = DarwinModifierNXMaskToNXKey(mask);
-
-    if (key != -1) {
-        keycode = DarwinModifierNXKeyToNXKeycode(key, 0);
-        if (keycode != 0)
-            DarwinSendKeyboardEvents(pressed, keycode);
-    }
-}
-
-#ifdef NX_DEVICELCTLKEYMASK
-#define CONTROL_MASK(flags) (flags & (NX_DEVICELCTLKEYMASK|NX_DEVICERCTLKEYMASK))
-#define NX_CONTROLMASK_FULL (NX_CONTROLMASK | NX_DEVICELCTLKEYMASK | NX_DEVICERCTLKEYMASK)
-#else
-#define CONTROL_MASK(flags) (NX_CONTROLMASK)
-#define NX_CONTROLMASK_FULL NX_CONTROLMASK
-#endif /* NX_DEVICELCTLKEYMASK */
+static void DarwinPressModifierKey(int pressed, int key) {
+    int keycode = DarwinModifierNXKeyToNXKeycode(key, 0);
 
-#ifdef NX_DEVICELSHIFTKEYMASK
-#define SHIFT_MASK(flags) (flags & (NX_DEVICELSHIFTKEYMASK|NX_DEVICERSHIFTKEYMASK))
-#define NX_SHIFTMASK_FULL (NX_SHIFTMASK | NX_DEVICELSHIFTKEYMASK | NX_DEVICERSHIFTKEYMASK)
-#else
-#define SHIFT_MASK(flags) (NX_SHIFTMASK)
-#define NX_SHIFTMASK_FULL NX_SHIFTMASK
-#endif /* NX_DEVICELSHIFTKEYMASK */
-
-#ifdef NX_DEVICELCMDKEYMASK
-#define COMMAND_MASK(flags) (flags & (NX_DEVICELCMDKEYMASK|NX_DEVICERCMDKEYMASK))
-#define NX_COMMANDMASK_FULL (NX_COMMANDMASK | NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK)
-#else
-#define COMMAND_MASK(flags) (NX_COMMANDMASK)
-#define NX_COMMANDMASK_FULL NX_COMMANDMASK
-#endif /* NX_DEVICELCMDKEYMASK */
+    if (keycode == 0) {
+        ErrorF("DarwinPressModifierKey bad keycode: key=%d\n", pressed == KeyPress ? "press" : "release", key, keycode);
+        return;
+    }
 
-#ifdef NX_DEVICELALTKEYMASK
-#define ALTERNATE_MASK(flags) (flags & (NX_DEVICELALTKEYMASK|NX_DEVICERALTKEYMASK))
-#define NX_ALTERNATEMASK_FULL (NX_ALTERNATEMASK | NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK)
-#else
-#define ALTERNATE_MASK(flags) (NX_ALTERNATEMASK)
-#define NX_ALTERNATEMASK_FULL NX_ALTERNATEMASK
-#endif /* NX_DEVICELALTKEYMASK */
+    DarwinSendKeyboardEvents(pressed, keycode);
+}
 
 /*
  * DarwinUpdateModifiers
  *  Send events to update the modifier state.
  */
+
+static int modifier_mask_list[] = {
+    NX_SECONDARYFNMASK, NX_NUMERICPADMASK, NX_HELPMASK,
+#ifdef NX_DEVICELCMDKEYMASK
+    NX_DEVICELCTLKEYMASK, NX_DEVICERCTLKEYMASK,
+    NX_DEVICELSHIFTKEYMASK, NX_DEVICERSHIFTKEYMASK,
+    NX_DEVICELCMDKEYMASK, NX_DEVICERCMDKEYMASK,
+    NX_DEVICELALTKEYMASK, NX_DEVICERALTKEYMASK,
+#else
+    NX_CONTROLMASK, NX_SHIFTMASK, NX_COMMANDMASK, NX_ALTERNATEMASK,
+#endif
+    0
+};
+
 static void DarwinUpdateModifiers(
     int pressed,        // KeyPress or KeyRelease
     int flags )         // modifier flags that have changed
 {
-    if (flags & NX_ALPHASHIFTMASK) {
-        DarwinPressModifierMask(pressed, NX_ALPHASHIFTMASK);
-    }
-    if (flags & NX_COMMANDMASK_FULL) {
-        DarwinPressModifierMask(pressed, COMMAND_MASK(flags));
-    }
-    if (flags & NX_CONTROLMASK_FULL) {
-        DarwinPressModifierMask(pressed, CONTROL_MASK(flags));
-    }
-    if (flags & NX_ALTERNATEMASK_FULL) {
-        DarwinPressModifierMask(pressed, ALTERNATE_MASK(flags));
-    }
-    if (flags & NX_SHIFTMASK_FULL) {
-        DarwinPressModifierMask(pressed, SHIFT_MASK(flags));
-    }
-    if (flags & NX_SECONDARYFNMASK) {
-        DarwinPressModifierMask(pressed, NX_SECONDARYFNMASK);
-    }
-}
+    int *f;
 
-/*
- * DarwinReleaseModifiers
- * This hacky function releases all modifier keys.  It should be called when X11.app
- * is deactivated (kXquartzDeactivate) to prevent modifiers from getting stuck if they
- * are held down during a "context" switch -- otherwise, we would miss the KeyUp.
- */
-static void DarwinReleaseModifiers(void) {
-    ErrorF("DarwinReleaseModifiers\n");
-	DarwinUpdateModifiers(KeyRelease, COMMAND_MASK(-1) | CONTROL_MASK(-1) | ALTERNATE_MASK(-1) | SHIFT_MASK(-1));
+    /* Capslock is special.  This mask is the state of capslock (on/off),
+     * not the state of the button.  Hopefully we can find a better solution.
+     */
+    if(NX_ALPHASHIFTMASK & flags) {
+        DarwinPressModifierKey(KeyPress, NX_MODIFIERKEY_ALPHALOCK);
+        DarwinPressModifierKey(KeyRelease, NX_MODIFIERKEY_ALPHALOCK);
+    }
+    
+    for(f=modifier_mask_list; *f; f++)
+        if(*f & flags)
+            DarwinPressModifierKey(pressed, DarwinModifierNXMaskToNXKey(*f));
 }
 
 /* Generic handler for Xquartz-specifc events.  When possible, these should
@@ -263,7 +231,6 @@ static void DarwinEventHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, in
                 
             case kXquartzDeactivate:
                 DEBUG_LOG("kXquartzDeactivate\n");
-                DarwinReleaseModifiers();
                 AppleWMSendEvent(AppleWMActivationNotify,
                                  AppleWMActivationNotifyMask,
                                  AppleWMIsInactive, 0);
@@ -476,20 +443,29 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin
             DarwinSendPointerEvents(ButtonRelease, darwinFakeMouseButtonDown, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
             darwinFakeMouseButtonDown=0;
         }
-		if ((modifier_flags & darwinFakeMouse2Mask) == darwinFakeMouse2Mask) {
+		if (darwin_modifier_flags & darwinFakeMouse2Mask) {
             ev_button = 2;
 			darwinFakeMouseButtonDown = 2;
-		} else if ((modifier_flags & darwinFakeMouse3Mask) == darwinFakeMouse3Mask) {
+            DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse2Mask);
+		} else if (darwin_modifier_flags & darwinFakeMouse3Mask) {
             ev_button = 3;
 			darwinFakeMouseButtonDown = 3;
+            DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse3Mask);
 		}
 	}
 
 	if (ev_type == ButtonRelease && ev_button == 1) {
         if(darwinFakeMouseButtonDown) {
             ev_button = darwinFakeMouseButtonDown;
-            darwinFakeMouseButtonDown = 0;
         }
+
+        if(darwinFakeMouseButtonDown == 2) {
+            DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse2Mask);
+        } else if(darwinFakeMouseButtonDown == 3) {
+            DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse3Mask);
+        }
+
+        darwinFakeMouseButtonDown = 0;
 	}
 
     DarwinPrepareValuators(valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
@@ -509,7 +485,7 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) {
 		return;
 	}
 
-	if (modifier_flags == 0 && darwinSyncKeymap && darwinKeymapFile == NULL) {
+	if (darwinSyncKeymap && darwinKeymapFile == NULL) {
 		/* See if keymap has changed. */
 
 		static unsigned int last_seed;
@@ -589,9 +565,9 @@ void DarwinSendScrollEvents(float count_x, float count_y,
 /* Send the appropriate KeyPress/KeyRelease events to GetKeyboardEvents to
    reflect changing modifier flags (alt, control, meta, etc) */
 void DarwinUpdateModKeys(int flags) {
-	DarwinUpdateModifiers(KeyRelease, modifier_flags & ~flags);
-	DarwinUpdateModifiers(KeyPress, ~modifier_flags & flags);
-	modifier_flags = flags;
+	DarwinUpdateModifiers(KeyRelease, darwin_modifier_flags & ~flags);
+	DarwinUpdateModifiers(KeyPress, ~darwin_modifier_flags & flags);
+	darwin_modifier_flags = flags;
 }
 
 /*
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 0bfb50b..a7f9248 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -71,8 +71,6 @@
 #include "X11/keysym.h"
 #include "keysym2ucs.h"
 
-#include <Availability.h>
-
 void QuartzXkbUpdate(DeviceIntPtr pDev);
 
 enum {
@@ -1014,28 +1012,6 @@ int DarwinModifierNXMaskToNXKey(int mask) {
     return -1;
 }
 
-static const char *DarwinModifierNXMaskTostring(int mask) {
-    switch (mask) {
-        case NX_ALPHASHIFTMASK:      return "NX_ALPHASHIFTMASK";
-        case NX_SHIFTMASK:           return "NX_SHIFTMASK";
-        case NX_DEVICELSHIFTKEYMASK: return "NX_DEVICELSHIFTKEYMASK";
-        case NX_DEVICERSHIFTKEYMASK: return "NX_DEVICERSHIFTKEYMASK";
-        case NX_CONTROLMASK:         return "NX_CONTROLMASK";
-        case NX_DEVICELCTLKEYMASK:   return "NX_DEVICELCTLKEYMASK";
-        case NX_DEVICERCTLKEYMASK:   return "NX_DEVICERCTLKEYMASK";
-        case NX_ALTERNATEMASK:       return "NX_ALTERNATEMASK";
-        case NX_DEVICELALTKEYMASK:   return "NX_DEVICELALTKEYMASK";
-        case NX_DEVICERALTKEYMASK:   return "NX_DEVICERALTKEYMASK";
-        case NX_COMMANDMASK:         return "NX_COMMANDMASK";
-        case NX_DEVICELCMDKEYMASK:   return "NX_DEVICELCMDKEYMASK";
-        case NX_DEVICERCMDKEYMASK:   return "NX_DEVICERCMDKEYMASK";
-        case NX_NUMERICPADMASK:      return "NX_NUMERICPADMASK";
-        case NX_HELPMASK:            return "NX_HELPMASK";
-        case NX_SECONDARYFNMASK:     return "NX_SECONDARYFNMASK";
-    }
-    return "unknown mask";
-}
-
 /*
  * DarwinModifierNXKeyToNXMask
  *      Returns 0 if key is not a known modifier key.
@@ -1043,21 +1019,20 @@ static const char *DarwinModifierNXMaskTostring(int mask) {
 int DarwinModifierNXKeyToNXMask(int key) {
     switch (key) {
         case NX_MODIFIERKEY_ALPHALOCK:   return NX_ALPHASHIFTMASK;
+#ifdef NX_DEVICELSHIFTKEYMASK
+        case NX_MODIFIERKEY_SHIFT:       return NX_DEVICELSHIFTKEYMASK;
+        case NX_MODIFIERKEY_RSHIFT:      return NX_DEVICERSHIFTKEYMASK;
+        case NX_MODIFIERKEY_CONTROL:     return NX_DEVICELCTLKEYMASK;
+        case NX_MODIFIERKEY_RCONTROL:    return NX_DEVICERCTLKEYMASK;
+        case NX_MODIFIERKEY_ALTERNATE:   return NX_DEVICELALTKEYMASK;
+        case NX_MODIFIERKEY_RALTERNATE:  return NX_DEVICERALTKEYMASK;
+        case NX_MODIFIERKEY_COMMAND:     return NX_DEVICELCMDKEYMASK;
+        case NX_MODIFIERKEY_RCOMMAND:    return NX_DEVICERCMDKEYMASK;
+#else
         case NX_MODIFIERKEY_SHIFT:       return NX_SHIFTMASK;
-#ifdef NX_MODIFIERKEY_RSHIFT
-        case NX_MODIFIERKEY_RSHIFT:      return NX_SHIFTMASK;
-#endif
         case NX_MODIFIERKEY_CONTROL:     return NX_CONTROLMASK;
-#ifdef NX_MODIFIERKEY_RCONTROL
-        case NX_MODIFIERKEY_RCONTROL:    return NX_CONTROLMASK;
-#endif
         case NX_MODIFIERKEY_ALTERNATE:   return NX_ALTERNATEMASK;
-#ifdef NX_MODIFIERKEY_RALTERNATE
-        case NX_MODIFIERKEY_RALTERNATE:  return NX_ALTERNATEMASK;
-#endif
         case NX_MODIFIERKEY_COMMAND:     return NX_COMMANDMASK;
-#ifdef NX_MODIFIERKEY_RCOMMAND
-        case NX_MODIFIERKEY_RCOMMAND:    return NX_COMMANDMASK;
 #endif
         case NX_MODIFIERKEY_NUMERICPAD:  return NX_NUMERICPADMASK;
         case NX_MODIFIERKEY_HELP:        return NX_HELPMASK;
@@ -1067,16 +1042,42 @@ int DarwinModifierNXKeyToNXMask(int key) {
 }
 
 /*
- * DarwinModifierStringToNXKey
- *      Returns -1 if string is not a known modifier.
+ * DarwinModifierStringToNXMask
+ *      Returns 0 if string is not a known modifier.
  */
-int DarwinModifierStringToNXKey(const char *str) {
-    if      (!strcasecmp(str, "shift"))   return NX_MODIFIERKEY_SHIFT;
-    else if (!strcasecmp(str, "control")) return NX_MODIFIERKEY_CONTROL;
-    else if (!strcasecmp(str, "option"))  return NX_MODIFIERKEY_ALTERNATE;
-    else if (!strcasecmp(str, "command")) return NX_MODIFIERKEY_COMMAND;
-    else if (!strcasecmp(str, "fn"))      return NX_MODIFIERKEY_SECONDARYFN;
-    else return -1;
+int DarwinModifierStringToNXMask(const char *str) {
+#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;
+#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;
 }
 
 /*
@@ -1092,7 +1093,7 @@ Bool LegalModifier(unsigned int key, DeviceIntPtr pDev)
 /* TODO: Not thread safe */
 unsigned int QuartzSystemKeymapSeed(void) {
     static unsigned int seed = 0;
-#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
+#if defined(__x86_64__) || defined(__ppc64__)
     static TISInputSourceRef last_key_layout = NULL;
     TISInputSourceRef key_layout;
 
@@ -1159,7 +1160,7 @@ static KeySym make_dead_key(KeySym in) {
 }
 
 Bool QuartzReadSystemKeymap(darwinKeyboardInfo *info) {
-#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+#if !defined(__x86_64__) && !defined(__ppc64__)
     KeyboardLayoutRef key_layout;
 #endif
     const void *chr_data = NULL;
@@ -1178,10 +1179,11 @@ Bool QuartzReadSystemKeymap(darwinKeyboardInfo *info) {
           chr_data = CFDataGetBytePtr(currentKeyLayoutDataRef);
     }
 
-#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+#if !defined(__x86_64__) && !defined(__ppc64__)
     if (chr_data == NULL) {
         ErrorF("X11.app: Error detected in determining keyboard layout.  Please report this error at http://xquartz.macosforge.org\n");
-        ErrorF("X11.app: Debug Info: currentKeyLayoutRef=%p, chr_data=%p\n", currentKeyLayoutRef, chr_data);
+        ErrorF("X11.app: Debug Info: keyboard_type=%u, currentKeyLayoutRef=%p, currentKeyLayoutDataRef=%p, chr_data=%p\n",
+               (unsigned)keyboard_type, currentKeyLayoutRef, currentKeyLayoutDataRef, chr_data);
 
         KLGetCurrentKeyboardLayout (&key_layout);
         KLGetKeyboardLayoutProperty (key_layout, kKLuchrData, &chr_data);
@@ -1192,7 +1194,7 @@ Bool QuartzReadSystemKeymap(darwinKeyboardInfo *info) {
     }
 
     if (chr_data == NULL) {
-        ErrorF("X11.app: Debug Info: kKLuchrData fallback failed, trying kKLKCHRData.\n", currentKeyLayoutRef, chr_data);
+        ErrorF("X11.app: Debug Info: kKLuchrData fallback failed, trying kKLKCHRData.\n");
         KLGetKeyboardLayoutProperty (key_layout, kKLKCHRData, &chr_data);
         is_uchr = 0;
         num_keycodes = 128;
diff --git a/hw/xquartz/quartzKeyboard.h b/hw/xquartz/quartzKeyboard.h
index 964ea01..3a892ba 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 DarwinModifierStringToNXKey(const char *string);
+int DarwinModifierStringToNXMask(const char *string);
 
 /* Provided for darwin.c */
 void DarwinKeyboardInit(DeviceIntPtr pDev);
commit 436b659091dd17bb3e316377ba31f5d2a5dfa12e
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Thu Aug 14 09:34:12 2008 -0700

    XQuartz: Updated bundle version to 2.3.1
    (cherry picked from commit eedecba0b882bb07931e8d9168589f5be7a08a69)
    (cherry picked from commit 7d9d864461858b25c5eb5858fdf4b53771795f11)

diff --git a/hw/xquartz/bundle/Info.plist b/hw/xquartz/bundle/Info.plist
index f06a30d..2582b92 100644
--- a/hw/xquartz/bundle/Info.plist
+++ b/hw/xquartz/bundle/Info.plist
@@ -19,11 +19,11 @@
 	<key>CFBundlePackageType</key>
 		<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-		<string>2.3.0</string>
+		<string>2.3.1</string>
 	<key>CFBundleVersion</key>
-		<string>2.3.0</string>
+		<string>2.3.1</string>
 	<key>CFBundleVersionString</key>
-		<string>2.3.0</string>
+		<string>2.3.1</string>
 	<key>CFBundleSignature</key>
 		<string>x11a</string>
 	<key>CSResourcesFileMapped</key>


More information about the xorg-commit mailing list