summaryrefslogtreecommitdiff
path: root/gdk/quartz
diff options
context:
space:
mode:
authorMichael Natterer <mitch@gimp.org>2013-06-20 17:09:07 +0200
committerMichael Natterer <mitch@lanedo.com>2013-06-20 17:09:37 +0200
commitbbe3554fa9baefc875dcc3d62cd1a4bbbaf18b53 (patch)
treea6f1a48408df9b1840008c0b6c20aa54f8dae738 /gdk/quartz
parent38d78f48b592deb72ca5065cc90e8793ecea2370 (diff)
downloadgtk+-bbe3554fa9baefc875dcc3d62cd1a4bbbaf18b53.tar.gz
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.
Diffstat (limited to 'gdk/quartz')
-rw-r--r--gdk/quartz/gdkkeys-quartz.c30
1 files changed, 23 insertions, 7 deletions
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)
@@ -836,13 +830,35 @@ _gdk_quartz_keys_is_modifier (guint keycode)
}
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);
}