diff options
author | Simon Thum <simon.thum@gmx.de> | 2009-01-12 14:24:26 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-01-16 08:42:28 +1000 |
commit | 99c932c1a0db7821df3ef78efcfe4824697c4815 (patch) | |
tree | bb05c5e5158ce667df65e1f424eb9555c4ea19ab | |
parent | ffff875c2c587e3ad64d57afc1c432de77497c10 (diff) |
Add set-float-prop option to set properties using floating point numbers.
Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com>
-rw-r--r-- | src/property.c | 91 | ||||
-rw-r--r-- | src/xinput.c | 4 | ||||
-rw-r--r-- | src/xinput.h | 12 |
3 files changed, 106 insertions, 1 deletions
diff --git a/src/property.c b/src/property.c index d0a4ffc..876d9cd 100644 --- a/src/property.c +++ b/src/property.c @@ -45,12 +45,14 @@ print_property(Display *dpy, XDevice* dev, Atom property) int j; name = XGetAtomName(dpy, property); - printf("\t%s (%d):\t", name, property); + printf("\t%s (%ld):\t", name, property); if (XGetDeviceProperty(dpy, dev, property, 0, 1000, False, AnyPropertyType, &act_type, &act_format, &nitems, &bytes_after, &data) == Success) { + int float_atom = XInternAtom(dpy, "FLOAT", False); + ptr = data; printf("\t"); @@ -79,6 +81,12 @@ print_property(Display *dpy, XDevice* dev, Atom property) printf("\t%s\n", XGetAtomName(dpy, (Atom)(*ptr))); break; default: + if (float_atom != None && act_type == float_atom) + { + printf("\t%f\n", *((float*)ptr)); + break; + } + printf("\t\t... of unknown type %s\n", XGetAtomName(dpy, act_type)); break; @@ -226,6 +234,87 @@ set_int_prop(Display *dpy, int argc, char** argv, char* n, char *desc) return EXIT_SUCCESS; } +int +set_float_prop(Display *dpy, int argc, char** argv, char* n, char *desc) +{ + XDeviceInfo *info; + XDevice *dev; + Atom prop, float_atom; + char *name; + int i; + Bool is_atom = True; + float *data; + int nelements = 0; + char* endptr; + + if (argc < 2) + { + 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; + + float_atom = XInternAtom(dpy, "FLOAT", False); + + if (float_atom == (Atom)0) + { + fprintf(stderr, "no FLOAT atom present in server\n"); + return EXIT_FAILURE; + } + + if (sizeof(float) != 4) + { + fprintf(stderr, "sane FP required\n"); + return EXIT_FAILURE; + } + + data = calloc(nelements, 4); + for (i = 0; i < nelements; i++) + { + *(data + i) = strtod(argv[2 + i], &endptr); + if(endptr == argv[2 + i]){ + fprintf(stderr, "argument %s could not be parsed\n", argv[2 + i]); + return EXIT_FAILURE; + } + } + + XChangeDeviceProperty(dpy, dev, prop, float_atom, 32, PropModeReplace, + (unsigned char*)data, nelements); + + free(data); + XCloseDevice(dpy, dev); + return EXIT_SUCCESS; +} + int watch_props(Display *dpy, int argc, char** argv, char* n, char *desc) { diff --git a/src/xinput.c b/src/xinput.c index 441ee12..ce19aae 100644 --- a/src/xinput.c +++ b/src/xinput.c @@ -114,6 +114,10 @@ static entry drivers[] = "<device> <property> <format (8, 16, 32)> <val> [<val> ...]", set_int_prop }, + { "set-float-prop", + "<device> <property> <val> [<val> ...]", + set_float_prop + }, { "watch-props", "<device>", watch_props diff --git a/src/xinput.h b/src/xinput.h index 532ee9a..654ccba 100644 --- a/src/xinput.h +++ b/src/xinput.h @@ -246,6 +246,18 @@ set_int_prop( ); int +set_float_prop( +#if NeedFunctionPrototypes + Display* display, + int argc, + char *argv[], + char *prog_name, + char *prog_desc +#endif +); + + +int watch_props( #if NeedFunctionPrototypes Display* display, |