xserver: Branch 'master' - 4 commits

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Sun Jan 11 16:39:39 PST 2009


 hw/xquartz/X11Application.m |   14 +++++++++++---
 hw/xquartz/darwin.c         |   11 -----------
 hw/xquartz/darwinEvents.c   |    4 ++--
 hw/xquartz/darwinEvents.h   |    3 +++
 hw/xquartz/quartzKeyboard.h |    1 -
 mi/mieq.c                   |   11 +++++++++--
 6 files changed, 25 insertions(+), 19 deletions(-)

New commits:
commit 67710ad1d172cc4d53e28e5cc7dab2efb57a9a85
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Sun Jan 11 16:34:36 2009 -0800

    XQuartz: Don't need explicit Activate/EnableDevice in InitInput
    (cherry picked from commit b1d29784410b3b93037e5636f336ba608d8ad6e3)

diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c
index c104589..f016682 100644
--- a/hw/xquartz/darwin.c
+++ b/hw/xquartz/darwin.c
@@ -511,17 +511,6 @@ void InitInput( int argc, char **argv )
 
     darwinTabletCurrent = darwinTabletStylus;
 
-    ActivateDevice(darwinKeyboard);
-    ActivateDevice(darwinPointer);
-    ActivateDevice(darwinTabletStylus);
-    ActivateDevice(darwinTabletCursor);
-    ActivateDevice(darwinTabletEraser);
-    EnableDevice(darwinKeyboard);
-    EnableDevice(darwinPointer);
-    EnableDevice(darwinTabletStylus);
-    EnableDevice(darwinTabletCursor);
-    EnableDevice(darwinTabletEraser);
-    
     DarwinEQInit();
 
     QuartzInitInput(argc, argv);
diff --git a/hw/xquartz/quartzKeyboard.h b/hw/xquartz/quartzKeyboard.h
index eb79366..215a4a9 100644
--- a/hw/xquartz/quartzKeyboard.h
+++ b/hw/xquartz/quartzKeyboard.h
@@ -54,7 +54,6 @@ Bool QuartzReadSystemKeymap(darwinKeyboardInfo *info);
 extern darwinKeyboardInfo keyInfo;
 extern pthread_mutex_t keyInfo_mutex;
 void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents);
-void DarwinKeyboardInit(DeviceIntPtr pDev);
 int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide);
 int DarwinModifierNXKeyToNXKeycode(int key, int side);
 int DarwinModifierNXKeyToNXMask(int key);
commit dde5c591be74139ec6f2a90a3fdc7904d7342554
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Sun Jan 11 16:10:45 2009 -0800

    mieq: Avoid possible race condition whereby one thread might call mieqEnqueue before InitAndStartDevices finishes
    
    This is more of a hack around the problem.  This is something that will need to be addressed in a
    more structured manner with the multi threaded input efforts.
    (cherry picked from commit 3c596c061e75848cfa76dd9259c23a3f3a67444c)

diff --git a/mi/mieq.c b/mi/mieq.c
index d6b722d..963f27c 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -247,7 +247,14 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
         evt->event->u.keyButtonPointer.time = miEventQueue.lastEventTime;
 
     miEventQueue.lastEventTime = evt->event->u.keyButtonPointer.time;
-    miEventQueue.events[oldtail].pScreen = EnqueueScreen(pDev);
+
+    /* Avoid possible crash when multithreaded and mieqEnqueue is called before 
+     * InitAndStartDevices finishes.
+     */
+    if(pDev && pDev->spriteInfo && pDev->spriteInfo->sprite)
+        miEventQueue.events[oldtail].pScreen = EnqueueScreen(pDev);
+    else 
+        miEventQueue.events[oldtail].pScreen = NULL;
     miEventQueue.events[oldtail].pDev = pDev;
 
     miEventQueue.lastMotion = isMotion;
@@ -403,7 +410,7 @@ mieqProcessInputEvents(void)
         /* Custom event handler */
         handler = miEventQueue.handlers[type];
 
