Skip to content

Commit

Permalink
quartz: update the keymap only if the input method changed
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mitchfoo authored and Michael Natterer committed Jun 20, 2013
1 parent 38d78f4 commit bbe3554
Showing 1 changed file with 23 additions and 7 deletions.
30 changes: 23 additions & 7 deletions gdk/quartz/gdkkeys-quartz.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ const static struct {
};

static void
maybe_update_keymap (void)
update_keymap (void)
{
const void *chr_data = NULL;

Expand Down Expand Up @@ -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));

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit bbe3554

Please sign in to comment.