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:
Peter Hutterer 2007-11-12 11:35:18 +10:30
parent 7a81bafc9b
commit a05f43bf3e
6 changed files with 74 additions and 43 deletions

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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 */

View File

@ -79,6 +79,7 @@ SOFTWARE.
#include <X11/extensions/XIproto.h>
#include "exglobals.h"
#include "exevents.h"
#include "listdev.h" /* for CopySwapXXXClass */
/** @file
* This file handles input device-related stuff.
@ -2314,9 +2315,50 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
*/
if (!master)
{
DeviceIntPtr it;
/* current root window */
InitializeSprite(dev, dev->spriteInfo->sprite->spriteTrace[0]);
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
dev->spriteInfo->sprite = master->spriteInfo->sprite;

View File

@ -111,7 +111,7 @@ key_autorepeats(DeviceIntPtr pDev, int key_code)
(1 << (key_code & 7)));
}
static void
void
CreateClassesChangedEvent(EventList* event,
DeviceIntPtr master,
DeviceIntPtr slave)

View File

@ -402,6 +402,9 @@ extern int GetMaximumEventsNum(void);
extern EventListPtr InitEventList(int num_events);
extern void FreeEventList(EventListPtr list, int num_events);
extern void CreateClassesChangedEvent(EventListPtr event,
DeviceIntPtr master,
DeviceIntPtr slave);
extern int GetPointerEvents(
EventListPtr events,
DeviceIntPtr pDev,