diff options
-rw-r--r-- | src/interface-gtk.cpp | 54 | ||||
-rw-r--r-- | src/interface-ncurses.cpp | 18 |
2 files changed, 61 insertions, 11 deletions
diff --git a/src/interface-gtk.cpp b/src/interface-gtk.cpp index cc39699..8436e2b 100644 --- a/src/interface-gtk.cpp +++ b/src/interface-gtk.cpp @@ -229,6 +229,9 @@ static gboolean cmdline_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer user_data __attribute__((unused))) { + bool is_shift = event->state & GDK_SHIFT_MASK; + bool is_ctl = event->state & GDK_CONTROL_MASK; + #ifdef DEBUG g_printf("KEY \"%s\" (%d) SHIFT=%d CNTRL=%d\n", event->string, *event->string, @@ -255,9 +258,56 @@ cmdline_key_pressed(GtkWidget *widget, GdkEventKey *event, cmdline_keypress('\n'); } break; + + /* + * Function key macros + */ +#define FN(KEY, MACRO) \ + case GDK_##KEY: cmdline_fnmacro(#MACRO); break +#define FNS(KEY, MACRO) \ + case GDK_##KEY: cmdline_fnmacro(is_shift ? "S" #MACRO : #MACRO); break + FN(Down, DOWN); FN(Up, UP); + FNS(Left, LEFT); FNS(Right, RIGHT); + FN(KP_Down, DOWN); FN(KP_Up, UP); + FNS(KP_Left, LEFT); FNS(KP_Right, RIGHT); + FNS(Home, HOME); + case GDK_F1...GDK_F35: { + gchar macro_name[3+1]; + + g_snprintf(macro_name, sizeof(macro_name), + "F%d", event->keyval - GDK_F1 + 1); + cmdline_fnmacro(macro_name); + break; + } + FNS(Delete, DC); + FNS(Insert, IC); + FN(Page_Down, NPAGE); FN(Page_Up, PPAGE); + FNS(Print, PRINT); + FN(KP_Home, A1); FN(KP_Prior, A3); + FN(KP_Begin, B2); + FN(KP_End, C1); FN(KP_Next, C3); + FNS(End, END); + FNS(Help, HELP); +#undef FNS +#undef FN + + /* + * Control keys and keys with printable representation + */ default: - if (*event->string) - cmdline_keypress(*event->string); + gunichar u = gdk_keyval_to_unicode(event->keyval); + + if (u && g_unichar_to_utf8(u, NULL) == 1) { + gchar key; + + g_unichar_to_utf8(u, &key); + if (key > 0x7F) + break; + if (is_ctl) + key = CTL_KEY(g_ascii_toupper(key)); + + cmdline_keypress(key); + } } return TRUE; diff --git a/src/interface-ncurses.cpp b/src/interface-ncurses.cpp index 3458813..b0a5276 100644 --- a/src/interface-ncurses.cpp +++ b/src/interface-ncurses.cpp @@ -401,9 +401,9 @@ InterfaceNCurses::event_loop(void) * Function key macros */ #define FN(KEY) case KEY_##KEY: cmdline_fnmacro(#KEY); break - FN(DOWN); FN(UP); FN(LEFT); FN(RIGHT); - FN(SLEFT); FN(SRIGHT); - FN(HOME); FN(SHOME); +#define FNS(KEY) FN(KEY); FN(S##KEY) + FN(DOWN); FN(UP); FNS(LEFT); FNS(RIGHT); + FNS(HOME); case KEY_F(0)...KEY_F(63): { gchar macro_name[3+1]; @@ -412,14 +412,14 @@ InterfaceNCurses::event_loop(void) cmdline_fnmacro(macro_name); break; } - FN(DC); FN(SDC); - FN(IC); FN(SIC); + FNS(DC); + FNS(IC); FN(NPAGE); FN(PPAGE); - FN(PRINT); FN(SPRINT); + FNS(PRINT); FN(A1); FN(A3); FN(B2); FN(C1); FN(C3); - FN(COMMAND); FN(SCOMMAND); - FN(END); FN(SEND); - FN(HELP); FN(SHELP); + FNS(END); + FNS(HELP); +#undef FNS #undef FN /* |