diff --git a/src/compositor.c b/src/compositor.c index 4ba89f8a8920535a34b754bd727620178988f548..469e6e9b856138ebc73809a3a8525c9d2677060b 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -89,7 +89,9 @@ #define WIN_IS_DAMAGED(cw) (cw->damaged) #define WIN_IS_REDIRECTED(cw) (cw->redirected) -#define USE_IDLE_REPAINT +#define USE_TIMEOUT_REPAINT +#define REPAINT_FREQ 50 /* Hz.*/ +#define TIMEOUT_REPAINT (1000 /* ms.*/ / REPAINT_FREQ) typedef struct _CWindow CWindow; struct _CWindow @@ -1390,6 +1392,18 @@ paint_all (ScreenInfo *screen_info, XserverRegion region) XFixesDestroyRegion (dpy, paint_region); } +#ifdef USE_TIMEOUT_REPAINT +static void +remove_timeouts (ScreenInfo *screen_info) +{ + if (screen_info->compositor_timeout_id != 0) + { + g_source_remove (screen_info->compositor_timeout_id); + screen_info->compositor_timeout_id = 0; + } +} +#endif /* USE_TIMEOUT_REPAINT */ + static void repair_screen (ScreenInfo *screen_info) { @@ -1403,6 +1417,10 @@ repair_screen (ScreenInfo *screen_info) return; } +#ifdef USE_TIMEOUT_REPAINT + remove_timeouts (screen_info); +#endif /* USE_TIMEOUT_REPAINT */ + display_info = screen_info->display_info; if (screen_info->allDamage != None) { @@ -1412,24 +1430,6 @@ repair_screen (ScreenInfo *screen_info) } } -#ifdef USE_IDLE_REPAINT -static void -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; - } -} -#endif /* USE_IDLE_REPAINT */ - static void repair_display (DisplayInfo *display_info) { @@ -1438,60 +1438,38 @@ repair_display (DisplayInfo *display_info) g_return_if_fail (display_info); TRACE ("entering repair_display"); -#ifdef USE_IDLE_REPAINT - remove_timeouts (display_info); -#endif /* USE_IDLE_REPAINT */ for (screens = display_info->screens; screens; screens = g_slist_next (screens)) { repair_screen ((ScreenInfo *) screens->data); } } -#ifdef USE_IDLE_REPAINT -static gboolean -compositor_idle_cb (gpointer data) -{ - DisplayInfo *display_info = (DisplayInfo *) data; - - display_info->compositor_idle_id = 0; - repair_display (display_info); - - return FALSE; -} - +#ifdef USE_TIMEOUT_REPAINT static gboolean compositor_timeout_cb (gpointer data) { - DisplayInfo *display_info; + ScreenInfo *screen_info; - display_info = (DisplayInfo *) data; - display_info->compositor_timeout_id = 0; - repair_display (display_info); + screen_info = (ScreenInfo *) data; + screen_info->compositor_timeout_id = 0; + repair_screen (screen_info); return FALSE; } -#endif /* USE_IDLE_REPAINT */ +#endif /* USE_TIMEOUT_REPAINT */ static void -add_repair (DisplayInfo *display_info) +add_repair (ScreenInfo *screen_info) { -#ifdef USE_IDLE_REPAINT - if (display_info->compositor_idle_id != 0) +#ifdef USE_TIMEOUT_REPAINT + if (screen_info->compositor_timeout_id != 0) { return; } - display_info->compositor_idle_id = - g_idle_add_full (G_PRIORITY_HIGH_IDLE, - 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); -#endif /* USE_IDLE_REPAINT */ + screen_info->compositor_timeout_id = + g_timeout_add (TIMEOUT_REPAINT, + compositor_timeout_cb, screen_info); +#endif /* USE_TIMEOUT_REPAINT */ } static void @@ -1521,7 +1499,7 @@ add_damage (ScreenInfo *screen_info, XserverRegion damage) } /* The per-screen allDamage region is freed by repair_screen () */ - add_repair (screen_info->display_info); + add_repair (screen_info); } static void @@ -1752,7 +1730,7 @@ set_win_opacity (CWindow *cw, guint opacity) XFixesDestroyRegion (display_info->dpy, cw->extents); } cw->extents = win_extents (cw); - add_repair (display_info); + add_repair (screen_info); } } @@ -1851,7 +1829,6 @@ unmap_win (CWindow *cw) } #endif /* HAVE_OVERLAYS */ damage_screen (screen_info); - repair_screen (screen_info); } } else if (WIN_IS_VISIBLE(cw)) @@ -2181,6 +2158,7 @@ destroy_win (DisplayInfo *display_info, Window id) static void compositorHandleDamage (DisplayInfo *display_info, XDamageNotifyEvent *ev) { + ScreenInfo *screen_info; CWindow *cw; g_return_if_fail (display_info != NULL); @@ -2197,15 +2175,16 @@ compositorHandleDamage (DisplayInfo *display_info, XDamageNotifyEvent *ev) cw = find_cwindow_in_display (display_info, ev->drawable); if ((cw) && WIN_IS_REDIRECTED(cw)) { + screen_info = cw->screen_info; repair_win (cw, &ev->area); - display_info->damages_pending = ev->more; -#ifdef USE_IDLE_REPAINT + screen_info->damages_pending = ev->more; +#ifdef USE_TIMEOUT_REPAINT /* If there are more damages to come, we'll schedule the repair later */ - if (!display_info->damages_pending) + if (!screen_info->damages_pending) { - add_repair (display_info); + add_repair (screen_info); } -#endif /* USE_IDLE_REPAINT */ +#endif /* USE_TIMEOUT_REPAINT */ } } @@ -2235,7 +2214,7 @@ compositorHandlePropertyNotify (DisplayInfo *display_info, XPropertyEvent *ev) XClearArea (display_info->dpy, screen_info->output, 0, 0, 0, 0, TRUE); XRenderFreePicture (display_info->dpy, screen_info->rootTile); screen_info->rootTile = None; - add_repair (display_info); + add_repair (screen_info); return; } @@ -2383,7 +2362,7 @@ compositorHandleCirculateNotify (DisplayInfo *display_info, XCirculateEvent *ev) above = None; } restack_win (cw, above); - add_repair (display_info); + add_repair (cw->screen_info); } static void @@ -2694,12 +2673,9 @@ compositorHandleEvent (DisplayInfo *display_info, XEvent *ev) { compositorHandleShapeNotify (display_info, (XShapeEvent *) ev); } -#ifndef USE_IDLE_REPAINT - if (!display_info->damages_pending) - { - repair_display (display_info); - } -#endif /* USE_IDLE_REPAINT */ +#ifndef USE_TIMEOUT_REPAINT + repair_display (display_info); +#endif /* USE_TIMEOUT_REPAINT */ #endif /* HAVE_COMPOSITOR */ } @@ -2769,10 +2745,6 @@ compositorInitDisplay (DisplayInfo *display_info) #endif /* DEBUG */ } - display_info->compositor_idle_id = 0; - display_info->compositor_timeout_id = 0; - display_info->damages_pending = FALSE; - display_info->enable_compositor = ((display_info->have_render) && (display_info->have_composite) && (display_info->have_damage) @@ -2912,6 +2884,8 @@ compositorManageScreen (ScreenInfo *screen_info) screen_info->cwindows = NULL; screen_info->compositor_active = TRUE; screen_info->wins_unredirected = 0; + screen_info->compositor_timeout_id = 0; + screen_info->damages_pending = FALSE; XClearArea (display_info->dpy, screen_info->output, 0, 0, 0, 0, TRUE); compositorSetCMSelection (screen_info, screen_info->xfwm4_win); @@ -2947,6 +2921,10 @@ compositorUnmanageScreen (ScreenInfo *screen_info) } screen_info->compositor_active = FALSE; +#ifdef USE_TIMEOUT_REPAINT + remove_timeouts (screen_info); +#endif /* USE_TIMEOUT_REPAINT */ + i = 0; for (index = screen_info->cwindows; index; index = g_list_next (index)) { diff --git a/src/display.h b/src/display.h index 6f079deee1b1118ad9b8123bc1a54ec2cefeb845..b5fbf2969a53b40fbefd416a5fd3d23dbcbcb6f3 100644 --- a/src/display.h +++ b/src/display.h @@ -341,10 +341,6 @@ struct _DisplayInfo gboolean have_composite; gboolean have_damage; gboolean have_fixes; - gboolean damages_pending; - - guint compositor_idle_id; - guint compositor_timeout_id; #if HAVE_NAME_WINDOW_PIXMAP gboolean have_name_window_pixmap; diff --git a/src/screen.h b/src/screen.h index 25328d626e6c0dc30bbe2aa87ff9b06b15f76d7e..a3b34ec6d18dbc03e00f0e99af59aaa3f48520eb 100644 --- a/src/screen.h +++ b/src/screen.h @@ -160,6 +160,10 @@ struct _ScreenInfo guint wins_unredirected; gboolean compositor_active; gboolean clipChanged; + gboolean damages_pending; + + guint compositor_timeout_id; + #endif /* HAVE_COMPOSITOR */ };