dixSetPrivate regression

Keith Packard keithp at keithp.com
Mon Jun 7 14:38:22 PDT 2010


On Mon, 07 Jun 2010 11:21:48 -0700, Jeremy Huddleston <jeremyhu at apple.com> wrote:
> Yeah, XTestExtensionInit isn't getting run.  We default to having that extension disabled and allow users to enable it with a special preference (see http://cgit.freedesktop.org/xorg/xserver/tree/hw/xquartz/X11Application.m#n757 ):
> 
>     noTestExtensions = ![self prefs_get_boolean:@PREFS_TEST_EXTENSIONS
>                                         default:FALSE];
> 
> This seems to confirm what you've already deduced.  And to add further
> confirmation, enabling the XTest extension gets us a working server.

Here's a patch which moves the data used by XTest into the deviceintrec
so that the code doesn't require a private at all. If this fixes the
problem for you with XTest not enabled, and Peter likes it, I'll merge
it in.

-keith

From 9591cceff0ebfc9590b9eedffb664fe96da4cc1b Mon Sep 17 00:00:00 2001
From: Keith Packard <keithp at keithp.com>
Date: Mon, 7 Jun 2010 14:23:47 -0700
Subject: [PATCH] If XTest is always required, then eliminate the XTest devPrivate

The internals of XTest are used by Xi and Xkb, and both Xi and Xkb are
always required, so it makes little sense to have XTest place data in
a devPrivate, especially a devPrivate which is only available when the
XTest extension is enabled.

Signed-off-by: Keith Packard <keithp at keithp.com>
---
 Xext/xtest.c               |   33 ++++++---------------------------
 include/input.h            |    1 -
 include/inputstr.h         |    3 +++
 test/xi2/protocol-common.c |    1 -
 test/xtest.c               |    1 -
 5 files changed, 9 insertions(+), 30 deletions(-)

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 6ee8430..2c733d8 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -62,10 +62,6 @@ extern int DeviceValuator;
  * other's memory */
 static EventListPtr xtest_evlist;
 
-/* Used to store if a device is an XTest Virtual device */
-static DevPrivateKeyRec XTestDevicePrivateKeyRec;
-#define XTestDevicePrivateKey (&XTestDevicePrivateKeyRec)
-
 /**
  * xtestpointer
  * is the virtual pointer for XTest. It is the first slave
@@ -99,18 +95,9 @@ static DISPATCH_PROC(SProcXTestFakeInput);
 static DISPATCH_PROC(SProcXTestGetVersion);
 static DISPATCH_PROC(SProcXTestGrabControl);
 
-Bool
-XTestInitPrivates(void)
-{
-    return dixRegisterPrivateKey(&XTestDevicePrivateKeyRec, PRIVATE_DEVICE, 0);
-}
-
 void
 XTestExtensionInit(INITARGS)
 {
-    if (!XTestInitPrivates())
-	return;
-
     AddExtension(XTestExtensionName, 0, 0,
             ProcXTestDispatch, SProcXTestDispatch,
             NULL, StandardMinorOpcode);
@@ -654,8 +641,8 @@ int AllocXTestDevice (ClientPtr client, char* name,
 
     retval = AllocDevicePair( client, xtestname, ptr, keybd, CorePointerProc, CoreKeyboardProc, FALSE);
     if ( retval == Success ){
-        dixSetPrivate(&((*ptr)->devPrivates), XTestDevicePrivateKey, (void *)(intptr_t)master_ptr->id);
-        dixSetPrivate(&((*keybd)->devPrivates), XTestDevicePrivateKey, (void *)(intptr_t)master_keybd->id);
+	(*ptr)->xtest_master_id = master_ptr->id;
+	(*keybd)->xtest_master_id = master_keybd->id;
 
         XIChangeDeviceProperty(*ptr, XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
                 XA_INTEGER, 8, PropModeReplace, 1, &dummy,
@@ -683,23 +670,15 @@ int AllocXTestDevice (ClientPtr client, char* name,
 BOOL
 IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master)
 {
-    int is_XTest = FALSE;
-    int mid;
-    void *tmp; /* shut up, gcc! */
-
     if (IsMaster(dev))
-        return is_XTest;
-
-    tmp = dixLookupPrivate(&dev->devPrivates, XTestDevicePrivateKey);
-    mid = (intptr_t)tmp;
+        return FALSE;
 
     /* deviceid 0 is reserved for XIAllDevices, non-zero mid means XTest
      * device */
-    if ((!master && mid) ||
-        (master && mid == master->id))
-        is_XTest = TRUE;
+    if (master)
+	return dev->xtest_master_id == master->id;
 
-    return is_XTest;
+    return dev->xtest_master_id != 0;
 }
 
 /**
diff --git a/include/input.h b/include/input.h
index 3b29855..c68a284 100644
--- a/include/input.h
+++ b/include/input.h
@@ -237,7 +237,6 @@ extern int key_is_down(DeviceIntPtr pDev, int key_code, int type);
 
 extern void InitCoreDevices(void);
 extern void InitXTestDevices(void);
-extern Bool XTestInitPrivates(void);
 
 extern _X_EXPORT DeviceIntPtr AddInputDevice(
     ClientPtr /*client*/,
diff --git a/include/inputstr.h b/include/inputstr.h
index a83e863..1b504e9 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -554,6 +554,9 @@ typedef struct _DeviceIntRec {
 
     /* coordinate transformation matrix for absolute input devices */
     struct pixman_f_transform transform;
+
+    /* XTest related master device id */
+    int xtest_master_id;
 } DeviceIntRec;
 
 typedef struct {
diff --git a/test/xi2/protocol-common.c b/test/xi2/protocol-common.c
index ad18042..50f2b86 100644
--- a/test/xi2/protocol-common.c
+++ b/test/xi2/protocol-common.c
@@ -157,7 +157,6 @@ void init_simple(void)
     dixResetPrivates();
     InitAtoms();
     XkbInitPrivates();
-    XTestInitPrivates();
     dixRegisterPrivateKey(&XIClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(XIClientRec));
     dixRegisterPrivateKey(&miPointerScreenKeyRec, PRIVATE_SCREEN, 0);
     dixRegisterPrivateKey(&miPointerPrivKeyRec, PRIVATE_DEVICE, 0);
diff --git a/test/xtest.c b/test/xtest.c
index af75f0c..6ea6862 100644
--- a/test/xtest.c
+++ b/test/xtest.c
@@ -61,7 +61,6 @@ static void xtest_init_devices(void)
     InitAtoms();
 
     XkbInitPrivates();
-    XTestInitPrivates();
 
     /* this also inits the xtest devices */
     InitCoreDevices();
-- 
1.7.1



-- 
keith.packard at intel.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg-devel/attachments/20100607/598855d0/attachment.pgp>


More information about the xorg-devel mailing list