[Vimprobable-users] [PATCH] Ignore irrelevant modifiers in key events.
Vimprobable is a lean web browser optimised for full keyboard control
Brought to you by:
hanness
|
From: Hans-Peter D. <hpd...@gm...> - 2011-09-22 15:23:06
|
Modifiers that change the key's symbol shouldn't be considered when
comparing keys, because they can vary between different keyboard
layouts. For example, the semicolon is shifted on DE keyboards and
isn't on US keyboards, so we should just use ';' for the binding and
ignore the shift modifier in the key event handler.
NOTE: Keybindings like 'S-x' in vimprobablerc will stop working and
should now be written as simply 'X'.
---
keymap.h | 39 +++++++++++++++++++--------------------
main.c | 14 ++++++++++++--
2 files changed, 31 insertions(+), 22 deletions(-)
diff --git a/keymap.h b/keymap.h
index 4a2cece..e501794 100644
--- a/keymap.h
+++ b/keymap.h
@@ -26,9 +26,9 @@ Key keys[] = {
{ 0, GDK_q, GDK_8, quickmark, { .s = "8" } },
{ 0, GDK_q, GDK_9, quickmark, { .s = "9" } },
{ 0, 0, GDK_0, scroll, {ScrollJumpTo | DirectionLeft} },
- { GDK_SHIFT_MASK, 0, GDK_dollar, scroll, {ScrollJumpTo | DirectionRight} },
+ { 0, 0, GDK_dollar, scroll, {ScrollJumpTo | DirectionRight} },
{ 0, GDK_g, GDK_g, scroll, {ScrollJumpTo | DirectionTop} },
- { GDK_SHIFT_MASK, 0, GDK_G, scroll, {ScrollJumpTo | DirectionBottom} },
+ { 0, 0, GDK_G, scroll, {ScrollJumpTo | DirectionBottom} },
{ 0, 0, GDK_h, scroll, {ScrollMove | DirectionLeft | UnitLine} },
{ 0, 0, GDK_j, scroll, {ScrollMove | DirectionBottom | UnitLine} },
{ 0, 0, GDK_k, scroll, {ScrollMove | DirectionTop | UnitLine} },
@@ -43,7 +43,7 @@ Key keys[] = {
{ GDK_CONTROL_MASK, 0, GDK_y, scroll, {ScrollMove | DirectionTop | UnitLine} },
{ 0, GDK_g, GDK_t, fake_key_event, { .s = "l", .i = ShiftMask + ControlMask } },
- { GDK_SHIFT_MASK, GDK_g, GDK_T, fake_key_event, { .s = "h", .i = ShiftMask + ControlMask } },
+ { 0, GDK_g, GDK_T, fake_key_event, { .s = "h", .i = ShiftMask + ControlMask } },
{ 0, GDK_g, GDK_1, fake_key_event, { .s = "1", .i = ControlMask } },
{ 0, GDK_g, GDK_2, fake_key_event, { .s = "2", .i = ControlMask } },
{ 0, GDK_g, GDK_3, fake_key_event, { .s = "3", .i = ControlMask } },
@@ -57,10 +57,10 @@ Key keys[] = {
{ GDK_CONTROL_MASK, 0, GDK_i, navigate, {NavigationBack} },
{ GDK_CONTROL_MASK, 0, GDK_o, navigate, {NavigationForward} },
- { GDK_SHIFT_MASK, 0, GDK_H, navigate, {NavigationBack} },
- { GDK_SHIFT_MASK, 0, GDK_L, navigate, {NavigationForward} },
+ { 0, 0, GDK_H, navigate, {NavigationBack} },
+ { 0, 0, GDK_L, navigate, {NavigationForward} },
{ 0, 0, GDK_r, navigate, {NavigationReload} },
- { GDK_SHIFT_MASK, 0, GDK_R, navigate, {NavigationForceReload} },
+ { 0, 0, GDK_R, navigate, {NavigationForceReload} },
{ GDK_CONTROL_MASK, 0, GDK_c, navigate, {NavigationCancel} },
{ 0, 0, GDK_plus, zoom, {ZoomIn | ZoomText} },
@@ -70,37 +70,36 @@ Key keys[] = {
{ 0, GDK_z, GDK_i, zoom, {ZoomIn | ZoomText} },
{ 0, GDK_z, GDK_o, zoom, {ZoomOut | ZoomText} },
{ 0, GDK_z, GDK_z, zoom, {ZoomReset | ZoomText} },
- { GDK_SHIFT_MASK, GDK_z, GDK_I, zoom, {ZoomIn | ZoomFullContent} },
- { GDK_SHIFT_MASK, GDK_z, GDK_O, zoom, {ZoomOut | ZoomFullContent} },
- { GDK_SHIFT_MASK, GDK_z, GDK_Z, zoom, {ZoomReset | ZoomFullContent} },
+ { 0, GDK_z, GDK_I, zoom, {ZoomIn | ZoomFullContent} },
+ { 0, GDK_z, GDK_O, zoom, {ZoomOut | ZoomFullContent} },
+ { 0, GDK_z, GDK_Z, zoom, {ZoomReset | ZoomFullContent} },
{ 0, 0, GDK_y, yank, {SourceURL | ClipboardPrimary | ClipboardGTK} },
- { GDK_SHIFT_MASK, 0, GDK_Y, yank, {SourceSelection| ClipboardPrimary | ClipboardGTK} },
+ { 0, 0, GDK_Y, yank, {SourceSelection| ClipboardPrimary | ClipboardGTK} },
{ 0, GDK_g, GDK_u, descend, {NthSubdir} },
- { GDK_SHIFT_MASK, GDK_g, GDK_U, descend, {Rootdir} },
+ { 0, GDK_g, GDK_U, descend, {Rootdir} },
{ 0, GDK_g, GDK_h, open_arg, {TargetCurrent, startpage} },
- { GDK_SHIFT_MASK, GDK_g, GDK_H, open_arg, {TargetNew, startpage} },
+ { 0, GDK_g, GDK_H, open_arg, {TargetNew, startpage} },
{ 0, 0, GDK_p, paste, {TargetCurrent | ClipboardPrimary | ClipboardGTK} },
- { GDK_SHIFT_MASK, 0, GDK_P, paste, {TargetNew | ClipboardPrimary | ClipboardGTK} },
+ { 0, 0, GDK_P, paste, {TargetNew | ClipboardPrimary | ClipboardGTK} },
{ GDK_CONTROL_MASK, 0, GDK_a, number, {Increment} },
{ GDK_CONTROL_MASK, 0, GDK_x, number, {Decrement} },
{ 0, 0, GDK_n, search, {DirectionNext | CaseInsensitive | Wrapping} },
- { GDK_SHIFT_MASK, 0, GDK_N, search, {DirectionPrev | CaseInsensitive | Wrapping} },
+ { 0, 0, GDK_N, search, {DirectionPrev | CaseInsensitive | Wrapping} },
- { GDK_SHIFT_MASK, 0, GDK_colon, input, {.s = ":" } },
+ { 0, 0, GDK_colon, input, {.s = ":" } },
{ 0, 0, GDK_o, input, {.s = ":open "} },
- { GDK_SHIFT_MASK, 0, GDK_O, input, {.s = ":open ", .i = InsertCurrentURL} },
+ { 0, 0, GDK_O, input, {.s = ":open ", .i = InsertCurrentURL} },
{ 0, 0, GDK_t, input, {.s = ":tabopen "} },
- { GDK_SHIFT_MASK, 0, GDK_T, input, {.s = ":tabopen ", .i = InsertCurrentURL} },
+ { 0, 0, GDK_T, input, {.s = ":tabopen ", .i = InsertCurrentURL} },
{ 0, 0, GDK_slash, input, {.s = "/"} },
- { GDK_SHIFT_MASK, 0, GDK_slash, input, {.s = "/"} },
{ 0, 0, GDK_KP_Divide, input, {.s = "/"} },
- { GDK_SHIFT_MASK, 0, GDK_question, input, {.s = "?"} },
+ { 0, 0, GDK_question, input, {.s = "?"} },
{ 0, 0, GDK_period, input, {.s = "."} },
{ 0, 0, GDK_comma, input, {.s = ","} },
@@ -110,7 +109,7 @@ Key keys[] = {
{ GDK_CONTROL_MASK, 0, GDK_z, set, {ModePassThrough} },
{ GDK_CONTROL_MASK, 0, GDK_v, set, {ModeSendKey} },
{ 0, 0, GDK_f, input, {.s = "."} },
- { GDK_SHIFT_MASK, 0, GDK_F, input, {.s = ","} },
+ { 0, 0, GDK_F, input, {.s = ","} },
{ 0, GDK_g, GDK_i, focus_input,{} },
{ 0, 0, GDK_u, revive, {} },
diff --git a/main.c b/main.c
index 9520ca6..58a94d2 100644
--- a/main.c
+++ b/main.c
@@ -120,6 +120,7 @@ static GtkWidget *status_state;
static WebKitWebView *webview;
static SoupSession *session;
static GtkClipboard *clipboards[2];
+static GdkKeymap *keymap;
static char **args;
static unsigned int mode = ModeNormal;
@@ -329,14 +330,21 @@ download_progress(WebKitDownload *d, GParamSpec *pspec) {
gboolean
process_keypress(GdkEventKey *event) {
KeyList *current;
+ guint keyval;
+ GdkModifierType irrelevant;
+
+ /* Get a mask of modifiers that shouldn't be considered for this event.
+ * E.g.: It shouldn't matter whether ';' is shifted or not. */
+ gdk_keymap_translate_keyboard_state(keymap, event->hardware_keycode,
+ event->state, event->group, &keyval, NULL, NULL, &irrelevant);
current = keylistroot;
while (current != NULL) {
- if (current->Element.mask == CLEAN(event->state)
+ if (current->Element.mask == (CLEAN(event->state) & ~irrelevant)
&& (current->Element.modkey == current_modkey
|| (!current->Element.modkey && !current_modkey)
|| current->Element.modkey == GDK_VoidSymbol ) /* wildcard */
- && current->Element.key == event->keyval
+ && current->Element.key == keyval
&& current->Element.func)
if (current->Element.func(¤t->Element.arg)) {
current_modkey = count = 0;
@@ -2082,6 +2090,8 @@ setup_gui() {
gtk_widget_set_name(GTK_WIDGET(window), "Vimprobable2");
gtk_window_set_geometry_hints(window, NULL, &hints, GDK_HINT_MIN_SIZE);
+ keymap = gdk_keymap_get_default();
+
#ifdef DISABLE_SCROLLBAR
viewport = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(viewport), GTK_POLICY_NEVER, GTK_POLICY_NEVER);
--
1.7.3.4
|