On Tue, Mar 29, 2011 at 11:21:58PM -0700, Jason Gerecke wrote:
> On Tue, Mar 29, 2011 at 9:21 PM, Peter Hutterer
> <[email protected]> wrote:
> > On Tue, Mar 29, 2011 at 04:18:38PM -0700, Jason Gerecke wrote:
> >> @@ -1782,41 +1797,118 @@ static int get_special_button_map(Display *dpy,
> >> XDevice *dev,
> >>
> >> TRACE("%s\n", buff);
> >>
> >> - XFree(btnact_data);
> >> + XFree(data);
> >>
> >> print_value(param, "%s", buff);
> >>
> >> return 1;
> >> }
> >>
> >> -static void get_button(Display *dpy, XDevice *dev, param_t *param, int
> >> argc,
> >> - char **argv)
> >> +/**
> >> + * Try to print the value of the raw button mapped to the given
> >> parameter's
> >> + * property. If the property contains data in the wrong format/type then
> >> + * nothing will be printed.
> >> + *
> >> + * @param dpy X11 display to connect to
> >> + * @param dev Device to query
> >> + * @param param Info about parameter to query
> >> + * @param offset Offset into the property specified in param
> >> + * @return 0 on failure, 1 otherwise
> >> + */
> >> +static int get_button(Display *dpy, XDevice *dev, param_t *param, int
> >> offset)
> >> {
> >> - int nmap = 256;
> >> - unsigned char map[nmap];
> >> - int button = 0;
> >> + Atom prop, type;
> >> + int format;
> >> + unsigned long nitems, bytes_after;
> >> + unsigned char *data;
> >>
> >> - if (argc < 1 || (sscanf(argv[0], "%d", &button) != 1))
> >> - return;
> >> + prop = XInternAtom(dpy, param->prop_name, True);
> >> +
> >> + if (!prop)
> >> + return 0;
> >> +
> >> + XGetDeviceProperty(dpy, dev, prop, 0, 100, False,
> >> + AnyPropertyType, &type, &format, &nitems,
> >> + &bytes_after, (unsigned char**)&data);
> >> +
> >> + if (offset >= nitems)
> >> + {
> >> + XFree(data);
> >> + return 0;
> >> + }
> >> +
> >> + prop = data[offset];
> >> + XFree(data);
> >> +
> >> + if (format != 8 || type != XA_INTEGER || !prop)
> >> + {
> >> + return 0;
> >> + }
> >> +
> >> + print_value(param, "%d", prop);
> >> +
> >> + return 1;
> >> +}
> >> +
> >> +/**
> >> + * Print the current button/wheel/strip mapping, be it a raw button or
> >> + * an action. Button map requests require the button number as the first
> >> + * argument in argv.
> >> + *
> >> + * @param dpy X11 display to connect to
> >> + * @param dev Device to query
> >> + * @param param Info about parameter to query
> >> + * @param argc Length of argv
> >> + * @param argv Command-line arguments
> >> + */
> >> +static void get_map(Display *dpy, XDevice *dev, param_t *param, int argc,
> >> char** argv)
> >> +{
> >> + int offset = param->prop_offset;
> >>
> >> TRACE("Getting button map for device %ld.\n", dev->device_id);
> >>
> >> - /* if there's a special map, print it and return */
> >> - if (get_special_button_map(dpy, dev, param, button))
> >> - return;
> >> + if (param->prop_name == WACOM_PROP_BUTTON_ACTIONS)
> >
> > in your testing, this should have always been false. you need a strcmp here.
> > Can you please re-test this?
> > applies to 8/9 as well which has the same condition.
> >
> I can test to be sure, though I was pretty sure this worked. Way up
> where parameters[] is defined, we do "prop_name =
> WACOM_PROP_BUTTON_ACTIONS". Unless another function changes the
> prop_name to an identical string at a different location (i.e., they
> ignored the already-defined constant and used a hard-coded string
> instead) I don't see why there'd be a problem.
>
> Though, I can certainly do a strcmp if you want (or if I'm mistaken
> about it working) :)
have a look at the gcc warning:
xsetwacom.c: In function ‘map_actions’:
xsetwacom.c:1321:23: warning: comparison with string literal results in
unspecified behavior
problem is simple, WACOM_PROP_BUTTON_ACTIONS is a preprocessor define and
thus replaced before compilation. it's not a constant. That's quite
important here.
it would work if the code was like this (pseudocode):
char property_name[] = "Wacom prop button actions";
...
prop_name = property_name;
...
if (prop_name == property_name)
but because it's a preprocessor define and not a constant, the code is more
like this:
prop_name = "Wacom prop button actions";
...
if (prop_name == "Wacom prop button actions")
and you're not guaranteed that the address is the same.
Cheers,
Peter
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel