X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=tools%2Finteractive-evdev.c;h=2dece752e3872d2f067274c33e57d899b1857243;hb=e73599ee0ee7a5ee16cbdbac664872d0aa0cf2df;hp=9c8c94eaff016e6576b90943f4c1772fa7d59261;hpb=fcc6b28f5fdf582b48124fbd9190e78fab496839;p=platform%2Fupstream%2Flibxkbcommon.git diff --git a/tools/interactive-evdev.c b/tools/interactive-evdev.c index 9c8c94e..2dece75 100644 --- a/tools/interactive-evdev.c +++ b/tools/interactive-evdev.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -38,7 +39,6 @@ #include #include -#include #include #include "xkbcommon/xkbcommon.h" @@ -59,6 +59,14 @@ static bool report_state_changes; static bool with_compose; static enum xkb_consumed_mode consumed_mode = XKB_CONSUMED_MODE_XKB; +#ifdef ENABLE_PRIVATE_APIS +#define DEFAULT_PRINT_FIELDS (PRINT_ALL_FIELDS & ~PRINT_MODMAPS) +#else +#define DEFAULT_PRINT_FIELDS PRINT_ALL_FIELDS +#endif +print_state_fields_mask_t print_fields = DEFAULT_PRINT_FIELDS; + +#define DEFAULT_INCLUDE_PATH_PLACEHOLDER "__defaults__" #define NLONGS(n) (((n) + LONG_BIT - 1) / LONG_BIT) static bool @@ -270,9 +278,12 @@ process_event(struct keyboard *kbd, uint16_t type, uint16_t code, int32_t value) xkb_compose_state_feed(kbd->compose_state, keysym); } - if (value != KEY_STATE_RELEASE) - tools_print_keycode_state(kbd->state, kbd->compose_state, keycode, - consumed_mode); + if (value != KEY_STATE_RELEASE) { + tools_print_keycode_state( + kbd->state, kbd->compose_state, keycode, + consumed_mode, print_fields + ); + } if (with_compose) { status = xkb_compose_state_get_status(kbd->compose_state); @@ -313,33 +324,25 @@ read_keyboard(struct keyboard *kbd) static int loop(struct keyboard *kbds) { - int i, ret = 1; - int epfd = -1; + int ret = -1; struct keyboard *kbd; - struct epoll_event ev; - struct epoll_event evs[16]; + nfds_t nfds, i; + struct pollfd *fds = NULL; - epfd = epoll_create1(0); - if (epfd < 0) { - fprintf(stderr, "Couldn't create epoll instance: %s\n", - strerror(errno)); + for (kbd = kbds, nfds = 0; kbd; kbd = kbd->next, nfds++) {} + fds = calloc(nfds, sizeof(*fds)); + if (fds == NULL) { + fprintf(stderr, "Out of memory"); goto out; } - for (kbd = kbds; kbd; kbd = kbd->next) { - memset(&ev, 0, sizeof(ev)); - ev.events = EPOLLIN; - ev.data.ptr = kbd; - ret = epoll_ctl(epfd, EPOLL_CTL_ADD, kbd->fd, &ev); - if (ret) { - fprintf(stderr, "Couldn't add %s to epoll: %s\n", - kbd->path, strerror(errno)); - goto out; - } + for (i = 0, kbd = kbds; kbd; kbd = kbd->next, i++) { + fds[i].fd = kbd->fd; + fds[i].events = POLLIN; } while (!terminate) { - ret = epoll_wait(epfd, evs, 16, -1); + ret = poll(fds, nfds, -1); if (ret < 0) { if (errno == EINTR) continue; @@ -348,18 +351,19 @@ loop(struct keyboard *kbds) goto out; } - for (i = 0; i < ret; i++) { - kbd = evs[i].data.ptr; - ret = read_keyboard(kbd); - if (ret) { - goto out; + for (i = 0, kbd = kbds; kbd; kbd = kbd->next, i++) { + if (fds[i].revents != 0) { + ret = read_keyboard(kbd); + if (ret) { + goto out; + } } } } ret = 0; out: - close(epfd); + free(fds); return ret; } @@ -372,16 +376,23 @@ sigintr_handler(int signum) static void usage(FILE *fp, char *progname) { - fprintf(fp, "Usage: %s [--rules=] [--model=] " - "[--layout=] [--variant=] [--options=]\n", + fprintf(fp, "Usage: %s [--include=] [--include-defaults] " + "[--rules=] [--model=] [--layout=] " + "[--variant=] [--options=]\n", progname); fprintf(fp, " or: %s --keymap \n", progname); fprintf(fp, "For both:\n" +#ifdef ENABLE_PRIVATE_APIS + " --print-modmaps (print real & virtual key modmaps)\n" +#endif + " --short (do not print layout nor Unicode keysym translation)\n" " --report-state-changes (report changes to the state)\n" " --enable-compose (enable Compose)\n" " --consumed-mode={xkb|gtk} (select the consumed modifiers mode, default: xkb)\n" " --without-x11-offset (don't add X11 keycode offset)\n" + "Other:\n" + " --help (display this help and exit)\n" ); } @@ -393,6 +404,8 @@ main(int argc, char *argv[]) struct xkb_context *ctx = NULL; struct xkb_keymap *keymap = NULL; struct xkb_compose_table *compose_table = NULL; + const char *includes[64]; + size_t num_includes = 0; const char *rules = NULL; const char *model = NULL; const char *layout = NULL; @@ -402,6 +415,8 @@ main(int argc, char *argv[]) const char *locale; struct sigaction act; enum options { + OPT_INCLUDE, + OPT_INCLUDE_DEFAULTS, OPT_RULES, OPT_MODEL, OPT_LAYOUT, @@ -411,10 +426,16 @@ main(int argc, char *argv[]) OPT_WITHOUT_X11_OFFSET, OPT_CONSUMED_MODE, OPT_COMPOSE, + OPT_SHORT, OPT_REPORT_STATE, +#ifdef ENABLE_PRIVATE_APIS + OPT_PRINT_MODMAPS, +#endif }; static struct option opts[] = { {"help", no_argument, 0, 'h'}, + {"include", required_argument, 0, OPT_INCLUDE}, + {"include-defaults", no_argument, 0, OPT_INCLUDE_DEFAULTS}, {"rules", required_argument, 0, OPT_RULES}, {"model", required_argument, 0, OPT_MODEL}, {"layout", required_argument, 0, OPT_LAYOUT}, @@ -423,8 +444,12 @@ main(int argc, char *argv[]) {"keymap", required_argument, 0, OPT_KEYMAP}, {"consumed-mode", required_argument, 0, OPT_CONSUMED_MODE}, {"enable-compose", no_argument, 0, OPT_COMPOSE}, + {"short", no_argument, 0, OPT_SHORT}, {"report-state-changes", no_argument, 0, OPT_REPORT_STATE}, {"without-x11-offset", no_argument, 0, OPT_WITHOUT_X11_OFFSET}, +#ifdef ENABLE_PRIVATE_APIS + {"print-modmaps", no_argument, 0, OPT_PRINT_MODMAPS}, +#endif {0, 0, 0, 0}, }; @@ -439,6 +464,20 @@ main(int argc, char *argv[]) break; switch (opt) { + case OPT_INCLUDE: + if (num_includes >= ARRAY_SIZE(includes)) { + fprintf(stderr, "error: too many includes\n"); + exit(EXIT_INVALID_USAGE); + } + includes[num_includes++] = optarg; + break; + case OPT_INCLUDE_DEFAULTS: + if (num_includes >= ARRAY_SIZE(includes)) { + fprintf(stderr, "error: too many includes\n"); + exit(EXIT_INVALID_USAGE); + } + includes[num_includes++] = DEFAULT_INCLUDE_PATH_PLACEHOLDER; + break; case OPT_RULES: rules = optarg; break; @@ -466,6 +505,9 @@ main(int argc, char *argv[]) case OPT_COMPOSE: with_compose = true; break; + case OPT_SHORT: + print_fields &= ~PRINT_VERBOSE_FIELDS; + break; case OPT_CONSUMED_MODE: if (strcmp(optarg, "gtk") == 0) { consumed_mode = XKB_CONSUMED_MODE_GTK; @@ -477,6 +519,11 @@ main(int argc, char *argv[]) return EXIT_INVALID_USAGE; } break; +#ifdef ENABLE_PRIVATE_APIS + case OPT_PRINT_MODMAPS: + print_fields |= PRINT_MODMAPS; + break; +#endif case 'h': usage(stdout, argv[0]); return EXIT_SUCCESS; @@ -486,12 +533,23 @@ main(int argc, char *argv[]) } } - ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + ctx = xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES); if (!ctx) { fprintf(stderr, "Couldn't create xkb context\n"); goto out; } + if (num_includes == 0) + includes[num_includes++] = DEFAULT_INCLUDE_PATH_PLACEHOLDER; + + for (size_t i = 0; i < num_includes; i++) { + const char *include = includes[i]; + if (strcmp(include, DEFAULT_INCLUDE_PATH_PLACEHOLDER) == 0) + xkb_context_include_path_append_default(ctx); + else + xkb_context_include_path_append(ctx, include); + } + if (keymap_path) { FILE *file = fopen(keymap_path, "rb"); if (!file) { @@ -547,6 +605,15 @@ main(int argc, char *argv[]) goto out; } +#ifdef ENABLE_PRIVATE_APIS + if (print_fields & PRINT_MODMAPS) { + print_keys_modmaps(keymap); + putchar('\n'); + print_keymap_modmaps(keymap); + putchar('\n'); + } +#endif + act.sa_handler = sigintr_handler; sigemptyset(&act.sa_mask); act.sa_flags = 0;