xserver: Branch 'mpx' - 9 commits

Peter Hutterer whot at kemper.freedesktop.org
Fri Jan 25 16:12:56 PST 2008


 Xext/geext.c                   |   46 ++++++++++++++++++++++++++++++++++++-----
 Xext/geext.h                   |   14 ++++++++----
 Xi/chdevhier.c                 |   10 +++-----
 Xi/xiselev.c                   |   13 ++++++++---
 config/dbus-core.c             |    5 ++--
 config/dbus.c                  |    5 +---
 config/hal.c                   |   17 ++++++++-------
 dix/devices.c                  |   12 +++++-----
 dix/events.c                   |    4 +--
 hw/vfb/InitInput.c             |    4 +--
 hw/xfree86/common/xf86Xinput.c |    2 -
 hw/xnest/Init.c                |    4 +--
 include/input.h                |    4 ++-
 xkb/xkbLEDs.c                  |    3 ++
 14 files changed, 98 insertions(+), 45 deletions(-)

New commits:
commit 210eeef495770c1883c842ff003c28ce25f279d4
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat Jan 26 09:39:54 2008 +1030

    config: don't reset connection info on disconnect.
    
    If dbus is restarted, we try to connect again and this is difficult if the
    busname and/or busobject is not set.

diff --git a/config/dbus.c b/config/dbus.c
index f6ac4c1..0be42af 100644
--- a/config/dbus.c
+++ b/config/dbus.c
@@ -396,9 +396,6 @@ err_start:
 static void
 disconnect_hook(void *data)
 {
-    struct connection_info *info = data;
-
-    reset_info(info);
 }
 
 #if 0
@@ -440,4 +437,6 @@ void
 config_dbus_fini(void)
 {
     config_dbus_core_remove_hook(&core_hook);
+    connection_data.busname[0] = '\0';
+    connection_data.busobject[0] = '\0';
 }
commit d23266522390a4ef7203ae7c062b2b920e45f9d7
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 25 13:54:47 2008 +1030

    config: check connection != NULL before getting dbus' dispatch status.

diff --git a/config/dbus-core.c b/config/dbus-core.c
index 9cf1530..b349c6e 100644
--- a/config/dbus-core.c
+++ b/config/dbus-core.c
@@ -56,8 +56,9 @@ wakeup_handler(pointer data, int err, pointer read_mask)
     if (info->connection && FD_ISSET(info->fd, (fd_set *) read_mask)) {
         do {
             dbus_connection_read_write_dispatch(info->connection, 0);
-        } while (dbus_connection_get_dispatch_status(info->connection) ==
-                  DBUS_DISPATCH_DATA_REMAINS);
+        } while (info->connection &&
+                 dbus_connection_get_is_connected(info->connection) &&
+                 dbus_connection_get_dispatch_status(info->connection) == DBUS_DISPATCH_DATA_REMAINS);
     }
 }
 
commit fb07fab2c07e7b0834724541dc47bfba02ba8574
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 25 13:45:22 2008 +1030

    config: only shutdown libhal if the connection is valid.
    
    Thanks to libdbus' extensive use of assert we won't just get an error, it'll
    bring the whole server down for us.

diff --git a/config/hal.c b/config/hal.c
index 52a0113..1575422 100644
--- a/config/hal.c
+++ b/config/hal.c
@@ -283,12 +283,14 @@ disconnect_hook(void *data)
     struct config_hal_info *info = data;
 
     if (info->hal_ctx) {
-        dbus_error_init(&error);
-        if (!libhal_ctx_shutdown(info->hal_ctx, &error))
-            DebugF("[config/hal] couldn't shut down context: %s (%s)\n",
-                   error.name, error.message);
+        if (dbus_connection_get_is_connected(info->system_bus)) {
+            dbus_error_init(&error);
+            if (!libhal_ctx_shutdown(info->hal_ctx, &error))
+                DebugF("[config/hal] couldn't shut down context: %s (%s)\n",
+                        error.name, error.message);
+            dbus_error_free(&error);
+        }
         libhal_ctx_free(info->hal_ctx);
-        dbus_error_free(&error);
     }
 
     info->hal_ctx = NULL;
commit 7732898aaa70e076000f6e6aa9420482896ed996
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 25 11:48:13 2008 +1030

    config: add a debug message, fix a whitespace error.

