summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli Abdallah <ali@ali-xfce.org>2009-10-20 08:21:06 +0000
committerAli Abdallah <ali@ali-xfce.org>2009-10-20 08:21:06 +0000
commitabb27c06ad0bf2bc600c0f102cab3f295ef9fb3d (patch)
treeed721ffdabdc6434ca8183566be4ac9755b035f4
parent212ef6d814f54448e85aa1fadef1e055a609de70 (diff)
downloadixfce4-power-manager-abb27c06ad0bf2bc600c0f102cab3f295ef9fb3d.tar.gz
Rework the way to switch off the screen on lid event and fix bug #5805
-rw-r--r--src/xfpm-dpms.c158
-rw-r--r--src/xfpm-dpms.h8
-rw-r--r--src/xfpm-engine.c20
3 files changed, 66 insertions, 120 deletions
diff --git a/src/xfpm-dpms.c b/src/xfpm-dpms.c
index 2cb3c5ea..564fdccf 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 d822faa9..9a5b1d49 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 5a3a9625..ef3b2b2a 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