[Xfce4-commits] <xfce4-power-manager:master> Force DMPSModeOff on lid close event if it is not done in hardware

Ali Abdallah aliov at xfce.org
Sun Aug 16 18:40:03 CEST 2009


Updating branch refs/heads/master
         to ec2521c64ef7c5afc7397dc8e1adcdaaaf7e8a61 (commit)
       from 3e1a43725331dd8ca7d0be0171545681be32b417 (commit)

commit ec2521c64ef7c5afc7397dc8e1adcdaaaf7e8a61
Author: Ali Abdallah <aliov at xfce.org>
Date:   Sun Aug 16 18:27:29 2009 +0200

    Force DMPSModeOff on lid close event if it is not done in hardware

 src/xfpm-button-hal.c |   35 ++++++++++++----
 src/xfpm-button-hal.h |    6 ++-
 src/xfpm-button.c     |    4 +-
 src/xfpm-dpms.c       |  105 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/xfpm-engine.c     |   38 +++++++++--------
 5 files changed, 158 insertions(+), 30 deletions(-)

diff --git a/src/xfpm-button-hal.c b/src/xfpm-button-hal.c
index e95e7e9..db6cbfb 100644
--- a/src/xfpm-button-hal.c
+++ b/src/xfpm-button-hal.c
@@ -54,6 +54,7 @@ struct XfpmButtonHalPrivate
 enum
 {
     HAL_BUTTON_PRESSED,
+    LID_EVENT,
     LAST_SIGNAL
 };
 
@@ -124,11 +125,8 @@ xfpm_button_hal_device_changed_cb (HalDevice *device, const gchar *udi, const gc
 	{
 	    pressed = hal_device_get_property_bool (device, key);
     
-	    if ( pressed )
-	    {
-		TRACE ("Emitting signal lid closed");
-		g_signal_emit (G_OBJECT (bt), signals [HAL_BUTTON_PRESSED], 0, BUTTON_LID_CLOSED );
-	    }
+	    TRACE ("Emitting signal lid event : pressed %s", xfpm_bool_to_string (pressed));
+	    g_signal_emit (G_OBJECT (bt), signals [LID_EVENT], 0, pressed);
 	}
 	g_free (button_type);
     }
@@ -245,6 +243,15 @@ xfpm_button_hal_class_init (XfpmButtonHalClass *klass)
                       g_cclosure_marshal_VOID__ENUM,
                       G_TYPE_NONE, 1, XFPM_TYPE_BUTTON_KEY);
 
+    signals[LID_EVENT] = 
+        g_signal_new("lid-event",
+                      XFPM_TYPE_BUTTON_HAL,
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET(XfpmButtonHalClass, lid_event),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__BOOLEAN,
+                      G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+
     object_class->finalize = xfpm_button_hal_finalize;
 
     g_type_class_add_private (klass, sizeof (XfpmButtonHalPrivate));
@@ -287,11 +294,21 @@ xfpm_button_hal_finalize (GObject *object)
 }
 
 XfpmButtonHal *
-xfpm_button_hal_new (void)
+xfpm_button_hal_get (void)
 {
-    XfpmButtonHal *button = NULL;
-    button = g_object_new (XFPM_TYPE_BUTTON_HAL, NULL);
-    return button;
+    static gpointer button = NULL;
+    
+    if ( G_LIKELY (button) )
+    {
+	g_object_ref (button);
+    }
+    else
+    {
+	button = g_object_new (XFPM_TYPE_BUTTON_HAL, NULL);
+	g_object_add_weak_pointer (button, &button);
+    }
+	
+    return XFPM_BUTTON_HAL (button);
 }
 
 void xfpm_button_hal_get_keys (XfpmButtonHal *button, gboolean lid_only, guint8 keys)
diff --git a/src/xfpm-button-hal.h b/src/xfpm-button-hal.h
index 1c1f5cf..2d991f4 100644
--- a/src/xfpm-button-hal.h
+++ b/src/xfpm-button-hal.h
@@ -46,11 +46,15 @@ typedef struct
     
     void                      (*hal_button_pressed)	      (XfpmButtonHal *button,
 							       XfpmButtonKey type);
