diff --git a/src/compositor.c b/src/compositor.c
index f4555470fcdbde7c154d034c9558c714d3f6bb66..9eb98fde92a27607fb8b7fe9ad1eed2cd6952f42 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -15,6 +15,7 @@
         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
         xcompmgr - (c) 2003 Keith Packard
+        metacity - (c) 2003, 2004 Red Hat, Inc.
         xfwm4    - (c) 2004 Olivier Fourdan
 
 */
@@ -1045,13 +1046,19 @@ repair_screen (ScreenInfo *screen_info)
 }
 
 static void
-remove_idle (DisplayInfo *display_info)
+remove_timeouts (DisplayInfo *display_info)
 {
     if (display_info->compositor_idle_id != 0)
     {
         g_source_remove (display_info->compositor_idle_id);
         display_info->compositor_idle_id = 0;
     }
+
+    if (display_info->compositor_timeout_id != 0)
+    {
+        g_source_remove (display_info->compositor_timeout_id);
+        display_info->compositor_timeout_id = 0;
+    }
 }
 
 static void
@@ -1068,7 +1075,7 @@ repair_display (DisplayInfo *display_info)
         return;
     }
 
-    remove_idle (display_info);
+    remove_timeouts (display_info);
     for (screens = display_info->screens; screens; screens = g_slist_next (screens))
     {
         repair_screen ((ScreenInfo *) screens->data);
@@ -1086,6 +1093,17 @@ compositor_idle_cb (gpointer data)
     return FALSE;
 }
 
+static gboolean
+compositor_timeout_cb (gpointer data)
+{
+    DisplayInfo *display_info = (DisplayInfo *) data;
+
+    display_info->compositor_timeout_id = 0;
+    repair_display (display_info);
+
+    return FALSE;
+}
+
 static void
 add_repair (DisplayInfo *display_info)
 {
@@ -1093,9 +1111,20 @@ add_repair (DisplayInfo *display_info)
     {
         return;
     }
+
     display_info->compositor_idle_id =
-        g_idle_add_full (G_PRIORITY_DEFAULT + 50,
+        g_idle_add_full (G_PRIORITY_HIGH_IDLE + 50,
                          compositor_idle_cb, display_info, NULL);
+
+    if (display_info->compositor_timeout_id != 0)
+    {
+        return;
+    }
+
+    display_info->compositor_timeout_id = 
+        g_timeout_add (50 /* ms */, 
+                       compositor_timeout_cb, display_info);
+
 }
 
 static void
@@ -2064,6 +2093,9 @@ compositorInitDisplay (DisplayInfo *display_info)
         display_info->have_fixes = TRUE;
     }
 
+    display_info->compositor_idle_id = 0;
+    display_info->compositor_timeout_id = 0;
+
     display_info->enable_compositor = ((display_info->have_composite)
                                     && (display_info->have_damage)
                                     && (display_info->have_fixes));
diff --git a/src/display.h b/src/display.h
index ab32c904bd5c0b85752afae8d74c74fcf53e592d..b3f13b22d9e5d4c564b2139ca4996999d4ec35a1 100644
--- a/src/display.h
+++ b/src/display.h
@@ -101,6 +101,7 @@ struct _DisplayInfo
     gboolean have_fixes;
 
     guint compositor_idle_id;
+    guint compositor_timeout_id;
 
 #if HAVE_NAME_WINDOW_PIXMAP
     gboolean have_name_window_pixmap;