From bbe3554fa9baefc875dcc3d62cd1a4bbbaf18b53 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Thu, 20 Jun 2013 17:09:07 +0200 Subject: quartz: update the keymap only if the input method changed and not on each keystroke, which for some IMs apparently caused a full update on each keystroke, not just a check for changes. Patch from Takuro Ashie, bug #698183. --- gdk/quartz/gdkkeys-quartz.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'gdk/quartz') diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c index a4df2cf933..0094102876 100644 --- a/gdk/quartz/gdkkeys-quartz.c +++ b/gdk/quartz/gdkkeys-quartz.c @@ -267,7 +267,7 @@ const static struct { }; static void -maybe_update_keymap (void) +update_keymap (void) { const void *chr_data = NULL; @@ -542,8 +542,6 @@ gdk_quartz_keymap_get_entries_for_keyval (GdkKeymap *keymap, GArray *keys_array; int i; - maybe_update_keymap (); - *n_keys = 0; keys_array = g_array_new (FALSE, FALSE, sizeof (GdkKeymapKey)); @@ -579,8 +577,6 @@ gdk_quartz_keymap_get_entries_for_keycode (GdkKeymap *keymap, int i; guint *p; - maybe_update_keymap (); - *n_entries = 0; if (hardware_keycode > NUM_KEYCODES) @@ -689,8 +685,6 @@ gdk_quartz_keymap_translate_keyboard_state (GdkKeymap *keymap, GdkModifierType bit; guint tmp_modifiers = 0; - maybe_update_keymap (); - if (keyval) *keyval = 0; if (effective_group) @@ -835,14 +829,36 @@ _gdk_quartz_keys_is_modifier (guint keycode) return FALSE; } +static void +input_sources_changed_notification (CFNotificationCenterRef center, + void *observer, + CFStringRef name, + const void *object, + CFDictionaryRef userInfo) +{ + update_keymap (); +} + static void gdk_quartz_keymap_init (GdkQuartzKeymap *keymap) { + update_keymap (); + CFNotificationCenterAddObserver (CFNotificationCenterGetDistributedCenter (), + keymap, + input_sources_changed_notification, + CFSTR ("AppleSelectedInputSourcesChangedNotification"), + NULL, + CFNotificationSuspensionBehaviorDeliverImmediately); } static void gdk_quartz_keymap_finalize (GObject *object) { + CFNotificationCenterRemoveObserver (CFNotificationCenterGetDistributedCenter (), + object, + CFSTR ("AppleSelectedInputSourcesChangedNotification"), + NULL); + G_OBJECT_CLASS (gdk_quartz_keymap_parent_class)->finalize (object); } -- cgit v1.2.1