Blame SOURCES/enable-ibus-osk-purpose.patch

333f48
commit b7e1d695935ffafdb838b61afa7041c54b3f92bd
333f48
Author: Carlos Garnacho <carlosg@gnome.org>
333f48
Date:   Tue Sep 25 20:19:39 2018 +0200
333f48
333f48
    keyboard: Enable ibus for OSK purposes
333f48
    
333f48
    As gnome-shell relies on IBus for focus tracking, enable this IM whenever
333f48
    the conditions for OSK popping up might arise.
333f48
    
333f48
    Closes: https://gitlab.gnome.org/GNOME/gnome-settings-daemon/issues/95
333f48
333f48
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
333f48
index ea67dda1..31bfade7 100644
333f48
--- a/plugins/keyboard/gsd-keyboard-manager.c
333f48
+++ b/plugins/keyboard/gsd-keyboard-manager.c
333f48
@@ -78,11 +78,15 @@
333f48
 
333f48
 #define DEFAULT_LAYOUT "us"
333f48
 
333f48
+#define GNOME_A11Y_APPLICATIONS_INTERFACE_DIR "org.gnome.desktop.a11y.applications"
333f48
+#define KEY_OSK_ENABLED "screen-keyboard-enabled"
333f48
+
333f48
 struct GsdKeyboardManagerPrivate
333f48
 {
333f48
 	guint      start_idle_id;
333f48
         GSettings *settings;
333f48
         GSettings *input_sources_settings;
333f48
+        GSettings *a11y_settings;
333f48
         GDBusProxy *localed;
333f48
         GCancellable *cancellable;
333f48
 
333f48
@@ -90,12 +94,15 @@ struct GsdKeyboardManagerPrivate
333f48
         GsdNumLockState old_state;
333f48
         GdkDeviceManager *device_manager;
333f48
         guint device_added_id;
333f48
+        guint device_removed_id;
333f48
 };
333f48
 
333f48
 static void     gsd_keyboard_manager_class_init  (GsdKeyboardManagerClass *klass);
333f48
 static void     gsd_keyboard_manager_init        (GsdKeyboardManager      *keyboard_manager);
333f48
 static void     gsd_keyboard_manager_finalize    (GObject                 *object);
333f48
 
333f48
+static void     update_gtk_im_module (GsdKeyboardManager *manager);
333f48
+
333f48
 G_DEFINE_TYPE (GsdKeyboardManager, gsd_keyboard_manager, G_TYPE_OBJECT)
333f48
 
333f48
 static gpointer manager_object = NULL;
333f48
@@ -363,9 +370,23 @@ device_added_cb (GdkDeviceManager   *device_manager,
333f48
         if (source == GDK_SOURCE_KEYBOARD) {
333f48
                 g_debug ("New keyboard plugged in, applying all settings");
333f48
                 apply_numlock (manager);
333f48
+        } else if (source == GDK_SOURCE_TOUCHSCREEN) {
333f48
+                update_gtk_im_module (manager);
333f48
         }
333f48
 }
333f48
 
333f48
+static void
333f48
+device_removed_cb (GdkDeviceManager   *device_manager,
333f48
+                   GdkDevice          *device,
333f48
+                   GsdKeyboardManager *manager)
333f48
+{
333f48
+        GdkInputSource source;
333f48
+
333f48
+        source = gdk_device_get_source (device);
333f48
+        if (source == GDK_SOURCE_TOUCHSCREEN)
333f48
+                update_gtk_im_module (manager);
333f48
+}
333f48
+
333f48
 static void
333f48
 set_devicepresence_handler (GsdKeyboardManager *manager)
333f48
 {
333f48
@@ -378,6 +399,8 @@ set_devicepresence_handler (GsdKeyboardManager *manager)
333f48
 
333f48
         manager->priv->device_added_id = g_signal_connect (G_OBJECT (device_manager), "device-added",
333f48
                                                            G_CALLBACK (device_added_cb), manager);
333f48
+        manager->priv->device_removed_id = g_signal_connect (G_OBJECT (device_manager), "device-removed",
333f48
+                                                             G_CALLBACK (device_removed_cb), manager);
333f48
         manager->priv->device_manager = device_manager;
333f48
 }
333f48
 
333f48
@@ -395,14 +418,37 @@ need_ibus (GVariant *sources)
333f48
         return FALSE;
333f48
 }
333f48
 
