| 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 */ |