+							       
+    void		      (*lid_event)		      (XfpmButtonHal *button,
+							       gboolean pressed);
     
 } XfpmButtonHalClass;
 
 GType        		      xfpm_button_hal_get_type        (void) G_GNUC_CONST;
-XfpmButtonHal       	     *xfpm_button_hal_new             (void);
+
+XfpmButtonHal       	     *xfpm_button_hal_get             (void);
 
 void                          xfpm_button_hal_get_keys        (XfpmButtonHal *button,
 							       gboolean lid_only,
diff --git a/src/xfpm-button.c b/src/xfpm-button.c
index 1907b53..800e8ad 100644
--- a/src/xfpm-button.c
+++ b/src/xfpm-button.c
@@ -63,7 +63,7 @@ G_DEFINE_TYPE (XfpmButton, xfpm_button, G_TYPE_OBJECT)
 static void
 xfpm_button_xf86_emit_signal (XfpmButton *button, XfpmButtonKey key)
 {
-    if ( key == BUTTON_LID_CLOSED || key == BUTTON_POWER_OFF || key == BUTTON_SLEEP || key == BUTTON_HIBERNATE )
+    if ( key == BUTTON_POWER_OFF || key == BUTTON_SLEEP || key == BUTTON_HIBERNATE )
     {
 	if ( g_timer_elapsed (button->priv->timer, NULL) > SLEEP_KEY_TIMEOUT )
 	{
@@ -126,7 +126,7 @@ xfpm_button_init (XfpmButton *button)
     
     xf86_mapped = xfpm_button_xf86_get_mapped_buttons (button->priv->xf86);
 
-    button->priv->hal = xfpm_button_hal_new ();
+    button->priv->hal = xfpm_button_hal_get ();
     
     if ( xf86_mapped & SLEEP_KEY && xf86_mapped & POWER_KEY && 
 	 xf86_mapped & BRIGHTNESS_KEY && xf86_mapped & HIBERNATE_KEY )
diff --git a/src/xfpm-dpms.c b/src/xfpm-dpms.c
index b627ae5..27cdc1b 100644
--- a/src/xfpm-dpms.c
+++ b/src/xfpm-dpms.c
@@ -37,11 +37,13 @@
 #include <libxfce4util/libxfce4util.h>
 
 #include "libxfpm/xfpm-string.h"
+#include "libxfpm/xfpm-common.h"
 
 #include "xfpm-dpms.h"
 #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
@@ -56,10 +58,14 @@ struct XfpmDpmsPrivate
     XfpmXfconf      *conf;
     XfpmAdapter     *adapter;
     XfpmScreenSaver *saver;
+    XfpmButtonHal   *bt_hal;
     
     gboolean       dpms_capable;
     gboolean       inhibited;
     gboolean       on_battery;
+    
+    gulong	   switch_off_timeout_id;
+    gulong	   switch_on_timeout_id;
 };
 
 G_DEFINE_TYPE(XfpmDpms, xfpm_dpms, G_TYPE_OBJECT)
@@ -219,6 +225,99 @@ 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_guess_is_multimonitor () )
+	    goto out;
+	
+	TRACE ("Checking if we have multiple monitor : no");
+	TRACE ("Forcing DPMSModeOff");
+	if ( !DPMSForceLevel (GDK_DISPLAY (), DPMSModeOff ) )
+	{
+	    g_warning ("Cannot set Force DPMSModeOff");
+	}
+    }
+    
+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");
+	}
+    }
+    
+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)
 {
@@ -238,12 +337,15 @@ xfpm_dpms_init(XfpmDpms *dpms)
     dpms->priv = XFPM_DPMS_GET_PRIVATE(dpms);
     
     dpms->priv->dpms_capable = DPMSCapable (GDK_DISPLAY());
+    dpms->priv->switch_off_timeout_id = 0;
+    dpms->priv->switch_on_timeout_id = 0;
 
     if ( dpms->priv->dpms_capable )
     {
 	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);
@@ -254,6 +356,9 @@ 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);
     }
