[Xfce4-commits] [apps/xfce4-screensaver] 01/01: Restore native timer to cover when X11 screensaver timer doesn't notify
noreply at xfce.org
noreply at xfce.org
Sun Apr 14 21:36:12 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 0f3c9b289802163c681be3cbe7ff00c70b394a7e
Author: Sean Davis <smd.seandavis at gmail.com>
Date: Sun Apr 14 15:36:06 2019 -0400
Restore native timer to cover when X11 screensaver timer doesn't notify
---
src/gs-listener-x11.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 105 insertions(+), 5 deletions(-)
diff --git a/src/gs-listener-x11.c b/src/gs-listener-x11.c
index 8839204..14ebe08 100644
--- a/src/gs-listener-x11.c
+++ b/src/gs-listener-x11.c
@@ -42,9 +42,13 @@ static void gs_listener_x11_class_init (GSListenerX11Class *klass);
static void gs_listener_x11_init (GSListenerX11 *listener);
static void gs_listener_x11_finalize (GObject *object);
+static void reset_lock_timer (GSListenerX11 *listener,
+ guint timeout);
+
struct GSListenerX11Private {
int scrnsaver_event_base;
- gint timeout;
+ gint lock_timeout;
+ guint lock_timer_id;
gboolean idle_activation_enabled;
gboolean saver_enabled;
};
@@ -88,6 +92,87 @@ gs_listener_x11_class_init (GSListenerX11Class *klass) {
0);
}
+static gboolean
+get_x11_idle_info (guint *idle_time,
+ gint *state) {
+ Display *display = gdk_x11_display_get_xdisplay(gdk_display_get_default());
+ static XScreenSaverInfo *mit_info = NULL;
+
+ mit_info = XScreenSaverAllocInfo();
+ XScreenSaverQueryInfo(display, GDK_ROOT_WINDOW(), mit_info);
+ *idle_time = mit_info->idle / 1000; // seconds
+ *state = mit_info->state;
+
+ return TRUE;
+}
+
+static gboolean
+lock_timer (GSListenerX11 *listener) {
+ guint idle_time;
+ gint state;
+
+ if (!listener->priv->saver_enabled)
+ return TRUE;
+
+ get_x11_idle_info (&idle_time, &state);
+ gs_debug("Lock Timeout: %is, Idle: %is, Idle Activation: %s, Screensaver: %s, Lock State: %s",
+ listener->priv->lock_timeout,
+ idle_time,
+ listener->priv->idle_activation_enabled ? "Enabled" : "Disabled",
+ state == ScreenSaverDisabled ? "Disabled" : "Enabled",
+ state == ScreenSaverOn ? "Locked" : "Unlocked");
+
+ if (listener->priv->idle_activation_enabled &&
+ idle_time >= listener->priv->lock_timeout &&
+ state != ScreenSaverDisabled) {
+ if (state == ScreenSaverOn)
+ g_signal_emit(listener, signals[LOCK], 0);
+ else
+ g_signal_emit(listener, signals[ACTIVATE], 0);
+ } else {
+ switch (state) {
+ case ScreenSaverOff:
+ // Reset the lock timer
+ if (idle_time < listener->priv->lock_timeout) {
+ reset_lock_timer(listener, listener->priv->lock_timeout - idle_time);
+ } else {
+ reset_lock_timer(listener, 30);
+ }
+ return FALSE;
+ break;
+
+ case ScreenSaverDisabled:
+ // Disabled, do nothing
+ break;
+
+ case ScreenSaverOn:
+ // lock now!
+ g_signal_emit(listener, signals[LOCK], 0);
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+remove_lock_timer(GSListenerX11 *listener) {
+ if (listener->priv->lock_timer_id != 0) {
+ g_source_remove(listener->priv->lock_timer_id);
+ listener->priv->lock_timer_id = 0;
+ }
+}
+
+static void
+reset_lock_timer(GSListenerX11 *listener,
+ guint timeout) {
+ remove_lock_timer(listener);
+
+ listener->priv->lock_timer_id = g_timeout_add_seconds(timeout,
+ (GSourceFunc)lock_timer,
+ listener);
+}
+
static GdkFilterReturn
xroot_filter (GdkXEvent *xevent,
GdkEvent *event,
@@ -111,6 +196,13 @@ xroot_filter (GdkXEvent *xevent,
if (ev->xany.type == (listener->priv->scrnsaver_event_base + ScreenSaverNotify)) {
XScreenSaverNotifyEvent *xssne = (XScreenSaverNotifyEvent *) ev;
switch (xssne->state) {
+ case ScreenSaverOff:
+ case ScreenSaverDisabled:
+ // Reset the lock timer
+ gs_debug("ScreenSaver timer reset");
+ reset_lock_timer(listener, listener->priv->lock_timeout);
+ break;
+
case ScreenSaverOn:
gs_debug("Activating screensaver on ScreenSaverOn");
g_signal_emit (listener, signals[ACTIVATE], 0);
@@ -158,13 +250,19 @@ gs_listener_x11_acquire (GSListenerX11 *listener) {
void
gs_listener_x11_set_timeout (GSListenerX11 *listener,
- gint timeout) {
+ gint lock_after) {
Display *display = gdk_x11_display_get_xdisplay(gdk_display_get_default());
+ gint timeout = lock_after * 60;
/* set X server timeouts and disable screen blanking */
- XSetScreenSaver(display, timeout * 60, timeout * 60, 0, 0);
- listener->priv->timeout = timeout * 60;
- gs_debug("Screensaver timeout updated to %i minutes", timeout);
+ XSetScreenSaver(display, timeout, timeout, 0, 0);
+
+ if (listener->priv->lock_timeout != timeout) {
+ listener->priv->lock_timeout = timeout;
+ listener->priv->lock_timeout = lock_after * 60;
+ reset_lock_timer(listener, listener->priv->lock_timeout);
+ gs_debug("Lock timeout updated to %i minutes", lock_after);
+ }
}
void
@@ -182,6 +280,8 @@ gs_listener_x11_set_activation_enabled (GSListenerX11 *listener,
static void
gs_listener_x11_init (GSListenerX11 *listener) {
listener->priv = gs_listener_x11_get_instance_private (listener);
+
+ listener->priv->lock_timeout = 0;
}
static void
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list