Acked-by: Chris Bagwell <ch...@cnpbagwell.com> On Fri, Mar 25, 2011 at 7:32 PM, Jason Gerecke <killert...@gmail.com> wrote: > Between the parsing code seperating the two halves of set/unset > and the code being confusing in general, I've rewritten this > to hopefully make its operation a little clearer for the next > person. > > Signed-off-by: Jason Gerecke <killert...@gmail.com> > --- > Changes: > * Broke parsing code out into its own function. Might as well > go whole-hog for readability. > > tools/xsetwacom.c | 159 ++++++++++++++++++++++++++++++++++------------------ > 1 files changed, 104 insertions(+), 55 deletions(-) > > diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c > index 70331b5..9860e57 100644 > --- a/tools/xsetwacom.c > +++ b/tools/xsetwacom.c > @@ -1115,59 +1115,30 @@ static int convert_wheel_prop(Display *dpy, XDevice > *dev, Atom btnact_prop) > return 0; > } > > - > -static void special_map_property(Display *dpy, XDevice *dev, Atom > btnact_prop, int offset, int argc, char **argv) > +/** > + * This function parses the given strings to produce a list of actions that > + * the driver can carry out. We first combine the strings and then split > + * on spaces to produce a wordlist. Begining with the first word, we let each > + * registered keyword parser try to parse the string; if one succeeds in > + * parsing a portion, we jump ahead to the first word it could not parse > + * and repeat the process. Each parser builds up the list of actions with > + * those commands it can interpret. > + * > + * @param dpy X11 display to query > + * @param argc Length of argv > + * @param argv String data to be parsed > + * @param data Parsed action data > + * @return 'true' if the whole string was parsed sucessfully, else 'false' > + */ > +static Bool parse_actions(Display *dpy, int argc, char **argv, unsigned > long* data, unsigned long *nitems) > { > - unsigned long *data, *btnact_data; > - Atom type, prop = 0; > - int format; > - unsigned long btnact_nitems, nitems, bytes_after; > - int i; > - int nwords = 0; > + int i; > + int nwords = 0; > char **words = NULL; > > - XGetDeviceProperty(dpy, dev, btnact_prop, 0, 100, False, > - AnyPropertyType, &type, &format, > &btnact_nitems, > - &bytes_after, (unsigned char**)&btnact_data); > - > - if (offset > btnact_nitems) > - return; > - > - /* Prop is currently 8 bit integer, i.e. plain button > - * mappings. Convert to 32 bit Atom actions first. > - */ > - if (format == 8 && type == XA_INTEGER) > - { > - if (convert_wheel_prop(dpy, dev, btnact_prop)) > - return; > - > - XGetDeviceProperty(dpy, dev, btnact_prop, 0, 100, False, > - AnyPropertyType, &type, &format, > - &btnact_nitems, &bytes_after, > - (unsigned char**)&btnact_data); > - } > - > - if (argc == 0) /* unset property */ > - { > - prop = btnact_data[offset]; > - btnact_data[offset] = 0; > - } else if (btnact_data[offset]) > - /* some atom already assigned, modify that */ > - prop = btnact_data[offset]; > - else > - { > - char buff[64]; > - sprintf(buff, "Wacom button action %d", (offset + 1)); > - prop = XInternAtom(dpy, buff, False); > - > - btnact_data[offset] = prop; > - } > - > - data = calloc(sizeof(long), 256); > - nitems = 0; > - > /* translate cmdline commands */ > words = strjoinsplit(argc, argv, &nwords); > + > for (i = 0; i < nwords; i++) > { > int j = 0; > @@ -1180,7 +1151,7 @@ static void special_map_property(Display *dpy, XDevice > *dev, Atom btnact_prop, i > { > parsed = keywords[j].func(dpy, nwords - i - 1, > &words[i + 1], > - &nitems, data); > + nitems, data); > i += parsed; > keyword_found = 1; > } > @@ -1193,22 +1164,100 @@ static void special_map_property(Display *dpy, > XDevice *dev, Atom btnact_prop, i > if (!keyword_found) > { > fprintf(stderr, "Cannot parse keyword '%s' at position > %d\n", words[i], i+1); > - return; > + return False; > } > } > > + free(words); > + > + return True; > +} > + > +/** > + * Maps sub-properties (e.g. the 3rd button in WACOM_PROP_BUTTON_ACTIONS) > + * to actions. This function leverages the several available parsing > + * functions to convert plain-text descriptions into a list of actions > + * the driver can understand. > + * > + * Once we have a list of actions, we can store it in the appropriate > + * child property. If none exists, we must first create one and update > + * the parent list. If we want no action to occur, we can delete the > + * child property and have the parent point to '0' instead. > + * > + * @param dpy X display we want to query > + * @param dev X device we want to modify > + * @param btnact_prop Parent property > + * @param offset Offset into the parent's list of child properties > + * @param argc Number of command line arguments we've been passed > + * @param argv Command line arguments we need to parse > + */ > +static void special_map_property(Display *dpy, XDevice *dev, Atom > btnact_prop, int offset, int argc, char **argv) > +{ > + unsigned long *data, *btnact_data; > + Atom type, prop = 0; > + int format; > + unsigned long btnact_nitems, bytes_after; > + unsigned long nitems = 0; > + > + data = calloc(sizeof(long), 256); > + if (!parse_actions(dpy, argc, argv, data, &nitems)) > + return; > + > + /* obtain the button actions Atom */ > + XGetDeviceProperty(dpy, dev, btnact_prop, 0, 100, False, > + AnyPropertyType, &type, &format, > &btnact_nitems, > + &bytes_after, (unsigned char**)&btnact_data); > + > + if (offset > btnact_nitems) > + return; > + > + if (format == 8 && type == XA_INTEGER) > + { > + /* Prop is currently 8 bit integer, i.e. plain button > + * mappings. Convert to 32 bit Atom actions first. > + */ > + if (convert_wheel_prop(dpy, dev, btnact_prop)) > + return; > + > + XGetDeviceProperty(dpy, dev, btnact_prop, 0, 100, False, > + AnyPropertyType, &type, &format, > + &btnact_nitems, &bytes_after, > + (unsigned char**)&btnact_data); > + } > + > + /* set or unset the property */ > + prop = btnact_data[offset]; > if (nitems > 0) > + { //Setting a new or existing property > + if (!prop) > + { > + char buff[64]; > + sprintf(buff, "Wacom button action %d", (offset + 1)); > + prop = XInternAtom(dpy, buff, False); > + btnact_data[offset] = prop; > + > + XChangeDeviceProperty(dpy, dev, btnact_prop, XA_ATOM, > 32, > + PropModeReplace, > + (unsigned char*)btnact_data, > + btnact_nitems); > + } > + > + > XChangeDeviceProperty(dpy, dev, prop, XA_INTEGER, 32, > PropModeReplace, > (unsigned char*)data, nitems); > + } > + else if (prop) > + { //Unsetting a property that exists > + btnact_data[offset] = 0; > > - XChangeDeviceProperty(dpy, dev, btnact_prop, XA_ATOM, 32, > - PropModeReplace, > - (unsigned char*)btnact_data, > - btnact_nitems); > + XChangeDeviceProperty(dpy, dev, btnact_prop, XA_ATOM, 32, > + PropModeReplace, > + (unsigned char*)btnact_data, > + btnact_nitems); > > - if (argc == 0 && prop) > XDeleteDeviceProperty(dpy, dev, prop); > + } > > XFlush(dpy); > } > -- > 1.7.4.1 > > > ------------------------------------------------------------------------------ > Enable your software for Intel(R) Active Management Technology to meet the > growing manageability and security demands of your customers. Businesses > are taking advantage of Intel(R) vPro (TM) technology - will your software > be a part of the solution? Download the Intel(R) Manageability Checker > today! http://p.sf.net/sfu/intel-dev2devmar > _______________________________________________ > Linuxwacom-devel mailing list > Linuxwacom-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel >
------------------------------------------------------------------------------ Enable your software for Intel(R) Active Management Technology to meet the growing manageability and security demands of your customers. Businesses are taking advantage of Intel(R) vPro (TM) technology - will your software be a part of the solution? Download the Intel(R) Manageability Checker today! http://p.sf.net/sfu/intel-dev2devmar _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel