aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/interface-gtk.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2013-02-21 23:49:24 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2013-02-22 01:18:06 +0100
commite4ed98589459018a8b4fc9eb35a5cf22e3e93396 (patch)
treeb7ad850d3da96717eab06709d05640da04048414 /src/interface-gtk.cpp
parent5611d53c8c5ecf586233636d6090ce7e47644e04 (diff)
downloadsciteco-e4ed98589459018a8b4fc9eb35a5cf22e3e93396.tar.gz
function key macro support for GTK+ interface
* also revised the way in which unhandled keys are interpreted (use gdk_keyval_to_unicode() instead of deprecated GdkEventKey::string) * keep in sync with Curses key handling
Diffstat (limited to 'src/interface-gtk.cpp')
-rw-r--r--src/interface-gtk.cpp54
1 files changed, 52 insertions, 2 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;