--- gnome-desktop-2.26.1/libgnome-desktop/gnome-rr.c.ori 2009-04-15 05:28:28.927718257 +0100
+++ gnome-desktop-2.26.1/libgnome-desktop/gnome-rr.c 2009-04-15 05:34:06.962714756 +0100
@@ -432,9 +432,34 @@
static ScreenInfo *
screen_info_new (GnomeRRScreen *screen, gboolean needs_reprobe, GError **error)
{
- ScreenInfo *info = g_new0 (ScreenInfo, 1);
-
+ GTimeVal cur_time_val;
+ gint64 cur, prev;
+
g_assert (screen != NULL);
+
+ if ( screen->info != NULL ) {
+ g_get_current_time(&cur_time_val);
+ cur = (gint64) cur_time_val.tv_sec * G_USEC_PER_SEC + cur_time_val.tv_usec;
+ prev =(gint64) screen->last_update_time.tv_sec * G_USEC_PER_SEC + screen->last_update_time.tv_usec;
+
+ /* Only referesh the info after 2 seconds have elapsed since last
+ * update, otherwise it will cause a lot of extra probing on the X
+ * server.
+ */
+ if (((cur - prev) < 0) || ((cur - prev) > 2000000)) {
+ screen->last_update_time = cur_time_val;
+ }
+ else {
+ /* Don't return any update, which should result in caller using
+ * existing data
+ */
+ g_warning("Call to screen_info_new is too frequent, skipping...");
+ return( NULL );
+ }
+ }
+
+ ScreenInfo *info = g_new0 (ScreenInfo, 1);
+
info->outputs = NULL;
info->crtcs = NULL;
diff -ruN gnome-desktop-2.29.92.orig/libgnome-desktop/gnome-rr-private.h gnome-desktop-2.29.92/libgnome-desktop/gnome-rr-private.h
--- gnome-desktop-2.29.92.orig/libgnome-desktop/gnome-rr-private.h 2010-03-11 22:12:45.452630032 +0000
+++ gnome-desktop-2.29.92/libgnome-desktop/gnome-rr-private.h 2010-03-11 22:13:28.367005972 +0000
@@ -42,7 +42,7 @@
GnomeRRScreenChanged callback;
gpointer data;
-
+ GTimeVal last_update_time;
Atom connector_type_atom;
};
diff -ruN gnome-desktop-2.29.92.orig/libgnome-desktop/gnome-rr.c gnome-desktop-2.29.92/libgnome-desktop/gnome-rr.c
--- gnome-desktop-2.29.92.orig/libgnome-desktop/gnome-rr.c 2010-03-11 22:15:24.569673576 +0000
+++ gnome-desktop-2.29.92/libgnome-desktop/gnome-rr.c 2010-03-11 22:18:41.223085776 +0000
@@ -713,6 +713,9 @@
}
screen->info = screen_info_new (screen, TRUE, error);
+
+ /* Initialize the last udpate time */
+ g_get_current_time (&(screen->last_update_time));
if (!screen->info) {
g_free (screen);