diff options
author | Peter Hutterer <peter.hutterer@redhat.com> | 2008-11-17 11:50:06 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@redhat.com> | 2008-11-17 12:16:11 +1000 |
commit | 305d356e43462834a2fdd2cf59d47b055c2416fd (patch) | |
tree | 4b361614f368805ace0718b2110eebca22a5d3d5 | |
parent | 45b73dc157f326785e1022f5476bfc1f9f514d6e (diff) |
Add support for XI 1.5 device properties.libXi-1.2-branch
This is a manual merge from master onto libXi 1.1.4. The branches have
diverged too much to make cherry-picking reasonable and readable.
This patch includes the property support provided by the combination of the
following patches:
- 7d5bb99ffce3200f82420c5a5ebac3b445aac633
- 0211e3e8277c590349903989f1676f6af4baa44b
- bfd2e08f3530091fbcd8c078f684e9aab9057df0
- bec02767629ed795582ba3f645299d7036093511
- f9a5371d43b2c6023745f766d0e8ceff2acdff60
- e179b124aac13387c6f730197b8852c1f69eb9e3
Man pages are copied from the parsed docbook output from master.
-rw-r--r-- | man/Makefile.am | 14 | ||||
-rw-r--r-- | man/XGetDeviceProperty.man | 191 | ||||
-rw-r--r-- | man/XListDeviceProperties.man | 95 | ||||
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/XChDProp.c | 106 | ||||
-rw-r--r-- | src/XDelDProp.c | 64 | ||||
-rw-r--r-- | src/XExtInt.c | 19 | ||||
-rw-r--r-- | src/XGetDProp.c | 139 | ||||
-rw-r--r-- | src/XListDProp.c | 84 |
9 files changed, 713 insertions, 3 deletions
diff --git a/man/Makefile.am b/man/Makefile.am index 9efc88c..c8c7624 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -51,7 +51,9 @@ libman_PRE = \ XSetDeviceButtonMapping.man \ XSetDeviceFocus.man \ XSetDeviceMode.man \ - XSetDeviceValuators.man + XSetDeviceValuators.man \ + XListDeviceProperties.man \ + XGetDeviceProperty.man BUILT_SOURCES = shadows.DONE @@ -89,7 +91,8 @@ all_shadows = \ $(XOpenDevice_shadows) \ $(XSetDeviceButtonMapping_shadows) \ $(XSetDeviceFocus_shadows) \ - $(XSelectExtensionEvent_shadows) + $(XSelectExtensionEvent_shadows) \ + $(XGetDeviceProperty_shadows) XGetDeviceControl_shadows = \ @@ -134,6 +137,10 @@ XSetDeviceFocus_shadows = \ XSelectExtensionEvent_shadows = \ XGetSelectedExtensionEvents +XGetDeviceProperty_shadows = \ + XDeleteDeviceProperty \ + XChangeDeviceProperty + shadows.DONE: -rm -f $(all_shadows:=.@LIB_MAN_SUFFIX@) (for i in $(XGetDeviceControl_shadows:=.@LIB_MAN_SUFFIX@) ; do \ @@ -178,3 +185,6 @@ shadows.DONE: (for i in $(XSelectExtensionEvent_shadows:=.@LIB_MAN_SUFFIX@) ; do \ echo .so man$(LIB_MAN_DIR_SUFFIX)/XSelectExtensionEvent.$(LIB_MAN_SUFFIX) > $$i; \ done) + (for i in $(XGetDeviceProperty_shadows:=.@LIB_MAN_SUFFIX@) ; do \ + echo .so man$(LIB_MAN_DIR_SUFFIX)/XGetDeviceProperty.$(LIB_MAN_SUFFIX) > $$i; \ + done) diff --git a/man/XGetDeviceProperty.man b/man/XGetDeviceProperty.man new file mode 100644 index 0000000..6944457 --- /dev/null +++ b/man/XGetDeviceProperty.man @@ -0,0 +1,191 @@ +.\" Title: XGetDeviceProperty +.\" Author: Peter Hutterer +.\" Generator: DocBook XSL Stylesheets v1.73.2 <http://docbook.sf.net/> +.\" Date: <pubdate>July 9, 2008</pubdate> +.\" Manual: XINPUT FUNCTIONS +.\" Source: __xorgversion__ +.\" +.TH "XGETDEVICEPROPERTY" "__libmansuffix__" "<pubdate>July 9, 2008</pubdate>" "__xorgversion__" "XINPUT FUNCTIONS" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +XGetDeviceProperty, XChangeDeviceProperty, XDeleteDeviceProperty - Get, change or delete a device's property. +.SH "SYNTAX" +.sp +.ft B +.nf +#include <X11/extensions/XInput\.h> +.fi +.ft +.HP 23 +.BI "int XGetDeviceProperty(Display\ *" "display" ", XDevice\ *" "device" ", Atom\ " "property" ", long\ " "offset" ", long\ " "length" ", Bool\ " "delete" ", Bool\ " "pending" ", Atom\ " "req_type" ", Atom\ *" "actual_type_return" ", int\ *" "actual_format_return" ", unsigned\ long\ *" "nitems_return" ", unsigned\ long\ *" "bytes_after_return" ", unsigned\ char\ **" "prop_return" ");" +.HP 27 +.BI "void XChangeDeviceProperty(Display\ *" "display" ", XDevice\ *" "device" ", Atom\ " "property" ", Atom\ " "type" ", int\ " "format" ", int\ " "mode" ", const\ char\ *" "data" ", int\ " "nelements" ");" +.HP 27 +.BI "void XDeleteDeviceProperty(Display\ *" "display" ", XDevice\ *" "device" ", Atom\ " "property" ");" +.SH "ARGUMENTS" +.PP +.PP +\fIactual_type_return\fR +.RS 4 +Returns an atom identifier that defines the actual type of the property\. +.RE +.PP +\fIactual_format_return\fR +.RS 4 +Returns the actual format of the property\. +.RE +.PP +\fIbytes_after_return\fR +.RS 4 +Returns the number of bytes remaining to be read in the property if a partial read was performed\. +.RE +.PP +\fIdata\fR +.RS 4 +Specifies the property data\. +.RE +.PP +\fIdelete\fR +.RS 4 +Specifies a Boolean value that determines wether the property is deleted\. +.RE +.PP +\fIdisplay\fR +.RS 4 +Specifies the connection to the X server\. +.RE +.PP +\fIdevice\fR +.RS 4 +The device to grab\. +.RE +.PP +\fIformat\fR +.RS 4 +Specifies whether the data should be viewed as a list of 8\-bit, 16\-bit, or 32\-bit quantities\. Possible values are 8, 16, and 32\. This information allows the X server to correctly perform byte\-swap operations as necessary\. If the format is 16\-bit or 32\-bit, you must explicitly cast the data pointer to an (unsigned char*) in the call to +\fBXChangeDeviceProperty\fR\. +.RE +.PP +\fIlength\fR +.RS 4 +Specifies the length in 32\-bit multiplies of the data to be retrieved\. +.RE +.PP +\fImode\fR +.RS 4 +Specifies the mode of operation\. You can pass +\fBPropModeReplace\fR, +\fBPropModePrepend\fR, or +\fBPropModeAppend\fR\. +.RE +.PP +\fInelements\fR +.RS 4 +Specifies the number of elements in data\. +.RE +.PP +\fInitems_return\fR +.RS 4 +Returns the actual number of 8\-bit, 16\-bit, or 32\-bit items stored in the prop_return array\. +.RE +.PP +\fInum_values\fR +.RS 4 +Specifies the number of elements in the values list\. +.RE +.PP +\fIoffset\fR +.RS 4 +Specifies the offset in the specified property (in 32\-bit quantities) where the data is to be retrieved\. +.RE +.PP +\fIpending\fR +.RS 4 +Specifies whether to retrieve the pending state of the property or the current state\. +.RE +.PP +\fIproperty\fR +.RS 4 +Specifies the property to modify or query\. +.RE +.PP +\fIprop_return\fR +.RS 4 +Returns the data in the specified format\. If the returned format is 8, the returned data is represented as a char array\. If the returned format is 16, the returned data is represented as an array of short int type and should be cast to that type to obtain the elements\. If the returned format is 32, the property data will be stored as an array of longs (which in a 64\-bit application will be 64\-bit values that are padded in the upper 4 bytes)\. +.RE +.PP +\fIreq_type\fR +.RS 4 +Specifies the atom identifier associated with the property type or +\fBAnyPropertyType\fR\. +.RE +.SH "DESCRIPTION" +.PP +The +\fBXGetDeviceProperty\fR +function returns the actual type of the property; the actual format of the property; the number of 8\-bit, 16\-bit, or 32\-bit items transferred; the number of bytes remaining to be read in the property; and a pointer to the data actually returned\. For a detailed description of this function, see the man page to +\fBXGetWindowProperty\fR\. +.PP +The +\fBXChangeDeviceProperty\fR +function alters the property for the specified device and causes the server to generate a +\fBXPropertyNotifyEvent\fR +event on that device\. For a detailed description of this function, see the man page to +\fBXChangeProperty\fR\. +.PP +The +\fBXDeleteDeviceProperty\fR +function deletes the specified device property\. Note that a client cannot delete a property created by a driver or the server\. Attempting to do so will result in a +BadAtom +error\. +.PP + +\fBXGetDeviceProperty\fR +can generate a +BadAtom, +BadDevice +error\. +.PP + +\fBXChangeDeviceProperty\fR +can generate a +BadDevice, a +BadMatch, a +BadAtom, and a +BadValue +error\. +.PP + +\fBXDeleteDeviceProperty\fR +can generate a +BadDevice, and a +BadAtom +error\. +.SH "DIAGNOSIS" +.PP +.PP +BadAtom +.RS 4 +A value does not describe a valid named identifier or the client attempted to remove a driver\-allocated property\. +.RE +.PP +BadDevice +.RS 4 +An invalid device was specified\. The device does not exist\. +.RE +.SH "SEE ALSO" +.PP + +\fBXListDeviceProperties\fR, +\fBXQueryDeviceProperty\fR, +\fBXConfigureDeviceProperty\fR\. +.SH "AUTHOR" +.PP +\fBPeter Hutterer\fR +.sp -1n +.IP "" 4 +Specification and implementation\. + diff --git a/man/XListDeviceProperties.man b/man/XListDeviceProperties.man new file mode 100644 index 0000000..4f986fc --- /dev/null +++ b/man/XListDeviceProperties.man @@ -0,0 +1,95 @@ +.\" Title: XListDeviceProperties +.\" Author: Peter Hutterer +.\" Generator: DocBook XSL Stylesheets v1.73.2 <http://docbook.sf.net/> +.\" Date: <pubdate>July 9, 2008</pubdate> +.\" Manual: XINPUT FUNCTIONS +.\" Source: __xorgversion__ +.\" +.TH "XLISTDEVICEPROPERTIE" "__libmansuffix__" "<pubdate>July 9, 2008</pubdate>" "__xorgversion__" "XINPUT FUNCTIONS" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +XListDeviceProperties - List a device's properties. +.SH "SYNTAX" +.sp +.ft B +.nf +#include <X11/extensions/XInput\.h> +.fi +.ft +.HP 28 +.BI "Atom* XListDeviceProperties(Display\ *" "display" ", XDevice\ *" "device" ", int\ *" "nprops_return" ");" +.SH "ARGUMENTS" +.PP +.PP +\fIdisplay\fR +.RS 4 +Specifies the connection to the X server\. +.RE +.PP +\fIdevice\fR +.RS 4 +The device to grab\. +.RE +.PP +\fInprops_return\fR +.RS 4 +Specifies the number of Atoms returned\. +.RE +.PP +\fInum_values\fR +.RS 4 +Specifies the number of elements in the values list\. +.RE +.PP +\fIproperty\fR +.RS 4 +Specifies the property to modify or query\. +.RE +.SH "DESCRIPTION" +.PP +The +\fBXListDeviceProperties\fR +function returns a list of the properties associated with the input device specified in +\fIdevice\fR\. Each device may have an arbitrary number of properties attached, some of which were created by the driver and/or server, others created by clients at runtime\. +.PP +The client is expected to free the list of properties using +\fBXFree\fR\. +.PP + +\fBXListDeviceProperties\fR +can generate a +BadDevice +error\. +.SH "DIAGNOSIS" +.PP +.PP +BadAtom +.RS 4 +A value does not describe a valid named identifier\. +.RE +.PP +BadWindow +.RS 4 +A value for a Window argument does not name a defined window\. +.RE +.PP +BadDevice +.RS 4 +An invalid device was specified\. The device does not exist\. +.RE +.SH "SEE ALSO" +.PP + +\fBXChangeDeviceProperty\fR, +\fBXGetDeviceProperty\fR, +\fBXDeleteDeviceProperty\fR\. +.SH "AUTHOR" +.PP +\fBPeter Hutterer\fR +.sp -1n +.IP "" 4 +Specification and implementation\. + diff --git a/src/Makefile.am b/src/Makefile.am index a02428c..1e7de91 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,15 +6,18 @@ libXi_la_SOURCES = \ XAllowDv.c \ XChgDCtl.c \ XChgFCtl.c \ + XChDProp.c \ XChgKbd.c \ XChgKMap.c \ XChgPnt.c \ XChgProp.c \ XCloseDev.c \ + XDelDProp.c \ XDevBell.c \ XExtToWire.c \ XGetBMap.c \ XGetDCtl.c \ + XGetDProp.c \ XGetFCtl.c \ XGetKMap.c \ XGetMMap.c \ @@ -27,6 +30,7 @@ libXi_la_SOURCES = \ XGtFocus.c \ XGtSelect.c \ XListDev.c \ + XListDProp.c \ XOpenDev.c \ XQueryDv.c \ XSelect.c \ diff --git a/src/XChDProp.c b/src/XChDProp.c new file mode 100644 index 0000000..c863cdb --- /dev/null +++ b/src/XChDProp.c @@ -0,0 +1,106 @@ +/************************************************************ + +Copyright 2008 Peter Hutterer + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the author shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the author. + +*/ + +/*********************************************************************** + * XChangeDeviceProperties - change an input device's properties. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <X11/Xlibint.h> +#include <X11/extensions/XI.h> +#include <X11/extensions/XIproto.h> +#include <X11/extensions/XInput.h> +#include <X11/extensions/extutil.h> +#include "XIint.h" + +void +XChangeDeviceProperty(Display* dpy, XDevice* dev, + Atom property, Atom type, + int format, int mode, + _Xconst unsigned char *data, int nelements) +{ + xChangeDevicePropertyReq *req; + int len; + + XExtDisplayInfo *info = XInput_find_display(dpy); + + LockDisplay(dpy); + if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1) + return; + + GetReq(ChangeDeviceProperty, req); + req->reqType = info->codes->major_opcode; + req->ReqType = X_ChangeDeviceProperty; + req->deviceid = dev->device_id; + req->property = property; + req->type = type; + req->mode = mode; + if (nelements < 0) { + req->nUnits = 0; + req->format = 0; /* ask for garbage, get garbage */ + } else { + req->nUnits = nelements; + req->format = format; + } + + switch (req->format) { + case 8: + len = ((long)nelements + 3) >> 2; + if (dpy->bigreq_size || req->length + len <= (unsigned) 65535) { + SetReqLen(req, len, len); + Data (dpy, (char *)data, nelements); + } /* else force BadLength */ + break; + + case 16: + len = ((long)nelements + 1) >> 1; + if (dpy->bigreq_size || req->length + len <= (unsigned) 65535) { + SetReqLen(req, len, len); + len = (long)nelements << 1; + Data16 (dpy, (short *) data, len); + } /* else force BadLength */ + break; + + case 32: + len = nelements; + if (dpy->bigreq_size || req->length + len <= (unsigned) 65535) { + SetReqLen(req, len, len); + len = (long)nelements << 2; + Data32 (dpy, (long *) data, len); + } /* else force BadLength */ + break; + + default: + /* BadValue will be generated */ ; + } + + UnlockDisplay(dpy); + SyncHandle(); +} + diff --git a/src/XDelDProp.c b/src/XDelDProp.c new file mode 100644 index 0000000..d6594c4 --- /dev/null +++ b/src/XDelDProp.c @@ -0,0 +1,64 @@ +/************************************************************ + +Copyright 2008 Peter Hutterer + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the author shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the author. + +*/ + +/*********************************************************************** + * XDeleteDeviceProperties - delete an input device's properties. + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <X11/Xlibint.h> +#include <X11/extensions/XI.h> +#include <X11/extensions/XIproto.h> +#include <X11/extensions/XInput.h> +#include <X11/extensions/extutil.h> +#include "XIint.h" + +void +XDeleteDeviceProperty(Display* dpy, XDevice* dev, Atom property) +{ + xDeleteDevicePropertyReq *req; + + XExtDisplayInfo *info = XInput_find_display(dpy); + + LockDisplay(dpy); + if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1) + return; + + GetReq(DeleteDeviceProperty, req); + req->reqType = info->codes->major_opcode; + req->ReqType = X_DeleteDeviceProperty; + req->deviceid = dev->device_id; + req->property = property; + + UnlockDisplay(dpy); + SyncHandle(); + return; +} + diff --git a/src/XExtInt.c b/src/XExtInt.c index 10f728d..d448406 100644 --- a/src/XExtInt.c +++ b/src/XExtInt.c @@ -121,7 +121,9 @@ XEXT_GENERATE_FIND_DISPLAY(XInput_find_display, xinput_info, {XI_Present, XI_Add_XChangeDeviceControl_Major, XI_Add_XChangeDeviceControl_Minor}, {XI_Present, XI_Add_DevicePresenceNotify_Major, - XI_Add_DevicePresenceNotify_Minor} + XI_Add_DevicePresenceNotify_Minor}, + {XI_Present, XI_Add_DeviceProperties_Major, + XI_Add_DeviceProperties_Minor}, }; /*********************************************************************** @@ -697,6 +699,21 @@ XInputWireToEvent(dpy, re, event) } break; + case XI_DevicePropertyNotify: + + { + XDevicePropertyNotifyEvent* ev = (XDevicePropertyNotifyEvent*)re; + devicePropertyNotify *ev2 = (devicePropertyNotify*)event; + + *ev = *(XDevicePropertyNotifyEvent*)save; + ev->time = ev2->time; + ev->deviceid = ev2->deviceid; + ev->atom = ev2->atom; + ev->state = ev2->state; + return ENQUEUE_EVENT; + } + break; + default: printf("XInputWireToEvent: UNKNOWN WIRE EVENT! type=%d\n", type); break; diff --git a/src/XGetDProp.c b/src/XGetDProp.c new file mode 100644 index 0000000..5d44f91 --- /dev/null +++ b/src/XGetDProp.c @@ -0,0 +1,139 @@ +/************************************************************ + +Copyright 2008 Peter Hutterer + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the author shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the author. + +*/ + +/*********************************************************************** + * XGetDeviceProperties - get an input device's properties. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <X11/Xlibint.h> +#include <X11/extensions/XI.h> +#include <X11/extensions/XIproto.h> +#include <X11/extensions/XInput.h> +#include <X11/extensions/extutil.h> +#include "XIint.h" + +int +XGetDeviceProperty(Display* dpy, XDevice* dev, + Atom property, long offset, long length, Bool delete, + Atom req_type, Atom *actual_type, int *actual_format, + unsigned long *nitems, unsigned long *bytes_after, + unsigned char **prop) +{ + xGetDevicePropertyReq *req; + xGetDevicePropertyReply rep; + long nbytes, rbytes; + + XExtDisplayInfo *info = XInput_find_display(dpy); + + LockDisplay(dpy); + if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1) + return 1; + + GetReq(GetDeviceProperty, req); + req->reqType = info->codes->major_opcode; + req->ReqType = X_GetDeviceProperty; + req->deviceid = dev->device_id; + req->property = property; + req->type = req_type; + req->longOffset = offset; + req->longLength = length; + req->delete = delete; + + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) + { + UnlockDisplay (dpy); + SyncHandle (); + return 1; + } + + *prop = (unsigned char *) NULL; + + if (rep.propertyType != None) { + /* + * One extra byte is malloced than is needed to contain the property + * data, but this last byte is null terminated and convenient for + * returning string properties, so the client doesn't then have to + * recopy the string to make it null terminated. + */ + switch (rep.format) { + case 8: + nbytes = rep.nItems; + rbytes = rep.nItems + 1; + if (rbytes > 0 && + (*prop = (unsigned char *) Xmalloc ((unsigned)rbytes))) + _XReadPad (dpy, (char *) *prop, nbytes); + break; + + case 16: + nbytes = rep.nItems << 1; + rbytes = rep.nItems * sizeof (short) + 1; + if (rbytes > 0 && + (*prop = (unsigned char *) Xmalloc ((unsigned)rbytes))) + _XRead16Pad (dpy, (short *) *prop, nbytes); + break; + + case 32: + nbytes = rep.nItems << 2; + rbytes = rep.nItems * sizeof (long) + 1; + if (rbytes > 0 && + (*prop = (unsigned char *) Xmalloc ((unsigned)rbytes))) + _XRead32 (dpy, (long *) *prop, nbytes); + break; + + default: + /* + * This part of the code should never be reached. If it is, + * the server sent back a property with an invalid format. + */ + nbytes = rep.length << 2; + _XEatData(dpy, (unsigned long) nbytes); + UnlockDisplay(dpy); + SyncHandle(); + return(BadImplementation); + } + if (! *prop) { + _XEatData(dpy, (unsigned long) nbytes); + UnlockDisplay(dpy); + SyncHandle(); + return(BadAlloc); + } + (*prop)[rbytes - 1] = '\0'; + } + + *actual_type = rep.propertyType; + *actual_format = rep.format; + *nitems = rep.nItems; + *bytes_after = rep.bytesAfter; + UnlockDisplay (dpy); + SyncHandle (); + + return Success; +} + diff --git a/src/XListDProp.c b/src/XListDProp.c new file mode 100644 index 0000000..aee2737 --- /dev/null +++ b/src/XListDProp.c @@ -0,0 +1,84 @@ +/************************************************************ + +Copyright 2008 Peter Hutterer + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the author shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the author. + +*/ + +/*********************************************************************** + * XListDeviceProperties - List an input device's properties. + */ + + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <X11/Xlibint.h> +#include <X11/extensions/XI.h> +#include <X11/extensions/XIproto.h> +#include <X11/extensions/XInput.h> +#include <X11/extensions/extutil.h> +#include "XIint.h" + +Atom* +XListDeviceProperties(Display* dpy, XDevice* dev, int *nprops_return) +{ + xListDevicePropertiesReq *req; + xListDevicePropertiesReply rep; + XExtDisplayInfo *info = XInput_find_display(dpy); + Atom *props = NULL; + + LockDisplay(dpy); + if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1) + return (NoSuchExtension); + + GetReq(ListDeviceProperties, req); + req->reqType = info->codes->major_opcode; + req->ReqType = X_ListDeviceProperties; + req->deviceid = dev->device_id; + + if (!_XReply(dpy, (xReply*)&rep, 0, xFalse)) { + *nprops_return = 0; + goto cleanup; + } + + *nprops_return = rep.nAtoms; + + if (rep.nAtoms) { + props = (Atom*)Xmalloc(rep.nAtoms * sizeof(Atom)); + if (!props) + { + _XEatData(dpy, rep.nAtoms << 2); + *nprops_return = 0; + goto cleanup; + } + + _XRead32(dpy, props, rep.nAtoms << 2); + } + +cleanup: + UnlockDisplay(dpy); + SyncHandle(); + return props; +} + |