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:
parent
7a81bafc9b
commit
a05f43bf3e
|
@ -162,25 +162,10 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
|
||||||
|
|
||||||
/* event is already correct size, see comment in GetPointerEvents */
|
/* event is already correct size, see comment in GetPointerEvents */
|
||||||
classbuff = (char*)&xE[1];
|
classbuff = (char*)&xE[1];
|
||||||
if (master->key)
|
/* we don't actually swap if there's a NullClient, swapping is done
|
||||||
{
|
* later when event is delivered. */
|
||||||
/* we don't actually swap here, swapping is done later */
|
CopySwapClasses(NullClient, master, &dcce->num_classes, &classbuff);
|
||||||
CopySwapKeyClass(NullClient, master->key, &classbuff);
|
SendEventToAllWindows(master, XI_DeviceClassesChangedMask, xE, 1);
|
||||||
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);
|
|
||||||
return;
|
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)
|
CopySwapButtonClass(ClientPtr client, ButtonClassPtr b, char **buf)
|
||||||
{
|
{
|
||||||
char n;
|
char n;
|
||||||
|
@ -201,7 +201,7 @@ CopySwapDevice(ClientPtr client, DeviceIntPtr d, int num_classes,
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
static void
|
||||||
CopySwapKeyClass(ClientPtr client, KeyClassPtr k, char **buf)
|
CopySwapKeyClass(ClientPtr client, KeyClassPtr k, char **buf)
|
||||||
{
|
{
|
||||||
char n;
|
char n;
|
||||||
|
@ -231,7 +231,7 @@ CopySwapKeyClass(ClientPtr client, KeyClassPtr k, char **buf)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
static int
|
||||||
CopySwapValuatorClass(ClientPtr client, ValuatorClassPtr v, char **buf)
|
CopySwapValuatorClass(ClientPtr client, ValuatorClassPtr v, char **buf)
|
||||||
{
|
{
|
||||||
int i, j, axes, t_axes;
|
int i, j, axes, t_axes;
|
||||||
|
@ -286,17 +286,24 @@ ListDeviceInfo(ClientPtr client, DeviceIntPtr d, xDeviceInfoPtr dev,
|
||||||
{
|
{
|
||||||
CopyDeviceName(namebuf, d->name);
|
CopyDeviceName(namebuf, d->name);
|
||||||
CopySwapDevice(client, d, 0, devbuf);
|
CopySwapDevice(client, d, 0, devbuf);
|
||||||
if (d->key != NULL) {
|
CopySwapClasses(client, d, &dev->num_classes, classbuf);
|
||||||
CopySwapKeyClass(client, d->key, classbuf);
|
}
|
||||||
dev->num_classes++;
|
|
||||||
|
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) {
|
if (dev->button != NULL) {
|
||||||
CopySwapButtonClass(client, d->button, classbuf);
|
CopySwapButtonClass(client, dev->button, classbuf);
|
||||||
dev->num_classes++;
|
(*num_classes)++;
|
||||||
}
|
}
|
||||||
if (d->valuator != NULL) {
|
if (dev->valuator != NULL) {
|
||||||
dev->num_classes +=
|
(*num_classes) +=
|
||||||
CopySwapValuatorClass(client, d->valuator, classbuf);
|
CopySwapValuatorClass(client, dev->valuator, classbuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
16
Xi/listdev.h
16
Xi/listdev.h
|
@ -44,15 +44,9 @@ void SRepXListInputDevices(ClientPtr /* client */ ,
|
||||||
);
|
);
|
||||||
|
|
||||||
void
|
void
|
||||||
CopySwapKeyClass(ClientPtr /* client */,
|
CopySwapClasses(ClientPtr /* client */,
|
||||||
KeyClassPtr /* k */,
|
DeviceIntPtr /* dev */,
|
||||||
char** /* buf */);
|
CARD8* /* num_classes */,
|
||||||
void
|
char** /* classbuf */);
|
||||||
CopySwapButtonClass(ClientPtr /* client */,
|
|
||||||
ButtonClassPtr /* b */,
|
|
||||||
char** /* buf */);
|
|
||||||
int
|
|
||||||
CopySwapValuatorClass(ClientPtr /* client */,
|
|
||||||
ValuatorClassPtr /* v */,
|
|
||||||
char** /* buf */);
|
|
||||||
#endif /* LISTDEV_H */
|
#endif /* LISTDEV_H */
|
||||||
|
|
|
@ -79,6 +79,7 @@ SOFTWARE.
|
||||||
#include <X11/extensions/XIproto.h>
|
#include <X11/extensions/XIproto.h>
|
||||||
#include "exglobals.h"
|
#include "exglobals.h"
|
||||||
#include "exevents.h"
|
#include "exevents.h"
|
||||||
|
#include "listdev.h" /* for CopySwapXXXClass */
|
||||||
|
|
||||||
/** @file
|
/** @file
|
||||||
* This file handles input device-related stuff.
|
* This file handles input device-related stuff.
|
||||||
|
@ -2314,9 +2315,50 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
|
||||||
*/
|
*/
|
||||||
if (!master)
|
if (!master)
|
||||||
{
|
{
|
||||||
|
DeviceIntPtr it;
|
||||||
/* current root window */
|
/* current root window */
|
||||||
InitializeSprite(dev, dev->spriteInfo->sprite->spriteTrace[0]);
|
InitializeSprite(dev, dev->spriteInfo->sprite->spriteTrace[0]);
|
||||||
dev->spriteInfo->spriteOwner = FALSE;
|
dev->spriteInfo->spriteOwner = FALSE;
|
||||||
|
|
||||||
|
/* the master may need to restore the original classes, search for a
|
||||||
|
* device that is still paired with our master. */
|
||||||
|
for (it = inputInfo.devices; it; it = it->next)
|
||||||
|
if (!it->isMaster && it->u.master == master)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!it) /* no dev is paired with our master */
|
||||||
|
{
|
||||||
|
ClassesPtr classes;
|
||||||
|
EventList event = { NULL, 0};
|
||||||
|
char* classbuf;
|
||||||
|
|
||||||
|
classes = master->devPrivates[MasterDevClassesPrivIdx].ptr;
|
||||||
|
master->key = classes->key;
|
||||||
|
master->valuator = classes->valuator;
|
||||||
|
master->button = classes->button;
|
||||||
|
master->focus = classes->focus;
|
||||||
|
master->proximity = classes->proximity;
|
||||||
|
master->absolute = classes->absolute;
|
||||||
|
master->kbdfeed = classes->kbdfeed;
|
||||||
|
master->ptrfeed = classes->ptrfeed;
|
||||||
|
master->intfeed = classes->intfeed;
|
||||||
|
master->stringfeed = classes->stringfeed;
|
||||||
|
master->bell = classes->bell;
|
||||||
|
master->leds = classes->leds;
|
||||||
|
|
||||||
|
/* Send event to clients */
|
||||||
|
CreateClassesChangedEvent(&event, master, master);
|
||||||
|
deviceClassesChangedEvent *dcce =
|
||||||
|
(deviceClassesChangedEvent*)event.event;
|
||||||
|
dcce->deviceid = master->id;
|
||||||
|
dcce->num_classes = 0;
|
||||||
|
classbuf = (char*)&event.event[1];
|
||||||
|
CopySwapClasses(NullClient, master, &dcce->num_classes, &classbuf);
|
||||||
|
SendEventToAllWindows(master, XI_DeviceClassesChangedMask,
|
||||||
|
event.event, 1);
|
||||||
|
xfree(event.event);
|
||||||
|
}
|
||||||
|
|
||||||
} else
|
} else
|
||||||
dev->spriteInfo->sprite = master->spriteInfo->sprite;
|
dev->spriteInfo->sprite = master->spriteInfo->sprite;
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,7 @@ key_autorepeats(DeviceIntPtr pDev, int key_code)
|
||||||
(1 << (key_code & 7)));
|
(1 << (key_code & 7)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
CreateClassesChangedEvent(EventList* event,
|
CreateClassesChangedEvent(EventList* event,
|
||||||
DeviceIntPtr master,
|
DeviceIntPtr master,
|
||||||
DeviceIntPtr slave)
|
DeviceIntPtr slave)
|
||||||
|
|
|
@ -402,6 +402,9 @@ extern int GetMaximumEventsNum(void);
|
||||||
extern EventListPtr InitEventList(int num_events);
|
extern EventListPtr InitEventList(int num_events);
|
||||||
extern void FreeEventList(EventListPtr list, int num_events);
|
extern void FreeEventList(EventListPtr list, int num_events);
|
||||||
|
|
||||||
|
extern void CreateClassesChangedEvent(EventListPtr event,
|
||||||
|
DeviceIntPtr master,
|
||||||
|
DeviceIntPtr slave);
|
||||||
extern int GetPointerEvents(
|
extern int GetPointerEvents(
|
||||||
EventListPtr events,
|
EventListPtr events,
|
||||||
DeviceIntPtr pDev,
|
DeviceIntPtr pDev,
|
||||||
|
|
Loading…
Reference in New Issue