[Xfce4-commits] [apps/xfce4-screensaver] 01/01: Add toggle for on-screen keyboard for individual user/use preference

noreply at xfce.org noreply at xfce.org
Sun Jul 14 01:38:04 CEST 2019


This is an automated email from the git hooks/post-receive script.

b   l   u   e   s   a   b   r   e       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository apps/xfce4-screensaver.

commit 6f9deef9b9fd5b4508bf1db4ab65f4e26be28084
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Sat Jul 13 19:37:57 2019 -0400

    Add toggle for on-screen keyboard for individual user/use preference
---
 src/Makefile.am                 |   2 +
 src/gs-lock-plug.c              |  35 ++++++++
 src/gs-prefs.c                  |  16 ++++
 src/gs-prefs.h                  |   8 ++
 src/gs-window-x11.c             |  18 +++++
 src/xfce4-screensaver-dialog.ui | 171 +++++++++++++++++++++++-----------------
 6 files changed, 176 insertions(+), 74 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 8ee7b55..b8969f5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -119,6 +119,8 @@ xfce4_screensaver_dialog_SOURCES = \
 	gs-lock-plug.h                             \
 	gs-debug.c                                 \
 	gs-debug.h                                 \
+	gs-prefs.c                                 \
+	gs-prefs.h                                 \
 	setuid.c                                   \
 	setuid.h                                   \
 	subprocs.c                                 \
diff --git a/src/gs-lock-plug.c b/src/gs-lock-plug.c
index ed566b2..d3291d7 100644
--- a/src/gs-lock-plug.c
+++ b/src/gs-lock-plug.c
@@ -40,9 +40,11 @@
 #include <gtk/gtkx.h>
 
 #include <libxfce4util/libxfce4util.h>
+#include <xfconf/xfconf.h>
 
 #include "gs-lock-plug.h"
 #include "gs-debug.h"
+#include "gs-prefs.h"
 #include "xfce-bg.h"
 #include "xfce-desktop-utils.h"
 #include "xfce4-screensaver-dialog-ui.h"
