[gnome-control-center/T20771: 40/44] user panel, password: add fallback kbd layout if necessary



commit 5c5b7ce18377a7172d2f5e99468a1078ac056a55
Author: Simon Schampijer <simon schampijer endlessm com>
Date:   Thu Dec 7 09:22:17 2017 +0100

    user panel, password: add fallback kbd layout if necessary
    
    If the current keyboard layout is not a latin one we
    will add the fallback kbd layout 'en'. This calls
    out to gnome-shell where the logic to detect
    the keyboard layout is kept. The layout will
    be available in the popup switcher and the taskbar
    keyboard layout switcher.

 panels/user-accounts/um-password-dialog.c |   47 ++++++++++++++++++++++++++++-
 1 files changed, 46 insertions(+), 1 deletions(-)
---
diff --git a/panels/user-accounts/um-password-dialog.c b/panels/user-accounts/um-password-dialog.c
index 225cf99..fd3b6ac 100644
--- a/panels/user-accounts/um-password-dialog.c
+++ b/panels/user-accounts/um-password-dialog.c
@@ -25,6 +25,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
+#include <gio/gio.h>
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
@@ -55,6 +56,8 @@ struct _UmPasswordDialog {
         ActUser *user;
         ActUserPasswordMode password_mode;
 
+        GDBusProxy *input_source_manager;
+
         GtkWidget *old_password_label;
         GtkWidget *old_password_entry;
         gboolean   old_password_ok;
@@ -97,8 +100,29 @@ update_password_strength (UmPasswordDialog *um)
 }
 
 static void
+shell_enable_password_mode (UmPasswordDialog *um,
+                            gboolean          enable)
+{
+        g_autoptr(GError) error = NULL;
+
+        if (!um->input_source_manager)
+                return;
+
+        g_dbus_proxy_call_sync (um->input_source_manager,
+                                "Set",
+                                g_variant_new_parsed ("('org.gnome.Shell.InputSourceManager', 
'PasswordModeEnabled', %v)",
+                                                     g_variant_new_boolean (enable)),
+                                G_DBUS_CALL_FLAGS_NONE, -1,
+                                NULL, &error);
+
+        if (error)
+                g_critical ("Unable to set PasswordMode: %s", error->message);
+}
+
+static void
 finish_password_change (UmPasswordDialog *um)
 {
+        shell_enable_password_mode (um, FALSE);
         gtk_widget_hide (um->dialog);
 
         gtk_entry_set_text (GTK_ENTRY (um->password_entry), " ");
@@ -116,11 +140,22 @@ cancel_password_dialog (GtkButton        *button,
         finish_password_change (um);
 }
 
+static gboolean
+hide_password_dialog (GtkWidget        *dialog,
+                      GdkEvent         *event,
+                      UmPasswordDialog *um)
+{
+        shell_enable_password_mode (um, FALSE);
+        gtk_widget_hide_on_delete (dialog);
+        return TRUE;
+}
+
 static void
 dialog_closed (GtkWidget        *dialog,
                gint              response_id,
                UmPasswordDialog *um)
 {
+        shell_enable_password_mode (um, FALSE);
         gtk_widget_destroy (dialog);
 }
 
@@ -512,7 +547,7 @@ um_password_dialog_new (void)
 
         widget = (GtkWidget *) gtk_builder_get_object (builder, "dialog");
         g_signal_connect (widget, "delete-event",
-                          G_CALLBACK (gtk_widget_hide_on_delete), NULL);
+                          G_CALLBACK (hide_password_dialog), um);
         um->dialog = widget;
 
         widget = (GtkWidget *) gtk_builder_get_object (builder, "cancel-button");
@@ -565,6 +600,13 @@ um_password_dialog_new (void)
 
         g_object_unref (builder);
 
+        um->input_source_manager = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+                                                                  G_DBUS_PROXY_FLAGS_NONE,
+                                                                  NULL,
+                                                                  "org.gnome.Shell.InputSourceManager",
+                                                                  "/org/gnome/Shell/InputSourceManager",
+                                                                  "org.freedesktop.DBus.Properties",
+                                                                  NULL, NULL);
         return um;
 }
 
@@ -574,6 +616,7 @@ um_password_dialog_free (UmPasswordDialog *um)
         gtk_widget_destroy (um->dialog);
 
         g_clear_object (&um->user);
+        g_clear_object (&um->input_source_manager);
 
         if (um->passwd_handler)
                 passwd_destroy (um->passwd_handler);
@@ -642,6 +685,8 @@ void
 um_password_dialog_show (UmPasswordDialog *um,
                          GtkWindow        *parent)
 {
+        shell_enable_password_mode (um, TRUE);
+
         gtk_window_set_transient_for (GTK_WINDOW (um->dialog), parent);
         gtk_window_present (GTK_WINDOW (um->dialog));
         if (um->old_password_ok == FALSE)


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