[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