|
From: Ping C. <pin...@gm...> - 2010-05-24 00:29:39
|
Reviewed-by: Ping Cheng <pin...@gm...>
Ping
On Sun, May 23, 2010 at 4:24 PM, Peter Hutterer
<pet...@wh...> wrote:
> Custom get_funcs that do not have a property name skip this part and go
> straight to the get_func, all others get the property tested.
>
> Signed-off-by: Peter Hutterer <pet...@wh...>
> ---
>
> Changes to v1:
> - apply to all set/get calls now (at least those that have a property)
>
>
> tools/xsetwacom.c | 66 ++++++++++++++++++++++++++++++++++++++++-------------
> 1 files changed, 50 insertions(+), 16 deletions(-)
>
> diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c
> index 065d925..874f42f 100644
> --- a/tools/xsetwacom.c
> +++ b/tools/xsetwacom.c
> @@ -968,6 +968,32 @@ static XDevice* find_device(Display *display, char *name)
> return dev;
> }
>
> +/* Return True if the given device has the property, or False otherwise */
> +static Bool test_property(Display *dpy, XDevice* dev, Atom prop)
> +{
> + int nprops_return;
> + Atom *properties;
> + int found = False;
> +
> + /* if no property is required, return success */
> + if (prop == None)
> + return True;
> +
> + properties = XListDeviceProperties(dpy, dev, &nprops_return);
> +
> + while(nprops_return--)
> + {
> + if (properties[nprops_return] == prop)
> + {
> + found = True;
> + break;
> + }
> + }
> +
> + XFree(properties);
> + return found;
> +}
> +
> static void list_one_device(Display *dpy, XDeviceInfo *info)
> {
> static int wacom_prop = 0;
> @@ -1651,7 +1677,7 @@ static void set(Display *dpy, int argc, char **argv)
> {
> param_t *param;
> XDevice *dev = NULL;
> - Atom prop, type;
> + Atom prop = None, type;
> int format;
> unsigned char* data = NULL;
> unsigned long nitems, bytes_after;
> @@ -1686,17 +1712,22 @@ static void set(Display *dpy, int argc, char **argv)
> {
> printf("'%s' is a read-only option.\n", argv[1]);
> goto out;
> - } else if (param->set_func)
> + }
> +
> + if (param->prop_name)
> {
> - param->set_func(dpy, dev, param, argc - 2, &argv[2]);
> - goto out;
> + 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;
> + }
> }
>
> - prop = XInternAtom(dpy, param->prop_name, True);
> - if (!prop)
> + if (param->set_func)
> {
> - fprintf(stderr, "Property for '%s' not available.\n",
> - param->name);
> + param->set_func(dpy, dev, param, argc - 2, &argv[2]);
> goto out;
> }
>
> @@ -1994,22 +2025,25 @@ static void get(Display *dpy, enum printformat printformat, int argc, char **arg
>
> static void get_param(Display *dpy, XDevice *dev, param_t *param, int argc, char **argv)
> {
> - Atom prop, type;
> + Atom prop = None, type;
> int format;
> unsigned char* data;
> unsigned long nitems, bytes_after;
>
> - if (param->get_func)
> + if (param->prop_name)
> {
> - param->get_func(dpy, dev, param, argc, argv);
> - return;
> + 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);
> + return;
> + }
> }
>
> - prop = XInternAtom(dpy, param->prop_name, True);
> - if (!prop)
> + if (param->get_func)
> {
> - fprintf(stderr, "Property for '%s' not available.\n",
> - param->name);
> + param->get_func(dpy, dev, param, argc, argv);
> return;
> }
>
> --
> 1.7.0.1
>
|