[Xfce4-commits] [apps/xfce4-screensaver] 01/01: Separate screensaver and lock screen signals. Lock delay will only apply to screensaver, lock commands lock the screen immediately.

noreply at xfce.org noreply at xfce.org
Sun Nov 18 18:09:58 CET 2018


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 15b3b47288e0cd37e1c4c0e503acd8a3eb318816
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Sun Nov 18 12:09:53 2018 -0500

    Separate screensaver and lock screen signals. Lock delay will only apply to screensaver, lock commands lock the screen immediately.
---
 src/gs-listener-x11.c | 17 ++++++++++++++++-
 src/gs-listener-x11.h |  1 +
 src/gs-manager.c      | 34 ++++++++++++++++++++++++++++++++++
 src/gs-manager.h      |  4 ++++
 src/gs-monitor.c      | 29 +++++++++++++++++++++++++++++
 src/gs-window-x11.c   | 13 +++++++++++++
 src/gs-window.h       |  2 ++
 7 files changed, 99 insertions(+), 1 deletion(-)

diff --git a/src/gs-listener-x11.c b/src/gs-listener-x11.c
index 6d4549a..f3d55aa 100644
--- a/src/gs-listener-x11.c
+++ b/src/gs-listener-x11.c
@@ -58,6 +58,7 @@ struct GSListenerX11Private {
 };
 
 enum {
+    ACTIVATE,
     LOCK,
     LAST_SIGNAL
 };
