* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+#include <config.h>
#include "gtkdebug.h"
#include "gtkkeyhash.h"
+#include "gtkalias.h"
typedef struct _GtkKeyHashEntry GtkKeyHashEntry;
(*key_hash->destroy_notify) (entry->value);
g_free (entry->keys);
- g_free (entry);
+ g_slice_free (GtkKeyHashEntry, entry);
}
static void
GdkModifierType modifiers,
gpointer value)
{
- GtkKeyHashEntry *entry = g_new (GtkKeyHashEntry, 1);
+ GtkKeyHashEntry *entry = g_slice_new (GtkKeyHashEntry);
entry->value = value;
entry->keyval = keyval;
GHashTable *keycode_hash = key_hash_get_keycode_hash (key_hash);
GSList *keys = g_hash_table_lookup (keycode_hash, GUINT_TO_POINTER ((guint)hardware_keycode));
GSList *results = NULL;
+ GSList *l;
gboolean have_exact = FALSE;
guint keyval;
gint effective_group;
while (tmp_list)
{
GtkKeyHashEntry *entry = tmp_list->data;
-
- if ((entry->modifiers & ~consumed_modifiers & mask) == (state & ~consumed_modifiers & mask))
+ GdkModifierType xmods, vmods;
+
+ /* If the virtual super, hyper or meta modifiers are present,
+ * they will also be mapped to some of the mod2 - mod5 modifiers,
+ * so we compare them twice, ignoring either set.
+ */
+ xmods = GDK_MOD2_MASK|GDK_MOD3_MASK|GDK_MOD4_MASK|GDK_MOD5_MASK;
+ vmods = GDK_SUPER_MASK|GDK_HYPER_MASK|GDK_META_MASK;
+
+ if ((entry->modifiers & ~consumed_modifiers & mask & ~vmods) == (state & ~consumed_modifiers & mask & ~vmods) ||
+ (entry->modifiers & ~consumed_modifiers & mask & ~xmods) == (state & ~consumed_modifiers & mask & ~xmods))
{
gint i;
}
have_exact = TRUE;
- results = g_slist_prepend (results, entry->value);
+ results = g_slist_prepend (results, entry);
}
if (!have_exact)
GTK_NOTE (KEYBINDINGS,
g_message (" found group = %d, level = %d",
entry->keys[i].group, entry->keys[i].level));
- results = g_slist_prepend (results, entry->value);
+ results = g_slist_prepend (results, entry);
break;
}
}
}
}
- return sort_lookup_results (results);
+ results = sort_lookup_results (results);
+ for (l = results; l; l = l->next)
+ l->data = ((GtkKeyHashEntry *)l->data)->value;
+
+ return results;
}
/**
GdkKeymapKey *keys;
gint n_keys;
GSList *results = NULL;
+ GSList *l;
if (!keyval) /* Key without symbol */
return NULL;
GtkKeyHashEntry *entry = entries->data;
if (entry->keyval == keyval && entry->modifiers == modifiers)
- results = g_slist_prepend (results, entry->value);
+ results = g_slist_prepend (results, entry);
entries = entries->next;
}
g_free (keys);
- return sort_lookup_results (results);
+ results = sort_lookup_results (results);
+ for (l = results; l; l = l->next)
+ l->data = ((GtkKeyHashEntry *)l->data)->value;
+
+ return results;
}