xserver: Branch 'glucose-2'

Jose Fonseca jrfonseca at kemper.freedesktop.org
Sat Sep 15 04:37:59 PDT 2007


 hw/xgl/glx/xglx.c |   65 +++++++++++++++++++++++++++++-------------------------
 hw/xgl/xglinit.c  |    2 -
 2 files changed, 36 insertions(+), 31 deletions(-)

New commits:
diff-tree 79677d094cf5f0f2f84f930aea882efc531b5e8b (from ade1abeb4ae4f9dfff0ad7c7d29118a320d53430)
Author: José Fonseca <jrfonseca at tungstengraphics.com>
Date:   Sat Sep 15 12:32:48 2007 +0100

    Update keyboard event code to prevent crash on key input.

diff --git a/hw/xgl/glx/xglx.c b/hw/xgl/glx/xglx.c
index 27aff1f..297036c 100644
--- a/hw/xgl/glx/xglx.c
+++ b/hw/xgl/glx/xglx.c
@@ -975,7 +975,21 @@ xglxBlockHandler (pointer   blockData,
     XFlush (xdisplay);
 }
 
-static DeviceIntPtr pKeyboard, pPointer;
+static DeviceIntPtr xglxKeyboardDevice = NULL;
+static DeviceIntPtr xglxPointerDevice = NULL;
+
+static xEvent *xglxEvents = NULL;
+
+static void
+xglxQueueKeyEvent(int type, unsigned int keycode)
+{
+  int i, n;
+
+  lastEventTime = GetTimeInMillis();
+  n = GetKeyboardEvents(xglxEvents, xglxKeyboardDevice, type, keycode);
+  for (i = 0; i < n; i++)
+    mieqEnqueue(xglxKeyboardDevice, xglxEvents + i);
+}
 
 static void
 xglxWakeupHandler (pointer blockData,
@@ -990,28 +1004,22 @@ xglxWakeupHandler (pointer blockData,
     {
 	switch (X.type) {
 	case KeyPress:
-	    x.u.u.type = KeyPress;
-	    x.u.u.detail = X.xkey.keycode;
-	    x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
-	    mieqEnqueue (pKeyboard, &x);
+	    xglxQueueKeyEvent(KeyPress, X.xkey.keycode);
 	    break;
 	case KeyRelease:
-	    x.u.u.type = KeyRelease;
-	    x.u.u.detail = X.xkey.keycode;
-	    x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
-	    mieqEnqueue (pKeyboard, &x);
+	    xglxQueueKeyEvent(KeyRelease, X.xkey.keycode);
 	    break;
 	case ButtonPress:
 	    x.u.u.type = ButtonPress;
 	    x.u.u.detail = X.xbutton.button;
 	    x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
-	    mieqEnqueue (pPointer, &x);
+	    mieqEnqueue (xglxPointerDevice, &x);
 	    break;
 	case ButtonRelease:
 	    x.u.u.type = ButtonRelease;
 	    x.u.u.detail = X.xbutton.button;
 	    x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
-	    mieqEnqueue (pPointer, &x);
+	    mieqEnqueue (xglxPointerDevice, &x);
 	    break;
 	case MotionNotify:
 	    x.u.u.type = MotionNotify;
@@ -1020,7 +1028,7 @@ xglxWakeupHandler (pointer blockData,
 	    x.u.keyButtonPointer.rootY = X.xmotion.y;
 	    x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
 	    miPointerAbsoluteCursor (X.xmotion.x, X.xmotion.y, lastEventTime);
-	    mieqEnqueue (pPointer, &x);
+	    mieqEnqueue (xglxPointerDevice, &x);
 	    break;
 	case EnterNotify:
 	    if (X.xcrossing.detail != NotifyInferior) {
@@ -1032,7 +1040,7 @@ xglxWakeupHandler (pointer blockData,
 		    x.u.keyButtonPointer.rootY = X.xcrossing.y;
 		    x.u.keyButtonPointer.time = lastEventTime =
 			GetTimeInMillis ();
-		    mieqEnqueue (pPointer, &x);
+		    mieqEnqueue (xglxPointerDevice, &x);
 		}
 	    }
 	    break;
@@ -1084,11 +1092,10 @@ xglxKbdCtrl (DeviceIntPtr pDev,
 }
 
 static int
-xglxKeybdProc (DeviceIntPtr pDevice,
+xglxKeybdProc (DeviceIntPtr pDev,
 	       int	    onoff)
 {
     Bool      ret = FALSE;
-    DevicePtr pDev = (DevicePtr) pDevice;
 
     if (!pDev)
 	return BadImplementation;
@@ -1099,7 +1106,7 @@ xglxKeybdProc (DeviceIntPtr pDevice,
       KeySym	      *xkeyMap;
       int	      minKeyCode, maxKeyCode, mapWidth, i, j;
       KeySymsRec      xglxKeySyms;
-      CARD8	      xglxModMap[256];
+      CARD8	      xglxModMap[MAP_LENGTH];
       XKeyboardState  values;
 
 #ifdef _XSERVER64
@@ -1112,9 +1119,6 @@ xglxKeybdProc (DeviceIntPtr pDevice,
       int	      xkbOp, xkbEvent, xkbError, xkbMajor, xkbMinor;
 #endif
 
-      if (pDev != LookupKeyboardDevice ())
-	  return !Success;
-
       xmodMap = XGetModifierMapping (xdisplay);
 
       XDisplayKeycodes (xdisplay, &minKeyCode, &maxKeyCode);
@@ -1138,8 +1142,8 @@ xglxKeybdProc (DeviceIntPtr pDevice,
 				     &mapWidth);
 #endif
 
-      memset (xglxModMap, 0, 256);
-
+      for (i = 0; i < MAP_LENGTH; i++)
+	  xglxModMap[i] = 0;
       for (j = 0; j < 8; j++)
       {
 	  for (i = 0; i < xmodMap->max_keypermod; i++)
@@ -1177,8 +1181,6 @@ xglxKeybdProc (DeviceIntPtr pDevice,
 	  if (desc && desc->geom)
 	  {
 	      XkbComponentNamesRec names;
-	      FILE		   *file;
-
 	      rules    = XKB_DFLT_RULES_FILE;
 	      model    = XKB_DFLT_KB_MODEL;
 	      layout   = XKB_DFLT_KB_LAYOUT;
@@ -1214,7 +1216,7 @@ xglxKeybdProc (DeviceIntPtr pDevice,
 	  memmove (defaultKeyboardControl.autoRepeats,
 		   values.auto_repeats, sizeof (values.auto_repeats));
 
-	  ret = InitKeyboardDeviceStruct (pDev,
+	  ret = InitKeyboardDeviceStruct (&pDev->public,
 					  &xglxKeySyms,
 					  xglxModMap,
 					  xglxBell,
@@ -1232,11 +1234,9 @@ xglxKeybdProc (DeviceIntPtr pDevice,
 
     } break;
     case DEVICE_ON:
-	pDev->on = TRUE;
 	break;
     case DEVICE_OFF:
     case DEVICE_CLOSE:
-	pDev->on = FALSE;
 	break;
     }
 
@@ -1261,11 +1261,16 @@ void
 xglxInitInput (int  argc,
 	       char **argv)
 {
-    pPointer  = AddInputDevice (xglMouseProc, TRUE);
-    pKeyboard = AddInputDevice (xglxKeybdProc, TRUE);
+    xglxPointerDevice  = AddInputDevice (xglMouseProc, TRUE);
+    xglxKeyboardDevice = AddInputDevice (xglxKeybdProc, TRUE);
+
+    RegisterPointerDevice (xglxPointerDevice);
+    RegisterKeyboardDevice (xglxKeyboardDevice);
 
-    RegisterPointerDevice (pPointer);
-    RegisterKeyboardDevice (pKeyboard);
+    if (!xglxEvents)
+	xglxEvents = (xEvent *) xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+    if (!xglxEvents)
+        FatalError("couldn't allocate room for events\n");
 
     mieqInit ();
 
diff --git a/hw/xgl/xglinit.c b/hw/xgl/xglinit.c
index 9a6f9aa..d915c91 100644
--- a/hw/xgl/xglinit.c
+++ b/hw/xgl/xglinit.c
@@ -70,7 +70,7 @@ typedef struct _xglDDXFunc {
     void (*initInput)	       (int	     argc,
 				char	     **argv);
     Bool (*legalModifier)      (unsigned int key,
-				DevicePtr    pDev);
+	    			DeviceIntPtr    pDev);
     void (*processInputEvents) (void);
     void (*useMsg)	       (void);
     int  (*processArgument)    (int	     argc,


More information about the xorg-commit mailing list