From ebe043a4d20d408f04fb1a520fd5e707bbbf68db Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Sat, 17 Mar 2007 13:30:23 +0000 Subject: Refactored global key handling and frame logic. --- (limited to 'lib') diff --git a/lib/python/_sugar.defs b/lib/python/_sugar.defs index c894777..a23e752 100644 --- a/lib/python/_sugar.defs +++ b/lib/python/_sugar.defs @@ -153,6 +153,16 @@ ) ) +(define-method get_key + (of-object "SugarKeyGrabber") + (c-name "sugar_key_grabber_get_key") + (return-type "char*") + (parameters + '("guint" "keycode") + '("guint" "state") + ) +) + ;; From sugar-push-scroller.h (define-function push_scroller_get_type diff --git a/lib/src/sugar-key-grabber.c b/lib/src/sugar-key-grabber.c index b086ba0..8c832a7 100644 --- a/lib/src/sugar-key-grabber.c +++ b/lib/src/sugar-key-grabber.c @@ -23,6 +23,7 @@ #include "sugar-key-grabber.h" #include "eggaccelerators.h" +#include "sugar-marshal.h" /* we exclude shift, GDK_CONTROL_MASK and GDK_MOD1_MASK since we know what these modifiers mean @@ -81,49 +82,31 @@ sugar_key_grabber_class_init(SugarKeyGrabberClass *grabber_class) G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (SugarKeyGrabberClass, key_pressed), NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); + sugar_marshal_BOOLEAN__UINT_UINT, + G_TYPE_BOOLEAN, 2, + G_TYPE_UINT, + G_TYPE_UINT); signals[KEY_RELEASED] = g_signal_new ("key-released", G_TYPE_FROM_CLASS (grabber_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (SugarKeyGrabberClass, key_released), NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); + sugar_marshal_BOOLEAN__UINT_UINT, + G_TYPE_BOOLEAN, 2, + G_TYPE_UINT, + G_TYPE_UINT); } -static char * -get_key_from_event(SugarKeyGrabber *grabber, XEvent *xev) +char * +sugar_key_grabber_get_key(SugarKeyGrabber *grabber, guint keycode, guint state) { GList *l; - guint keycode, state; - - 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) { - 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); - } - } + if ((keyinfo->keycode == keycode) && + ((state & USED_MODS) == keyinfo->state)) { + return g_strdup(keyinfo->key); } } @@ -137,36 +120,19 @@ filter_events(GdkXEvent *xevent, GdkEvent *event, gpointer data) XEvent *xev = (XEvent *)xevent; if (xev->type == KeyRelease) { - char *key; - - key = get_key_from_event(grabber, xevent); - if (key) { - g_signal_emit (grabber, signals[KEY_RELEASED], 0, key); - g_free(key); - - XUngrabKeyboard (GDK_WINDOW_XDISPLAY (grabber->root), 0L); - - return GDK_FILTER_REMOVE; - } + int return_value; + g_signal_emit (grabber, signals[KEY_RELEASED], 0, xev->xkey.keycode, + xev->xkey.state, &return_value); + if(return_value) + return GDK_FILTER_REMOVE; } if (xev->type == KeyPress) { - char *key; - - 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); - - XGrabKeyboard (GDK_WINDOW_XDISPLAY (grabber->root), - GDK_WINDOW_XID (grabber->root), - 0, GrabModeAsync, GrabModeAsync, 0L); - - return GDK_FILTER_REMOVE; - } + int return_value; + g_signal_emit (grabber, signals[KEY_PRESSED], 0, xev->xkey.keycode, + xev->xkey.state, &return_value); + if(return_value) + return GDK_FILTER_REMOVE; } return GDK_FILTER_CONTINUE; @@ -180,8 +146,6 @@ 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 e45c329..3e9ab5d 100644 --- a/lib/src/sugar-key-grabber.h +++ b/lib/src/sugar-key-grabber.h @@ -39,22 +39,25 @@ struct _SugarKeyGrabber { GdkWindow *root; GList *keys; - guint last_key_pressed; - guint last_key_pressed_modifier; }; struct _SugarKeyGrabberClass { GObjectClass base_class; - void (* key_pressed) (SugarKeyGrabber *grabber, - const char *key); - void (* key_released) (SugarKeyGrabber *grabber, - const char *key); + gboolean (* key_pressed) (SugarKeyGrabber *grabber, + guint keycode, + guint state); + gboolean (* key_released) (SugarKeyGrabber *grabber, + guint keycode, + guint state); }; GType sugar_key_grabber_get_type (void); void sugar_key_grabber_grab (SugarKeyGrabber *grabber, const char *key); +char *sugar_key_grabber_get_key (SugarKeyGrabber *grabber, + guint keycode, + guint state); G_END_DECLS diff --git a/lib/src/sugar-marshal.list b/lib/src/sugar-marshal.list index 81b3ae1..45c0401 100644 --- a/lib/src/sugar-marshal.list +++ b/lib/src/sugar-marshal.list @@ -2,3 +2,4 @@ VOID:OBJECT,STRING,LONG,LONG VOID:OBJECT,LONG VOID:OBJECT BOOLEAN:BOXED +BOOLEAN:UINT,UINT -- cgit v0.9.1