[gnome-power-manager] Remove all the bodges from the IDLETIMER code now X is fixed



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]