Hello community, here is the log from the commit of package evtest for openSUSE:Factory checked in at 2015-08-21 07:40:47 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/evtest (Old) and /work/SRC/openSUSE:Factory/.evtest.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "evtest" Changes: -------- --- /work/SRC/openSUSE:Factory/evtest/evtest.changes 2015-01-14 11:45:13.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.evtest.new/evtest.changes 2015-08-21 07:40:50.000000000 +0200 @@ -1,0 +2,6 @@ +Sun Aug 16 13:39:49 UTC 2015 - [email protected] + +- Update to version 1.33 + * No ChangeLog available + +------------------------------------------------------------------- Old: ---- evtest-1.32.tar.gz New: ---- evtest-1.33.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ evtest.spec ++++++ --- /var/tmp/diff_new_pack.8rJefj/_old 2015-08-21 07:40:51.000000000 +0200 +++ /var/tmp/diff_new_pack.8rJefj/_new 2015-08-21 07:40:51.000000000 +0200 @@ -16,7 +16,7 @@ # Name: evtest -Version: 1.32 +Version: 1.33 Release: 0 Summary: Input device event monitor and query tool License: GPL-2.0+ ++++++ evtest-1.32.tar.gz -> evtest-1.33.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evtest-1.32/configure.ac new/evtest-1.33/configure.ac --- old/evtest-1.32/configure.ac 2014-08-08 04:49:19.000000000 +0200 +++ new/evtest-1.33/configure.ac 2015-07-23 01:51:31.000000000 +0200 @@ -1,5 +1,5 @@ AC_PREREQ([2.57]) -AC_INIT(evtest,[1.32], [https://bugzilla.freedesktop.org/enter_bug.cgi?product=evtest], evtest) +AC_INIT(evtest,[1.33], [https://bugzilla.freedesktop.org/enter_bug.cgi?product=evtest], evtest) AM_INIT_AUTOMAKE([foreign dist-bzip2]) AC_CONFIG_HEADERS(config.h) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evtest-1.32/evtest.c new/evtest-1.33/evtest.c --- old/evtest-1.32/evtest.c 2014-08-08 04:49:19.000000000 +0200 +++ new/evtest-1.33/evtest.c 2015-07-23 01:51:31.000000000 +0200 @@ -55,6 +55,10 @@ #include <errno.h> #include <getopt.h> #include <ctype.h> +#include <signal.h> +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> #define BITS_PER_LONG (sizeof(long) * 8) #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) @@ -100,6 +104,14 @@ { "EV_SW", EV_SW, SW_MAX, EVIOCGSW(SW_MAX) }, }; +static int grab_flag = 0; +static volatile sig_atomic_t stop = 0; + +static void interrupt_handler(int sig) +{ + stop = 1; +} + /** * Look up an entry in the query_modes table by its textual name. * @@ -192,6 +204,12 @@ NAME_ELEMENT(INPUT_PROP_DIRECT), NAME_ELEMENT(INPUT_PROP_BUTTONPAD), NAME_ELEMENT(INPUT_PROP_SEMI_MT), +#ifdef INPUT_PROP_TOPBUTTONPAD + NAME_ELEMENT(INPUT_PROP_TOPBUTTONPAD), +#endif +#ifdef INPUT_PROP_POINTING_STICK + NAME_ELEMENT(INPUT_PROP_POINTING_STICK), +#endif }; #endif @@ -349,10 +367,39 @@ NAME_ELEMENT(KEY_DATABASE), NAME_ELEMENT(KEY_NEWS), NAME_ELEMENT(KEY_VOICEMAIL), NAME_ELEMENT(KEY_ADDRESSBOOK), NAME_ELEMENT(KEY_MESSENGER), NAME_ELEMENT(KEY_DISPLAYTOGGLE), - NAME_ELEMENT(KEY_SPELLCHECK), NAME_ELEMENT(KEY_LOGOFF), - NAME_ELEMENT(KEY_DOLLAR), NAME_ELEMENT(KEY_EURO), - NAME_ELEMENT(KEY_FRAMEBACK), NAME_ELEMENT(KEY_FRAMEFORWARD), - NAME_ELEMENT(KEY_CONTEXT_MENU), NAME_ELEMENT(KEY_MEDIA_REPEAT), +#ifdef KEY_SPELLCHECK + NAME_ELEMENT(KEY_SPELLCHECK), +#endif +#ifdef KEY_LOGOFF + NAME_ELEMENT(KEY_LOGOFF), +#endif +#ifdef KEY_DOLLAR + NAME_ELEMENT(KEY_DOLLAR), +#endif +#ifdef KEY_EURO + NAME_ELEMENT(KEY_EURO), +#endif +#ifdef KEY_FRAMEBACK + NAME_ELEMENT(KEY_FRAMEBACK), +#endif +#ifdef KEY_FRAMEFORWARD + NAME_ELEMENT(KEY_FRAMEFORWARD), +#endif +#ifdef KEY_CONTEXT_MENU + NAME_ELEMENT(KEY_CONTEXT_MENU), +#endif +#ifdef KEY_MEDIA_REPEAT + NAME_ELEMENT(KEY_MEDIA_REPEAT), +#endif +#ifdef KEY_10CHANNELSUP + NAME_ELEMENT(KEY_10CHANNELSUP), +#endif +#ifdef KEY_10CHANNELSDOWN + NAME_ELEMENT(KEY_10CHANNELSDOWN), +#endif +#ifdef KEY_IMAGES + NAME_ELEMENT(KEY_IMAGES), +#endif NAME_ELEMENT(KEY_DEL_EOL), NAME_ELEMENT(KEY_DEL_EOS), NAME_ELEMENT(KEY_INS_LINE), NAME_ELEMENT(KEY_DEL_LINE), NAME_ELEMENT(KEY_FN), NAME_ELEMENT(KEY_FN_ESC), @@ -371,28 +418,54 @@ NAME_ELEMENT(KEY_BRL_DOT5), NAME_ELEMENT(KEY_BRL_DOT6), NAME_ELEMENT(KEY_BRL_DOT7), NAME_ELEMENT(KEY_BRL_DOT8), NAME_ELEMENT(KEY_BRL_DOT9), NAME_ELEMENT(KEY_BRL_DOT10), +#ifdef KEY_NUMERIC_0 NAME_ELEMENT(KEY_NUMERIC_0), NAME_ELEMENT(KEY_NUMERIC_1), NAME_ELEMENT(KEY_NUMERIC_2), NAME_ELEMENT(KEY_NUMERIC_3), NAME_ELEMENT(KEY_NUMERIC_4), NAME_ELEMENT(KEY_NUMERIC_5), NAME_ELEMENT(KEY_NUMERIC_6), NAME_ELEMENT(KEY_NUMERIC_7), NAME_ELEMENT(KEY_NUMERIC_8), NAME_ELEMENT(KEY_NUMERIC_9), NAME_ELEMENT(KEY_NUMERIC_STAR), NAME_ELEMENT(KEY_NUMERIC_POUND), +#endif NAME_ELEMENT(KEY_BATTERY), NAME_ELEMENT(KEY_BLUETOOTH), NAME_ELEMENT(KEY_BRIGHTNESS_CYCLE), - NAME_ELEMENT(KEY_BRIGHTNESS_ZERO), NAME_ELEMENT(KEY_DASHBOARD), + NAME_ELEMENT(KEY_BRIGHTNESS_ZERO), +#ifdef KEY_DASHBOARD + NAME_ELEMENT(KEY_DASHBOARD), +#endif NAME_ELEMENT(KEY_DISPLAY_OFF), NAME_ELEMENT(KEY_DOCUMENTS), NAME_ELEMENT(KEY_FORWARDMAIL), NAME_ELEMENT(KEY_NEW), NAME_ELEMENT(KEY_KBDILLUMDOWN), NAME_ELEMENT(KEY_KBDILLUMUP), NAME_ELEMENT(KEY_KBDILLUMTOGGLE), NAME_ELEMENT(KEY_REDO), NAME_ELEMENT(KEY_REPLY), NAME_ELEMENT(KEY_SAVE), - NAME_ELEMENT(KEY_SCALE), NAME_ELEMENT(KEY_SEND), +#ifdef KEY_SCALE + NAME_ELEMENT(KEY_SCALE), +#endif + NAME_ELEMENT(KEY_SEND), NAME_ELEMENT(KEY_SCREENLOCK), NAME_ELEMENT(KEY_SWITCHVIDEOMODE), - NAME_ELEMENT(KEY_UWB), NAME_ELEMENT(KEY_VIDEO_NEXT), - NAME_ELEMENT(KEY_VIDEO_PREV), NAME_ELEMENT(KEY_WIMAX), +#ifdef KEY_UWB + NAME_ELEMENT(KEY_UWB), +#endif +#ifdef KEY_VIDEO_NEXT + NAME_ELEMENT(KEY_VIDEO_NEXT), +#endif +#ifdef KEY_VIDEO_PREV + NAME_ELEMENT(KEY_VIDEO_PREV), +#endif +#ifdef KEY_WIMAX + NAME_ELEMENT(KEY_WIMAX), +#endif +#ifdef KEY_WLAN NAME_ELEMENT(KEY_WLAN), +#endif #ifdef KEY_RFKILL NAME_ELEMENT(KEY_RFKILL), #endif +#ifdef KEY_MICMUTE + NAME_ELEMENT(KEY_MICMUTE), +#endif +#ifdef KEY_CAMERA_FOCUS + NAME_ELEMENT(KEY_CAMERA_FOCUS), +#endif #ifdef KEY_WPS_BUTTON NAME_ELEMENT(KEY_WPS_BUTTON), #endif @@ -445,7 +518,10 @@ NAME_ELEMENT(BTN_TOOL_MOUSE), NAME_ELEMENT(BTN_TOOL_LENS), NAME_ELEMENT(BTN_TOUCH), NAME_ELEMENT(BTN_STYLUS), NAME_ELEMENT(BTN_STYLUS2), NAME_ELEMENT(BTN_TOOL_DOUBLETAP), - NAME_ELEMENT(BTN_TOOL_TRIPLETAP), NAME_ELEMENT(BTN_TOOL_QUADTAP), + NAME_ELEMENT(BTN_TOOL_TRIPLETAP), +#ifdef BTN_TOOL_QUADTAP + NAME_ELEMENT(BTN_TOOL_QUADTAP), +#endif NAME_ELEMENT(BTN_GEAR_DOWN), NAME_ELEMENT(BTN_GEAR_UP), @@ -453,7 +529,54 @@ NAME_ELEMENT(BTN_DPAD_UP), NAME_ELEMENT(BTN_DPAD_DOWN), NAME_ELEMENT(BTN_DPAD_LEFT), NAME_ELEMENT(BTN_DPAD_RIGHT), #endif - +#ifdef KEY_ALS_TOGGLE + NAME_ELEMENT(KEY_ALS_TOGGLE), +#endif +#ifdef KEY_BUTTONCONFIG + NAME_ELEMENT(KEY_BUTTONCONFIG), +#endif +#ifdef KEY_TASKMANAGER + NAME_ELEMENT(KEY_TASKMANAGER), +#endif +#ifdef KEY_JOURNAL + NAME_ELEMENT(KEY_JOURNAL), +#endif +#ifdef KEY_CONTROLPANEL + NAME_ELEMENT(KEY_CONTROLPANEL), +#endif +#ifdef KEY_APPSELECT + NAME_ELEMENT(KEY_APPSELECT), +#endif +#ifdef KEY_SCREENSAVER + NAME_ELEMENT(KEY_SCREENSAVER), +#endif +#ifdef KEY_VOICECOMMAND + NAME_ELEMENT(KEY_VOICECOMMAND), +#endif +#ifdef KEY_BRIGHTNESS_MIN + NAME_ELEMENT(KEY_BRIGHTNESS_MIN), +#endif +#ifdef KEY_BRIGHTNESS_MAX + NAME_ELEMENT(KEY_BRIGHTNESS_MAX), +#endif +#ifdef KEY_KBDINPUTASSIST_PREV + NAME_ELEMENT(KEY_KBDINPUTASSIST_PREV), +#endif +#ifdef KEY_KBDINPUTASSIST_NEXT + NAME_ELEMENT(KEY_KBDINPUTASSIST_NEXT), +#endif +#ifdef KEY_KBDINPUTASSIST_PREVGROUP + NAME_ELEMENT(KEY_KBDINPUTASSIST_PREVGROUP), +#endif +#ifdef KEY_KBDINPUTASSIST_NEXTGROUP + NAME_ELEMENT(KEY_KBDINPUTASSIST_NEXTGROUP), +#endif +#ifdef KEY_KBDINPUTASSIST_ACCEPT + NAME_ELEMENT(KEY_KBDINPUTASSIST_ACCEPT), +#endif +#ifdef KEY_KBDINPUTASSIST_CANCEL + NAME_ELEMENT(KEY_KBDINPUTASSIST_CANCEL), +#endif #ifdef BTN_TRIGGER_HAPPY NAME_ELEMENT(BTN_TRIGGER_HAPPY1), NAME_ELEMENT(BTN_TRIGGER_HAPPY11), NAME_ELEMENT(BTN_TRIGGER_HAPPY2), NAME_ELEMENT(BTN_TRIGGER_HAPPY12), @@ -554,6 +677,12 @@ NAME_ELEMENT(LED_KANA), NAME_ELEMENT(LED_SLEEP), NAME_ELEMENT(LED_SUSPEND), NAME_ELEMENT(LED_MUTE), NAME_ELEMENT(LED_MISC), +#ifdef LED_MAIL + NAME_ELEMENT(LED_MAIL), +#endif +#ifdef LED_CHARGING + NAME_ELEMENT(LED_CHARGING), +#endif }; static const char * const repeats[REP_MAX + 1] = { @@ -580,11 +709,21 @@ NAME_ELEMENT(SW_LID), NAME_ELEMENT(SW_TABLET_MODE), NAME_ELEMENT(SW_HEADPHONE_INSERT), +#ifdef SW_RFKILL_ALL NAME_ELEMENT(SW_RFKILL_ALL), +#endif +#ifdef SW_MICROPHONE_INSERT NAME_ELEMENT(SW_MICROPHONE_INSERT), +#endif +#ifdef SW_DOCK NAME_ELEMENT(SW_DOCK), +#endif +#ifdef SW_LINEOUT_INSERT NAME_ELEMENT(SW_LINEOUT_INSERT), +#endif +#ifdef SW_JACK_PHYSICAL_INSERT NAME_ELEMENT(SW_JACK_PHYSICAL_INSERT), +#endif #ifdef SW_VIDEOOUT_INSERT NAME_ELEMENT(SW_VIDEOOUT_INSERT), #endif @@ -596,6 +735,12 @@ #ifdef SW_ROTATE_LOCK NAME_ELEMENT(SW_ROTATE_LOCK), #endif +#ifdef SW_LINEIN_INSERT + NAME_ELEMENT(SW_LINEIN_INSERT), +#endif +#ifdef SW_MUTE_DEVICE + NAME_ELEMENT(SW_MUTE_DEVICE), +#endif }; static const char * const force[FF_MAX + 1] = { @@ -617,7 +762,7 @@ static const char * const * const names[EV_MAX + 1] = { [0 ... EV_MAX] = NULL, - [EV_SYN] = events, [EV_KEY] = keys, + [EV_SYN] = syns, [EV_KEY] = keys, [EV_REL] = relatives, [EV_ABS] = absolutes, [EV_MSC] = misc, [EV_LED] = leds, [EV_SND] = sounds, [EV_REP] = repeats, @@ -684,6 +829,7 @@ struct dirent **namelist; int i, ndev, devnum; char *filename; + int max_device = 0; ndev = scandir(DEV_INPUT_EVENT, &namelist, is_event_device, versionsort); if (ndev <= 0) @@ -706,13 +852,18 @@ fprintf(stderr, "%s: %s\n", fname, name); close(fd); + + sscanf(namelist[i]->d_name, "event%d", &devnum); + if (devnum > max_device) + max_device = devnum; + free(namelist[i]); } - fprintf(stderr, "Select the device event number [0-%d]: ", ndev - 1); + fprintf(stderr, "Select the device event number [0-%d]: ", max_device); scanf("%d", &devnum); - if (devnum >= ndev || devnum < 0) + if (devnum > max_device || devnum < 0) return NULL; asprintf(&filename, "%s/%s%d", @@ -738,8 +889,9 @@ static int usage(void) { printf("USAGE:\n"); - printf(" Grab mode:\n"); - printf(" %s /dev/input/eventX\n", program_invocation_short_name); + printf(" Capture mode:\n"); + printf(" %s [--grab] /dev/input/eventX\n", program_invocation_short_name); + printf(" --grab grab the device for exclusive access\n"); printf("\n"); printf(" Query mode: (check exit code)\n"); printf(" %s --query /dev/input/eventX <type> <value>\n", @@ -802,6 +954,32 @@ } #endif +static int get_state(int fd, unsigned int type, unsigned long *array, size_t size) +{ + int rc; + + switch(type) { + case EV_LED: + rc = ioctl(fd, EVIOCGLED(size), array); + break; + case EV_SND: + rc = ioctl(fd, EVIOCGSND(size), array); + break; + case EV_SW: + rc = ioctl(fd, EVIOCGSW(size), array); + break; + case EV_KEY: + /* intentionally not printing the value for EV_KEY, let the + * repeat handle this */ + default: + return 1; + } + if (rc == -1) + return 1; + + return 0; +} + /** * Print static device information (no events). This information includes * version numbers, device name and all bits supported by this device. @@ -811,14 +989,18 @@ */ static int print_device_info(int fd) { - unsigned int type, code, prop; + unsigned int type, code; int version; unsigned short id[4]; char name[256] = "Unknown"; unsigned long bit[EV_MAX][NBITS(KEY_MAX)]; + unsigned long state[KEY_CNT] = {0}; #ifdef INPUT_PROP_SEMI_MT + unsigned int prop; unsigned long propbits[INPUT_PROP_MAX]; #endif + int stateval; + int have_state; if (ioctl(fd, EVIOCGVERSION, &version)) { perror("evtest: can't get version"); @@ -841,12 +1023,20 @@ for (type = 0; type < EV_MAX; type++) { if (test_bit(type, bit[0]) && type != EV_REP) { + have_state = (get_state(fd, type, state, sizeof(state)) == 0); + printf(" Event type %d (%s)\n", type, typename(type)); if (type == EV_SYN) continue; ioctl(fd, EVIOCGBIT(type, KEY_MAX), bit[type]); for (code = 0; code < KEY_MAX; code++) if (test_bit(code, bit[type])) { - printf(" Event code %d (%s)\n", code, codename(type, code)); + if (have_state) { + stateval = test_bit(code, state); + printf(" Event code %d (%s) state %d\n", + code, codename(type, code), stateval); + } else { + printf(" Event code %d (%s)\n", code, codename(type, code)); + } if (type == EV_ABS) print_absdata(fd, code); } @@ -881,9 +1071,16 @@ { struct input_event ev[64]; int i, rd; + fd_set rdfs; - while (1) { - rd = read(fd, ev, sizeof(struct input_event) * 64); + FD_ZERO(&rdfs); + FD_SET(fd, &rdfs); + + while (!stop) { + select(fd + 1, &rdfs, NULL, NULL, NULL); + if (stop) + break; + rd = read(fd, ev, sizeof(ev)); if (rd < (int) sizeof(struct input_event)) { printf("expected %d bytes, got %d\n", (int) sizeof(struct input_event), rd); @@ -902,6 +1099,8 @@ if (type == EV_SYN) { if (code == SYN_MT_REPORT) printf("++++++++++++++ %s ++++++++++++\n", codename(type, code)); + else if (code == SYN_DROPPED) + printf(">>>>>>>>>>>>>> %s <<<<<<<<<<<<\n", codename(type, code)); else printf("-------------- %s ------------\n", codename(type, code)); } else { @@ -916,6 +1115,9 @@ } } + + ioctl(fd, EVIOCGRAB, (void*)0); + return EXIT_SUCCESS; } /** @@ -924,13 +1126,13 @@ * @param fd The file descriptor to the device. * @return 0 if the grab was successful, or 1 otherwise. */ -static int test_grab(int fd) +static int test_grab(int fd, int grab_flag) { int rc; rc = ioctl(fd, EVIOCGRAB, (void*)1); - if (!rc) + if (rc == 0 && !grab_flag) ioctl(fd, EVIOCGRAB, (void*)0); return rc; @@ -943,7 +1145,7 @@ * @param device The device to monitor, or NULL if the user should be prompted. * @return 0 on success, non-zero on error. */ -static int do_capture(const char *device) +static int do_capture(const char *device, int grab_flag) { int fd; char *filename = NULL; @@ -981,7 +1183,7 @@ printf("Testing ... (interrupt to exit)\n"); - if (test_grab(fd)) + if (test_grab(fd, grab_flag)) { printf("***********************************************\n"); printf(" This device is grabbed by another process.\n"); @@ -995,6 +1197,9 @@ printf("***********************************************\n"); } + signal(SIGINT, interrupt_handler); + signal(SIGTERM, interrupt_handler); + free(filename); return print_events(fd); @@ -1077,6 +1282,7 @@ } static const struct option long_options[] = { + { "grab", no_argument, &grab_flag, 1 }, { "query", no_argument, NULL, MODE_QUERY }, { "version", no_argument, NULL, MODE_VERSION }, { 0, }, @@ -1095,6 +1301,8 @@ if (c == -1) break; switch (c) { + case 0: + break; case MODE_QUERY: mode = c; break; @@ -1109,7 +1317,7 @@ device = argv[optind++]; if (mode == MODE_CAPTURE) - return do_capture(device); + return do_capture(device, grab_flag); if ((argc - optind) < 2) { fprintf(stderr, "Query mode requires device, type and key parameters\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evtest-1.32/evtest.txt new/evtest-1.33/evtest.txt --- old/evtest-1.32/evtest.txt 2014-08-08 04:49:19.000000000 +0200 +++ new/evtest-1.33/evtest.txt 2015-07-23 01:51:31.000000000 +0200 @@ -8,7 +8,7 @@ SYNOPSIS -------- - evtest /dev/input/eventX + evtest [--grab] /dev/input/eventX evtest --query /dev/input/eventX <type> <value> @@ -19,6 +19,10 @@ supported by the device. It then monitors the device and displays all the events layer events generated. +If the --grab flag is given in capture mode, evtest keeps an EVIOCGRAB on the +device. While this grab is active, other processes will not receive events +from the kernel devices. The grab is released again when evtest quits. + In the second invocation type ("query mode"), evtest performs a one-shot query of the state of a specific key *value* of an event *type*.
