summaryrefslogtreecommitdiff
path: root/Xi/xiproperty.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2008-07-10 16:27:36 +0930
committerPeter Hutterer <peter.hutterer@who-t.net>2008-07-10 16:27:36 +0930
commit4ab01fe5db7fb330b1ec463aa49b77859527e597 (patch)
tree82676a6dd2f5a03939cec42bf607b5bff9ae4109 /Xi/xiproperty.c
parent666838fcc8b71fdeae160844160187f345cbf4a6 (diff)
Revert "Xi: add support for input device properties."
Note to self: don't mix up branches with half-finished cherrypicks. This reverts commit 666838fcc8b71fdeae160844160187f345cbf4a6.
Diffstat (limited to 'Xi/xiproperty.c')
-rw-r--r--Xi/xiproperty.c742
1 files changed, 0 insertions, 742 deletions
diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
deleted file mode 100644
index a02c565d7..000000000
--- a/Xi/xiproperty.c
+++ /dev/null
@@ -1,742 +0,0 @@
-/*
- * Copyright © 2006 Keith Packard
- * Copyright © 2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WAXIANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WAXIANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- */
-
-/* This code is a modified version of randr/rrproperty.c */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "dix.h"
-#include "inputstr.h"
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "exglobals.h"
-#include "exevents.h"
-#include "swaprep.h"
-
-#include "xiproperty.h"
-
-void
-XIDeleteAllDeviceProperties (DeviceIntPtr device)
-{
- XIPropertyPtr prop, next;
- devicePropertyNotifyEvent event;
-
- for (prop = device->properties; prop; prop = next)
- {
- next = prop->next;
-
- event.type = GenericEvent;
- event.extension = IReqCode;
- event.evtype = XI_DevicePropertyNotify;
- event.length = 0;
- event.deviceid = device->id;
- event.state = PropertyDelete;
- event.atom = prop->propertyName;
- event.time = currentTime.milliseconds;
- SendEventToAllWindows(device, XI_DevicePropertyNotifyMask,
- (xEvent*)&event, 1);
-
- if (prop->current.data)
- xfree(prop->current.data);
- if (prop->pending.data)
- xfree(prop->pending.data);
- xfree(prop);
- }
-}
-
-static void
-XIInitDevicePropertyValue (XIPropertyValuePtr property_value)
-{
- property_value->type = None;
- property_value->format = 0;
- property_value->size = 0;
- property_value->data = NULL;
-}
-
-static XIPropertyPtr
-XICreateDeviceProperty (Atom property)
-{
- XIPropertyPtr prop;
-
- prop = (XIPropertyPtr)xalloc(sizeof(XIPropertyRec));
- if (!prop)
- return NULL;
-
- prop->next = NULL;
- prop->propertyName = property;
- prop->is_pending = FALSE;
- prop->range = FALSE;
- prop->immutable = FALSE;
- prop->num_valid = 0;
- prop->valid_values = NULL;
-
- XIInitDevicePropertyValue (&prop->current);
- XIInitDevicePropertyValue (&prop->pending);
- return prop;
-}
-
-static void
-XIDestroyDeviceProperty (XIPropertyPtr prop)
-{
- if (prop->valid_values)
- xfree (prop->valid_values);
- if (prop->current.data)
- xfree(prop->current.data);
- if (prop->pending.data)
- xfree(prop->pending.data);
- xfree(prop);
-}
-
-void
-XIDeleteDeviceProperty (DeviceIntPtr device, Atom property)
-{
- XIPropertyPtr prop, *prev;
- devicePropertyNotifyEvent event;
-
- for (prev = &device->properties; (prop = *prev); prev = &(prop->next))
- if (prop->propertyName == property)
- break;
-
- if (prop)
- {
- *prev = prop->next;
- event.type = GenericEvent;
- event.extension = IReqCode;
- event.length = 0;
- event.evtype = XI_DevicePropertyNotify;
- event.deviceid = device->id;
- event.state = PropertyDelete;
- event.atom = prop->propertyName;
- event.time = currentTime.milliseconds;
- SendEventToAllWindows(device, XI_DevicePropertyNotifyMask,
- (xEvent*)&event, 1);
- XIDestroyDeviceProperty (prop);
- }
-}
-
-int
-XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
- int format, int mode, unsigned long len,
- pointer value, Bool sendevent, Bool pending)
-{
- XIPropertyPtr prop;
- devicePropertyNotifyEvent event;
- int size_in_bytes;
- int total_size;
- unsigned long total_len;
- XIPropertyValuePtr prop_value;
- XIPropertyValueRec new_value;
- Bool add = FALSE;
-
- size_in_bytes = format >> 3;
-
- /* first see if property already exists */
- prop = XIQueryDeviceProperty (dev, property);
- if (!prop) /* just add to list */
- {
- prop = XICreateDeviceProperty (property);
- if (!prop)
- return(BadAlloc);
- add = TRUE;
- mode = PropModeReplace;
- }
- if (pending && prop->is_pending)
- prop_value = &prop->pending;
- else
- prop_value = &prop->current;
-
- /* To append or prepend to a property the request format and type
- must match those of the already defined property. The
- existing format and type are irrelevant when using the mode
- "PropModeReplace" since they will be written over. */
-
- if ((format != prop_value->format) && (mode != PropModeReplace))
- return(BadMatch);
- if ((prop_value->type != type) && (mode != PropModeReplace))
- return(BadMatch);
- new_value = *prop_value;
- if (mode == PropModeReplace)
- total_len = len;
- else
- total_len = prop_value->size + len;
-
- if (mode == PropModeReplace || len > 0)
- {
- pointer new_data = NULL, old_data = NULL;
-
- total_size = total_len * size_in_bytes;
- new_value.data = (pointer)xalloc (total_size);
- if (!new_value.data && total_size)
- {
- if (add)
- XIDestroyDeviceProperty (prop);
- return BadAlloc;
- }
- new_value.size = len;
- new_value.type = type;
- new_value.format = format;
-
- switch (mode) {
- case PropModeReplace:
- new_data = new_value.data;
- old_data = NULL;
- break;
- case PropModeAppend:
- new_data = (pointer) (((char *) new_value.data) +
- (prop_value->size * size_in_bytes));
- old_data = new_value.data;
- break;
- case PropModePrepend:
- new_data = new_value.data;
- old_data = (pointer) (((char *) new_value.data) +
- (prop_value->size * size_in_bytes));
- break;
- }
- if (new_data)
- memcpy ((char *) new_data, (char *) value, len * size_in_bytes);
- if (old_data)
- memcpy ((char *) old_data, (char *) prop_value->data,
- prop_value->size * size_in_bytes);
-
- if (pending && dev->SetProperty &&
- !dev->SetProperty(dev, prop->propertyName, &new_value))
- {
- if (new_value.data)
- xfree (new_value.data);
- return (BadValue);
- }
- if (prop_value->data)
- xfree (prop_value->data);
- *prop_value = new_value;
- }
-
- else if (len == 0)
- {
- /* do nothing */
- }
-
- if (add)
- {
- prop->next = dev->properties;
- dev->properties = prop;
- }
-
- if (pending && prop->is_pending)
- dev->pendingProperties = TRUE;
-
- if (sendevent)
- {
- event.type = GenericEvent;
- event.extension = IReqCode;
- event.length = 0;
- event.evtype = XI_DevicePropertyNotify;
- event.deviceid = dev->id;
- event.state = PropertyNewValue;
- event.atom = prop->propertyName;
- event.time = currentTime.milliseconds;
- SendEventToAllWindows(dev, XI_DevicePropertyNotifyMask,
- (xEvent*)&event, 1);
- }
- return(Success);
-}
-
-XIPropertyPtr
-XIQueryDeviceProperty (DeviceIntPtr dev, Atom property)
-{
- XIPropertyPtr prop;
-
- for (prop = dev->properties; prop; prop = prop->next)
- if (prop->propertyName == property)
- return prop;
- return NULL;
-}
-
-XIPropertyValuePtr
-XIGetDeviceProperty (DeviceIntPtr dev, Atom property, Bool pending)
-{
- XIPropertyPtr prop = XIQueryDeviceProperty (dev, property);
-
- if (!prop)
- return NULL;
- if (pending && prop->is_pending)
- return &prop->pending;
- else {
- /* If we can, try to update the property value first */
- if (dev->GetProperty)
- dev->GetProperty(dev, prop->propertyName);
- return &prop->current;
- }
-}
-
-int
-XIConfigureDeviceProperty (DeviceIntPtr dev, Atom property,
- Bool pending, Bool range, Bool immutable,
- int num_values, INT32 *values)
-{
- XIPropertyPtr prop = XIQueryDeviceProperty (dev, property);
- Bool add = FALSE;
- INT32 *new_values;
-
- if (!prop)
- {
- prop = XICreateDeviceProperty (property);
- if (!prop)
- return(BadAlloc);
- add = TRUE;
- } else if (prop->immutable && !immutable)
- return(BadAccess);
-
- /*
- * ranges must have even number of values
- */
- if (range && (num_values & 1))
- return BadMatch;
-
- new_values = xalloc (num_values * sizeof (INT32));
- if (!new_values && num_values)
- return BadAlloc;
- if (num_values)
- memcpy (new_values, values, num_values * sizeof (INT32));
-
- /*
- * Property moving from pending to non-pending
- * loses any pending values
- */
- if (prop->is_pending && !pending)
- {
- if (prop->pending.data)
- xfree (prop->pending.data);
- XIInitDevicePropertyValue (&prop->pending);
- }
-
- prop->is_pending = pending;
- prop->range = range;
- prop->immutable = immutable;
- prop->num_valid = num_values;
- if (prop->valid_values)
- xfree (prop->valid_values);
- prop->valid_values = new_values;
-
- if (add) {
- prop->next = dev->properties;
- dev->properties = prop;
- }
-
- return Success;
-}
-
-int
-ProcXListDeviceProperties (ClientPtr client)
-{
- Atom *pAtoms = NULL, *temppAtoms;
- xListDevicePropertiesReply rep;
- int numProps = 0;
- DeviceIntPtr dev;
- XIPropertyPtr prop;
- int rc = Success;
-
- REQUEST(xListDevicePropertiesReq);
- REQUEST_SIZE_MATCH(xListDevicePropertiesReq);
-
- rc = dixLookupDevice (&dev, stuff->deviceid, client, DixReadAccess);
- if (rc != Success)
- return rc;
-
- for (prop = dev->properties; prop; prop = prop->next)
- numProps++;
- if (numProps)
- if(!(pAtoms = (Atom *)xalloc(numProps * sizeof(Atom))))
- return(BadAlloc);
-
- rep.repType = X_Reply;
- rep.RepType = X_ListDeviceProperties;
- rep.length = (numProps * sizeof(Atom)) >> 2;
- rep.sequenceNumber = client->sequence;
- rep.nAtoms = numProps;
- if (client->swapped)
- {
- int n;
- swaps (&rep.sequenceNumber, n);
- swapl (&rep.length, n);
- }
- temppAtoms = pAtoms;
- for (prop = dev->properties; prop; prop = prop->next)
- *temppAtoms++ = prop->propertyName;
-
- WriteReplyToClient(client, sizeof(xListDevicePropertiesReply), &rep);
- if (numProps)
- {
- client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write;
- WriteSwappedDataToClient(client, numProps * sizeof(Atom), pAtoms);
- xfree(pAtoms);
- }
- return rc;
-}
-
-int
-ProcXQueryDeviceProperty (ClientPtr client)
-{
- REQUEST(xQueryDevicePropertyReq);
- xQueryDevicePropertyReply rep;
- DeviceIntPtr dev;
- XIPropertyPtr prop;
- int rc;
-
- REQUEST_SIZE_MATCH(xQueryDevicePropertyReq);
-
- rc = dixLookupDevice (&dev, stuff->deviceid, client, DixReadAccess);
-
- if (rc != Success)
- return rc;
-
- prop = XIQueryDeviceProperty (dev, stuff->property);
- if (!prop)
- return BadName;
-
- rep.repType = X_Reply;
- rep.length = prop->num_valid;
- rep.sequenceNumber = client->sequence;
- rep.pending = prop->is_pending;
- rep.range = prop->range;
- rep.immutable = prop->immutable;
- if (client->swapped)
- {
- int n;
- swaps (&rep.sequenceNumber, n);
- swapl (&rep.length, n);
- }
- WriteReplyToClient (client, sizeof (xQueryDevicePropertyReply), &rep);
- if (prop->num_valid)
- {
- client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write;
- WriteSwappedDataToClient(client, prop->num_valid * sizeof(INT32),
- prop->valid_values);
- }
- return(client->noClientException);
-}
-
-int
-ProcXConfigureDeviceProperty (ClientPtr client)
-{
- REQUEST(xConfigureDevicePropertyReq);
- DeviceIntPtr dev;
- int num_valid;
- int rc;
-
- REQUEST_AT_LEAST_SIZE(xConfigureDevicePropertyReq);
-
- rc = dixLookupDevice (&dev, stuff->deviceid, client, DixReadAccess);
-
- if (rc != Success)
- return rc;
-
- num_valid = stuff->length - (sizeof (xConfigureDevicePropertyReq) >> 2);
- return XIConfigureDeviceProperty (dev, stuff->property,
- stuff->pending, stuff->range,
- FALSE, num_valid,
- (INT32 *) (stuff + 1));
-}
-
-int
-ProcXChangeDeviceProperty (ClientPtr client)
-{
- REQUEST(xChangeDevicePropertyReq);
- DeviceIntPtr dev;
- char format, mode;
- unsigned long len;
- int sizeInBytes;
- int totalSize;
- int rc;
-
- REQUEST_AT_LEAST_SIZE(xChangeDevicePropertyReq);
- UpdateCurrentTime();
- format = stuff->format;
- mode = stuff->mode;
- if ((mode != PropModeReplace) && (mode != PropModeAppend) &&
- (mode != PropModePrepend))
- {
- client->errorValue = mode;
- return BadValue;
- }
- if ((format != 8) && (format != 16) && (format != 32))
- {
- client->errorValue = format;
- return BadValue;
- }
- len = stuff->nUnits;
- if (len > ((0xffffffff - sizeof(xChangePropertyReq)) >> 2))
- return BadLength;
- sizeInBytes = format>>3;
- totalSize = len * sizeInBytes;
- REQUEST_FIXED_SIZE(xChangeDevicePropertyReq, totalSize);
-
- rc = dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
- if (rc != Success)
- return rc;
-
- if (!ValidAtom(stuff->property))
- {
- client->errorValue = stuff->property;
- return(BadAtom);
- }
- if (!ValidAtom(stuff->type))
- {
- client->errorValue = stuff->type;
- return(BadAtom);
- }
-
- rc = XIChangeDeviceProperty(dev, stuff->property,
- stuff->type, (int)format,
- (int)mode, len, (pointer)&stuff[1], TRUE, TRUE);
-
- return rc;
-}
-
-int
-ProcXDeleteDeviceProperty (ClientPtr client)
-{
- REQUEST(xDeleteDevicePropertyReq);
- DeviceIntPtr dev;
- int rc;
-
- REQUEST_SIZE_MATCH(xDeleteDevicePropertyReq);
- UpdateCurrentTime();
- rc = dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
- if (rc != Success)
- return rc;
-
- if (!ValidAtom(stuff->property))
- {
- client->errorValue = stuff->property;
- return (BadAtom);
- }
-
-
- XIDeleteDeviceProperty(dev, stuff->property);
- return rc;
-}
-
-int
-ProcXGetDeviceProperty (ClientPtr client)
-{
- REQUEST(xGetDevicePropertyReq);
- XIPropertyPtr prop, *prev;
- XIPropertyValuePtr prop_value;
- unsigned long n, len, ind;
- DeviceIntPtr dev;
- xGetDevicePropertyReply reply;
- int rc;
-
- REQUEST_SIZE_MATCH(xGetDevicePropertyReq);
- if (stuff->delete)
- UpdateCurrentTime();
- rc = dixLookupDevice (&dev, stuff->deviceid, client,
- stuff->delete ? DixWriteAccess :
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (!ValidAtom(stuff->property))
- {
- client->errorValue = stuff->property;
- return(BadAtom);
- }
- if ((stuff->delete != xTrue) && (stuff->delete != xFalse))
- {
- client->errorValue = stuff->delete;
- return(BadValue);
- }
- if ((stuff->type != AnyPropertyType) && !ValidAtom(stuff->type))
- {
- client->errorValue = stuff->type;
- return(BadAtom);
- }
-
- for (prev = &dev->properties; (prop = *prev); prev = &prop->next)
- if (prop->propertyName == stuff->property)
- break;
-
- reply.repType = X_Reply;
- reply.RepType = X_GetDeviceProperty;
- reply.sequenceNumber = client->sequence;
- if (!prop)
- {
- reply.nItems = 0;
- reply.length = 0;
- reply.bytesAfter = 0;
- reply.propertyType = None;
- reply.format = 0;
- WriteReplyToClient(client, sizeof(xGetDevicePropertyReply), &reply);
- return(client->noClientException);
- }
-
- if (prop->immutable && stuff->delete)
- return BadAccess;
-
- prop_value = XIGetDeviceProperty(dev, stuff->property, stuff->pending);
- if (!prop_value)
- return BadAtom;
-
- /* If the request type and actual type don't match. Return the
- property information, but not the data. */
-
- if (((stuff->type != prop_value->type) &&
- (stuff->type != AnyPropertyType))
- )
- {
- reply.bytesAfter = prop_value->size;
- reply.format = prop_value->format;
- reply.length = 0;
- reply.nItems = 0;
- reply.propertyType = prop_value->type;
- WriteReplyToClient(client, sizeof(xGetDevicePropertyReply), &reply);
- return(client->noClientException);
- }
-
-/*
- * Return type, format, value to client
- */
- n = (prop_value->format/8) * prop_value->size; /* size (bytes) of prop */
- ind = stuff->longOffset << 2;
-
- /* If longOffset is invalid such that it causes "len" to
- be negative, it's a value error. */
-
- if (n < ind)
- {
- client->errorValue = stuff->longOffset;
- return BadValue;
- }
-
- len = min(n - ind, 4 * stuff->longLength);
-
- reply.bytesAfter = n - (ind + len);
- reply.format = prop_value->format;
- reply.length = (len + 3) >> 2;
- if (prop_value->format)
- reply.nItems = len / (prop_value->format / 8);
- else
- reply.nItems = 0;
- reply.propertyType = prop_value->type;
-
- if (stuff->delete && (reply.bytesAfter == 0))
- {
- devicePropertyNotifyEvent event;
-
- event.type = GenericEvent;
- event.extension = IReqCode;
- event.length = 0;
- event.evtype = XI_DevicePropertyNotify;
- event.deviceid = dev->id;
- event.state = PropertyDelete;
- event.atom = prop->propertyName;
- event.time = currentTime.milliseconds;
- SendEventToAllWindows(dev, XI_DevicePropertyNotifyMask,
- (xEvent*)&event, 1);
- }
-
- WriteReplyToClient(client, sizeof(xGenericReply), &reply);
- if (len)
- {
- switch (reply.format) {
- case 32: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write; break;
- case 16: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write; break;
- default: client->pSwapReplyFunc = (ReplySwapPtr)WriteToClient; break;
- }
- WriteSwappedDataToClient(client, len,
- (char *)prop_value->data + ind);
- }
-
- if (stuff->delete && (reply.bytesAfter == 0))
- { /* delete the Property */
- *prev = prop->next;
- XIDestroyDeviceProperty (prop);
- }
- return(client->noClientException);
-}
-
-
-int
-SProcXListDeviceProperties (ClientPtr client)
-{
- REQUEST(xListDevicePropertiesReq);
-
- REQUEST_SIZE_MATCH(xListDevicePropertiesReq);
- (void) stuff;
- return BadImplementation;
-}
-
-int
-SProcXQueryDeviceProperty (ClientPtr client)
-{
- REQUEST(xQueryDevicePropertyReq);
-
- REQUEST_SIZE_MATCH(xQueryDevicePropertyReq);
- (void) stuff;
- return BadImplementation;
-}
-
-int
-SProcXConfigureDeviceProperty (ClientPtr client)
-{
- REQUEST(xConfigureDevicePropertyReq);
-
- REQUEST_SIZE_MATCH(xConfigureDevicePropertyReq);
- (void) stuff;
- return BadImplementation;
-}
-
-int
-SProcXChangeDeviceProperty (ClientPtr client)
-{
- REQUEST(xChangeDevicePropertyReq);
-
- REQUEST_SIZE_MATCH(xChangeDevicePropertyReq);
- (void) stuff;
- return BadImplementation;
-}
-
-int
-SProcXDeleteDeviceProperty (ClientPtr client)
-{
- REQUEST(xDeleteDevicePropertyReq);
-
- REQUEST_SIZE_MATCH(xDeleteDevicePropertyReq);
- (void) stuff;
- return BadImplementation;
-}
-
-int
-SProcXGetDeviceProperty (ClientPtr client)
-{
- REQUEST(xGetDevicePropertyReq);
-
- REQUEST_SIZE_MATCH(xGetDevicePropertyReq);
- (void) stuff;
- return BadImplementation;
-}
-