---- { 0, GDK_KEY_BackSpace,scrollv, { .i = -90 } }, ---- (this patch only handles GDK_KEY_PRESS events in the after pass, as i'm not sure which other events might be useful there.) i hope the patch works well, and if there are problems with the format or functionality, please let me know. cheers, Greg ---- From 1c1d63b6f8c02e98c04ed0d6a32548f2568bcf57 Mon Sep 17 00:00:00 2001 From: Greg Minshall <minshall_AT_acm.org> Date: Wed, 27 Nov 2019 11:25:23 +0530 Subject: [PATCH] allow KeyPress to use g_signal_connect_after() if BackSpace, e.g., is used to page back, but uses g_signal_connect(), then in a text entry field, BackSpace doesn't go back a character. this seems to get around that problem. --- config.def.h | 8 ++++++++ surf.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/config.def.h b/config.def.h index d9c93f3..6c4c941 100644 --- a/config.def.h +++ b/config.def.h _AT_@ -196,6 +196,14 @@ static Key keys[] = { { MODKEY , GDK_KEY_Return, spawn, SETURI("_SURF_GO") }, }; +/* + * Keys that should only be handled if no other widget (a text entry + * one, say) wants them + */ +static Key syek[] = { + /* modifier keyval function arg */ +}; + /* button definitions */ /* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */ static Button buttons[] = { diff --git a/surf.c b/surf.c index a7c37fd..90aa9a7 100644 --- a/surf.c +++ b/surf.c _AT_@ -187,6 +187,7 @@ static gboolean buttonreleased(GtkWidget *w, GdkEvent *e, Client *c); static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d); static gboolean winevent(GtkWidget *w, GdkEvent *e, Client *c); +static gboolean wineventafter(GtkWidget *w, GdkEvent *e, Client *c); static gboolean readpipe(GIOChannel *s, GIOCondition ioc, gpointer unused); static void showview(WebKitWebView *v, Client *c); static GtkWidget *createwindow(Client *c); _AT_@ -1401,6 +1402,35 @@ winevent(GtkWidget *w, GdkEvent *e, Client *c) return FALSE; } +/* doing events *after* allows us to distinguish from events handled + * by "lower" widgets */ +gboolean +wineventafter(GtkWidget *w, GdkEvent *e, Client *c) +{ + int i; + + switch (e->type) { + case GDK_KEY_PRESS: + if (!curconfig[KioskMode].val.i) { + for (i = 0; i < LENGTH(syek); ++i) { + if (gdk_keyval_to_lower(e->key.keyval) == + syek[i].keyval && + CLEANMASK(e->key.state) == syek[i].mod && + syek[i].func) { + updatewinid(c); + syek[i].func(c, &(syek[i].arg)); + return TRUE; + } + } + } + default: + break; + } + + return FALSE; +} + + void showview(WebKitWebView *v, Client *c) { _AT_@ -1473,6 +1503,8 @@ createwindow(Client *c) G_CALLBACK(winevent), c); g_signal_connect(G_OBJECT(w), "key-press-event", G_CALLBACK(winevent), c); + g_signal_connect_after(G_OBJECT(w), "key-press-event", + G_CALLBACK(wineventafter), c); g_signal_connect(G_OBJECT(w), "leave-notify-event", G_CALLBACK(winevent), c); g_signal_connect(G_OBJECT(w), "window-state-event", -- 2.24.0Received on Thu Dec 19 2019 - 07:26:45 CET
This archive was generated by hypermail 2.3.0 : Thu Dec 19 2019 - 07:36:31 CET