dix: When the last slave is removed, set master to the original classes.
DeviceClassesChangedEvent is sent to the client, where device == new slave.
This commit is contained in:
@@ -162,25 +162,10 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
|
||||
|
||||
/* event is already correct size, see comment in GetPointerEvents */
|
||||
classbuff = (char*)&xE[1];
|
||||
if (master->key)
|
||||
{
|
||||
/* we don't actually swap here, swapping is done later */
|
||||
CopySwapKeyClass(NullClient, master->key, &classbuff);
|
||||
dcce->num_classes++;
|
||||
}
|
||||
if (master->button)
|
||||
{
|
||||
CopySwapButtonClass(NullClient, master->button, &classbuff);
|
||||
dcce->num_classes++;
|
||||
}
|
||||
if (master->valuator)
|
||||
{
|
||||
CopySwapValuatorClass(NullClient, master->valuator, &classbuff);
|
||||
dcce->num_classes++;
|
||||
}
|
||||
|
||||
SendEventToAllWindows(master, XI_DeviceClassesChangedMask,
|
||||
xE, 1);
|
||||
/* we don't actually swap if there's a NullClient, swapping is done
|
||||
* later when event is delivered. */
|
||||
CopySwapClasses(NullClient, master, &dcce->num_classes, &classbuff);
|
||||
SendEventToAllWindows(master, XI_DeviceClassesChangedMask, xE, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
31
Xi/listdev.c
31
Xi/listdev.c
@@ -142,7 +142,7 @@ CopyDeviceName(char **namebuf, char *name)
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
static void
|
||||
CopySwapButtonClass(ClientPtr client, ButtonClassPtr b, char **buf)
|
||||
{
|
||||
char n;
|
||||
@@ -201,7 +201,7 @@ CopySwapDevice(ClientPtr client, DeviceIntPtr d, int num_classes,
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
static void
|
||||
CopySwapKeyClass(ClientPtr client, KeyClassPtr k, char **buf)
|
||||
{
|
||||
char n;
|
||||
@@ -231,7 +231,7 @@ CopySwapKeyClass(ClientPtr client, KeyClassPtr k, char **buf)
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
static int
|
||||
CopySwapValuatorClass(ClientPtr client, ValuatorClassPtr v, char **buf)
|
||||
{
|
||||
int i, j, axes, t_axes;
|
||||
@@ -286,17 +286,24 @@ ListDeviceInfo(ClientPtr client, DeviceIntPtr d, xDeviceInfoPtr dev,
|
||||
{
|
||||
CopyDeviceName(namebuf, d->name);
|
||||
CopySwapDevice(client, d, 0, devbuf);
|
||||
if (d->key != NULL) {
|
||||
CopySwapKeyClass(client, d->key, classbuf);
|
||||
dev->num_classes++;
|
||||
CopySwapClasses(client, d, &dev->num_classes, classbuf);
|
||||
}
|
||||
|
||||
void
|
||||
CopySwapClasses(ClientPtr client, DeviceIntPtr dev, CARD8 *num_classes,
|
||||
char** classbuf)
|
||||
{
|
||||
if (dev->key != NULL) {
|
||||
CopySwapKeyClass(client, dev->key, classbuf);
|
||||
(*num_classes)++;
|
||||
}
|
||||
if (d->button != NULL) {
|
||||
CopySwapButtonClass(client, d->button, classbuf);
|
||||
dev->num_classes++;
|
||||
if (dev->button != NULL) {
|
||||
CopySwapButtonClass(client, dev->button, classbuf);
|
||||
(*num_classes)++;
|
||||
}
|
||||
if (d->valuator != NULL) {
|
||||
dev->num_classes +=
|
||||
CopySwapValuatorClass(client, d->valuator, classbuf);
|
||||
if (dev->valuator != NULL) {
|
||||
(*num_classes) +=
|
||||
CopySwapValuatorClass(client, dev->valuator, classbuf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
16
Xi/listdev.h
16
Xi/listdev.h
@@ -44,15 +44,9 @@ void SRepXListInputDevices(ClientPtr /* client */ ,
|
||||
);
|
||||
|
||||
void
|
||||
CopySwapKeyClass(ClientPtr /* client */,
|
||||
KeyClassPtr /* k */,
|
||||
char** /* buf */);
|
||||
void
|
||||
CopySwapButtonClass(ClientPtr /* client */,
|
||||
ButtonClassPtr /* b */,
|
||||
char** /* buf */);
|
||||
int
|
||||
CopySwapValuatorClass(ClientPtr /* client */,
|
||||
ValuatorClassPtr /* v */,
|
||||
char** /* buf */);
|
||||
CopySwapClasses(ClientPtr /* client */,
|
||||
DeviceIntPtr /* dev */,
|
||||
CARD8* /* num_classes */,
|
||||
char** /* classbuf */);
|
||||
|
||||
#endif /* LISTDEV_H */
|
||||
|
||||
Reference in New Issue
Block a user