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