From: Peter Hutterer Date: Thu, 15 Jan 2009 23:53:01 +0000 (+1000) Subject: Add set-atom-prop to set properties containing other properties. X-Git-Url: https://diplodocus.org/git/xorg-xinput/commitdiff_plain/aabe69b44c14c443df1dfb25d23e1c180a6a029d?ds=sidebyside;hp=--cc Add set-atom-prop to set properties containing other properties. --- aabe69b44c14c443df1dfb25d23e1c180a6a029d 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[] = " [ ...]", set_float_prop }, + { "set-atom-prop", + " [ ...]", + set_atom_prop + }, { "watch-props", "", 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(