From 769600b226cadd1bd08a21ac8fec59698592dbb8 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 27 Aug 2015 18:35:17 +0100 Subject: [PATCH] Add conditioned-out diagnostics in GTK key_event(). These should dump out all the important parts of the incoming GdkEventKey, so that if keys aren't being translated right, it should be possible to work out something about why not. To enable: make CPPFLAGS="-DKEY_EVENT_DIAGNOSTICS" --- unix/gtkwin.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/unix/gtkwin.c b/unix/gtkwin.c index 2b8c92df..95f360aa 100644 --- a/unix/gtkwin.c +++ b/unix/gtkwin.c @@ -639,6 +639,134 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) special = use_ucsoutput = FALSE; output_charset = CS_ISO8859_1; +#ifdef KEY_EVENT_DIAGNOSTICS + /* + * Condition this mess in if you want to debug keyboard events as + * they come in to this function (e.g. because some particular + * port of GDK is producing an unexpected arrangement of + * modifiers). + */ +#define TRY(val, prefix, string) \ + if ((val) == prefix ## string) printf("%s", #string); else +#define GIVE_UP(val) \ + printf("%d", (int)(val)) +#define TRY_MASK(val, prefix, string, suffix) \ + if ((val) & prefix ## string ## suffix) { \ + (val) &= ~ prefix ## string ## suffix; \ + printf("%s", #string); \ + if (val) printf("|"); \ + } +#define GIVE_UP_MASK(val) \ + do \ + { \ + if ((val)) printf("%d", (int)(val)); \ + } while (0) + + printf("key_event: type="); + TRY(event->type, GDK_KEY_, PRESS) + TRY(event->type, GDK_KEY_, RELEASE) + GIVE_UP(event->type); + printf(" keyval="); + TRY(event->keyval, GDK_KEY_, Alt_L) + TRY(event->keyval, GDK_KEY_, Alt_R) + TRY(event->keyval, GDK_KEY_, BackSpace) + TRY(event->keyval, GDK_KEY_, Begin) + TRY(event->keyval, GDK_KEY_, Break) + TRY(event->keyval, GDK_KEY_, Delete) + TRY(event->keyval, GDK_KEY_, Down) + TRY(event->keyval, GDK_KEY_, End) + TRY(event->keyval, GDK_KEY_, Escape) + TRY(event->keyval, GDK_KEY_, F10) + TRY(event->keyval, GDK_KEY_, F11) + TRY(event->keyval, GDK_KEY_, F12) + TRY(event->keyval, GDK_KEY_, F13) + TRY(event->keyval, GDK_KEY_, F14) + TRY(event->keyval, GDK_KEY_, F15) + TRY(event->keyval, GDK_KEY_, F16) + TRY(event->keyval, GDK_KEY_, F17) + TRY(event->keyval, GDK_KEY_, F18) + TRY(event->keyval, GDK_KEY_, F19) + TRY(event->keyval, GDK_KEY_, F1) + TRY(event->keyval, GDK_KEY_, F20) + TRY(event->keyval, GDK_KEY_, F2) + TRY(event->keyval, GDK_KEY_, F3) + TRY(event->keyval, GDK_KEY_, F4) + TRY(event->keyval, GDK_KEY_, F5) + TRY(event->keyval, GDK_KEY_, F6) + TRY(event->keyval, GDK_KEY_, F7) + TRY(event->keyval, GDK_KEY_, F8) + TRY(event->keyval, GDK_KEY_, F9) + TRY(event->keyval, GDK_KEY_, Home) + TRY(event->keyval, GDK_KEY_, Insert) + TRY(event->keyval, GDK_KEY_, ISO_Left_Tab) + TRY(event->keyval, GDK_KEY_, KP_0) + TRY(event->keyval, GDK_KEY_, KP_1) + TRY(event->keyval, GDK_KEY_, KP_2) + TRY(event->keyval, GDK_KEY_, KP_3) + TRY(event->keyval, GDK_KEY_, KP_4) + TRY(event->keyval, GDK_KEY_, KP_5) + TRY(event->keyval, GDK_KEY_, KP_6) + TRY(event->keyval, GDK_KEY_, KP_7) + TRY(event->keyval, GDK_KEY_, KP_8) + TRY(event->keyval, GDK_KEY_, KP_9) + TRY(event->keyval, GDK_KEY_, KP_Add) + TRY(event->keyval, GDK_KEY_, KP_Begin) + TRY(event->keyval, GDK_KEY_, KP_Decimal) + TRY(event->keyval, GDK_KEY_, KP_Delete) + TRY(event->keyval, GDK_KEY_, KP_Divide) + TRY(event->keyval, GDK_KEY_, KP_Down) + TRY(event->keyval, GDK_KEY_, KP_End) + TRY(event->keyval, GDK_KEY_, KP_Enter) + TRY(event->keyval, GDK_KEY_, KP_Home) + TRY(event->keyval, GDK_KEY_, KP_Insert) + TRY(event->keyval, GDK_KEY_, KP_Left) + TRY(event->keyval, GDK_KEY_, KP_Multiply) + TRY(event->keyval, GDK_KEY_, KP_Page_Down) + TRY(event->keyval, GDK_KEY_, KP_Page_Up) + TRY(event->keyval, GDK_KEY_, KP_Right) + TRY(event->keyval, GDK_KEY_, KP_Subtract) + TRY(event->keyval, GDK_KEY_, KP_Up) + TRY(event->keyval, GDK_KEY_, Left) + TRY(event->keyval, GDK_KEY_, Meta_L) + TRY(event->keyval, GDK_KEY_, Meta_R) + TRY(event->keyval, GDK_KEY_, Num_Lock) + TRY(event->keyval, GDK_KEY_, Page_Down) + TRY(event->keyval, GDK_KEY_, Page_Up) + TRY(event->keyval, GDK_KEY_, Return) + TRY(event->keyval, GDK_KEY_, Right) + TRY(event->keyval, GDK_KEY_, Tab) + TRY(event->keyval, GDK_KEY_, Up) + TRY(event->keyval, GDK_KEY_, Shift_L) + TRY(event->keyval, GDK_KEY_, Shift_R) + TRY(event->keyval, GDK_KEY_, Control_L) + TRY(event->keyval, GDK_KEY_, Control_R) + TRY(event->keyval, GDK_KEY_, Caps_Lock) + TRY(event->keyval, GDK_KEY_, Shift_Lock) + TRY(event->keyval, GDK_KEY_, Super_L) + TRY(event->keyval, GDK_KEY_, Super_R) + TRY(event->keyval, GDK_KEY_, Hyper_L) + TRY(event->keyval, GDK_KEY_, Hyper_R) + GIVE_UP(event->keyval); + printf(" state="); + { + int val = event->state; + TRY_MASK(val, GDK_, SHIFT, _MASK) + TRY_MASK(val, GDK_, LOCK, _MASK) + TRY_MASK(val, GDK_, CONTROL, _MASK) + TRY_MASK(val, GDK_, MOD1, _MASK) + TRY_MASK(val, GDK_, MOD2, _MASK) + TRY_MASK(val, GDK_, MOD3, _MASK) + TRY_MASK(val, GDK_, MOD4, _MASK) + TRY_MASK(val, GDK_, MOD5, _MASK) + TRY_MASK(val, GDK_, SUPER, _MASK) + TRY_MASK(val, GDK_, HYPER, _MASK) + TRY_MASK(val, GDK_, META, _MASK) + GIVE_UP_MASK(val); + } + printf(" hardware_keycode=%d is_modifier=%s\n", + (int)event->hardware_keycode, event->is_modifier ? "TRUE" : "FALSE"); +#endif /* KEY_EVENT_DIAGNOSTICS */ + /* * If Alt is being released after typing an Alt+numberpad * sequence, we should generate the code that was typed. -- 2.45.2