summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Cristau <jcristau@debian.org>2009-09-15 17:33:54 +0200
committerPeter Hutterer <peter.hutterer@who-t.net>2009-09-17 11:02:21 +1000
commit1665fa4e24930f7e3f1cfbc8bf50119ab7d6ca04 (patch)
tree5d67e72c854dd89b19fdabf359780812061d1f82
parent650c52db8b30cebca3386ac350154a6b3a0abbe1 (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.c77
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);
}
+