Replaces near-identical calls to XChangeDeviceProperty with a single centralized function to do the same thing. The new '_set' function uses '_get_parameter' to ensure arguments are of the expected type before doing its job.
Signed-off-by: Jason Gerecke <killert...@gmail.com> --- tools/xsetwacom.c | 193 ++++++++++++++++++++++------------------------------ 1 files changed, 82 insertions(+), 111 deletions(-) diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c index 392b063..acc57c7 100644 --- a/tools/xsetwacom.c +++ b/tools/xsetwacom.c @@ -103,6 +103,7 @@ typedef struct _param /* get_func/set_func calls for special parameters */ static void* _get_property(Display *dpy, XDevice *dev, const char *prop_name, int format, Atom type, unsigned long *items); static void* _get(Display *dpy, XDevice *dev, const char *prop_name, int prop_offset, int format, Atom type, int items); +static void _set(Display *dpy, XDevice *dev, const char *prop_name, int prop_offset, void *data, int format, int type, int items); static void map_actions(Display *dpy, XDevice *dev, param_t *param, int argc, char **argv); static void set_mode(Display *dpy, XDevice *dev, param_t *param, int argc, char **argv); static void get_mode(Display *dpy, XDevice *dev, param_t *param, int argc, char **argv); @@ -1346,49 +1347,83 @@ static void map_actions(Display *dpy, XDevice *dev, param_t* param, int argc, ch special_map_property(dpy, dev, action_prop, offset, argc, argv); } -static void set_xydefault(Display *dpy, XDevice *dev, param_t* param, int argc, char **argv) +/** + * Sets a parameter to the given values. This function takes a pointer + * to the head of an appropriately-typed array and uses it to update + * the underlying device property. + * + * @param dpy X11 display to connect to + * @param dev Device to query + * @param prop_name Name of device property + * @param prop_offset Offset (in items) to begin writing + * @param data Pointer to the data to write + * @param format Format of the underlying property (8/16/32) + * @param type Type of the underlying property + * @param items Number of items in data to write + */ +static void _set(Display *dpy, XDevice *dev, const char *prop_name, int prop_offset, + void *data, int format, int type, int items) { - Atom prop, type; - int format; - unsigned char* data = NULL; - unsigned long nitems, bytes_after; - long *ldata; + Atom prop; + int i, read_format; + unsigned long read_items; + void *values; - if (argc != param->arg_count) + prop = XInternAtom(dpy, prop_name, True); + if (!prop || !test_property(dpy, dev, prop)) { - fprintf(stderr, "'%s' requires exactly %d value(s).\n", param->name, - param->arg_count); + printf("Property '%s' does not exist on device.\n", + prop_name); return; } - prop = XInternAtom(dpy, param->prop_name, True); - if (!prop) + values = _get_property(dpy, dev, prop_name, format, type, &read_items); + if (values == NULL) + return; + + if (items > prop_offset + read_items) { - fprintf(stderr, "Property for '%s' not available.\n", - param->name); - goto out; + fprintf(stderr, " %-23s = count mismatch: expected at least %d got %d\n", + prop_name, items, read_items); + free(values); + return; } - XGetDeviceProperty(dpy, dev, prop, 0, 1000, False, AnyPropertyType, - &type, &format, &nitems, &bytes_after, &data); - - if (nitems <= param->prop_offset) + for (i = 0; i < items; i++) { - fprintf(stderr, "Property offset doesn't exist, this is a bug.\n"); - goto out; + switch(format) + { + case 8: + ((char*)values)[prop_offset + i] = ((char*)data)[i]; + break; + case 16: + ((short*)values)[prop_offset + i] = ((short*)data)[i]; + break; + case 32: + ((long*)values)[prop_offset + i] = ((long*)data)[i]; + break; + } } - ldata = (long*)data; - ldata[0] = -1; - ldata[1] = -1; - ldata[2] = -1; - ldata[3] = -1; - XChangeDeviceProperty(dpy, dev, prop, type, format, - PropModeReplace, data, nitems); + PropModeReplace, values, read_items); + XFlush(dpy); -out: - free(data); + free(values); +} + +static void set_xydefault(Display *dpy, XDevice *dev, param_t* param, int argc, char **argv) +{ + if (argc != param->arg_count) + { + fprintf(stderr, "'%s' requires exactly %d value(s).\n", param->name, + param->arg_count); + return; + } + + long data[] = {-1, -1, -1, -1}; + _set(dpy, dev, param->prop_name, param->prop_offset, + &data, param->prop_format, param->prop_type, param->arg_count); } static void set_mode(Display *dpy, XDevice *dev, param_t* param, int argc, char **argv) @@ -1422,10 +1457,6 @@ static void set_mode(Display *dpy, XDevice *dev, param_t* param, int argc, char static void set_rotate(Display *dpy, XDevice *dev, param_t* param, int argc, char **argv) { int rotation = 0; - Atom prop, type; - int format; - unsigned char* data; - unsigned long nitems, bytes_after; if (argc != param->arg_count) { @@ -1451,28 +1482,9 @@ static void set_rotate(Display *dpy, XDevice *dev, param_t* param, int argc, cha return; } - prop = XInternAtom(dpy, param->prop_name, True); - if (!prop) - { - fprintf(stderr, "Property for '%s' not available.\n", - param->name); - return; - } - - XGetDeviceProperty(dpy, dev, prop, 0, 1000, False, AnyPropertyType, - &type, &format, &nitems, &bytes_after, &data); - - if (nitems == 0 || format != 8) - { - fprintf(stderr, "Property for '%s' has no or wrong value - this is a bug.\n", - param->name); - return; - } - - *data = rotation; - XChangeDeviceProperty(dpy, dev, prop, type, format, - PropModeReplace, data, nitems); - XFlush(dpy); + char data[] = {rotation}; + _set(dpy, dev, param->prop_name, param->prop_offset, &data, + param->prop_format, param->prop_type, param->arg_count); return; } @@ -1531,10 +1543,7 @@ static void set(Display *dpy, int argc, char **argv) { param_t *param; XDevice *dev = NULL; - Atom prop = None, type; - int format; unsigned char* data = NULL; - unsigned long nitems, bytes_after; long *n; char *b; int i; @@ -1569,32 +1578,12 @@ static void set(Display *dpy, int argc, char **argv) goto out; } - if (param->prop_name) - { - prop = XInternAtom(dpy, param->prop_name, True); - if (!prop || !test_property(dpy, dev, prop)) - { - printf("Property '%s' does not exist on device.\n", - param->prop_name); - goto out; - } - } - if (param->set_func) { param->set_func(dpy, dev, param, argc - 2, &argv[2]); goto out; } - XGetDeviceProperty(dpy, dev, prop, 0, 1000, False, AnyPropertyType, - &type, &format, &nitems, &bytes_after, &data); - - if (nitems <= param->prop_offset) - { - fprintf(stderr, "Property offset doesn't exist.\n"); - goto out; - } - values = strjoinsplit(argc - 2, &argv[2], &nvals); if (nvals != param->arg_count) @@ -1604,6 +1593,13 @@ static void set(Display *dpy, int argc, char **argv) goto out; } + data = calloc(param->arg_count, param->prop_format); + if (!data) + { + fprintf(stderr, "Unable to allocate memory.\n"); + goto out; + } + for (i = 0; i < nvals; i++) { Bool success; @@ -1620,36 +1616,24 @@ static void set(Display *dpy, int argc, char **argv) switch(param->prop_format) { case 8: - if (format != param->prop_format || type != XA_INTEGER) { - fprintf(stderr, " %-23s = format mismatch (%d)\n", - param->name, format); - break; - } - b = (char*)data; - b[param->prop_offset + i] = rint(val); + ((char*)data)[i] = rint(val); break; case 32: - if (format != param->prop_format || type != XA_INTEGER) { - fprintf(stderr, " %-23s = format mismatch (%d)\n", - param->name, format); - break; - } - n = (long*)data; - n[param->prop_offset + i] = rint(val); + ((long*)data)[i] = rint(val); break; } } - XChangeDeviceProperty(dpy, dev, prop, type, format, - PropModeReplace, data, nitems); - XFlush(dpy); + /* set() only supports setting vanilla XA_INTEGER properties */ + _set(dpy, dev, param->prop_name, param->prop_offset, data, + param->prop_format, XA_INTEGER, param->arg_count); for (i = 0; i < nvals; i++) free(values[i]); free(values); + free(data); out: XCloseDevice(dpy, dev); - free(data); } /** @@ -2184,21 +2168,8 @@ static Bool _set_matrix_prop(Display *dpy, XDevice *dev, const float fmatrix[9]) for (i = 0; i < ARRAY_SIZE(matrix); i++) *(float*)(matrix + i) = fmatrix[i]; - XGetDeviceProperty(dpy, dev, matrix_prop, 0, 9, False, - AnyPropertyType, &type, &format, &nitems, - &bytes_after, (unsigned char**)&data); - - if (format != 32 || type != XInternAtom(dpy, "FLOAT", True)) - { - fprintf(stderr, "Property for '%s' has unexpected type - this is a bug.\n", - "Coordinate Transformation Matrix"); - return; - } - - XChangeDeviceProperty(dpy, dev, matrix_prop, type, format, - PropModeReplace, (unsigned char*)matrix, 9); - XFree(data); - XFlush(dpy); + _set(dpy, dev, "Coordinate Transformation Matrix", 0, &matrix, + 32, XInternAtom(dpy, "FLOAT", True), 9); return True; } -- 1.7.6 ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity and more. Splunk takes this data and makes sense of it. Business sense. IT sense. Common sense. http://p.sf.net/sfu/splunk-d2dcopy1 _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel