[gtk+] quartz: update the keymap only if the input method changed



commit bbe3554fa9baefc875dcc3d62cd1a4bbbaf18b53
Author: Michael Natterer <mitch gimp org>
Date:   Thu Jun 20 17:09:07 2013 +0200

    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 files changed, 23 insertions(+), 7 deletions(-)
---
diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c
index a4df2cf..0094102 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);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]