On Tue, Sep 27, 2011 at 06:03:56PM -0700, Jason Gerecke wrote: > 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>
same comments for void* and the union suggestion from the _set patch. looks good otherwise though. Cheers, Peter > --- > 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 > ------------------------------------------------------------------------------ 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