diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c
index a4df2cf..e651b31 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);
 }
 