@@ -88,6 +90,7 @@ struct GSLockPlugPrivate {
     GtkWidget   *auth_logout_button;
 
     GtkWidget   *auth_prompt_kbd_layout_indicator;
+    GtkWidget   *keyboard_toggle;
 
     gboolean     caps_lock_on;
     gboolean     switch_enabled;
@@ -105,6 +108,9 @@ struct GSLockPlugPrivate {
     gint         monitor_index;
 
     GList       *key_events;
+
+    GSPrefs       *prefs;
+    XfconfChannel *channel;
 };
 
 typedef struct _ResponseData ResponseData;
@@ -1442,6 +1448,17 @@ redraw_background (GSLockPlug *plug) {
     gtk_image_set_from_pixbuf(GTK_IMAGE(plug->priv->background_image), pixbuf);
 }
 
+static void
+keyboard_toggled_cb (GtkToggleButton *button,
+                    gpointer        *user_data) {
+    GSLockPlug *plug = GS_LOCK_PLUG (user_data);
+
+    gboolean active = gtk_toggle_button_get_active (button);
+    xfconf_channel_set_bool (plug->priv->channel, KEY_KEYBOARD_DISPLAYED, active);
+
+    gtk_widget_grab_focus (plug->priv->auth_prompt_entry);
+}
+
 static gboolean
 gs_lock_plug_add_login_window (GSLockPlug *plug) {
     GtkBuilder *builder;
@@ -1458,6 +1475,9 @@ gs_lock_plug_add_login_window (GSLockPlug *plug) {
         return FALSE;
     }
 
+    plug->priv->prefs = gs_prefs_new ();
+    plug->priv->channel = xfconf_channel_get (SETTINGS_XFCONF_CHANNEL);
+
     lock_overlay = GTK_WIDGET(gtk_builder_get_object(builder, "lock-overlay"));
     lock_panel = GTK_WIDGET(gtk_builder_get_object(builder, "lock-panel"));
     lock_dialog = GTK_WIDGET(gtk_builder_get_object(builder, "login_window"));
@@ -1492,6 +1512,15 @@ gs_lock_plug_add_login_window (GSLockPlug *plug) {
     plug->priv->auth_capslock_label = GTK_WIDGET (gtk_builder_get_object(builder, "auth-capslock-label"));
     plug->priv->auth_message_label = GTK_WIDGET (gtk_builder_get_object(builder, "auth-status-label"));
 
+    plug->priv->keyboard_toggle = GTK_WIDGET (gtk_builder_get_object(builder, "keyboard-toggle"));
+    if (plug->priv->prefs->keyboard_enabled) {
+        gtk_widget_show (plug->priv->keyboard_toggle);
+        gtk_widget_set_no_show_all (plug->priv->keyboard_toggle, FALSE);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plug->priv->keyboard_toggle), plug->priv->prefs->keyboard_displayed);
+        g_signal_connect (GTK_TOGGLE_BUTTON (plug->priv->keyboard_toggle), "toggled",
+                          G_CALLBACK (keyboard_toggled_cb), plug);
+    }
+
     /* Placeholder for the keyboard indicator */
     plug->priv->auth_prompt_kbd_layout_indicator = GTK_WIDGET (
             gtk_builder_get_object(builder, "auth-prompt-kbd-layout-indicator"));
@@ -1637,6 +1666,12 @@ gs_lock_plug_finalize (GObject *object) {
 
     g_free (plug->priv->logout_command);
 
+    g_free (plug->priv->prefs);
+    plug->priv->prefs = NULL;
+
+    g_free (plug->priv->channel);
+    plug->priv->channel = NULL;
+
     remove_response_idle (plug);
     remove_cancel_timeout (plug);
     remove_datetime_timeout (plug);
diff --git a/src/gs-prefs.c b/src/gs-prefs.c
index 3b81cd6..0b5e5e2 100644
--- a/src/gs-prefs.c
+++ b/src/gs-prefs.c
@@ -240,6 +240,12 @@ _gs_prefs_set_keyboard_command (GSPrefs    *prefs,
 }
 
 static void
+_gs_prefs_set_keyboard_displayed (GSPrefs  *prefs,
+                                        gboolean  displayed) {
+    prefs->keyboard_displayed = displayed;
+}
+
+static void
 _gs_prefs_set_status_message_enabled (GSPrefs  *prefs,
                                       gboolean  enabled) {
     prefs->status_message_enabled = enabled;
@@ -355,6 +361,11 @@ gs_prefs_load_from_settings (GSPrefs *prefs) {
     g_free (string);
 
     bvalue = xfconf_channel_get_bool (prefs->priv->channel,
+                                      KEY_KEYBOARD_DISPLAYED,
+                                      DEFAULT_KEY_KEYBOARD_DISPLAYED);
+    _gs_prefs_set_keyboard_displayed (prefs, bvalue);
+
+    bvalue = xfconf_channel_get_bool (prefs->priv->channel,
                                       KEY_STATUS_MESSAGE_ENABLED,
                                       DEFAULT_KEY_STATUS_MESSAGE_ENABLED);
     _gs_prefs_set_status_message_enabled (prefs, bvalue);
@@ -469,6 +480,11 @@ key_changed_cb (XfconfChannel *channel,
         command = xfconf_channel_get_string (channel, property, DEFAULT_KEY_KEYBOARD_COMMAND);
         _gs_prefs_set_keyboard_command (prefs, command);
         g_free (command);
+    } else if (strcmp (property, KEY_KEYBOARD_DISPLAYED) == 0) {
+        gboolean enabled;
+
+        enabled = xfconf_channel_get_bool (channel, property, DEFAULT_KEY_KEYBOARD_DISPLAYED);
+        _gs_prefs_set_keyboard_displayed (prefs, enabled);
     } else if (strcmp (property, KEY_STATUS_MESSAGE_ENABLED) == 0) {
         gboolean enabled;
 
diff --git a/src/gs-prefs.h b/src/gs-prefs.h
index f4a7f27..70ca1e4 100644
--- a/src/gs-prefs.h
+++ b/src/gs-prefs.h
@@ -131,6 +131,13 @@ G_BEGIN_DECLS
 #define DEFAULT_KEY_KEYBOARD_COMMAND ""
 
 /**
+ * Display embedded keyboard
+ * Remembers the current user preference to display the on-screen keyboard.
+ */
+#define KEY_KEYBOARD_DISPLAYED "/lock/embedded-keyboard/displayed"
+#define DEFAULT_KEY_KEYBOARD_DISPLAYED FALSE
+
+/**
  * Allow the session status message to be displayed
  * Allow the session status message to be displayed when the screen is locked.
  */
@@ -195,6 +202,7 @@ typedef struct
     guint            logout_enabled : 1;         /* Whether to offer the logout option */
     guint            user_switch_enabled : 1;  /* Whether to offer the user switch option */
     guint            keyboard_enabled : 1;       /* Whether to try to embed a keyboard */
+    guint            keyboard_displayed : 1;       /* Whether the keyboard is displayed */
     guint            status_message_enabled : 1; /* show the status message in the lock */
     guint            timeout;        /* how much idle time before activation */
     guint            lock_timeout;   /* how long after activation locking starts */
diff --git a/src/gs-window-x11.c b/src/gs-window-x11.c
index 2cf9db3..8bf28fd 100644
--- a/src/gs-window-x11.c
+++ b/src/gs-window-x11.c
@@ -1084,6 +1084,16 @@ remove_key_events (GSWindow *window) {
 }
 
 static void
+prefs_changed (GSPrefs  *prefs,
+               GSWindow *window) {
+    if (window->priv->prefs->keyboard_enabled) {
+        if (window->priv->keyboard_socket) {
+            gtk_widget_set_visible (window->priv->keyboard_socket, window->priv->prefs->keyboard_displayed);
+        }
+    }
+}
+
+static void
 lock_socket_show (GtkWidget *widget,
                   GSWindow  *window) {
     gtk_widget_child_focus (window->priv->lock_socket, GTK_DIR_TAB_FORWARD);
@@ -1099,6 +1109,7 @@ lock_socket_destroyed (GtkWidget *widget,
     g_signal_handlers_disconnect_by_func (widget, lock_socket_destroyed, window);
     g_signal_handlers_disconnect_by_func (widget, lock_plug_added, window);
     g_signal_handlers_disconnect_by_func (widget, lock_plug_removed, window);
+    g_signal_handlers_disconnect_by_func (window->priv->prefs, prefs_changed, window);
 
     window->priv->lock_socket = NULL;
 }
@@ -1146,6 +1157,10 @@ create_keyboard_socket (GSWindow *window,
 
     gtk_overlay_add_overlay (GTK_OVERLAY (window->priv->overlay), window->priv->keyboard_socket);
     gtk_socket_add_id (GTK_SOCKET (window->priv->keyboard_socket), id);
+
+    if (!window->priv->prefs->keyboard_displayed) {
+        gtk_widget_hide (window->priv->keyboard_socket);
+    }
 }
 
 /* adapted from gspawn.c */
@@ -1311,6 +1326,9 @@ create_lock_socket (GSWindow *window,
     if (window->priv->prefs->keyboard_enabled) {
         embed_keyboard (window);
     }
+
+    g_signal_connect (window->priv->prefs, "changed",
+                      G_CALLBACK (prefs_changed), window);
 }
 
 static void
diff --git a/src/xfce4-screensaver-dialog.ui b/src/xfce4-screensaver-dialog.ui
index 53f5caa..6d3bcc7 100644
--- a/src/xfce4-screensaver-dialog.ui
+++ b/src/xfce4-screensaver-dialog.ui
@@ -2,81 +2,12 @@
 <!-- Generated with glade 3.22.1 -->
 <interface>
   <requires lib="gtk+" version="3.20"/>
-  <object class="GtkOverlay" id="lock-overlay">
-    <property name="name">screen</property>
+  <object class="GtkImage" id="image1">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <child>
-      <object class="GtkImage" id="lock-image">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="stock">gtk-missing-image</property>
-      </object>
-      <packing>
-        <property name="index">-1</property>
-      </packing>
-    </child>
-    <style>
-      <class name="lightdm-gtk-greeter"/>
-    </style>
-  </object>
-  <object class="GtkBox" id="lock-panel">
-    <property name="name">panel_window</property>
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="spacing">6</property>
-    <child>
-      <object class="GtkLabel" id="auth-hostname-label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="margin_left">6</property>
-        <property name="label" translatable="yes"><b>%h</b></property>
-        <property name="use_markup">True</property>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">0</property>
-      </packing>
-    </child>
-    <child type="center">
-      <object class="GtkLabel" id="auth-date-time-label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="margin_right">6</property>
-        <property name="label" translatable="yes"><b>%s</b></property>
-        <property name="use_markup">True</property>
-        <property name="xalign">0.5</property>
-      </object>
-      <packing>
-        <property name="expand">True</property>
-        <property name="fill">True</property>
-        <property name="position">4</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkImage">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="margin_right">6</property>
-        <property name="margin_top">6</property>
-        <property name="margin_bottom">6</property>
-        <property name="pixel_size">16</property>
-        <property name="icon_name">system-lock-screen-symbolic</property>
-        <property name="icon_size">1</property>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="pack_type">end</property>
-        <property name="position">3</property>
-      </packing>
-    </child>
-    <style>
-      <class name="background"/>
-      <class name="panel"/>
-      <class name="xfce4-panel"/>
-    </style>
+    <property name="pixel_size">16</property>
+    <property name="icon_name">input-keyboard-symbolic</property>
+    <property name="use_fallback">True</property>
   </object>
   <object class="GtkEventBox" id="login_window">
     <property name="name">login_window</property>
@@ -175,6 +106,22 @@
                       </packing>
                     </child>
                     <child>
+                      <object class="GtkToggleButton" id="keyboard-toggle">
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="no_show_all">True</property>
+                        <property name="halign">center</property>
+                        <property name="valign">center</property>
+                        <property name="image">image1</property>
+                        <property name="relief">none</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
                       <object class="GtkBox" id="auth-prompt-kbd-layout-indicator">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
@@ -187,7 +134,7 @@
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">True</property>
-                        <property name="position">1</property>
+                        <property name="position">2</property>
                       </packing>
                     </child>
                   </object>
@@ -400,4 +347,80 @@
       <class name="keycap"/>
     </style>
   </object>
+  <object class="GtkOverlay" id="lock-overlay">
+    <property name="name">screen</property>
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkImage" id="lock-image">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="stock">gtk-missing-image</property>
+      </object>
+      <packing>
+        <property name="index">-1</property>
+      </packing>
+    </child>
+    <style>
+      <class name="lightdm-gtk-greeter"/>
+    </style>
+  </object>
+  <object class="GtkBox" id="lock-panel">
+    <property name="name">panel_window</property>
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="spacing">6</property>
+    <child>
+      <object class="GtkLabel" id="auth-hostname-label">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="margin_left">6</property>
+        <property name="label" translatable="yes"><b>%h</b></property>
+        <property name="use_markup">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child type="center">
+      <object class="GtkLabel" id="auth-date-time-label">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="margin_right">6</property>
+        <property name="label" translatable="yes"><b>%s</b></property>
+        <property name="use_markup">True</property>
+        <property name="xalign">0.5</property>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">4</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkImage">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="margin_right">6</property>
+        <property name="margin_top">6</property>
+        <property name="margin_bottom">6</property>
+        <property name="pixel_size">16</property>
+        <property name="icon_name">system-lock-screen-symbolic</property>
+        <property name="icon_size">1</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="pack_type">end</property>
+        <property name="position">3</property>
+      </packing>
+    </child>
+    <style>
+      <class name="background"/>
+      <class name="panel"/>
+      <class name="xfce4-panel"/>
+    </style>
+  </object>
 </interface>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list