diff options
author | Julien Cristau <jcristau@debian.org> | 2009-09-15 17:33:54 +0200 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-09-17 11:02:21 +1000 |
commit | 1665fa4e24930f7e3f1cfbc8bf50119ab7d6ca04 (patch) | |
tree | 5d67e72c854dd89b19fdabf359780812061d1f82 | |
parent | 650c52db8b30cebca3386ac350154a6b3a0abbe1 (diff) |
Add a format and type argument to the set_prop functions
This will allow the addition of command-line options to set format and
type, and the reuse of this code for the set-{atom,float,int}-prop
paths.
Signed-off-by: Julien Cristau <jcristau@debian.org>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | src/property.c | 77 |
1 files changed, 51 insertions, 26 deletions
diff --git a/src/property.c b/src/property.c index 59a8aa3..a41446b 100644 --- a/src/property.c +++ b/src/property.c @@ -482,16 +482,16 @@ set_atom_prop(Display *dpy, int argc, char** argv, char* n, char *desc) } static int -set_prop_xi1(Display *dpy, int argc, char **argv, char *n, char *desc) +do_set_prop_xi1(Display *dpy, Atom type, int format, int argc, char **argv, char *n, char *desc) { XDeviceInfo *info; XDevice *dev; Atom prop; - Atom type; + Atom old_type; char *name; int i; Atom float_atom; - int format, nelements = 0; + int old_format, nelements = 0; unsigned long act_nitems, bytes_after; char *endptr; union { @@ -533,17 +533,26 @@ set_prop_xi1(Display *dpy, int argc, char **argv, char *n, char *desc) float_atom = XInternAtom(dpy, "FLOAT", False); nelements = argc - 2; - if (XGetDeviceProperty(dpy, dev, prop, 0, 0, False, AnyPropertyType, - &type, &format, &act_nitems, &bytes_after, &data.c) - != Success) { - fprintf(stderr, "failed to get property type and format for %s\n", name); - return EXIT_FAILURE; - } + if (type == None || format == 0) { + if (XGetDeviceProperty(dpy, dev, prop, 0, 0, False, AnyPropertyType, + &old_type, &old_format, &act_nitems, + &bytes_after, &data.c) != Success) { + fprintf(stderr, "failed to get property type and format for %s\n", + name); + return EXIT_FAILURE; + } else { + if (type == None) + type = old_type; + if (format == 0) + format = old_format; + } - XFree(data.c); + XFree(data.c); + } if (type == None) { - fprintf(stderr, "property %s doesn't exist\n", name); + fprintf(stderr, "property %s doesn't exist, you need to specify " + "its type and format\n", name); return EXIT_FAILURE; } @@ -755,15 +764,15 @@ delete_prop_xi2(Display *dpy, int argc, char** argv, char* n, char *desc) } static int -set_prop_xi2(Display *dpy, int argc, char **argv, char *n, char *desc) +do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char *n, char *desc) { XIDeviceInfo *info; Atom prop; - Atom type; + Atom old_type; char *name; int i; Atom float_atom; - int format, nelements = 0; + int old_format, nelements = 0; unsigned long act_nitems, bytes_after; char *endptr; union { @@ -797,17 +806,26 @@ set_prop_xi2(Display *dpy, int argc, char **argv, char *n, char *desc) float_atom = XInternAtom(dpy, "FLOAT", False); nelements = argc - 2; - if (XIGetProperty(dpy, info->deviceid, prop, 0, 0, False, AnyPropertyType, - &type, &format, &act_nitems, &bytes_after, &data.c) - != Success) { - fprintf(stderr, "failed to get property type and format for %s\n", name); - return EXIT_FAILURE; - } + if (type == None || format == 0) { + if (XIGetProperty(dpy, info->deviceid, prop, 0, 0, False, + AnyPropertyType, &old_type, &old_format, &act_nitems, + &bytes_after, &data.c) != Success) { + fprintf(stderr, "failed to get property type and format for %s\n", + name); + return EXIT_FAILURE; + } else { + if (type == None) + type = old_type; + if (format == 0) + format = old_format; + } - XFree(data.c); + XFree(data.c); + } if (type == None) { - fprintf(stderr, "property %s doesn't exist\n", name); + fprintf(stderr, "property %s doesn't exist, you need to specify " + "its type and format\n", name); return EXIT_FAILURE; } @@ -884,12 +902,19 @@ int delete_prop(Display *display, int argc, char *argv[], char *name, } -int set_prop(Display *display, int argc, char *argv[], char *name, - char *desc) +static int +do_set_prop(Display *display, Atom type, int format, int argc, char *argv[], char *name, char *desc) { #ifdef HAVE_XI2 if (xinput_version(display) == XI_2_Major) - return set_prop_xi2(display, argc, argv, name, desc); + return do_set_prop_xi2(display, type, format, argc, argv, name, desc); #endif - return set_prop_xi1(display, argc, argv, name, desc); + return do_set_prop_xi1(display, type, format, argc, argv, name, desc); +} + +int set_prop(Display *display, int argc, char *argv[], char *name, + char *desc) +{ + return do_set_prop(display, None, 0, argc, argv, name, desc); } + |