Backport device properties to XI 1.5 instead of XI 2.0

This commit is contained in:
Peter Hutterer 2008-08-13 13:11:44 +09:30
parent 8b9ed7dec2
commit de1573172a
3 changed files with 72 additions and 59 deletions

View File

@ -52,6 +52,7 @@ extern Mask DeviceOwnerGrabButtonMask;
extern Mask DeviceButtonGrabMask; extern Mask DeviceButtonGrabMask;
extern Mask DeviceButtonMotionMask; extern Mask DeviceButtonMotionMask;
extern Mask DevicePresenceNotifyMask; extern Mask DevicePresenceNotifyMask;
extern Mask DevicePropertyNotifyMask;
extern Mask DeviceEnterWindowMask; extern Mask DeviceEnterWindowMask;
extern Mask DeviceLeaveWindowMask; extern Mask DeviceLeaveWindowMask;
extern Mask PropagateMask[]; extern Mask PropagateMask[];
@ -72,6 +73,7 @@ extern int DeviceButtonStateNotify;
extern int DeviceMappingNotify; extern int DeviceMappingNotify;
extern int ChangeDeviceNotify; extern int ChangeDeviceNotify;
extern int DevicePresenceNotify; extern int DevicePresenceNotify;
extern int DevicePropertyNotify;
extern int DeviceEnterNotify; extern int DeviceEnterNotify;
extern int DeviceLeaveNotify; extern int DeviceLeaveNotify;

View File

