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>
static char togglestat[6];
static char pagestat[3];
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);
static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
WebKitWebResource *r, WebKitNetworkRequest *req,
WebKitNetworkResponse *resp, gpointer d);
static gboolean inspector_close(WebKitWebInspector *i, Client *c);
static void inspector_finished(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,
static void linkhover(WebKitWebView *v, const char* t, const char* l,
Client *c);
static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec,
/* configuration, allows nested code to access above variables */
#include "config.h"
/* configuration, allows nested code to access above variables */
#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,
static void
beforerequest(WebKitWebView *w, WebKitWebFrame *f, WebKitWebResource *r,
WebKitNetworkRequest *req, WebKitNetworkResponse *resp,
-keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
+keypress(GtkAccelGroup *group, GObject *obj,
+ guint key, GdkModifierType mods, Client *c) {
guint i;
gboolean processed = FALSE;
guint i;
gboolean processed = FALSE;
+ mods = CLEANMASK(mods);
+ key = gdk_keyval_to_lower(key);
updatewinid(c);
for(i = 0; i < LENGTH(keys); i++) {
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;
&& keys[i].func) {
keys[i].func(c, &(keys[i].arg));
processed = TRUE;
"destroy",
G_CALLBACK(destroywin), c);
if(!kioskmode) {
"destroy",
G_CALLBACK(destroywin), c);
if(!kioskmode) {
- g_signal_connect(G_OBJECT(c->win),
- "key-press-event",
- G_CALLBACK(keypress), c);