diff --git a/config/hal.c b/config/hal.c
index 4ab2961..52a0113 100644
--- a/config/hal.c
+++ b/config/hal.c
@@ -105,7 +105,7 @@ get_prop_string(LibHalContext *hal_ctx, const char *udi, const char *name)
     char *prop, *ret;
 
     prop = libhal_device_get_property_string(hal_ctx, udi, name, NULL);
-    DebugF(" [config/hal] getting %s on %s returned %s\n", name, udi, prop);
+    DebugF("[config/hal] getting %s on %s returned %s\n", name, udi, prop);
     if (prop) {
         ret = xstrdup(prop);
         libhal_free_string(prop);
@@ -234,8 +234,9 @@ device_added(LibHalContext *hal_ctx, const char *udi)
     if (xkb_options)
         add_option(&options, "xkb_options", xkb_options);
 
+    DebugF("[config/hal] Adding device %s\n", name);
     if (NewInputDeviceRequest(options, &dev) != Success) {
-        DebugF("[config/hal] NewInputDeviceRequest failed\n");
+        ErrorF("[config/hal] NewInputDeviceRequest failed\n");
         dev = NULL;
         goto unwind;
     }
commit 466f6552190d1b83d66ebfd71e07921ed6210ee2
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jan 23 16:11:31 2008 +1030

    Xi: if deviceid is > 127 assume GE mask is for all devices (XiSelectEvent).

diff --git a/Xi/xiselev.c b/Xi/xiselev.c
index f24dd36..2bfbd82 100644
--- a/Xi/xiselev.c
+++ b/Xi/xiselev.c
@@ -69,9 +69,13 @@ ProcXiSelectEvent(ClientPtr client)
     if (rc != Success)
         return rc;
 
-    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
-    if (rc != Success)
-        return rc;
+    if (stuff->deviceid & (0x1 << 7)) /* all devices */
+        pDev = NULL;
+    else {
+        rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
+        if (rc != Success)
+            return rc;
+    }
 
     GEWindowSetMask(client, pDev, pWin, IReqCode, stuff->mask);
 
commit 379f057646588fa3211d7ba0ec8d77d2fc0ad246
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jan 23 16:08:37 2008 +1030

    Xext: add GEDeviceMaskIsSet (GE mask checking per device)
    
    If a mask was set for the NULL device, then we pretend the mask is set for all
    devices.

diff --git a/Xext/geext.c b/Xext/geext.c
index 0127a05..77bb181 100644
--- a/Xext/geext.c
+++ b/Xext/geext.c
@@ -378,4 +378,38 @@ void GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev,
     GERecalculateWinMask(pWin);
 }
 
+/**
+ * Return TRUE if the mask for the given device is set.
+ * @param pWin Window the event may be delivered to.
+ * @param pDev Device the device originating the event. May be NULL.
+ * @param extension Extension ID
+ * @param mask Event mask
+ */
+BOOL GEDeviceMaskIsSet(WindowPtr pWin, DeviceIntPtr pDev,
+                       int extension, Mask mask)
+{
+    GenericMaskPtr gemask;
+
+    if (!pWin->optional || !pWin->optional->geMasks)
+        return FALSE;
+
+    extension &= 0x7F;
+
+    if (!pWin->optional->geMasks->eventMasks[extension] & mask)
+        return FALSE;
+
+
+    gemask = pWin->optional->geMasks->geClients;
+
+    while(gemask)
+    {
+        if ((!gemask->dev || gemask->dev == pDev) && 
+                (gemask->eventMask[extension] & mask))
+            return TRUE;
+
+        gemask = gemask->next;
+    }
+
+    return FALSE;
+}
 
diff --git a/Xext/geext.h b/Xext/geext.h
index a902127..577654a 100644
--- a/Xext/geext.h
+++ b/Xext/geext.h
@@ -106,7 +106,8 @@ void GERegisterExtension(
         );
 
 void GEInitEvent(xGenericEvent* ev, int extension);
-
+BOOL GEDeviceMaskIsSet(WindowPtr pWin, DeviceIntPtr pDev, 
+                       int extension, Mask mask);
 
 void GEExtensionInit(void);
 
