[Xfce4-commits] <xfce4-power-manager:master> Rework the way to switch off the screen on lid event and fix bug #5805

Ali Abdallah noreply at xfce.org
Tue Oct 20 09:00:01 CEST 2009


Updating branch refs/heads/master
         to abb27c06ad0bf2bc600c0f102cab3f295ef9fb3d (commit)
       from 212ef6d814f54448e85aa1fadef1e055a609de70 (commit)

commit abb27c06ad0bf2bc600c0f102cab3f295ef9fb3d
Author: Ali Abdallah <ali at ali-xfce.org>
Date:   Tue Oct 20 08:21:06 2009 +0000

    Rework the way to switch off the screen on lid event and fix bug #5805

 src/xfpm-dpms.c   |  158 ++++++++++++++--------------------------------------
 src/xfpm-dpms.h   |    8 +++
 src/xfpm-engine.c |   20 +++++--
 3 files changed, 66 insertions(+), 120 deletions(-)

diff --git a/src/xfpm-dpms.c b/src/xfpm-dpms.c
index 2cb3c5e..564fdcc 100644
--- a/src/xfpm-dpms.c
+++ b/src/xfpm-dpms.c
@@ -28,11 +28,6 @@
 #include <string.h>
 
 #include <gdk/gdk.h>
-#include <gdk/gdkx.h>
-
-#include <X11/Xproto.h>
-#include <X11/extensions/dpms.h>
-#include <X11/extensions/dpmsstr.h>
 
 #include <libxfce4util/libxfce4util.h>
 
@@ -43,7 +38,6 @@
 #include "xfpm-adapter.h"
 #include "xfpm-xfconf.h"
 #include "xfpm-screen-saver.h"
-#include "xfpm-button-hal.h"
 #include "xfpm-config.h"
 
 #ifdef HAVE_DPMS
@@ -58,7 +52,6 @@ struct XfpmDpmsPrivate
     XfpmXfconf      *conf;
     XfpmAdapter     *adapter;
     XfpmScreenSaver *saver;
-    XfpmButtonHal   *bt_hal;
     
     gboolean       dpms_capable;
     gboolean       inhibited;
@@ -225,103 +218,6 @@ xfpm_dpms_inhibit_changed_cb (XfpmScreenSaver *saver, gboolean inhibited, XfpmDp
     xfpm_dpms_refresh (dpms);
 }
 