diff --git a/src/xfpm-engine.c b/src/xfpm-engine.c
index 00dfbff..6417126 100644
--- a/src/xfpm-engine.c
+++ b/src/xfpm-engine.c
@@ -49,6 +49,7 @@
 #include "xfpm-backlight.h"
 #include "xfpm-screen-saver.h"
 #include "xfpm-shutdown.h"
+#include "xfpm-button-hal.h"
 #include "xfpm-idle.h"
 #include "xfpm-errors.h"
 #include "xfpm-config.h"
@@ -76,6 +77,7 @@ struct XfpmEnginePrivate
     XfpmInhibit 	*inhibit;
     XfpmShutdown        *shutdown;
     XfpmButton          *button;
+    XfpmButtonHal       *bt_hal;
     XfpmIdle            *idle;
     XfpmScreenSaver     *srv;
 #ifdef HAVE_DPMS
@@ -230,23 +232,26 @@ xfpm_engine_shutdown_request_battery_cb (XfpmSupply * supply,
 }
 
 static void
-xfpm_engine_lid_event (XfpmEngine *engine)
+xfpm_engine_lid_event (XfpmButtonHal *bt_hal, gboolean pressed, XfpmEngine *engine)
 {
     XfpmLidTriggerAction action;
     
-    g_object_get (G_OBJECT (engine->priv->conf),
-		  engine->priv->on_battery ? LID_SWITCH_ON_BATTERY_CFG : LID_SWITCH_ON_AC_CFG, &action,
-		  NULL);
-		  
-    XFPM_DEBUG_ENUM ("LID close event", action, XFPM_TYPE_LID_TRIGGER_ACTION);
-    
-    if ( action == LID_TRIGGER_LOCK_SCREEN )
+    if ( pressed )
     {
-	if ( !xfpm_guess_is_multimonitor () )
-	    xfpm_lock_screen ();
+	g_object_get (G_OBJECT (engine->priv->conf),
+		      engine->priv->on_battery ? LID_SWITCH_ON_BATTERY_CFG : LID_SWITCH_ON_AC_CFG, &action,
+		      NULL);
+		      
+	XFPM_DEBUG_ENUM ("LID close event", action, XFPM_TYPE_LID_TRIGGER_ACTION);
+	
+	if ( action == LID_TRIGGER_LOCK_SCREEN )
+	{
+	    if ( !xfpm_guess_is_multimonitor () )
+		xfpm_lock_screen ();
+	}
+	else 
+	    xfpm_engine_shutdown_request (engine, action, FALSE);
     }
-    else 
-	xfpm_engine_shutdown_request (engine, action, FALSE);
 }
 
 static void
@@ -266,12 +271,6 @@ xfpm_engine_button_pressed_cb (XfpmButton *button,
     if ( type == BUTTON_MON_BRIGHTNESS_DOWN || type == BUTTON_MON_BRIGHTNESS_UP )
 	return;
     
-    if ( type == BUTTON_LID_CLOSED )
-    {
-	xfpm_engine_lid_event (engine);
-	return;
-    }
-    
     if ( type == BUTTON_POWER_OFF )
     {
 	g_object_get (G_OBJECT (engine->priv->conf),
@@ -381,6 +380,9 @@ xfpm_engine_load_all (gpointer data)
     g_signal_connect (engine->priv->button, "button-pressed",
 		      G_CALLBACK (xfpm_engine_button_pressed_cb), engine);
 
+    engine->priv->bt_hal = xfpm_button_hal_get ();
+    g_signal_connect (engine->priv->bt_hal, "lid_event",
+		      G_CALLBACK (xfpm_engine_lid_event), engine);
   /*
    * Brightness HAL
    */



More information about the Xfce4-commits mailing list