From: Peter Hutterer Date: Thu, 7 May 2009 03:06:05 +0000 (+1000) Subject: Merge branch 'master' into xi2 X-Git-Url: https://diplodocus.org/git/xorg-xinput/commitdiff_plain/a783c19f94e6fed28aeaf0550558cd0b63402b9c?hp=65e3e12fa6fc2043fbb0122c72a4f7df09b1c659 Merge branch 'master' into xi2 Conflicts: src/property.c src/xinput.c src/xinput.h --- diff --git a/configure.ac b/configure.ac index f2ad4f1..8314a6b 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl Copyright 2007 Peter Hutterer dnl Process this file with autoconf to create configure. AC_PREREQ([2.57]) -AC_INIT(xinput,[1.4.0], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xinput) +AC_INIT(xinput,[1.4.1], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xinput) AM_INIT_AUTOMAKE([dist-bzip2]) AM_MAINTAINER_MODE diff --git a/man/xinput.man b/man/xinput.man index c9ff46f..104cafb 100644 --- a/man/xinput.man +++ b/man/xinput.man @@ -65,6 +65,16 @@ Sets an integer property for the device. Appropriate values for \fIformat\fP are 8, 16, or 32, depending on the property. .PP .TP 8 +.B xinput set-float-prop \fIdevice_name\fP \fIproperty\fP \fIvalue\fP +Sets a float property for the device. +.PP +.TP 8 +.B xinput set-prop \fIdevice_name\fP \fIproperty\fP \fIvalue\fP +Set the property to the given value(s). The format and type of the property +are left as-is and the arguments are interpreted according to the property +type. This argument can only be used to modify existing properties. +.PP +.TP 8 .B xinput watch-props \fIdevice_name\fP Prints to standard out when property changes occur. .PP diff --git a/src/list.c b/src/list.c index 52e3961..24edc70 100644 --- a/src/list.c +++ b/src/list.c @@ -26,7 +26,7 @@ #include /* for XI_Device***ChangedNotify */ static void -print_info(XDeviceInfo *info, Bool shortformat) +print_info(Display* dpy, XDeviceInfo *info, Bool shortformat) { int i,j; XAnyClassPtr any; @@ -62,6 +62,9 @@ print_info(XDeviceInfo *info, Bool shortformat) if (shortformat) return; + if(info->type != None) + printf("\tType is %s\n", XGetAtomName(dpy, info->type)); + if (info->num_classes > 0) { any = (XAnyClassPtr) (info->inputclassinfo); for (i=0; inum_classes; i++) { @@ -120,7 +123,7 @@ static int list_xi1(Display *display, do { info = XListInputDevices(display, &num_devices); for(loop=0; loopid); + if (!dev) + { + fprintf(stderr, "unable to open device %s\n", argv[0]); + return EXIT_FAILURE; + } + + name = argv[1]; + + prop = parse_atom(dpy, name); + + if (prop == None) { + fprintf(stderr, "invalid property %s\n", name); + return EXIT_FAILURE; + } + + 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; + } + + XFree(data.c); + + if (type == None) { + fprintf(stderr, "property %s doesn't exist\n", name); + return EXIT_FAILURE; + } + + data.c = calloc(nelements, sizeof(long)); + + for (i = 0; i < nelements; i++) + { + if (type == XA_INTEGER) { + switch (format) + { + case 8: + data.c[i] = atoi(argv[2 + i]); + break; + case 16: + data.s[i] = atoi(argv[2 + i]); + break; + case 32: + data.l[i] = atoi(argv[2 + i]); + break; + default: + fprintf(stderr, "unexpected size for property %s", name); + return EXIT_FAILURE; + } + } else if (type == float_atom) { + if (format != 32) { + fprintf(stderr, "unexpected format %d for property %s\n", + format, name); + return EXIT_FAILURE; + } + *(float *)(data.l + 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; + } + } else if (type == XA_ATOM) { + if (format != 32) { + fprintf(stderr, "unexpected format %d for property %s\n", + format, name); + return EXIT_FAILURE; + } + data.a[i] = parse_atom(dpy, argv[2 + i]); + } else { + fprintf(stderr, "unexpected type for property %s\n", name); + return EXIT_FAILURE; + } + } + XChangeDeviceProperty(dpy, dev, prop, type, format, PropModeReplace, + data.c, nelements); + free(data.c); + XCloseDevice(dpy, dev); + return EXIT_SUCCESS; +} diff --git a/src/xinput.c b/src/xinput.c index cc85aff..da54b48 100644 --- a/src/xinput.c +++ b/src/xinput.c @@ -135,6 +135,10 @@ static entry drivers[] = " ", delete_prop }, + { "set-prop", + " [ ...]", + set_prop + }, {NULL, NULL, NULL } }; @@ -193,7 +197,7 @@ find_device_info(Display *display, "Warning: There are multiple devices named \"%s\".\n" "To ensure the correct one is selected, please use " "the device ID instead.\n\n", name); - return NULL; + return NULL; } else { found = &devices[loop]; } diff --git a/src/xinput.h b/src/xinput.h index 4b68090..c7269b9 100644 --- a/src/xinput.h +++ b/src/xinput.h @@ -41,47 +41,39 @@ #define EXIT_FAILURE 0 #endif -XDeviceInfo* -find_device_info( - Display *display, - char *name, - Bool only_extended - ); -int -xi2_find_device_id(Display *display, char *name); +XDeviceInfo* find_device_info( Display *display, char *name, Bool only_extended); +int xi2_find_device_id(Display *display, char *name); int xinput_version(Display* display); -#define DECLARE(name) \ - int (name) ( \ - Display* display, \ - int argc, \ - char *argv[], \ - char *prog_name, \ - char *prog_desc \ -) +int get_feedbacks( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_ptr_feedback( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int get_button_map( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_button_map( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_pointer( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); + +int set_mode( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int list( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int test( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int version( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_integer_feedback( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int query_state( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); + +/* X Input 1.5 */ +int list_props( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_int_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_float_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_atom_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int watch_props( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int delete_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); + +/* X Input 2.0 */ +int create_master( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int remove_master( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int change_attachment( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int float_device( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int set_clientpointer( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int test_xi2( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); -DECLARE(get_feedbacks); -DECLARE(set_ptr_feedback); -DECLARE(get_button_map); -DECLARE(set_button_map); -DECLARE(set_pointer); -DECLARE(set_mode); -DECLARE(list); -DECLARE(test); -DECLARE(version); -DECLARE(set_integer_feedback); -DECLARE(query_state); -DECLARE(create_master); -DECLARE(remove_master); -DECLARE(change_attachment); -DECLARE(float_device); -DECLARE(set_clientpointer); -DECLARE(test_xi2); -DECLARE(list_props); -DECLARE(set_int_prop); -DECLARE(set_float_prop); -DECLARE(set_atom_prop); -DECLARE(watch_props); -DECLARE(delete_prop); /* end of xinput.h */