----
{ 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