Skip to content
Snippets Groups Projects
Commit abb27c06 authored by Ali Abdallah's avatar Ali Abdallah
Browse files

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

parent 212ef6d8
No related branches found
No related tags found
No related merge requests found
...@@ -28,11 +28,6 @@ ...@@ -28,11 +28,6 @@
#include <string.h> #include <string.h>
#include <gdk/gdk.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> #include <libxfce4util/libxfce4util.h>
...@@ -43,7 +38,6 @@ ...@@ -43,7 +38,6 @@
#include "xfpm-adapter.h" #include "xfpm-adapter.h"
#include "xfpm-xfconf.h" #include "xfpm-xfconf.h"
#include "xfpm-screen-saver.h" #include "xfpm-screen-saver.h"
#include "xfpm-button-hal.h"
#include "xfpm-config.h" #include "xfpm-config.h"
#ifdef HAVE_DPMS #ifdef HAVE_DPMS
...@@ -58,7 +52,6 @@ struct XfpmDpmsPrivate ...@@ -58,7 +52,6 @@ struct XfpmDpmsPrivate
XfpmXfconf *conf; XfpmXfconf *conf;
XfpmAdapter *adapter; XfpmAdapter *adapter;
XfpmScreenSaver *saver; XfpmScreenSaver *saver;
XfpmButtonHal *bt_hal;
gboolean dpms_capable; gboolean dpms_capable;
gboolean inhibited; gboolean inhibited;
...@@ -225,103 +218,6 @@ xfpm_dpms_inhibit_changed_cb (XfpmScreenSaver *saver, gboolean inhibited, XfpmDp ...@@ -225,103 +218,6 @@ xfpm_dpms_inhibit_changed_cb (XfpmScreenSaver *saver, gboolean inhibited, XfpmDp
xfpm_dpms_refresh (dpms); 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 static void
xfpm_dpms_class_init(XfpmDpmsClass *klass) xfpm_dpms_class_init(XfpmDpmsClass *klass)
{ {
...@@ -349,7 +245,6 @@ xfpm_dpms_init(XfpmDpms *dpms) ...@@ -349,7 +245,6 @@ xfpm_dpms_init(XfpmDpms *dpms)
dpms->priv->adapter = xfpm_adapter_new (); dpms->priv->adapter = xfpm_adapter_new ();
dpms->priv->saver = xfpm_screen_saver_new (); dpms->priv->saver = xfpm_screen_saver_new ();
dpms->priv->conf = xfpm_xfconf_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_signal_connect (dpms->priv->saver, "screen-saver-inhibited",
G_CALLBACK(xfpm_dpms_inhibit_changed_cb), dpms); G_CALLBACK(xfpm_dpms_inhibit_changed_cb), dpms);
...@@ -360,9 +255,6 @@ xfpm_dpms_init(XfpmDpms *dpms) ...@@ -360,9 +255,6 @@ xfpm_dpms_init(XfpmDpms *dpms)
g_signal_connect (dpms->priv->conf, "notify", g_signal_connect (dpms->priv->conf, "notify",
G_CALLBACK (xfpm_dpms_settings_changed_cb), dpms); 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); dpms->priv->on_battery = !xfpm_adapter_get_present (dpms->priv->adapter);
xfpm_dpms_refresh (dpms); xfpm_dpms_refresh (dpms);
} }
...@@ -380,11 +272,8 @@ xfpm_dpms_finalize(GObject *object) ...@@ -380,11 +272,8 @@ xfpm_dpms_finalize(GObject *object)
dpms = XFPM_DPMS (object); dpms = XFPM_DPMS (object);
g_object_unref (dpms->priv->conf); g_object_unref (dpms->priv->conf);
g_object_unref (dpms->priv->adapter); g_object_unref (dpms->priv->adapter);
g_object_unref ( dpms->priv->saver); g_object_unref ( dpms->priv->saver);
g_object_unref ( dpms->priv->bt_hal);
G_OBJECT_CLASS(xfpm_dpms_parent_class)->finalize(object); G_OBJECT_CLASS(xfpm_dpms_parent_class)->finalize(object);
} }
...@@ -397,14 +286,53 @@ xfpm_dpms_new (void) ...@@ -397,14 +286,53 @@ xfpm_dpms_new (void)
return dpms; 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) gboolean xfpm_dpms_capable (XfpmDpms *dpms)
{ {
g_return_val_if_fail (XFPM_IS_DPMS(dpms), FALSE); g_return_val_if_fail (XFPM_IS_DPMS(dpms), FALSE);
return dpms->priv->dpms_capable; 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 */ #endif /* HAVE_DPMS */
...@@ -31,6 +31,11 @@ ...@@ -31,6 +31,11 @@
#ifdef HAVE_DPMS #ifdef HAVE_DPMS
#include <gdk/gdkx.h>
#include <X11/Xproto.h>
#include <X11/extensions/dpms.h>
#include <X11/extensions/dpmsstr.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define XFPM_TYPE_DPMS (xfpm_dpms_get_type () ) #define XFPM_TYPE_DPMS (xfpm_dpms_get_type () )
...@@ -53,10 +58,13 @@ typedef struct ...@@ -53,10 +58,13 @@ typedef struct
} XfpmDpmsClass; } XfpmDpmsClass;
GType xfpm_dpms_get_type (void) G_GNUC_CONST; GType xfpm_dpms_get_type (void) G_GNUC_CONST;
XfpmDpms *xfpm_dpms_new (void); XfpmDpms *xfpm_dpms_new (void);
gboolean xfpm_dpms_capable (XfpmDpms *dpms) G_GNUC_PURE; gboolean xfpm_dpms_capable (XfpmDpms *dpms) G_GNUC_PURE;
void xfpm_dpms_force_level (XfpmDpms *dpms, CARD16 level);
G_END_DECLS G_END_DECLS
#endif /* HAVE_DPMS */ #endif /* HAVE_DPMS */
......
...@@ -236,15 +236,20 @@ xfpm_engine_lid_event (XfpmButtonHal *bt_hal, gboolean pressed, XfpmEngine *engi ...@@ -236,15 +236,20 @@ xfpm_engine_lid_event (XfpmButtonHal *bt_hal, gboolean pressed, XfpmEngine *engi
{ {
XfpmLidTriggerAction action; 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, engine->priv->on_battery ? LID_SWITCH_ON_BATTERY_CFG : LID_SWITCH_ON_AC_CFG, &action,
NULL); NULL);
if ( pressed )
{
XFPM_DEBUG_ENUM ("LID close event", action, XFPM_TYPE_LID_TRIGGER_ACTION); 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 () ) if ( !xfpm_is_multihead_connected () )
xfpm_lock_screen (); xfpm_lock_screen ();
...@@ -252,6 +257,11 @@ xfpm_engine_lid_event (XfpmButtonHal *bt_hal, gboolean pressed, XfpmEngine *engi ...@@ -252,6 +257,11 @@ xfpm_engine_lid_event (XfpmButtonHal *bt_hal, gboolean pressed, XfpmEngine *engi
else else
xfpm_engine_shutdown_request (engine, action, FALSE); 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 static void
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment