예제 #1
0
파일: xkeybinder.cpp 프로젝트: UIKit0/gnote
  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;
  }
예제 #2
0
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;
}
예제 #3
0
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);
    }
}