-        if (screen != DequeueScreen(dev) && !handler) {
+        if (screen && screen != DequeueScreen(dev) && !handler) {
             /* Assumption - screen switching can only occur on motion events. */
             DequeueScreen(dev) = screen;
             x = event->u.keyButtonPointer.rootX;
commit 0720816aea20971ee94b5df3faa9cb9f16e93f82
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Sun Jan 11 14:49:39 2009 -0800

    XQuartz: Only call DarwinUpdateModKeys when needed
    
    Previously, we were calling it on almost every itteration through sendX11Event
    (cherry picked from commit 6461729647ff4441d80811e73f0c0d2f108f2700)

diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index 50212dc..7bf4d71 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -65,6 +65,7 @@ extern BOOL xpbproxy_init (void);
 
 /* Stuck modifier / button state... force release when we context switch */
 static NSEventType keyState[NUM_KEYCODES];
+static int modifierFlagsMask;
 
 int X11EnableKeyEquivalents = TRUE, quartzFullscreenMenu = FALSE;
 int quartzHasRoot = FALSE, quartzEnableRootless = TRUE;
@@ -200,7 +201,8 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
         }
     } else {
 
-        DarwinUpdateModKeys(0);
+        if(darwin_modifier_flags)
+            DarwinUpdateModKeys(0);
         for(i=0; i < NUM_KEYCODES; i++) {
             if(keyState[i] == NSKeyDown) {
                 DarwinSendKeyboardEvents(KeyRelease, i);
@@ -872,6 +874,7 @@ environment the next time you start X11?", @"Startup xinitrc dialog");
 
 void X11ApplicationMain (int argc, char **argv, char **envp) {
     NSAutoreleasePool *pool;
+    int *p;
 
 #ifdef DEBUG
     while (access ("/tmp/x11-block", F_OK) == 0) sleep (1);
@@ -916,6 +919,10 @@ void X11ApplicationMain (int argc, char **argv, char **envp) {
         fprintf(stderr, "X11ApplicationMain: Could not build a valid keymap.\n");
     }
 
+    for(p=darwin_modifier_mask_list, modifierFlagsMask=0; *p; p++) {
+        modifierFlagsMask |= *p;
+    }
+    
     /* Tell the server thread that it can proceed */
     QuartzInitServer(argc, argv, envp);
     
@@ -932,7 +939,6 @@ void X11ApplicationMain (int argc, char **argv, char **envp) {
 }
 
 @implementation X11Application (Private)
-extern int darwin_modifier_flags; // darwinEvents.c
 
 #ifdef NX_DEVICELCMDKEYMASK
 /* This is to workaround a bug in the VNC server where we sometimes see the L
@@ -987,6 +993,8 @@ static inline int ensure_flag(int flags, int device_independent, int device_depe
     modifierFlags = ensure_flag(modifierFlags, NX_ALTERNATEMASK, NX_DEVICELALTKEYMASK   | NX_DEVICERALTKEYMASK,     NX_DEVICELALTKEYMASK);
 #endif
 
+    modifierFlags &= modifierFlagsMask;
+
     /* 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
diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 0d864db..2dc0482 100644
--- a/hw/xquartz/darwinEvents.c
+++ b/hw/xquartz/darwinEvents.c
@@ -145,7 +145,7 @@ static void DarwinPressModifierKey(int pressed, int key) {
  *  Send events to update the modifier state.
  */
 
-static int modifier_mask_list[] = {
+int darwin_modifier_mask_list[] = {
 #ifdef NX_DEVICELCMDKEYMASK
     NX_DEVICELCTLKEYMASK, NX_DEVICERCTLKEYMASK,
     NX_DEVICELSHIFTKEYMASK, NX_DEVICERSHIFTKEYMASK,
@@ -172,7 +172,7 @@ static void DarwinUpdateModifiers(
         DarwinPressModifierKey(KeyRelease, NX_MODIFIERKEY_ALPHALOCK);
     }
     
-    for(f=modifier_mask_list; *f; f++)
+    for(f=darwin_modifier_mask_list; *f; f++)
         if(*f & flags) {
             key = DarwinModifierNXMaskToNXKey(*f);
             if(key == -1)
diff --git a/hw/xquartz/darwinEvents.h b/hw/xquartz/darwinEvents.h
index 2f1d9ff..9ec3bda 100644
--- a/hw/xquartz/darwinEvents.h
+++ b/hw/xquartz/darwinEvents.h
@@ -78,4 +78,7 @@ enum {
 /* Send one of the above events to the server thread. */
 void DarwinSendDDXEvent(int type, int argc, ...);
 
+extern int darwin_modifier_mask_list[];
+extern int darwin_modifier_flags;
+
 #endif  /* _DARWIN_EVENTS_H */
commit c8bf582db8111f71b9250a602a9d5aa7bd828136
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Thu Oct 23 11:41:22 2008 -0700

    XQuartz: Comment explaining the 0x10 flag for [e data2]
    (cherry picked from commit 3c695280641c1205b97d3bb9f1d5e15a19cfa45f)

diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index ec58ab1..50212dc 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -357,7 +357,7 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
                         if(!ok)
                             switch_on_activate = YES;
                         
-                        if ([e data2] & 0x10 && switch_on_activate)
+                        if ([e data2] & 0x10 && switch_on_activate) // 0x10 is set when we use cmd-tab or the dock icon
                             DarwinSendDDXEvent(kXquartzBringAllToFront, 0);
                     }
                     break;


More information about the xorg-commit mailing list