@ -210,22 +210,24 @@ static int (*ProcIVector[])(ClientPtr) = {
ProcXSetDeviceValuators, /* 33 */ ProcXSetDeviceValuators, /* 33 */
ProcXGetDeviceControl, /* 34 */ ProcXGetDeviceControl, /* 34 */
ProcXChangeDeviceControl, /* 35 */ ProcXChangeDeviceControl, /* 35 */
ProcXQueryDevicePointer, /* 36 */ /* XI 1.5 */
ProcXWarpDevicePointer, /* 37 */ ProcXListDeviceProperties, /* 36 */
ProcXChangeDeviceCursor, /* 38 */ ProcXQueryDeviceProperty, /* 37 */
ProcXChangeDeviceHierarchy, /* 39 */ ProcXConfigureDeviceProperty, /* 38 */
ProcXChangeWindowAccess, /* 40 */ ProcXChangeDeviceProperty, /* 39 */
ProcXQueryWindowAccess, /* 41 */ ProcXDeleteDeviceProperty, /* 40 */
ProcXSetClientPointer, /* 42 */ ProcXGetDeviceProperty, /* 41 */
ProcXGetClientPointer, /* 43 */ /* XI 2 */
ProcXiSelectEvent, /* 44 */ ProcXQueryDevicePointer, /* 42 */
ProcXExtendedGrabDevice, /* 45 */ ProcXWarpDevicePointer, /* 43 */
ProcXListDeviceProperties, /* 46 */ ProcXChangeDeviceCursor, /* 44 */
ProcXQueryDeviceProperty, /* 47 */ ProcXChangeDeviceHierarchy, /* 45 */
ProcXConfigureDeviceProperty, /* 48 */ ProcXChangeWindowAccess, /* 46 */
ProcXChangeDeviceProperty, /* 49 */ ProcXQueryWindowAccess, /* 47 */
ProcXDeleteDeviceProperty, /* 50 */ ProcXSetClientPointer, /* 48 */
ProcXGetDeviceProperty /* 51 */ ProcXGetClientPointer, /* 49 */
ProcXiSelectEvent, /* 50 */
ProcXExtendedGrabDevice /* 51 */
}; };
/* For swapped clients */ /* For swapped clients */
@ -266,22 +268,22 @@ static int (*SProcIVector[])(ClientPtr) = {
SProcXSetDeviceValuators, /* 33 */ SProcXSetDeviceValuators, /* 33 */
SProcXGetDeviceControl, /* 34 */ SProcXGetDeviceControl, /* 34 */
SProcXChangeDeviceControl, /* 35 */ SProcXChangeDeviceControl, /* 35 */
SProcXQueryDevicePointer, /* 36 */ SProcXListDeviceProperties, /* 36 */
SProcXWarpDevicePointer, /* 37 */ SProcXQueryDeviceProperty, /* 37 */
SProcXChangeDeviceCursor, /* 38 */ SProcXConfigureDeviceProperty, /* 38 */
SProcXChangeDeviceHierarchy, /* 39 */ SProcXChangeDeviceProperty, /* 39 */
SProcXChangeWindowAccess, /* 40 */ SProcXDeleteDeviceProperty, /* 40 */
SProcXQueryWindowAccess, /* 41 */ SProcXGetDeviceProperty, /* 41 */
SProcXSetClientPointer, /* 42 */ SProcXQueryDevicePointer, /* 42 */
SProcXGetClientPointer, /* 43 */ SProcXWarpDevicePointer, /* 43 */
SProcXiSelectEvent, /* 44 */ SProcXChangeDeviceCursor, /* 44 */
SProcXExtendedGrabDevice, /* 45 */ SProcXChangeDeviceHierarchy, /* 45 */
SProcXListDeviceProperties, /* 46 */ SProcXChangeWindowAccess, /* 46 */
SProcXQueryDeviceProperty, /* 47 */ SProcXQueryWindowAccess, /* 47 */
SProcXConfigureDeviceProperty, /* 48 */ SProcXSetClientPointer, /* 48 */
SProcXChangeDeviceProperty, /* 49 */ SProcXGetClientPointer, /* 49 */
SProcXDeleteDeviceProperty, /* 50 */ SProcXiSelectEvent, /* 50 */
SProcXGetDeviceProperty /* 51 */ SProcXExtendedGrabDevice /* 51 */
}; };
/***************************************************************** /*****************************************************************
@ -308,6 +310,7 @@ Mask DeviceOwnerGrabButtonMask;
Mask DeviceButtonGrabMask; Mask DeviceButtonGrabMask;
Mask DeviceButtonMotionMask; Mask DeviceButtonMotionMask;
Mask DevicePresenceNotifyMask; Mask DevicePresenceNotifyMask;
Mask DevicePropertyNotifyMask;
Mask DeviceEnterWindowMask; Mask DeviceEnterWindowMask;
Mask DeviceLeaveWindowMask; Mask DeviceLeaveWindowMask;
@ -327,6 +330,7 @@ int DeviceButtonStateNotify;
int DeviceMappingNotify; int DeviceMappingNotify;
int ChangeDeviceNotify; int ChangeDeviceNotify;
int DevicePresenceNotify; int DevicePresenceNotify;
int DevicePropertyNotify;
int DeviceEnterNotify; int DeviceEnterNotify;
int DeviceLeaveNotify; int DeviceLeaveNotify;
@ -589,6 +593,17 @@ SDevicePresenceNotifyEvent (devicePresenceNotify *from, devicePresenceNotify *to
swaps(&to->control, n); swaps(&to->control, n);
} }
static void
SDevicePropertyNotifyEvent (devicePropertyNotify *from, devicePropertyNotify *to)
{
char n;
*to = *from;
swaps(&to->sequenceNumber,n);
swapl(&to->time, n);
swapl(&to->atom, n);
}
static void static void
SDeviceEnterNotifyEvent (deviceEnterNotify *from, deviceEnterNotify *to) SDeviceEnterNotifyEvent (deviceEnterNotify *from, deviceEnterNotify *to)
{ {
@ -786,7 +801,8 @@ FixExtensionEvents(ExtensionEntry * extEntry)
DeviceKeyStateNotify = ChangeDeviceNotify + 1; DeviceKeyStateNotify = ChangeDeviceNotify + 1;
DeviceButtonStateNotify = DeviceKeyStateNotify + 1; DeviceButtonStateNotify = DeviceKeyStateNotify + 1;
DevicePresenceNotify = DeviceButtonStateNotify + 1; DevicePresenceNotify = DeviceButtonStateNotify + 1;
DeviceEnterNotify = DevicePresenceNotify + 1; DevicePropertyNotify = DevicePresenceNotify + 1;
DeviceEnterNotify = DevicePropertyNotify + 1;
DeviceLeaveNotify = DeviceEnterNotify + 1; DeviceLeaveNotify = DeviceEnterNotify + 1;
event_base[KeyClass] = DeviceKeyPress; event_base[KeyClass] = DeviceKeyPress;
@ -876,6 +892,9 @@ FixExtensionEvents(ExtensionEntry * extEntry)
DevicePresenceNotifyMask = GetNextExtEventMask(); DevicePresenceNotifyMask = GetNextExtEventMask();
SetEventInfo(DevicePresenceNotifyMask, _devicePresence); SetEventInfo(DevicePresenceNotifyMask, _devicePresence);
DevicePropertyNotifyMask = GetNextExtEventMask();
SetMaskForExtEvent(DevicePropertyNotifyMask, DevicePropertyNotify);
DeviceEnterWindowMask = GetNextExtEventMask(); DeviceEnterWindowMask = GetNextExtEventMask();
SetMaskForExtEvent(DeviceEnterWindowMask, DeviceEnterNotify); SetMaskForExtEvent(DeviceEnterWindowMask, DeviceEnterNotify);
AllowPropagateSuppress(DeviceEnterWindowMask); AllowPropagateSuppress(DeviceEnterWindowMask);
@ -929,8 +948,9 @@ RestoreExtensionEvents(void)
DeviceKeyStateNotify = 13; DeviceKeyStateNotify = 13;
DeviceButtonStateNotify = 13; DeviceButtonStateNotify = 13;
DevicePresenceNotify = 14; DevicePresenceNotify = 14;
DeviceEnterNotify = 15; DevicePropertyNotify = 15;
DeviceLeaveNotify = 16; DeviceEnterNotify = 16;
DeviceLeaveNotify = 17;
BadDevice = 0; BadDevice = 0;
BadEvent = 1; BadEvent = 1;
@ -969,6 +989,7 @@ IResetProc(ExtensionEntry * unused)
EventSwapVector[DeviceMappingNotify] = NotImplemented; EventSwapVector[DeviceMappingNotify] = NotImplemented;
EventSwapVector[ChangeDeviceNotify] = NotImplemented; EventSwapVector[ChangeDeviceNotify] = NotImplemented;
EventSwapVector[DevicePresenceNotify] = NotImplemented; EventSwapVector[DevicePresenceNotify] = NotImplemented;
EventSwapVector[DevicePropertyNotify] = NotImplemented;
EventSwapVector[DeviceEnterNotify] = NotImplemented; EventSwapVector[DeviceEnterNotify] = NotImplemented;
EventSwapVector[DeviceLeaveNotify] = NotImplemented; EventSwapVector[DeviceLeaveNotify] = NotImplemented;
RestoreExtensionEvents(); RestoreExtensionEvents();
@ -1072,6 +1093,8 @@ SEventIDispatch(xEvent * from, xEvent * to)
DO_SWAP(SChangeDeviceNotifyEvent, changeDeviceNotify); DO_SWAP(SChangeDeviceNotifyEvent, changeDeviceNotify);
else if (type == DevicePresenceNotify) else if (type == DevicePresenceNotify)
DO_SWAP(SDevicePresenceNotifyEvent, devicePresenceNotify); DO_SWAP(SDevicePresenceNotifyEvent, devicePresenceNotify);
else if (type == DevicePropertyNotify)
DO_SWAP(SDevicePropertyNotifyEvent, devicePropertyNotify);
else if (type == DeviceEnterNotify) else if (type == DeviceEnterNotify)
DO_SWAP(SDeviceEnterNotifyEvent, deviceEnterNotify); DO_SWAP(SDeviceEnterNotifyEvent, deviceEnterNotify);
else if (type == DeviceLeaveNotify) else if (type == DeviceLeaveNotify)

View File

@ -191,21 +191,18 @@ XIDeleteAllDeviceProperties (DeviceIntPtr device)
{ {
XIPropertyPtr prop, next; XIPropertyPtr prop, next;
XIPropertyHandlerPtr curr_handler, next_handler; XIPropertyHandlerPtr curr_handler, next_handler;
devicePropertyNotifyEvent event; devicePropertyNotify event;
for (prop = device->properties.properties; prop; prop = next) for (prop = device->properties.properties; prop; prop = next)
{ {
next = prop->next; next = prop->next;
event.type = GenericEvent; event.type = DevicePropertyNotify;
event.extension = IReqCode;
event.evtype = XI_DevicePropertyNotify;
event.length = 0;
event.deviceid = device->id; event.deviceid = device->id;
event.state = PropertyDelete; event.state = PropertyDelete;
event.atom = prop->propertyName; event.atom = prop->propertyName;
event.time = currentTime.milliseconds; event.time = currentTime.milliseconds;
SendEventToAllWindows(device, XI_DevicePropertyNotifyMask, SendEventToAllWindows(device, DevicePropertyNotifyMask,
(xEvent*)&event, 1); (xEvent*)&event, 1);
XIDestroyDeviceProperty(prop); XIDestroyDeviceProperty(prop);
@ -226,7 +223,7 @@ int
XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient) XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient)
{ {
XIPropertyPtr prop, *prev; XIPropertyPtr prop, *prev;
devicePropertyNotifyEvent event; devicePropertyNotify event;
for (prev = &device->properties.properties; (prop = *prev); prev = &(prop->next)) for (prev = &device->properties.properties; (prop = *prev); prev = &(prop->next))
if (prop->propertyName == property) if (prop->propertyName == property)
@ -238,15 +235,12 @@ XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient)
if (prop) if (prop)
{ {
*prev = prop->next; *prev = prop->next;
event.type = GenericEvent; event.type = DevicePropertyNotify;
event.extension = IReqCode;
event.length = 0;
event.evtype = XI_DevicePropertyNotify;
event.deviceid = device->id; event.deviceid = device->id;
event.state = PropertyDelete; event.state = PropertyDelete;
event.atom = prop->propertyName; event.atom = prop->propertyName;
event.time = currentTime.milliseconds; event.time = currentTime.milliseconds;
SendEventToAllWindows(device, XI_DevicePropertyNotifyMask, SendEventToAllWindows(device, DevicePropertyNotifyMask,
(xEvent*)&event, 1); (xEvent*)&event, 1);
XIDestroyDeviceProperty (prop); XIDestroyDeviceProperty (prop);
} }
@ -261,7 +255,7 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
Bool fromClient) Bool fromClient)
{ {
XIPropertyPtr prop; XIPropertyPtr prop;
devicePropertyNotifyEvent event; devicePropertyNotify event;
int size_in_bytes; int size_in_bytes;
int total_size; int total_size;
unsigned long total_len; unsigned long total_len;
@ -379,15 +373,12 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
if (sendevent) if (sendevent)
{ {
event.type = GenericEvent; event.type = DevicePropertyNotify;
event.extension = IReqCode;
event.length = 0;
event.evtype = XI_DevicePropertyNotify;
event.deviceid = dev->id; event.deviceid = dev->id;
event.state = PropertyNewValue; event.state = PropertyNewValue;
event.atom = prop->propertyName; event.atom = prop->propertyName;
event.time = currentTime.milliseconds; event.time = currentTime.milliseconds;
SendEventToAllWindows(dev, XI_DevicePropertyNotifyMask, SendEventToAllWindows(dev, DevicePropertyNotifyMask,
(xEvent*)&event, 1); (xEvent*)&event, 1);
} }
return(Success); return(Success);
@ -786,17 +777,14 @@ ProcXGetDeviceProperty (ClientPtr client)
if (stuff->delete && (reply.bytesAfter == 0)) if (stuff->delete && (reply.bytesAfter == 0))
{ {
devicePropertyNotifyEvent event; devicePropertyNotify event;
event.type = GenericEvent; event.type = DevicePropertyNotify;
event.extension = IReqCode;
event.length = 0;
event.evtype = XI_DevicePropertyNotify;
event.deviceid = dev->id; event.deviceid = dev->id;
event.state = PropertyDelete; event.state = PropertyDelete;
event.atom = prop->propertyName; event.atom = prop->propertyName;
event.time = currentTime.milliseconds; event.time = currentTime.milliseconds;
SendEventToAllWindows(dev, XI_DevicePropertyNotifyMask, SendEventToAllWindows(dev, DevicePropertyNotifyMask,
(xEvent*)&event, 1); (xEvent*)&event, 1);
} }