Improve error handling of calls to XGrabKey #431
This commit is contained in:
parent
6508128adc
commit
7d69328162
@ -173,7 +173,7 @@ grab_key (SugarKeyGrabber *grabber, Key *key, gboolean grab)
|
|||||||
int indexes[N_BITS];/*indexes of bits we need to flip*/
|
int indexes[N_BITS];/*indexes of bits we need to flip*/
|
||||||
int i, bit, bits_set_cnt;
|
int i, bit, bits_set_cnt;
|
||||||
int uppervalue;
|
int uppervalue;
|
||||||
guint mask_to_traverse = IGNORED_MODS & ~ key->state;
|
guint mask_to_traverse = IGNORED_MODS & ~key->state & GDK_MODIFIER_MASK;
|
||||||
|
|
||||||
bit = 0;
|
bit = 0;
|
||||||
for (i = 0; i < N_BITS; i++) {
|
for (i = 0; i < N_BITS; i++) {
|
||||||
@ -200,11 +200,13 @@ grab_key (SugarKeyGrabber *grabber, Key *key, gboolean grab)
|
|||||||
void
|
void
|
||||||
sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber, const char **keys)
|
sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber, const char **keys)
|
||||||
{
|
{
|
||||||
char **cur = keys;
|
const char **cur = keys;
|
||||||
char *key;
|
const char *key;
|
||||||
Key *keyinfo;
|
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) {
|
while (*cur != NULL) {
|
||||||
key = *cur;
|
key = *cur;
|
||||||
@ -213,16 +215,34 @@ sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber, const char **keys)
|
|||||||
keyinfo = g_new0 (Key, 1);
|
keyinfo = g_new0 (Key, 1);
|
||||||
keyinfo->key = g_strdup(key);
|
keyinfo->key = g_strdup(key);
|
||||||
|
|
||||||
egg_accelerator_parse_virtual (key, &keyinfo->keysym,
|
if (!egg_accelerator_parse_virtual (key, &keyinfo->keysym,
|
||||||
&keyinfo->keycode, &keyinfo->state);
|
&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);
|
grab_key(grabber, keyinfo, TRUE);
|
||||||
|
|
||||||
grabber->keys = g_list_append(grabber->keys, keyinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
gdk_flush();
|
gdk_flush();
|
||||||
gdk_error_trap_push();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
Loading…
Reference in New Issue
Block a user