Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2007-03-07 21:23:11 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2007-03-07 21:23:11 (GMT)
commit08e65464894ff2d8564e770026f0a02b18ee5f9e (patch)
tree61823fcfc4528abf579e02b47d62e88a21601bfe /lib
parent44f00a9cd84bed34fb10abd08f16a8acf3a29924 (diff)
Fix for keyboard focus bug when <alt>f.
Diffstat (limited to 'lib')
-rw-r--r--lib/src/sugar-key-grabber.c27
-rw-r--r--lib/src/sugar-key-grabber.h2
2 files changed, 26 insertions, 3 deletions
diff --git a/lib/src/sugar-key-grabber.c b/lib/src/sugar-key-grabber.c
index ee428cb..b086ba0 100644
--- a/lib/src/sugar-key-grabber.c
+++ b/lib/src/sugar-key-grabber.c
@@ -103,11 +103,27 @@ get_key_from_event(SugarKeyGrabber *grabber, XEvent *xev)
keycode = xev->xkey.keycode;
state = xev->xkey.state;
+ if(grabber->last_key_pressed == keycode) {
+ grabber->last_key_pressed = 0;
+ }
+ if(grabber->last_key_pressed_modifier == state) {
+ grabber->last_key_pressed_modifier = 0;
+ }
+
for (l = grabber->keys; l != NULL; l = l->next) {
Key *keyinfo = (Key *)l->data;
- if (keyinfo->keycode == keycode &&
- (state & USED_MODS) == keyinfo->state) {
- return g_strdup(keyinfo->key);
+ if (keyinfo->keycode == keycode) {
+ if (xev->type == KeyPress &&
+ (state & USED_MODS) == keyinfo->state) {
+
+ return g_strdup(keyinfo->key);
+ } else if (xev->type == KeyRelease) {
+ if(!grabber->last_key_pressed &&
+ !grabber->last_key_pressed_modifier) {
+
+ return g_strdup(keyinfo->key);
+ }
+ }
}
}
@@ -139,6 +155,9 @@ filter_events(GdkXEvent *xevent, GdkEvent *event, gpointer data)
key = get_key_from_event(grabber, xevent);
if (key) {
+ grabber->last_key_pressed = xev->xkey.keycode;
+ grabber->last_key_pressed_modifier = xev->xkey.state;
+
g_signal_emit (grabber, signals[KEY_PRESSED], 0, key);
g_free(key);
@@ -161,6 +180,8 @@ sugar_key_grabber_init(SugarKeyGrabber *grabber)
screen = gdk_screen_get_default();
grabber->root = gdk_screen_get_root_window(screen);
grabber->keys = NULL;
+ grabber->last_key_pressed = 0;
+ grabber->last_key_pressed_modifier = 0;
gdk_window_add_filter(grabber->root, filter_events, grabber);
}
diff --git a/lib/src/sugar-key-grabber.h b/lib/src/sugar-key-grabber.h
index 720a931..e45c329 100644
--- a/lib/src/sugar-key-grabber.h
+++ b/lib/src/sugar-key-grabber.h
@@ -39,6 +39,8 @@ struct _SugarKeyGrabber {
GdkWindow *root;
GList *keys;
+ guint last_key_pressed;
+ guint last_key_pressed_modifier;
};
struct _SugarKeyGrabberClass {