diff --git a/dix/events.c b/dix/events.c
index f955d81..2928554 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2151,7 +2151,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 
             /* if we get here, filter should be set to the GE specific mask.
                check if any client wants it */
-            if (!GEMaskIsSet(pWin, GEEXT(pEvents), filter))
+            if (!GEDeviceMaskIsSet(pWin, pDev, GEEXT(pEvents), filter))
                 return 0;
 
             /* run through all clients, deliver event */
@@ -2471,7 +2471,7 @@ DeliverDeviceEvents(WindowPtr pWin, xEvent *xE, GrabPtr grab,
 
         while(win)
         {
-            if (GEMaskIsSet(win, GEEXT(xE), filter))
+            if (GEDeviceMaskIsSet(win, dev, GEEXT(xE), filter))
             {
                 if (GEExtensions[GEEXTIDX(xE)].evfill)
                     GEExtensions[GEEXTIDX(xE)].evfill(ge, dev, win, grab);
commit 91dc8c43d2343e494c59023484883f4683bdc639
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jan 23 15:45:02 2008 +1030

    Xi: Change window access right check to RecieveAccess in XiSelectEvent.

diff --git a/Xi/xiselev.c b/Xi/xiselev.c
index 601b10c..f24dd36 100644
--- a/Xi/xiselev.c
+++ b/Xi/xiselev.c
@@ -65,7 +65,7 @@ ProcXiSelectEvent(ClientPtr client)
     REQUEST(xXiSelectEventReq);
     REQUEST_SIZE_MATCH(xXiSelectEventReq);
 
-    rc = dixLookupWindow(&pWin, stuff->window, client, DixWriteAccess);
+    rc = dixLookupWindow(&pWin, stuff->window, client, DixReceiveAccess);
     if (rc != Success)
         return rc;
 
commit 94a6a65ae7414c8247aa1741ec5c7561e6f4bbe0
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jan 23 15:43:48 2008 +1030

    Xext: allow per-device GE masks.
    
    Instead of a single mask per client we allow the storage of a mask per client
    per device.

diff --git a/Xext/geext.c b/Xext/geext.c
index 8f48e44..0127a05 100644
--- a/Xext/geext.c
+++ b/Xext/geext.c
@@ -300,7 +300,8 @@ GERecalculateWinMask(WindowPtr pWin)
 }
 
 /* Set generic event mask for given window. */
-void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask)
+void GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev, 
+                     WindowPtr pWin, int extension, Mask mask)
 {
     GenericMaskPtr cli;
 
@@ -326,13 +327,13 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask
         cli = evmasks->geClients;
         while(cli)
         {
-            if (cli->client == pClient)
+            if (cli->client == pClient && cli->dev == pDev)
                 break;
             cli = cli->next;
         }
         if (!cli)
         {
-            /* new client */
+            /* new client and/or new device */
             cli  = (GenericMaskPtr)xcalloc(1, sizeof(GenericMaskRec));
             if (!cli)
             {
@@ -341,6 +342,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask
             }
             cli->next = evmasks->geClients;
             cli->client = pClient;
+            cli->dev = pDev;
             evmasks->geClients = cli;
         }
         cli->eventMask[extension] = mask;
@@ -348,7 +350,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask
     {
         /* remove client. */
         cli = pWin->optional->geMasks->geClients;
-        if (cli->client == pClient)
+        if (cli->client == pClient && cli->dev == pDev)
         {
             pWin->optional->geMasks->geClients = cli->next;
             xfree(cli);
@@ -359,7 +361,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask
 
             while(cli)
             {
-                if (cli->client == pClient)
+                if (cli->client == pClient && cli->dev == pDev)
                 {
                     prev->next = cli->next;
                     xfree(cli);
diff --git a/Xext/geext.h b/Xext/geext.h
index 1ba71e0..a902127 100644
--- a/Xext/geext.h
+++ b/Xext/geext.h
@@ -39,12 +39,13 @@ from the author.
  * This struct is used both in the window and by grabs to determine the event
  * mask for a client.
  * A window will have a linked list of these structs, with one entry per
- * client, null-terminated.
+ * client per device, null-terminated.
  * A grab has only one instance of this struct.
  */
 typedef struct _GenericMaskRec {
-    ClientPtr   client;                   /* client who set the event mask */
-    Mask        eventMask[MAXEXTENSIONS]; /* one mask per extension */
+    ClientPtr       client;                /* client who set the event mask */
+    DeviceIntPtr    dev;
+    Mask            eventMask[MAXEXTENSIONS]; /* one mask per extension */
     struct _GenericMaskRec* next;            
 } GenericMaskRec, *GenericMaskPtr;
 
@@ -94,7 +95,9 @@ extern GEExtension GEExtensions[MAXEXTENSIONS];
 
 
 /* Interface for other extensions */
-void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask);
+void GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev,
+                     WindowPtr pWin, int extension, Mask mask);
+
 void GERegisterExtension(
         int extension,
         void (*ev_dispatch)(xGenericEvent* from, xGenericEvent* to),
diff --git a/Xi/xiselev.c b/Xi/xiselev.c
index 3c85032..601b10c 100644
--- a/Xi/xiselev.c
+++ b/Xi/xiselev.c
@@ -61,16 +61,19 @@ ProcXiSelectEvent(ClientPtr client)
 {
     int rc;
     WindowPtr pWin;
+    DeviceIntPtr pDev;
     REQUEST(xXiSelectEventReq);
     REQUEST_SIZE_MATCH(xXiSelectEventReq);
 
     rc = dixLookupWindow(&pWin, stuff->window, client, DixWriteAccess);
     if (rc != Success)
-    {
         return rc;
-    }
 
-    GEWindowSetMask(client, pWin, IReqCode, stuff->mask);
+    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
+    if (rc != Success)
+        return rc;
+
+    GEWindowSetMask(client, pDev, pWin, IReqCode, stuff->mask);
 
     return Success;
 }
commit ba315ae5ddd00763147a4b0cdcacba7691793dfc
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Mon Jan 21 23:43:53 2008 +1030

    Xi: add XACE hooks for device creation (ChangeDeviceHierarchy)
    
    AddInputDevice checks for permissions already, so all we do is modify a few
    callers to let AID sort it out.

diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index 65ff387..b749567 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -52,6 +52,7 @@ from the author.
 #include "exevents.h"
 #include "exglobals.h"
 #include "geext.h"
+#include "xace.h"
 
 #include "chdevhier.h"
 
@@ -104,20 +105,17 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
                 {
                     xCreateMasterInfo* c = (xCreateMasterInfo*)any;
                     char* name;
-                    int ret;
-
-                    /* XXX: check for creation permission */
 
                     SWAPIF(swaps(&c->namelen, n));
                     name = xcalloc(c->namelen + 1, sizeof(char));
                     strncpy(name, (char*)&c[1], c->namelen);
 
 
-                    ret = AllocMasterDevice(name, &ptr, &keybd);
-                    if (ret != Success)
+                    rc = AllocMasterDevice(client, name, &ptr, &keybd);
+                    if (rc != Success)
                     {
                         xfree(name);
-                        return ret;
+                        return rc;
                     }
 
                     if (!c->sendCore)
diff --git a/dix/devices.c b/dix/devices.c
index e78c1e7..0ffc798 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -100,7 +100,7 @@ DevPrivateKey CoreDevicePrivateKey = &CoreDevicePrivateKey;
  * @return The newly created device.
  */
 DeviceIntPtr
-AddInputDevice(DeviceProc deviceProc, Bool autoStart)
+AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
 {
     DeviceIntPtr dev, *prev; /* not a typo */
     DeviceIntPtr devtmp;
@@ -562,9 +562,9 @@ CorePointerProc(DeviceIntPtr pDev, int what)
 void
 InitCoreDevices(void)
 {
-    if (AllocMasterDevice("Virtual core",
+    if (AllocMasterDevice(serverClient, "Virtual core",
                           &inputInfo.pointer,
-                          &inputInfo.keyboard) == BadAlloc)
+                          &inputInfo.keyboard) != Success)
         FatalError("Failed to allocate core devices");
 }
 
@@ -2597,13 +2597,13 @@ NextFreePointerDevice()
  * EnableDevice() manually.
  */
 int
-AllocMasterDevice(char* name, DeviceIntPtr* ptr, DeviceIntPtr* keybd)
+AllocMasterDevice(ClientPtr client, char* name, DeviceIntPtr* ptr, DeviceIntPtr* keybd)
 {
     DeviceIntPtr pointer;
     DeviceIntPtr keyboard;
     *ptr = *keybd = NULL;
 
-    pointer = AddInputDevice(CorePointerProc, TRUE);
+    pointer = AddInputDevice(client, CorePointerProc, TRUE);
     if (!pointer)
         return BadAlloc;
 
@@ -2628,7 +2628,7 @@ AllocMasterDevice(char* name, DeviceIntPtr* ptr, DeviceIntPtr* keybd)
     pointer->u.lastSlave = NULL;
     pointer->isMaster = TRUE;
 
-    keyboard = AddInputDevice(CoreKeyboardProc, TRUE);
+    keyboard = AddInputDevice(client, CoreKeyboardProc, TRUE);
     if (!keyboard)
         return BadAlloc;
 
diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index 99cf56c..393698f 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -318,8 +318,8 @@ void
 InitInput(int argc, char *argv[])
 {
     DeviceIntPtr p, k;
-    p = AddInputDevice(vfbMouseProc, TRUE);
-    k = AddInputDevice(vfbKeybdProc, TRUE);
+    p = AddInputDevice(serverClient, vfbMouseProc, TRUE);
+    k = AddInputDevice(serverClient, vfbKeybdProc, TRUE);
     RegisterPointerDevice(p);
     RegisterKeyboardDevice(k);
     (void)mieqInit();
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 92298e1..a3b19e9 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -158,7 +158,7 @@ xf86ActivateDevice(LocalDevicePtr local)
     DeviceIntPtr	dev;
 
     if (local->flags & XI86_CONFIGURED) {
-        dev = AddInputDevice(local->device_control, TRUE);
+        dev = AddInputDevice(serverClient, local->device_control, TRUE);
 
         if (dev == NULL)
             FatalError("Too many input devices");
diff --git a/hw/xnest/Init.c b/hw/xnest/Init.c
index 7b344e2..de80cb5 100644
--- a/hw/xnest/Init.c
+++ b/hw/xnest/Init.c
@@ -89,8 +89,8 @@ InitOutput(ScreenInfo *screenInfo, int argc, char *argv[])
 void
 InitInput(int argc, char *argv[])
 {
-  xnestPointerDevice = AddInputDevice(xnestPointerProc, TRUE);
-  xnestKeyboardDevice = AddInputDevice(xnestKeyboardProc, TRUE);
+  xnestPointerDevice = AddInputDevice(serverClient, xnestPointerProc, TRUE);
+  xnestKeyboardDevice = AddInputDevice(serverClient, xnestKeyboardProc, TRUE);
 
   if (!xnestEvents)
       xnestEvents = (xEvent *) xcalloc(sizeof(xEvent), GetMaximumEventsNum());
diff --git a/include/input.h b/include/input.h
index da02aea..1863676 100644
--- a/include/input.h
+++ b/include/input.h
@@ -180,6 +180,7 @@ typedef struct _InputOption {
 extern void InitCoreDevices(void);
 
 extern DeviceIntPtr AddInputDevice(
+    ClientPtr /*client*/,
     DeviceProc /*deviceProc*/,
     Bool /*autoStart*/);
 
@@ -471,7 +472,8 @@ extern Bool RegisterPairingClient(ClientPtr client);
 extern DeviceIntPtr GuessFreePointerDevice(void);
 extern DeviceIntPtr NextFreePointerDevice(void);
 
-extern int AllocMasterDevice(char* name,
+extern int AllocMasterDevice(ClientPtr client,
+                             char* name,
                              DeviceIntPtr* ptr,
                              DeviceIntPtr* keybd);
 extern void DeepCopyDeviceClasses(DeviceIntPtr from,
diff --git a/xkb/xkbLEDs.c b/xkb/xkbLEDs.c
index 2877af0..55ce12a 100644
--- a/xkb/xkbLEDs.c
+++ b/xkb/xkbLEDs.c
@@ -63,6 +63,9 @@ XkbSrvLedInfoPtr	sli;
 
     sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
 
+    if (!sli)
+        return update;
+
     if (state_changes&(XkbModifierStateMask|XkbGroupStateMask))
 	update|= sli->usesEffective;
     if (state_changes&(XkbModifierBaseMask|XkbGroupBaseMask))


More information about the xorg-commit mailing list