summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Xi/exevents.c26
-rw-r--r--dix/eventconvert.c8
-rw-r--r--dix/getevents.c12
-rw-r--r--include/eventstr.h15
4 files changed, 30 insertions, 31 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 22126492a..2377d054e 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -699,23 +699,31 @@ XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChanged
static void
ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
{
- DeviceIntPtr master = device->u.master;
+ DeviceIntPtr slave;
+ int rc;
- if (IsMaster(device))
+ /* For now, we don't have devices that change physically. */
+ if (!IsMaster(device))
return;
- if (!master) /* if device was set floating between SIGIO and now */
- return;
+ rc = dixLookupDevice(&slave, dce->sourceid, serverClient, DixReadAccess);
+
+ if (rc != Success)
+ return; /* Device has disappeared */
+
+ if (!slave->u.master)
+ return; /* set floating since the event */
+ if (slave->u.master->id != dce->masterid)
+ return; /* not our slave anymore, don't care */
- master = GetMaster(device,
- (dce->flags & DEVCHANGE_POINTER_EVENT) ? MASTER_POINTER : MASTER_KEYBOARD);
+ /* FIXME: we probably need to send a DCE for the new slave now */
- master->public.devicePrivate = device->public.devicePrivate;
+ device->public.devicePrivate = slave->public.devicePrivate;
/* FIXME: the classes may have changed since we generated the event. */
- DeepCopyDeviceClasses(device, master, dce);
- XISendDeviceChangedEvent(device, master, dce);
+ DeepCopyDeviceClasses(slave, device, dce);
+ XISendDeviceChangedEvent(slave, device, dce);
}
/**
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index f0c98eadc..07a8e5fb9 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -350,7 +350,7 @@ appendKeyInfo(DeviceChangedEvent *dce, xXIKeyInfo* info)
info->type = XIKeyClass;
info->num_keycodes = dce->keys.max_keycode - dce->keys.min_keycode + 1;
info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes;
- info->sourceid = dce->deviceid;
+ info->sourceid = dce->sourceid;
kc = (uint32_t*)&info[1];
for (i = 0; i < info->num_keycodes; i++)
@@ -371,7 +371,7 @@ appendButtonInfo(DeviceChangedEvent *dce, xXIButtonInfo *info)
info->num_buttons = dce->buttons.num_buttons;
info->length = bytes_to_int32(sizeof(xXIButtonInfo)) +
info->num_buttons + mask_len;
- info->sourceid = dce->deviceid;
+ info->sourceid = dce->sourceid;
bits = (unsigned char*)&info[1];
memset(bits, 0, mask_len * 4);
@@ -399,7 +399,7 @@ appendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo *info, int axisnumbe
info->resolution = dce->valuators[axisnumber].resolution;
info->number = axisnumber;
info->mode = dce->valuators[axisnumber].mode; /* Server doesn't have per-axis mode yet */
- info->sourceid = dce->deviceid;
+ info->sourceid = dce->sourceid;
return info->length * 4;
}
@@ -441,7 +441,7 @@ eventToDeviceChanged(DeviceChangedEvent *dce, xEvent **xi)
dcce->evtype = XI_DeviceChanged;
dcce->time = dce->time;
dcce->deviceid = dce->deviceid;
- dcce->sourceid = dce->deviceid;
+ dcce->sourceid = dce->sourceid;
dcce->reason = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch;
dcce->num_classes = 0;
dcce->length = bytes_to_int32(len - sizeof(xEvent));
diff --git a/dix/getevents.c b/dix/getevents.c
index 5f0095430..2912c1e85 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -193,19 +193,15 @@ CreateClassesChangedEvent(EventList* event,
dce = (DeviceChangedEvent*)event->event;
memset(dce, 0, sizeof(DeviceChangedEvent));
- dce->deviceid = master->id;
+ dce->deviceid = slave->id;
+ dce->masterid = master->id;
dce->header = ET_Internal;
dce->length = sizeof(DeviceChangedEvent);
dce->type = ET_DeviceChanged;
dce->time = ms;
dce->flags = type;
- if (master->last.slave)
- {
- dce->flags |= DEVCHANGE_HAS_OLD_SLAVE;
- dce->old_slaveid = master->last.slave->id;
- }
- dce->flags |= DEVCHANGE_HAS_NEW_SLAVE;
- dce->new_slaveid = slave->id;
+ dce->flags |= DEVCHANGE_SLAVE_SWITCH;
+ dce->sourceid = slave->id;
if (slave->button)
{
diff --git a/include/eventstr.h b/include/eventstr.h
index b7611a5b1..8dd98be5f 100644
--- a/include/eventstr.h
+++ b/include/eventstr.h
@@ -120,9 +120,8 @@ struct _DeviceEvent
};
-/* Flags used in DeviceChangedEvent to signal if new/old slave is present. */
-#define DEVCHANGE_HAS_OLD_SLAVE 0x1
-#define DEVCHANGE_HAS_NEW_SLAVE 0x2
+/* Flags used in DeviceChangedEvent to signal if the slave has changed */
+#define DEVCHANGE_SLAVE_SWITCH 0x2
/* Flags used in DeviceChangedEvent to signal whether the event was a
* pointer event or a keyboard event */
#define DEVCHANGE_POINTER_EVENT 0x4
@@ -140,14 +139,10 @@ struct _DeviceChangedEvent
int length; /**< Length in bytes */
Time time; /**< Time in ms */
int deviceid; /**< Device whose capabilities have changed */
- int flags; /**< Mask of ::HAS_OLD_SLAVE, ::HAS_NEW_SLAVE,
+ int flags; /**< Mask of ::HAS_NEW_SLAVE,
::POINTER_EVENT, ::KEYBOARD_EVENT */
- /** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies SD previously
- * attached to this device. */
- int old_slaveid;
- /** If flags & HAS_NEW_SLAVE is set, new_slaveid specifies device now
- * attached to this device. */
- int new_slaveid;
+ int masterid; /**< MD when event was generated */
+ int sourceid; /**< The device that caused the change */
struct {
int num_buttons; /**< Number of buttons */