[hackers] [surf][PATCH] allow BackSpace to "Scroll up one whole page view"

From: Greg Minshall <minshall_AT_acm.org>
Date: Thu, 19 Dec 2019 11:56:45 +0530

hi. since in surf i page forward using Space, i like paging backwards
with BackSpace (as Space and BackSpace seem naturally mutual-inverses).
but, setting that in config.def.h's "static Key keys[]" seems to result
in the loss of a usable backspace (for editing) in textboxes.

this patch introduces "syek", a parallel to "keys", for signal handlers
to receive signals *after* all "normal" signal handlers have been called
(this is a feature of gtk's glib).

(as far as i can tell...) when a textbox is open, it gets a
key-press-event in the "non-after" pass, and so the "after" signal
handler is never called (so, the textbox will delete one character
backwards), whereas if there is no handler handling, e.g., BackSpace in
the non-after pass, the after pass will call the signal handler in syek.

the patch doesn't actually BackSpace to scroll up one page, since i
don't know if everyone would want that behavior. but, adding this, in
config.h, to the syek structure, should allow that:
----
    { 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.0
Received 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