bool XKeybinder::get_accel_keys(const std::string & key, guint & keyval, Gdk::ModifierType & mods) { keyval = 0; mods = (Gdk::ModifierType)0; try { std::string binding = Preferences::obj().get_schema_settings( Preferences::SCHEMA_KEYBINDINGS)->get_string(key); if (binding.empty() || binding == "disabled") { return false; } EggVirtualModifierType virtual_mods = (EggVirtualModifierType)0; if (!egg_accelerator_parse_virtual (binding.c_str(), &keyval, &virtual_mods)) { return false; } GdkKeymap *keymap = gdk_keymap_get_default(); GdkModifierType pmods = (GdkModifierType)0; egg_keymap_resolve_virtual_modifiers (keymap, virtual_mods, &pmods); mods = (Gdk::ModifierType)pmods; } catch (...) { return false; } return true; }
static gboolean do_grab_key (Binding *binding) { GdkKeymap *keymap = gdk_keymap_get_default (); GdkWindow *rootwin = gdk_get_default_root_window (); EggVirtualModifierType virtual_mods = 0; guint keysym = 0; if (keymap == NULL || rootwin == NULL) return FALSE; if (!egg_accelerator_parse_virtual (binding->keystring, &keysym, &virtual_mods)) return FALSE; TRACE (g_print ("Got accel %d, %d\n", keysym, virtual_mods)); binding->keycode = XKeysymToKeycode (GDK_WINDOW_XDISPLAY (rootwin), keysym); if (binding->keycode == 0) return FALSE; TRACE (g_print ("Got keycode %d\n", binding->keycode)); egg_keymap_resolve_virtual_modifiers (keymap, virtual_mods, &binding->modifiers); if (binding->modifiers == 0) return FALSE; TRACE (g_print ("Got modmask %d\n", binding->modifiers)); gdk_error_trap_push (); grab_ungrab_with_ignorable_modifiers (rootwin, binding, TRUE /* grab */); gdk_flush (); if (gdk_error_trap_pop ()) { g_warning ("Binding '%s' failed!\n", binding->keystring); return FALSE; } return TRUE; }
void sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber, const char **keys) { const char **cur = keys; const char *key; Key *keyinfo = NULL; int min_keycodes, max_keycodes; XDisplayKeycodes(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), &min_keycodes, &max_keycodes); while (*cur != NULL) { key = *cur; cur += 1; keyinfo = g_new0 (Key, 1); keyinfo->key = g_strdup(key); 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); 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); } }