@@ -72,6 +73,17 @@ gs_listener_x11_class_init (GSListenerX11Class *klass) {
 
     object_class->finalize       = gs_listener_x11_finalize;
 
+    signals[ACTIVATE] =
+        g_signal_new ("activate",
+                      G_TYPE_FROM_CLASS (object_class),
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (GSListenerX11Class, activate),
+                      NULL,
+                      NULL,
+                      g_cclosure_marshal_VOID__VOID,
+                      G_TYPE_NONE,
+                      0);
+
     signals[LOCK] =
         g_signal_new ("lock",
                       G_TYPE_FROM_CLASS (object_class),
@@ -114,7 +126,10 @@ lock_timer (GSListenerX11 *listener) {
     if (listener->priv->idle_activation_enabled &&
             idle_time >= listener->priv->lock_timeout &&
             state != ScreenSaverDisabled) {
-        g_signal_emit(listener, signals[LOCK], 0);
+        if (state == ScreenSaverOn)
+            g_signal_emit(listener, signals[LOCK], 0);
+        else
+            g_signal_emit(listener, signals[ACTIVATE], 0);
     } else {
         switch (state) {
             case ScreenSaverOff:
diff --git a/src/gs-listener-x11.h b/src/gs-listener-x11.h
index d7c833d..136427f 100644
--- a/src/gs-listener-x11.h
+++ b/src/gs-listener-x11.h
@@ -45,6 +45,7 @@ typedef struct
     GObjectClass          parent_class;
 
     void         (* lock) (GSListenerX11 *listener);
+    void         (* activate) (GSListenerX11 *listener);
 } GSListenerX11Class;
 
 GType                     gs_listener_x11_get_type                  (void);
diff --git a/src/gs-manager.c b/src/gs-manager.c
index 7a11838..6da7c58 100644
--- a/src/gs-manager.c
+++ b/src/gs-manager.c
@@ -69,6 +69,7 @@ struct GSManagerPrivate {
     /* State */
     guint           active : 1;
     guint           lock_active : 1;
+    guint           saver_active : 1;
 
     guint           fading : 1;
     guint           dialog_up : 1;
@@ -400,6 +401,38 @@ gs_manager_set_lock_active (GSManager *manager,
 }
 
 void
+gs_manager_get_saver_active (GSManager *manager,
+                             gboolean  *saver_active) {
+    if (saver_active != NULL) {
+        *saver_active = FALSE;
+    }
+
+    g_return_if_fail (GS_IS_MANAGER (manager));
+
+    if (saver_active != NULL) {
+        *saver_active = manager->priv->saver_active;
+    }
+}
+
+void
+gs_manager_set_saver_active (GSManager *manager,
+                             gboolean   saver_active) {
+    GSList *l;
+
+    g_return_if_fail (GS_IS_MANAGER (manager));
+
+    gs_debug ("Setting saver active: %d", saver_active);
+
+    if (manager->priv->saver_active != saver_active) {
+        manager->priv->saver_active = saver_active;
+    }
+
+    for (l = manager->priv->windows; l; l = l->next) {
+        gs_window_set_saver_active(l->data, saver_active);
+    }
+}
+
+void
 gs_manager_get_lock_enabled (GSManager *manager,
                              gboolean  *lock_enabled) {
     if (lock_enabled != NULL) {
@@ -1348,6 +1381,7 @@ gs_manager_create_window_for_monitor (GSManager  *manager,
     gs_window_set_keyboard_enabled (window, manager->priv->keyboard_enabled);
     gs_window_set_keyboard_command (window, manager->priv->keyboard_command);
     gs_window_set_status_message (window, manager->priv->status_message);
+    gs_window_set_lock_active (window, manager->priv->lock_active);
 
     connect_window_signals (manager, window);
 
diff --git a/src/gs-manager.h b/src/gs-manager.h
index cf1d9d3..ff8ec38 100644
--- a/src/gs-manager.h
+++ b/src/gs-manager.h
@@ -66,6 +66,10 @@ void        gs_manager_get_lock_active         (GSManager   *manager,
                                                 gboolean    *lock_active);
 void        gs_manager_set_lock_active         (GSManager   *manager,
                                                 gboolean     lock_active);
+void        gs_manager_get_saver_active        (GSManager   *manager,
+                                                gboolean    *saver_active);
+void        gs_manager_set_saver_active        (GSManager   *manager,
+                                                gboolean     saver_active);
 void        gs_manager_set_keyboard_enabled    (GSManager   *manager,
                                                 gboolean     enabled);
 void        gs_manager_set_keyboard_command    (GSManager   *manager,
diff --git a/src/gs-monitor.c b/src/gs-monitor.c
index f3b28bf..f304ded 100644
--- a/src/gs-monitor.c
+++ b/src/gs-monitor.c
@@ -98,6 +98,28 @@ static void gs_monitor_lock_screen(GSMonitor* monitor) {
     }
 }
 
+static void gs_monitor_save_screen(GSMonitor* monitor) {
+    gboolean res;
+    gboolean saved;
+    gboolean active;
+
+    /* set lock flag before trying to activate screensaver
+       in case something tries to react to the ActiveChanged signal */
+    gs_manager_get_saver_active(monitor->priv->manager, &saved);
+    gs_manager_set_saver_active(monitor->priv->manager, TRUE);
+    active = gs_manager_get_active(monitor->priv->manager);
+
+    if (!active) {
+        res = gs_listener_set_active(monitor->priv->listener, TRUE);
+
+        if (!res) {
+            /* if we've failed then restore lock status */
+            gs_manager_set_saver_active(monitor->priv->manager, saved);
+            gs_debug("Unable to save the screen");
+        }
+    }
+}
+
 static void gs_monitor_simulate_user_activity(GSMonitor* monitor) {
     Display *display = gdk_x11_display_get_xdisplay (gdk_display_get_default ());
     XScreenSaverSuspend (display, TRUE);
@@ -118,6 +140,10 @@ static void listener_lock_cb(GSListener* listener, GSMonitor* monitor) {
     }
 }
 
+static void listener_x11_activate_cb(GSListenerX11* listener, GSMonitor* monitor) {
+    gs_monitor_save_screen(monitor);
+}
+
 static void listener_x11_lock_cb(GSListenerX11* listener, GSMonitor* monitor) {
     gs_monitor_lock_screen(monitor);
 }
@@ -200,6 +226,7 @@ static void disconnect_listener_signals(GSMonitor* monitor) {
     g_signal_handlers_disconnect_by_func(monitor->priv->listener, listener_simulate_user_activity_cb, monitor);
     g_signal_handlers_disconnect_by_func(monitor->priv->listener, listener_show_message_cb, monitor);
 
+    g_signal_handlers_disconnect_by_func(monitor->priv->listener_x11, listener_x11_activate_cb, monitor);
     g_signal_handlers_disconnect_by_func(monitor->priv->listener_x11, listener_x11_lock_cb, monitor);
 }
 
@@ -219,6 +246,8 @@ static void connect_listener_signals(GSMonitor* monitor) {
     g_signal_connect(monitor->priv->listener, "show-message",
                      G_CALLBACK(listener_show_message_cb), monitor);
 
+    g_signal_connect(monitor->priv->listener_x11, "activate",
+                     G_CALLBACK(listener_x11_activate_cb), monitor);
     g_signal_connect(monitor->priv->listener_x11, "lock",
                      G_CALLBACK(listener_x11_lock_cb), monitor);
 }
diff --git a/src/gs-window-x11.c b/src/gs-window-x11.c
index c4c409a..277518a 100644
--- a/src/gs-window-x11.c
+++ b/src/gs-window-x11.c
@@ -72,6 +72,7 @@ struct GSWindowPrivate {
 
     guint64          logout_timeout;
     gboolean         lock_active;
+    gboolean         saver_active;
     char            *logout_command;
     char            *keyboard_command;
     char            *status_message;
@@ -1632,10 +1633,22 @@ gs_window_set_lock_active (GSWindow *window,
                            gboolean  active) {
     g_return_if_fail (GS_IS_WINDOW (window));
 
+    gs_debug("Setting lock active: %i", active);
+
     window->priv->lock_active = active;
 }
 
 void
+gs_window_set_saver_active (GSWindow *window,
+                            gboolean  active) {
+    g_return_if_fail (GS_IS_WINDOW (window));
+
+    gs_debug("Setting saver active: %i", active);
+
+    window->priv->saver_active = active;
+}
+
+void
 gs_window_cancel_unlock_request (GSWindow  *window) {
     /* FIXME: This is a bit of a hammer approach...
      * Maybe we should send a delete-event to the plug?
diff --git a/src/gs-window.h b/src/gs-window.h
index 0612f2c..11482c6 100644
--- a/src/gs-window.h
+++ b/src/gs-window.h
@@ -81,6 +81,8 @@ void        gs_window_set_logout_timeout      (GSWindow        *window,
                                                glong            timeout);
 void        gs_window_set_lock_active         (GSWindow        *window,
                                                gboolean         active);
+void        gs_window_set_saver_active        (GSWindow        *window,
+                                               gboolean         active);
 void        gs_window_set_logout_command      (GSWindow        *window,
                                                const char      *command);
 void        gs_window_set_status_message      (GSWindow        *window,

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


More information about the Xfce4-commits mailing list