diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-01-16 09:53:01 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-01-16 09:56:31 +1000 |
commit | aabe69b44c14c443df1dfb25d23e1c180a6a029d (patch) | |
tree | ae80ef65f6b53334944b98f6344cb94be7179643 | |
parent | 9870cb4120961f15d3e372a1ba49b5d32013e819 (diff) |
Add set-atom-prop to set properties containing other properties.
-rw-r--r-- | src/property.c | 78 | ||||
-rw-r--r-- | src/xinput.c | 4 | ||||
-rw-r--r-- | src/xinput.h | 10 |
3 files changed, 92 insertions, 0 deletions
diff --git a/src/property.c b/src/property.c index a046a37..062ede9 100644 --- a/src/property.c +++ b/src/property.c @@ -404,3 +404,81 @@ int delete_prop(Display *dpy, int argc, char** argv, char* n, char *desc) XCloseDevice(dpy, dev); return EXIT_SUCCESS; } + +int +set_atom_prop(Display *dpy, int argc, char** argv, char* n, char *desc) +{ + XDeviceInfo *info; + XDevice *dev; + Atom prop; + char *name; + int i, j; + Bool is_atom = True; + Atom *data; + int nelements = 0; + + if (argc < 3) + { + fprintf(stderr, "Usage: xinput %s %s\n", n, desc); + return EXIT_FAILURE; + } + + info = find_device_info(dpy, argv[0], False); + if (!info) + { + fprintf(stderr, "unable to find device %s\n", argv[0]); + return EXIT_FAILURE; + } + + dev = XOpenDevice(dpy, info->id); + if (!dev) + { + fprintf(stderr, "unable to open device %s\n", argv[0]); + return EXIT_FAILURE; + } + + name = argv[1]; + + for(i = 0; i < strlen(name); i++) { + if (!isdigit(name[i])) { + is_atom = False; + break; + } + } + + if (!is_atom) + prop = XInternAtom(dpy, name, False); + else + prop = atoi(name); + + nelements = argc - 2; + data = calloc(nelements, sizeof(Atom)); + for (i = 0; i < nelements; i++) + { + is_atom = True; + name = argv[2 + i]; + for(j = 0; j < strlen(name); j++) { + if (!isdigit(name[j])) { + is_atom = False; + break; + } + } + + if (!is_atom) + data[i] = XInternAtom(dpy, name, False); + else + { + data[i] = atoi(name); + XFree(XGetAtomName(dpy, data[i])); + } + } + + XChangeDeviceProperty(dpy, dev, prop, XA_ATOM, 32, PropModeReplace, + (unsigned char*)data, nelements); + + free(data); + XCloseDevice(dpy, dev); + return EXIT_SUCCESS; +} + + diff --git a/src/xinput.c b/src/xinput.c index 6f41619..1207f9d 100644 --- a/src/xinput.c +++ b/src/xinput.c @@ -119,6 +119,10 @@ static entry drivers[] = "<device> <property> <val> [<val> ...]", set_float_prop }, + { "set-atom-prop", + "<device> <property> <val> [<val> ...]", + set_atom_prop + }, { "watch-props", "<device>", watch_props diff --git a/src/xinput.h b/src/xinput.h index 654ccba..3c36497 100644 --- a/src/xinput.h +++ b/src/xinput.h @@ -256,6 +256,16 @@ set_float_prop( #endif ); +int +set_atom_prop( +#if NeedFunctionPrototypes + Display* display, + int argc, + char *argv[], + char *prog_name, + char *prog_desc +#endif +); int watch_props( |