diff options
author | Sascha Hlusiak <saschahlusiak@arcor.de> | 2008-09-30 15:27:56 +0200 |
---|---|---|
committer | Sascha Hlusiak <saschahlusiak@arcor.de> | 2008-09-30 15:27:56 +0200 |
commit | 50e5235ecd7142892567c7d3ea6460907538b421 (patch) | |
tree | 9779200464fce07e7eee4a3e5583afbc081a6929 | |
parent | 7f046c957d4529249bcb69b35f6513411f6efcf5 (diff) |
Add --get-button-map option.
-rw-r--r-- | src/buttonmap.c | 66 | ||||
-rw-r--r-- | src/xinput.c | 4 | ||||
-rw-r--r-- | src/xinput.h | 11 |
3 files changed, 81 insertions, 0 deletions
diff --git a/src/buttonmap.c b/src/buttonmap.c index 06f271b..c3dc406 100644 --- a/src/buttonmap.c +++ b/src/buttonmap.c @@ -23,6 +23,72 @@ #include "xinput.h" + +int +get_button_map(Display *display, + int argc, + char *argv[], + char *name, + char *desc) +{ + XDeviceInfo *info; + XDevice *device; + XAnyClassPtr ip; + int i; + int nbuttons; + + if (argc != 1) { + fprintf(stderr, "usage: xinput %s %s\n", name, desc); + return EXIT_FAILURE; + } + + info = find_device_info(display, argv[0], False); + + if (!info) { + fprintf(stderr, "unable to find device %s\n", argv[0]); + return EXIT_FAILURE; + } + + ip = (XAnyClassPtr) info->inputclassinfo; + nbuttons = 0; + + /* try to find the number of buttons */ + for(i=0; i<info->num_classes; i++) { + if (ip->class == ButtonClass) { + nbuttons = ((XButtonInfoPtr)ip)->num_buttons; + break; + } + ip = (XAnyClassPtr) ((char *) ip + ip->length); + } + if (nbuttons == 0) { + fprintf(stderr, "device has no buttons\n"); + return EXIT_FAILURE; + } + + device = XOpenDevice(display, info->id); + if (device) { + int idx; + unsigned char *map; + int min; + + map = (unsigned char *) malloc(sizeof(unsigned char) * nbuttons); + + XGetDeviceButtonMapping(display, device, map, nbuttons); + + for(idx=1; idx < nbuttons + 1; idx++) { + printf("%d ", map[idx - 1]); + } + printf("\n"); + XCloseDevice(display, device); + return EXIT_SUCCESS; + } else { + fprintf(stderr, "Unable to open device\n"); + return EXIT_FAILURE; + } +} + + + int set_button_map(Display *display, int argc, diff --git a/src/xinput.c b/src/xinput.c index b1cd0a3..e174388 100644 --- a/src/xinput.c +++ b/src/xinput.c @@ -53,6 +53,10 @@ static entry drivers[] = "<device name> <feedback id> <value>", set_integer_feedback }, + {"get-button-map", + "<device name>", + get_button_map + }, {"set-button-map", "<device name> <map button 1> [<map button 2> [...]]", set_button_map diff --git a/src/xinput.h b/src/xinput.h index d7a5104..532ee9a 100644 --- a/src/xinput.h +++ b/src/xinput.h @@ -69,6 +69,17 @@ set_ptr_feedback( ); int +get_button_map( +#if NeedFunctionPrototypes + Display* display, + int argc, + char *argv[], + char *prog_name, + char *prog_desc +#endif +); + +int set_button_map( #if NeedFunctionPrototypes Display* display, |