summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorinfirit <[email protected]>2014-11-12 18:35:06 +0100
committerinfirit <[email protected]>2014-11-12 20:36:49 +0100
commit1de3cf470353049ee9974bd6d9a437f556931bea (patch)
tree66ee1e5424e65f54ecd5097869009672d2b6de2c /src/core
parentad9db61aabc2cbf743a1157ddc42ff76127f3fab (diff)
downloadmarco-1de3cf470353049ee9974bd6d9a437f556931bea.tar.bz2
marco-1de3cf470353049ee9974bd6d9a437f556931bea.tar.xz
Update keybindings when XKB keyboard layout changes
* Select for XKB keyboard notification events explicitly; since GTK+ has selected for XKB events, delivery of old-school MappingNotify events is disabled. * Fix a bug where once a keycode was loaded for a key binding, it would never be reassigned; we want to laod new keycodes for all bindings that have a key symbol rather than a fixed keycode. [ With fixes from Owen W. Taylor <[email protected]> ] Based on metacity commit: c262e3d65a37abedc507705cddfec72c901c321f From: Derek Poon <[email protected]> Gnome bug: https://bugzilla.gnome.org/show_bug.cgi?id=565540
Diffstat (limited to 'src/core')
-rw-r--r--src/core/display.c4
-rw-r--r--src/core/keybindings.c28
2 files changed, 31 insertions, 1 deletions
diff --git a/src/core/display.c b/src/core/display.c
index 68569f3a..8a81d8f4 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -2580,6 +2580,10 @@ static gboolean event_callback(XEvent* event, gpointer data)
meta_bell_notify (display, xkb_ev);
}
break;
+ case XkbNewKeyboardNotify:
+ case XkbMapNotify:
+ meta_display_process_mapping_event (display, event);
+ break;
}
}
#endif
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index eea49baf..9bdea53e 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -262,9 +262,11 @@ reload_keycodes (MetaDisplay *display)
i = 0;
while (i < display->n_key_bindings)
{
- if (display->key_bindings[i].keycode == 0)
+ if (display->key_bindings[i].keysym != 0)
+ {
display->key_bindings[i].keycode = XKeysymToKeycode (
display->xdisplay, display->key_bindings[i].keysym);
+ }
++i;
}
@@ -504,6 +506,22 @@ void
meta_display_process_mapping_event (MetaDisplay *display,
XEvent *event)
{
+#ifdef HAVE_XKB
+ if (event->type == display->xkb_base_event_type)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "XKB mapping changed, will redo keybindings\n");
+
+ reload_keymap (display);
+ reload_modmap (display);
+
+ reload_keycodes (display);
+ reload_modifiers (display);
+
+ regrab_key_bindings (display);
+ }
+ else
+#endif
if (event->xmapping.request == MappingModifier)
{
meta_topic (META_DEBUG_KEYBINDINGS,
@@ -589,6 +607,14 @@ meta_display_init_keys (MetaDisplay *display)
/* Keys are actually grabbed in meta_screen_grab_keys() */
meta_prefs_add_listener (bindings_changed_callback, display);
+
+#ifdef HAVE_XKB
+ /* meta_display_init_keys() should have already called XkbQueryExtension() */
+ if (display->xkb_base_event_type != -1)
+ XkbSelectEvents (display->xdisplay, XkbUseCoreKbd,
+ XkbNewKeyboardNotifyMask | XkbMapNotifyMask,
+ XkbNewKeyboardNotifyMask | XkbMapNotifyMask);
+#endif
}
void