tFixed keys handling for multilayout environments. - surf - customized build of… | |
git clone git://src.adamsgaard.dk/surf | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit bccfe2a9a553784aa0b50fb63aa198be906d8cae | |
parent dcb4f81ad22ed7fbaa4df391814307feb700f18e | |
Author: Alexander Sedov <[email protected]> | |
Date: Fri, 15 Mar 2013 19:12:15 +0400 | |
Fixed keys handling for multilayout environments. | |
There is a bug in GTK+ that does not allow capturing shortcuts using | |
letter keys on layouts other than "us". The bug is there for ages and | |
tthere is probably no hope that it will get fixed. This patch switches | |
shortcut handling method to GtkAccelGroup, which handles this case | |
correctly. Enjoy! | |
Signed-off-by: Christoph Lohmann <[email protected]> | |
Diffstat: | |
M surf.c | 30 +++++++++++++++++++++++------- | |
1 file changed, 23 insertions(+), 7 deletions(-) | |
--- | |
diff --git a/surf.c b/surf.c | |
t@@ -80,6 +80,7 @@ static gboolean usingproxy = 0; | |
static char togglestat[6]; | |
static char pagestat[3]; | |
+static void add_accels(Client *c); | |
static void beforerequest(WebKitWebView *w, WebKitWebFrame *f, | |
WebKitWebResource *r, WebKitNetworkRequest *req, | |
WebKitNetworkResponse *resp, gpointer d); | |
t@@ -124,7 +125,9 @@ static gboolean inspector_show(WebKitWebInspector *i, Clie… | |
static gboolean inspector_close(WebKitWebInspector *i, Client *c); | |
static void inspector_finished(WebKitWebInspector *i, Client *c); | |
-static gboolean keypress(GtkWidget *w, GdkEventKey *ev, Client *c); | |
+static gboolean keypress(GtkAccelGroup *group, | |
+ GObject *obj, guint key, GdkModifierType mods, | |
+ Client *c); | |
static void linkhover(WebKitWebView *v, const char* t, const char* l, | |
Client *c); | |
static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, | |
t@@ -166,6 +169,18 @@ static void zoom(Client *c, const Arg *arg); | |
#include "config.h" | |
static void | |
+add_accels(Client *c) { | |
+ int i; | |
+ GtkAccelGroup *group = gtk_accel_group_new(); | |
+ for(i = 0; i < LENGTH(keys); i++) { | |
+ GClosure *closure = g_cclosure_new(G_CALLBACK(keypress), c, NU… | |
+ gtk_accel_group_connect(group, keys[i].keyval, keys[i].mod, | |
+ 0, closure); | |
+ } | |
+ gtk_window_add_accel_group(GTK_WINDOW(c->win), group); | |
+} | |
+ | |
+static void | |
beforerequest(WebKitWebView *w, WebKitWebFrame *f, WebKitWebResource *r, | |
WebKitNetworkRequest *req, WebKitNetworkResponse *resp, | |
gpointer d) { | |
t@@ -514,14 +529,17 @@ inspector_finished(WebKitWebInspector *i, Client *c) { | |
} | |
static gboolean | |
-keypress(GtkWidget* w, GdkEventKey *ev, Client *c) { | |
+keypress(GtkAccelGroup *group, GObject *obj, | |
+ guint key, GdkModifierType mods, Client *c) { | |
guint i; | |
gboolean processed = FALSE; | |
+ mods = CLEANMASK(mods); | |
+ key = gdk_keyval_to_lower(key); | |
updatewinid(c); | |
for(i = 0; i < LENGTH(keys); i++) { | |
- if(gdk_keyval_to_lower(ev->keyval) == keys[i].keyval | |
- && CLEANMASK(ev->state) == keys[i].mod | |
+ if(key == keys[i].keyval | |
+ && mods == keys[i].mod | |
&& keys[i].func) { | |
keys[i].func(c, &(keys[i].arg)); | |
processed = TRUE; | |
t@@ -646,9 +664,7 @@ newclient(void) { | |
"destroy", | |
G_CALLBACK(destroywin), c); | |
if(!kioskmode) { | |
- g_signal_connect(G_OBJECT(c->win), | |
- "key-press-event", | |
- G_CALLBACK(keypress), c); | |
+ add_accels(c); | |
} | |
/* Pane */ |