[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