summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Sedov <alex0player@gmail.com>2013-03-15 19:12:15 +0400
committerChristoph Lohmann <20h@r-36.net>2013-03-15 18:34:31 +0100
commitbccfe2a9a553784aa0b50fb63aa198be906d8cae (patch)
treeb892e40f7b67c94ff11c53e129509ae0479d692d
parentdcb4f81ad22ed7fbaa4df391814307feb700f18e (diff)
downloadsurf-bccfe2a9a553784aa0b50fb63aa198be906d8cae.tar.gz
surf-bccfe2a9a553784aa0b50fb63aa198be906d8cae.tar.bz2
surf-bccfe2a9a553784aa0b50fb63aa198be906d8cae.zip
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 there 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 <20h@r-36.net>
-rw-r--r--surf.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/surf.c b/surf.c
index 1ad5ace..56bf6b0 100644
--- a/surf.c
+++ b/surf.c
@@ -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);
@@ -124,7 +125,9 @@ static gboolean inspector_show(WebKitWebInspector *i, Client *c);
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,
@@ -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, NULL);
+ 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) {
@@ -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;
@@ -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 */