Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar
diff options
context:
space:
mode:
Diffstat (limited to 'src/sugar')
-rw-r--r--src/sugar/sugar-key-grabber.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/src/sugar/sugar-key-grabber.c b/src/sugar/sugar-key-grabber.c
index 89b743f..65476ef 100644
--- a/src/sugar/sugar-key-grabber.c
+++ b/src/sugar/sugar-key-grabber.c
@@ -173,7 +173,7 @@ grab_key (SugarKeyGrabber *grabber, Key *key, gboolean grab)
int indexes[N_BITS];/*indexes of bits we need to flip*/
int i, bit, bits_set_cnt;
int uppervalue;
- guint mask_to_traverse = IGNORED_MODS & ~ key->state;
+ guint mask_to_traverse = IGNORED_MODS & ~key->state & GDK_MODIFIER_MASK;
bit = 0;
for (i = 0; i < N_BITS; i++) {
@@ -200,11 +200,13 @@ grab_key (SugarKeyGrabber *grabber, Key *key, gboolean grab)
void
sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber, const char **keys)
{
- char **cur = keys;
- char *key;
- Key *keyinfo;
+ const char **cur = keys;
+ const char *key;
+ Key *keyinfo = NULL;
+ int min_keycodes, max_keycodes;
- gdk_error_trap_push();
+ XDisplayKeycodes(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()),
+ &min_keycodes, &max_keycodes);
while (*cur != NULL) {
key = *cur;
@@ -213,16 +215,34 @@ sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber, const char **keys)
keyinfo = g_new0 (Key, 1);
keyinfo->key = g_strdup(key);
- egg_accelerator_parse_virtual (key, &keyinfo->keysym,
- &keyinfo->keycode, &keyinfo->state);
+ if (!egg_accelerator_parse_virtual (key, &keyinfo->keysym,
+ &keyinfo->keycode,
+ &keyinfo->state)) {
+ g_warning ("Invalid key specified: %s", key);
+ continue;
+ }
+
+ if (keyinfo->keycode < min_keycodes || keyinfo->keycode > max_keycodes) {
+ g_warning ("Keycode out of bounds: %d for key %s", keyinfo->keycode, key);
+ continue;
+ }
+
+ gdk_error_trap_push();
grab_key(grabber, keyinfo, TRUE);
- grabber->keys = g_list_append(grabber->keys, keyinfo);
+ gdk_flush();
+ gint error_code = gdk_error_trap_pop ();
+ if(!error_code)
+ grabber->keys = g_list_append(grabber->keys, keyinfo);
+ else if(error_code == BadAccess)
+ g_warning ("Grab failed, another application may already have access to key '%s'", key);
+ else if(error_code == BadValue)
+ g_warning ("Grab failed, invalid key %s specified. keysym: %u keycode: %u state: %u",
+ key, keyinfo->keysym, keyinfo->keycode, keyinfo->state);
+ else
+ g_warning ("Grab failed for key '%s' for unknown reason '%d'", key, error_code);
}
-
- gdk_flush();
- gdk_error_trap_push();
}
gboolean