summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Thum <simon.thum@gmx.de>2009-01-12 14:24:26 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-01-16 08:42:28 +1000
commit99c932c1a0db7821df3ef78efcfe4824697c4815 (patch)
treebb05c5e5158ce667df65e1f424eb9555c4ea19ab
parentffff875c2c587e3ad64d57afc1c432de77497c10 (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.c91
-rw-r--r--src/xinput.c4
-rw-r--r--src/xinput.h12
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,