333f48
+static gboolean
333f48
+need_osk (GsdKeyboardManager *manager)
333f48
+{
333f48
+        GSettings *a11y_settings;
333f48
+        gboolean has_touchscreen = FALSE;
333f48
+        GList *devices, *l;
333f48
+        GdkSeat *seat;
333f48
+
333f48
+        if (g_settings_get_boolean (manager->priv->a11y_settings,
333f48
+                                    KEY_OSK_ENABLED))
333f48
+                return TRUE;
333f48
+
333f48
+        seat = gdk_display_get_default_seat (gdk_display_get_default ());
333f48
+        devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TOUCH);
333f48
+
333f48
+        has_touchscreen = devices != NULL;
333f48
+
333f48
+        g_list_free (devices);
333f48
+
333f48
+        return has_touchscreen;
333f48
+}
333f48
+
333f48
 static void
333f48
-set_gtk_im_module (GSettings *settings,
333f48
-                   GVariant  *sources)
333f48
+set_gtk_im_module (GsdKeyboardManager *manager,
333f48
+                   GSettings          *settings,
333f48
+                   GVariant           *sources)
333f48
 {
333f48
         const gchar *new_module;
333f48
         gchar *current_module;
333f48
 
333f48
-        if (need_ibus (sources))
333f48
+        if (need_ibus (sources) || need_osk (manager))
333f48
                 new_module = GTK_IM_MODULE_IBUS;
333f48
         else
333f48
                 new_module = GTK_IM_MODULE_SIMPLE;
333f48
@@ -414,20 +460,20 @@ set_gtk_im_module (GSettings *settings,
333f48
 }
333f48
 
333f48
 static void
333f48
-input_sources_changed (GSettings          *settings,
333f48
-                       const char         *key,
333f48
-                       GsdKeyboardManager *manager)
333f48
+update_gtk_im_module (GsdKeyboardManager *manager)
333f48
 {
333f48
         GSettings *interface_settings;
333f48
         GVariant *sources;
333f48
+
333f48
         /* Gtk+ uses the IM module advertised in XSETTINGS so, if we
333f48
          * have IBus input sources, we want it to load that
333f48
          * module. Otherwise we can use the default "simple" module
333f48
          * which is builtin gtk+
333f48
          */
333f48
-        sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
333f48
         interface_settings = g_settings_new (GNOME_DESKTOP_INTERFACE_DIR);
333f48
-        set_gtk_im_module (interface_settings, sources);
333f48
+        sources = g_settings_get_value (manager->priv->input_sources_settings,
333f48
+                                        KEY_INPUT_SOURCES);
333f48
+        set_gtk_im_module (manager, interface_settings, sources);
333f48
         g_object_unref (interface_settings);
333f48
         g_variant_unref (sources);
333f48
 }
333f48
@@ -686,8 +732,15 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
333f48
 	set_devicepresence_handler (manager);
333f48
 
333f48
         manager->priv->input_sources_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR);
333f48
-        g_signal_connect (manager->priv->input_sources_settings, "changed::"KEY_INPUT_SOURCES,
333f48
-                          G_CALLBACK (input_sources_changed), manager);
333f48
+        g_signal_connect_swapped (manager->priv->input_sources_settings,
333f48
+                                  "changed::" KEY_INPUT_SOURCES,
333f48
+                                  G_CALLBACK (update_gtk_im_module), manager);
333f48
+
333f48
+        manager->priv->a11y_settings = g_settings_new (GNOME_A11Y_APPLICATIONS_INTERFACE_DIR);
333f48
+        g_signal_connect_swapped (manager->priv->a11y_settings,
333f48
+                                  "changed::" KEY_OSK_ENABLED,
333f48
+                                  G_CALLBACK (update_gtk_im_module), manager);
333f48
+        update_gtk_im_module (manager);
333f48
 
333f48
         manager->priv->cancellable = g_cancellable_new ();
333f48
 
333f48
@@ -750,10 +803,12 @@ gsd_keyboard_manager_stop (GsdKeyboardManager *manager)
333f48
 
333f48
         g_clear_object (&p->settings);
333f48
         g_clear_object (&p->input_sources_settings);
333f48
+        g_clear_object (&p->a11y_settings);
333f48
         g_clear_object (&p->localed);
333f48
 
333f48
         if (p->device_manager != NULL) {
333f48
                 g_signal_handler_disconnect (p->device_manager, p->device_added_id);
333f48
+                g_signal_handler_disconnect (p->device_manager, p->device_removed_id);
333f48
                 p->device_manager = NULL;
333f48
         }
333f48