[gnome-power-manager] Remove all the bodges from the IDLETIMER code now X is fixed
- From: Richard Hughes <rhughes src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-power-manager] Remove all the bodges from the IDLETIMER code now X is fixed
- Date: Tue, 18 Aug 2009 11:50:22 +0000 (UTC)
commit b6ea044d3b67087ef2fd73f4647d7c5b2d17f8c8
Author: Richard Hughes <richard hughsie com>
Date: Tue Aug 18 12:49:09 2009 +0100
Remove all the bodges from the IDLETIMER code now X is fixed
For the DPMS blanking to work correctly, you need to be running either xserver
git master, or any fairly new xserver with these two trivial patches backported:
http://cgit.freedesktop.org/xorg/xserver/patch/?id=db568f9eabf3450d8a023597ff007df355b13ea8
http://cgit.freedesktop.org/xorg/xserver/patch/?id=6b5978dcf1f7ac3ecc2f22df06f7000f360e2066
If you don't do this, you'll get an extra nag-icon with a tooltip telling you what to do.
src/egg-idletime.c | 79 ++++++++++++++--------------------------------------
src/gpm-idle.c | 35 ++---------------------
2 files changed, 24 insertions(+), 90 deletions(-)
---
diff --git a/src/egg-idletime.c b/src/egg-idletime.c
index 9bf6030..ea5e6af 100644
--- a/src/egg-idletime.c
+++ b/src/egg-idletime.c
@@ -41,13 +41,11 @@ static void egg_idletime_finalize (GObject *object);
struct EggIdletimePrivate
{
- int sync_event;
- guint last_event;
+ gint sync_event;
gboolean reset_set;
XSyncCounter idle_counter;
GPtrArray *array;
Display *dpy;
- guint emit_idle_id;
};
typedef struct
@@ -203,7 +201,7 @@ egg_idletime_set_reset_alarm (EggIdletime *idletime, XSyncAlarmNotifyEvent *alar
* idletime->priv->idle_counter < the current counter value */
egg_idletime_xsync_alarm_set (idletime, alarm, EGG_IDLETIME_ALARM_TYPE_NEGATIVE);
- /* don't try to set this again if multiple timers are doing off in sequence */
+ /* don't try to set this again if multiple timers are going off in sequence */
idletime->priv->reset_set = TRUE;
}
}
@@ -225,25 +223,6 @@ egg_idletime_alarm_find_event (EggIdletime *idletime, XSyncAlarmNotifyEvent *ala
}
/**
- * egg_idletime_emit_idle_cb:
- */
-static gboolean
-egg_idletime_emit_idle_cb (EggIdletimeAlarm *alarm)
-{
- g_return_val_if_fail (alarm != NULL, FALSE);
- g_return_val_if_fail (EGG_IS_IDLETIME (alarm->idletime), FALSE);
-
- /* emit */
- g_signal_emit (alarm->idletime, signals [SIGNAL_ALARM_EXPIRED], 0, alarm->id);
-
- /* clear event */
- alarm->idletime->priv->emit_idle_id = 0;
-
- /* never repeat */
- return FALSE;
-}
-
-/**
* egg_idletime_event_filter_cb:
*/
static GdkFilterReturn
@@ -262,36 +241,23 @@ egg_idletime_event_filter_cb (GdkXEvent *gdkxevent, GdkEvent *event, gpointer da
/* did we match one of our alarms? */
alarm = egg_idletime_alarm_find_event (idletime, alarm_event);
- if (alarm != NULL) {
- /* save the last state we triggered */
- idletime->priv->last_event = alarm->id;
-
- /* are we not the reset symbol */
- if (alarm->id != 0) {
- /* emit signal idle, as we don't want to miss the
- * expired signal when we are actually dimming */
- idletime->priv->emit_idle_id = g_idle_add ((GSourceFunc) egg_idletime_emit_idle_cb, alarm);
-
- /* we need the first alarm to go off to set the reset alarm */
- egg_idletime_set_reset_alarm (idletime, alarm_event);
-
- return GDK_FILTER_REMOVE;
- }
-
- /* we have queued an idle event, so unqueue it */
- if (idletime->priv->emit_idle_id > 0) {
- g_source_remove (idletime->priv->emit_idle_id);
- idletime->priv->emit_idle_id = 0;
- }
+ if (alarm == NULL)
+ return GDK_FILTER_CONTINUE;
- /* do the reset callback */
+ /* are we the reset alarm? */
+ if (alarm->id == 0) {
egg_idletime_alarm_reset_all (idletime);
-
- /* don't propagate */
- return GDK_FILTER_REMOVE;
+ goto out;
}
- return GDK_FILTER_CONTINUE;
+ /* emit */
+ g_signal_emit (alarm->idletime, signals [SIGNAL_ALARM_EXPIRED], 0, alarm->id);
+
+ /* we need the first alarm to go off to set the reset alarm */
+ egg_idletime_set_reset_alarm (idletime, alarm_event);
+out:
+ /* don't propagate */
+ return GDK_FILTER_REMOVE;
}
/**
@@ -419,10 +385,9 @@ egg_idletime_init (EggIdletime *idletime)
idletime->priv->array = g_ptr_array_new ();
+ idletime->priv->reset_set = FALSE;
idletime->priv->idle_counter = None;
- idletime->priv->last_event = 0;
idletime->priv->sync_event = 0;
- idletime->priv->emit_idle_id = 0;
idletime->priv->dpy = GDK_DISPLAY ();
/* get the sync event */
@@ -445,8 +410,6 @@ egg_idletime_init (EggIdletime *idletime)
return;
}
- idletime->priv->reset_set = FALSE;
-
/* catch the timer alarm */
gdk_window_add_filter (NULL, egg_idletime_event_filter_cb, idletime);
@@ -588,10 +551,10 @@ egg_idletime_test (gpointer data)
/************************************************************/
egg_test_title (test, "check if we are alarm zero with no alarms");
- if (idletime->priv->last_event == 0) {
+ if (last_alarm == 0) {
egg_test_success (test, NULL);
} else {
- egg_test_failed (test, "alarm %i set!", idletime->priv->last_event);
+ egg_test_failed (test, "alarm %i set!", last_alarm);
}
/************************************************************/
@@ -647,10 +610,10 @@ egg_idletime_test (gpointer data)
/************************************************************/
egg_test_title (test, "check if correct alarm has gone off");
- if (idletime->priv->last_event == 101) {
+ if (last_alarm == 101) {
egg_test_success (test, "correct alarm");
} else {
- egg_test_failed (test, "alarm %i set!", idletime->priv->last_event);
+ egg_test_failed (test, "alarm %i set!", last_alarm);
}
/************************************************************/
@@ -658,7 +621,7 @@ egg_idletime_test (gpointer data)
if (event_time > 3000 && event_time < 6000) {
egg_test_success (test, "correct, timeout ideally %ims (we did after %ims)", 5000, event_time);
} else {
- egg_test_failed (test, "alarm %i did not timeout correctly !", idletime->priv->last_event);
+ egg_test_failed (test, "alarm %i did not timeout correctly !", last_alarm);
}
}
diff --git a/src/gpm-idle.c b/src/gpm-idle.c
index 37d6d97..06ce39e 100644
--- a/src/gpm-idle.c
+++ b/src/gpm-idle.c
@@ -50,14 +50,8 @@
/* Sets the idle percent limit, i.e. how hard the computer can work
while considered "at idle" */
#define GPM_IDLE_CPU_LIMIT 5
-#define GPM_IDLE_TIMEOUT_IGNORE_DPMS_CHANGE 1.0f /* seconds */
#define GPM_IDLE_IDLETIME_ID 1
-/* XSync seems to be unreliable when setting small values of time.
- * Ideally we want this to be 1ms (or smaller!) to reduce the chance of a race,
- * but this fails to trigger on some systems. */
-#define GPM_IDLE_SMALLEST_RESET_VALUE 500 /* ms */
-
struct GpmIdlePrivate
{
GtkStatusIcon *status_icon;
@@ -72,7 +66,6 @@ struct GpmIdlePrivate
guint timeout_sleep_id;
gboolean x_idle;
gboolean check_type_cpu;
- GTimer *timer;
};
enum {
@@ -137,11 +130,6 @@ gpm_idle_set_mode (GpmIdle *idle, GpmIdleMode mode)
if (mode != idle->priv->mode) {
idle->priv->mode = mode;
-
- /* we save the time of the last state, so we can ignore the X11
- * timer reset when we change brightness or do DPMS actions */
- g_timer_reset (idle->priv->timer);
-
egg_debug ("Doing a state transition: %s", gpm_idle_mode_to_text (mode));
g_signal_emit (idle, signals [IDLE_CHANGED], 0, mode);
}
@@ -226,7 +214,7 @@ gpm_idle_evaluate (GpmIdle *idle)
/* TRANSLATORS: this is what the user should read for more information about the blanking problem (%s is a URL) */
what_to_do = g_strdup_printf (_("Please see %s for more information."),
- "http://blogs.gnome.org/hughsie/2009/08/14/blanking-in-gnome-power-manager-fixed/");
+ "http://blogs.gnome.org/hughsie/2009/08/17/gnome-power-manager-and-blanking-removal-of-bodges/");
/* TRANSLATORS: this is telling the user that thier X server is broken, and needs to be fixed */
nag_message = g_strdup_printf ("%s\n%s", _("If you can see this text, your display server is broken and you should notify your distributor."),
@@ -388,10 +376,7 @@ gpm_idle_session_inhibited_changed_cb (GpmSession *session, gboolean is_inhibite
static void
gpm_idle_idletime_alarm_expired_cb (EggIdletime *idletime, guint alarm_id, GpmIdle *idle)
{
- egg_warning ("idletime alarm: %i", alarm_id);
-
- /* reset time to dim default (could be 1ms) */
- egg_idletime_alarm_set (idle->priv->idletime, GPM_IDLE_IDLETIME_ID, idle->priv->timeout_dim * 1000);
+ egg_debug ("idletime alarm: %i", alarm_id);
/* set again */
idle->priv->x_idle = TRUE;
@@ -406,19 +391,7 @@ gpm_idle_idletime_alarm_expired_cb (EggIdletime *idletime, guint alarm_id, GpmId
static void
gpm_idle_idletime_reset_cb (EggIdletime *idletime, GpmIdle *idle)
{
- gdouble elapsed;
- elapsed = g_timer_elapsed (idle->priv->timer, NULL);
-
- egg_warning ("idletime reset");
-
- /* have we just chaged state? */
- if (idle->priv->mode == GPM_IDLE_MODE_BLANK &&
- elapsed < GPM_IDLE_TIMEOUT_IGNORE_DPMS_CHANGE) {
- egg_debug ("ignoring reset, as we've just done a state change");
- /* make sure we trigger a short timeout so we can get the expired signal */
- egg_idletime_alarm_set (idle->priv->idletime, GPM_IDLE_IDLETIME_ID, GPM_IDLE_SMALLEST_RESET_VALUE);
- return;
- }
+ egg_debug ("idletime reset");
idle->priv->x_idle = FALSE;
gpm_idle_evaluate (idle);
@@ -448,7 +421,6 @@ gpm_idle_finalize (GObject *object)
/* for debugging */
g_object_unref (idle->priv->status_icon);
- g_timer_destroy (idle->priv->timer);
g_object_unref (idle->priv->load);
g_object_unref (idle->priv->session);
@@ -498,7 +470,6 @@ gpm_idle_init (GpmIdle *idle)
idle->priv->timeout_blank_id = 0;
idle->priv->timeout_sleep_id = 0;
idle->priv->x_idle = FALSE;
- idle->priv->timer = g_timer_new ();
idle->priv->load = gpm_load_new ();
idle->priv->session = gpm_session_new ();
g_signal_connect (idle->priv->session, "idle-changed", G_CALLBACK (gpm_idle_session_idle_changed_cb), idle);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]