-static gboolean
-xfpm_dpms_force_off (gpointer data)
-{ 
-    XfpmDpms *dpms;
-    CARD16 power_level;
-    BOOL state;
-    
-    dpms = XFPM_DPMS (data);
-    
-    TRACE ("Start");
-    
-    if ( G_UNLIKELY (!DPMSInfo (GDK_DISPLAY (), &power_level, &state)) )
-    {
-	g_warning ("Cannot get DPMSInfo");
-	goto out;
-    }
-
-    if ( power_level != DPMSModeOff )
-    {
-	if ( xfpm_is_multihead_connected () )
-	    goto out;
-	
-	TRACE ("Checking if we have multiple monitor : no");
-	TRACE ("Forcing DPMSModeOff");
-	if ( !DPMSForceLevel (GDK_DISPLAY (), DPMSModeOff ) )
-	{
-	    g_warning ("Cannot set Force DPMSModeOff");
-	    goto out;
-	}
-	XSync (GDK_DISPLAY (), FALSE);
-    }
-    
-out:
-    dpms->priv->switch_off_timeout_id = 0;
-    return FALSE;
-}
-
-static gboolean
-xfpm_dpms_force_on (gpointer data)
-{
-    XfpmDpms *dpms;
-    CARD16 power_level;
-    BOOL state;
-    
-    dpms = XFPM_DPMS (data);
-    
-    TRACE ("start");
-    
-    if ( G_UNLIKELY (!DPMSInfo (GDK_DISPLAY (), &power_level, &state)) )
-    {
-	g_warning ("Cannot get DPMSInfo");
-	goto out;
-    }
-
-    if ( power_level != DPMSModeOn )
-    {
-	TRACE ("Forcing DPMSModeOn");
-	if ( !DPMSForceLevel (GDK_DISPLAY (), DPMSModeOn ) )
-	{
-	    g_warning ("Cannot set Force DPMSModeOn");
-	    goto out;
-	}
-	XSync (GDK_DISPLAY (), FALSE);
-    }
-    
-out:
-    dpms->priv->switch_on_timeout_id = 0;
-    return FALSE;
-}
-
-static void
-xfpm_dpms_lid_event_cb (XfpmButtonHal *bt, gboolean pressed, XfpmDpms *dpms)
-{
-    TRACE ("pressed: %s", xfpm_bool_to_string (pressed));
-
-    if ( dpms->priv->switch_off_timeout_id != 0 )
-    {
-	g_source_remove (dpms->priv->switch_off_timeout_id);
-	dpms->priv->switch_off_timeout_id = 0;
-    }
-    
-    if ( dpms->priv->switch_on_timeout_id != 0 )
-    {
-	g_source_remove (dpms->priv->switch_on_timeout_id );
-	dpms->priv->switch_on_timeout_id = 0;
-    }
-	
-    if ( pressed )
-    {
-	g_timeout_add (100, (GSourceFunc) xfpm_dpms_force_off, dpms);
-    }
-    else
-    {
-	g_timeout_add (100, (GSourceFunc) xfpm_dpms_force_on, dpms);
-    }
-}
-
 static void
 xfpm_dpms_class_init(XfpmDpmsClass *klass)
 {
@@ -349,7 +245,6 @@ xfpm_dpms_init(XfpmDpms *dpms)
 	dpms->priv->adapter = xfpm_adapter_new ();
 	dpms->priv->saver   = xfpm_screen_saver_new ();
 	dpms->priv->conf    = xfpm_xfconf_new  ();
-	dpms->priv->bt_hal  = xfpm_button_hal_get ();
     
 	g_signal_connect (dpms->priv->saver, "screen-saver-inhibited",
 			  G_CALLBACK(xfpm_dpms_inhibit_changed_cb), dpms);
@@ -360,9 +255,6 @@ xfpm_dpms_init(XfpmDpms *dpms)
 	g_signal_connect (dpms->priv->conf, "notify",
 			  G_CALLBACK (xfpm_dpms_settings_changed_cb), dpms);
 			  
-	g_signal_connect (dpms->priv->bt_hal, "lid-event",
-			  G_CALLBACK (xfpm_dpms_lid_event_cb), dpms);
-			  
 	dpms->priv->on_battery = !xfpm_adapter_get_present (dpms->priv->adapter);
 	xfpm_dpms_refresh (dpms);
     }
@@ -380,11 +272,8 @@ xfpm_dpms_finalize(GObject *object)
     dpms = XFPM_DPMS (object);
     
     g_object_unref (dpms->priv->conf);
-	
     g_object_unref (dpms->priv->adapter);
-	
     g_object_unref ( dpms->priv->saver);
-    g_object_unref ( dpms->priv->bt_hal);
 
     G_OBJECT_CLASS(xfpm_dpms_parent_class)->finalize(object);
 }
@@ -397,14 +286,53 @@ xfpm_dpms_new (void)
     return dpms;
 }
 
-/*
- * Get if the display is DPMS capable. if not the dpms
- * object is freed by xfpm-engine
- */
 gboolean xfpm_dpms_capable (XfpmDpms *dpms)
 {
     g_return_val_if_fail (XFPM_IS_DPMS(dpms), FALSE);
     
     return dpms->priv->dpms_capable;
 }
+
+void xfpm_dpms_force_level (XfpmDpms *dpms, CARD16 level)
+{
+    CARD16 current_level;
+    BOOL current_state;
+    
+    TRACE ("start");
+    
+    if ( !dpms->priv->dpms_capable )
+	goto out;
+    
+    if ( G_UNLIKELY (!DPMSInfo (GDK_DISPLAY (), &current_level, &current_state)) )
+    {
+	g_warning ("Cannot get DPMSInfo");
+	goto out;
+    }
+
+    if ( !current_state )
+    {
+	TRACE ("DPMS is disabled");
+	goto out;
+    }
+
+    if ( current_level != level )
+    {
+	TRACE ("Forcing DPMS mode %d", level);
+	
+	if ( !DPMSForceLevel (GDK_DISPLAY (), level ) )
+	{
+	    g_warning ("Cannot set Force DPMS level %d", level);
+	    goto out;
+	}
+	XSync (GDK_DISPLAY (), FALSE);
+    }
+    else
+    {
+	TRACE ("No need to change DPMS mode, current_level=%d requested_level=%d", current_level, level);
+    }
+    
+    out:
+	;
+}
+
 #endif /* HAVE_DPMS */
diff --git a/src/xfpm-dpms.h b/src/xfpm-dpms.h
index d822faa..9a5b1d4 100644
--- a/src/xfpm-dpms.h
+++ b/src/xfpm-dpms.h
@@ -31,6 +31,11 @@
 
 #ifdef HAVE_DPMS
 
+#include <gdk/gdkx.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/dpms.h>
+#include <X11/extensions/dpmsstr.h>
+
 G_BEGIN_DECLS
 
 #define XFPM_TYPE_DPMS        (xfpm_dpms_get_type () )
@@ -53,10 +58,13 @@ typedef struct
 } XfpmDpmsClass;
 
 GType           xfpm_dpms_get_type        (void) G_GNUC_CONST;
+
 XfpmDpms       *xfpm_dpms_new             (void);
 
 gboolean        xfpm_dpms_capable         (XfpmDpms *dpms) G_GNUC_PURE;
 
+void		xfpm_dpms_force_level	  (XfpmDpms *dpms, CARD16 level);
+
 G_END_DECLS
 
 #endif /* HAVE_DPMS */
diff --git a/src/xfpm-engine.c b/src/xfpm-engine.c
index 5a3a962..ef3b2b2 100644
--- a/src/xfpm-engine.c
+++ b/src/xfpm-engine.c
@@ -236,15 +236,20 @@ xfpm_engine_lid_event (XfpmButtonHal *bt_hal, gboolean pressed, XfpmEngine *engi
 {
     XfpmLidTriggerAction action;
     
-    if ( pressed )
-    {
-	g_object_get (G_OBJECT (engine->priv->conf),
+    g_object_get (G_OBJECT (engine->priv->conf),
 		      engine->priv->on_battery ? LID_SWITCH_ON_BATTERY_CFG : LID_SWITCH_ON_AC_CFG, &action,
 		      NULL);
-		      
+
+    if ( pressed )
+    {
 	XFPM_DEBUG_ENUM ("LID close event", action, XFPM_TYPE_LID_TRIGGER_ACTION);
 	
-	if ( action == LID_TRIGGER_LOCK_SCREEN )
+	if ( action == LID_TRIGGER_NOTHING )
+	{
+	    if ( !xfpm_is_multihead_connected () )
+		xfpm_dpms_force_level (engine->priv->dpms, DPMSModeOff);
+	}
+	else if ( action == LID_TRIGGER_LOCK_SCREEN )
 	{
 	    if ( !xfpm_is_multihead_connected () )
 		xfpm_lock_screen ();
@@ -252,6 +257,11 @@ xfpm_engine_lid_event (XfpmButtonHal *bt_hal, gboolean pressed, XfpmEngine *engi
 	else 
 	    xfpm_engine_shutdown_request (engine, action, FALSE);
     }
+    else
+    {
+	XFPM_DEBUG_ENUM ("LID opened", action, XFPM_TYPE_LID_TRIGGER_ACTION);
+	xfpm_dpms_force_level (engine->priv->dpms, DPMSModeOn);
+    }
 }
 
 static void



More information about the Xfce4-commits mailing list