/* * Copyright 1996 by Frederic Lepied, France. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of the authors not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. The authors make no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * */ #include "xinput.h" #include #include typedef int (*prog)(Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); typedef struct { char *func_name; char *arg_desc; prog func; } entry; static entry drivers[] = { {"get-feedbacks", "", get_feedbacks }, {"set-ptr-feedback", " ", set_ptr_feedback }, {"set-integer-feedback", " ", set_integer_feedback }, {"get-button-map", "", get_button_map }, {"set-button-map", " [ [...]]", set_button_map }, {"set-pointer", " [ ]", set_pointer }, {"set-mode", " ABSOLUTE|RELATIVE", set_mode }, {"list", "[--loop || --short || ...]", list }, {"query-state", "", query_state }, {"test", "[-proximity] ", test }, {"version", "", version }, #if HAVE_XI2 { "create-master", " [] []", create_master }, { "remove-master", " [] [] []", remove_master }, { "reattach", " ", change_attachment }, { "float", "", float_device }, { "set-cp", " ", set_clientpointer }, { "test-xi2", "", test_xi2, }, #endif { "list-props", " [ ...]", list_props }, { "set-int-prop", " [ ...]", set_int_prop }, { "set-float-prop", " [ ...]", set_float_prop }, { "set-atom-prop", " [ ...]", set_atom_prop }, { "watch-props", "", watch_props }, { "delete-prop", " ", delete_prop }, { "set-prop", " [ ...]", set_prop }, {NULL, NULL, NULL } }; int xinput_version(Display *display) { XExtensionVersion *version; static int vers = -1; if (vers != -1) return vers; version = XGetExtensionVersion(display, INAME); if (version && (version != (XExtensionVersion*) NoSuchExtension)) { vers = version->major_version; XFree(version); } return vers; } XDeviceInfo* find_device_info(Display *display, char *name, Bool only_extended) { XDeviceInfo *devices; XDeviceInfo *found = NULL; int loop; int num_devices; int len = strlen(name); Bool is_id = True; XID id = (XID)-1; for(loop=0; loop= IsXExtensionDevice)) && ((!is_id && strcmp(devices[loop].name, name) == 0) || (is_id && devices[loop].id == id))) { if (found) { fprintf(stderr, "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; } else { found = &devices[loop]; } } } return found; } #ifdef HAVE_XI2 XIDeviceInfo* xi2_find_device_info(Display *display, char *name) { XIDeviceInfo *info; int ndevices; Bool is_id = True; int i, id = -1; for(i = 0; i < strlen(name); i++) { if (!isdigit(name[i])) { is_id = False; break; } } if (is_id) { id = atoi(name); } info = XIQueryDevice(display, XIAllDevices, &ndevices); for(i = 0; i < ndevices; i++) { if ((is_id && info[i].deviceid == id) || (!is_id && strcmp(info[i].name, name) == 0)) { return &info[i]; } } XIFreeDeviceInfo(info); return NULL; } #endif static void usage(void) { entry *pdriver = drivers; fprintf(stderr, "usage :\n"); while(pdriver->func_name) { fprintf(stderr, "\txinput %s %s\n", pdriver->func_name, pdriver->arg_desc); pdriver++; } } int main(int argc, char * argv[]) { Display *display; entry *driver = drivers; char *func; if (argc < 2) { usage(); return EXIT_FAILURE; } display = XOpenDisplay(NULL); if (display == NULL) { fprintf(stderr, "Unable to connect to X server\n"); return EXIT_FAILURE; } func = argv[1]; while((*func) == '-') func++; if (!xinput_version(display)) { fprintf(stderr, "%s extension not available\n", INAME); return EXIT_FAILURE; } while(driver->func_name) { if (strcmp(driver->func_name, func) == 0) { int r = (*driver->func)(display, argc-2, argv+2, driver->func_name, driver->arg_desc); XSync(display, False); XCloseDisplay(display); return r; } driver++; } usage(); return EXIT_FAILURE; } /* end of xinput.c */