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

Reply via email to