OK, I went ahead and implemented all of this. It is a little bigger than I might of like but generally went smoothly and seems to be working well. It's sort of neat to load up a Russian keymap and be able to use the same Emacs keybindings in both groups, and I think it should resolve a lot of less obvious strangeness in key bindings as well. The main issue that I know of with this patch is that it doesn't handle keymap changes while the app is running; to do that, we need some sort of notification mechanism when a GdkKeymap changes, which would mean a small API addition, though it could be treated as a GTK+ <=> GDK private API. (Most of the code is there to handle changes is in gdkkeymap.c, #ifdef'ed out.) There are some small changes in the interpretation of key bindings here. The main one that you might notice is that it used to be that for typical keyboards: Tab -- matched [Tab] <Shift>Tab -- matched nothing ISO_Left_Tab -- matched nothing <Shift>ISO_Left_Tab -- matched <Shift>[Tab] While now: Tab -- matches [Tab] <Shift>Tab -- matches <Shift>[Tab] ISO_Left_Tab -- matches <Shift>[Tab] <Shift>ISO_Left_Tab -- matches <Shift>[Tab] Some parts of GTK+ added a key binding of ISO_Left_Tab where they only wanted to match an unshifted Tab; these bugs needed to be fixed with this change. I'm planning to commit this patch tomorrow morning after I have a night or so to think of any problems that it might have. If any body wants to look this patch over or try it out, I'd certainly appriciate it. Regards, Owen ChangeLog: Wed Feb 20 14:26:47 2002 Owen Taylor <otaylor redhat com> * gtk/gtkkeyhash.[ch]: Implement "fuzzy" key binding lookups; allow matches on key and level but not group. Also, implement ignoring "consumed modifiers correctly." * gtk/gtkaccelgroup.c gtk/gtkbindings.c: Convert to using GtkKeyHash. * gtk/gtkdebug.h gtk/gtkmain.c: Support GTK_DEBUG=keybindings * gdk/x11/gdkevents-x11.c (gdk_event_translate): Fill in the group for key release events as well as key press events. * gdk/gdkkeys.h gdk/x11/gdkkeys-x11.c (gdk_keymap_translate_keyboard_state): Rename unused_modifiers to consumed_modifiers, make the docs and non-Xkb implementation match the Xkb implementation. * gdk/linux-fb/gdkkeyboard-fb.c gdk/win32/gdkkeys-win32.c: Propagate doc and parameter name changes. * gdk/x11/gdkkeys-x11.c (gdk_keymap_translate_keyboard_state): XkbTranslateKeyCode doesn't handle LockMask, we need to handle it ourselves. * gdk/x11/gdkkeys-x11.c (gdk_keymap_translate_keyboard_state): Force <Shift>Tab to give GDK_ISO_Left_Tab, since we need consistency to allow dealing with ISO_Left_Tab. * gtk/gtkwindow.c gtk/gtktextview.c gtk/gtkscrolledwindow.c gtk/gtkpaned.c gtk/gtkcombo.c gtk/gtknotebook.c: Remove inappropriate uses of GDK_ISO_Left_Tab. (GDK_ISO_Left_Tab or <Shift>Tab both are equivalent as a binding specifier.) * gtk/gtkbutton.c (gtk_button_class_init): Make ::activate GTK_RUN_ACTION, so you can bind an accelerator to it. * gtk/gtklabel.c (gtk_label_set_uline_text_internal): Call gdk_unicode_to_keyval on the mnemonic character. * tests/testgtk.c: Add a test for the new fuzzy key binding matching.
Attachment:
keyhash.diff.gz
Description: Patch adding fuzzy key binding matching