summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Holmes <iain@src.gnome.org>2007-11-17 12:42:59 +0000
committerIain Holmes <iain@src.gnome.org>2007-11-17 12:42:59 +0000
commit5a679fc3c8e3de95f38deef2c620e89646e12318 (patch)
tree74b20cb2d10a01fdfd77b700e12a02a2a0d9f99b
parent729a1e18cd2824bce9b7c417369d48fec37f99d0 (diff)
downloadmetacity-5a679fc3c8e3de95f38deef2c620e89646e12318.tar.gz
Use an idle function to repaint
Listen for background changes svn path=/branches/iains-blingtastic-bucket-o-bling/; revision=3405
-rw-r--r--src/compositor.c90
1 files changed, 85 insertions, 5 deletions
diff --git a/src/compositor.c b/src/compositor.c
index 75fe2d6a..4fdd588a 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -27,6 +27,7 @@ struct _MetaCompositor
{
MetaDisplay *display;
+ guint repaint_id;
guint enabled : 1;
};
@@ -530,16 +531,15 @@ root_tile (MetaScreen *screen)
XRenderPictureAttributes pa;
XRenderPictFormat *format;
int p;
- Atom background_atoms[3];
+ Atom background_atoms[2];
Atom pixmap_atom;
pixmap = None;
background_atoms[0] = display->atom_x_root_pixmap;
background_atoms[1] = display->atom_x_set_root;
- background_atoms[2] = display->atom_e_set_root;
pixmap_atom = XInternAtom (display->xdisplay, "PIXMAP", False);
- for (p = 0; p < 3; p++)
+ for (p = 0; p < 2; p++)
{
Atom actual_type;
int actual_format;
@@ -1009,11 +1009,42 @@ static void
repair_display (MetaDisplay *display)
{
GSList *screens;
+ MetaCompositor *compositor = display->compositor;
+
+ if (compositor->repaint_id > 0)
+ {
+ g_source_remove (compositor->repaint_id);
+ compositor->repaint_id = 0;
+ }
for (screens = display->screens; screens; screens = screens->next)
repair_screen ((MetaScreen *) screens->data);
}
+static gboolean
+compositor_idle_cb (gpointer data)
+{
+ MetaCompositor *compositor = (MetaCompositor *) data;
+
+ compositor->repaint_id = 0;
+ repair_display (compositor->display);
+
+ return FALSE;
+}
+
+static void
+add_repair (MetaDisplay *display)
+{
+ MetaCompositor *compositor = display->compositor;
+
+ if (compositor->repaint_id > 0)
+ return;
+
+ compositor->repaint_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE,
+ compositor_idle_cb, compositor,
+ NULL);
+}
+
static void
add_damage (MetaDisplay *display,
MetaScreen *screen,
@@ -1029,6 +1060,8 @@ add_damage (MetaDisplay *display,
}
else
info->all_damage = damage;
+
+ add_repair (display);
}
static void
@@ -1466,6 +1499,8 @@ process_circulate_notify (MetaCompositor *compositor,
restack_win (cw, above);
info->clip_changed = TRUE;
+
+ add_repair (compositor->display);
}
static void
@@ -1484,6 +1519,43 @@ process_configure_notify (MetaCompositor *compositor,
}
static void
+process_property_notify (MetaCompositor *compositor,
+ XPropertyEvent *event)
+{
+ MetaDisplay *display = compositor->display;
+ MetaScreen *screen;
+ int p;
+ Atom background_atoms[2];
+
+ background_atoms[0] = display->atom_x_root_pixmap;
+ background_atoms[1] = display->atom_x_set_root;
+
+ for (p = 0; p < 2; p++)
+ {
+ if (event->atom == background_atoms[p])
+ {
+ screen = meta_display_screen_for_root (display, event->window);
+ if (screen)
+ {
+ MetaCompScreen *info = screen->compositor_data;
+ if (info->root_tile)
+ {
+ XClearArea (display->xdisplay, screen->xroot,
+ 0, 0, 0, 0, TRUE);
+ XRenderFreePicture (display->xdisplay, info->root_tile);
+ info->root_tile = None;
+ add_repair (display);
+
+ return;
+ }
+ }
+ }
+ }
+
+ /* Handle transparency here... */
+}
+
+static void
expose_area (MetaScreen *screen,
XRectangle *rects,
int nrects)
@@ -1598,6 +1670,9 @@ process_damage (MetaCompositor *compositor,
return;
repair_win (cw);
+ if (event->more == FALSE) {
+ add_repair (compositor->display);
+ }
}
static void
@@ -1632,6 +1707,7 @@ meta_compositor_new (MetaDisplay *display)
compositor = g_new (MetaCompositor, 1);
compositor->display = display;
+ compositor->repaint_id = 0;
compositor->enabled = TRUE;
return compositor;
@@ -1852,7 +1928,11 @@ meta_compositor_process_event (MetaCompositor *compositor,
case ConfigureNotify:
process_configure_notify (compositor, (XConfigureEvent *) event);
break;
-
+
+ case PropertyNotify:
+ process_property_notify (compositor, (XPropertyEvent *) event);
+ break;
+
case Expose:
process_expose (compositor, (XExposeEvent *) event);
break;
@@ -1891,7 +1971,7 @@ meta_compositor_process_event (MetaCompositor *compositor,
}
meta_error_trap_pop (compositor->display, FALSE);
- repair_display (compositor->display);
+/* repair_display (compositor->display); */
return;
#endif