Add vfuncs for process_updates_recurse and the before and after hooks

This commit is contained in:
Matthias Clasen 2010-12-13 13:30:05 -05:00
parent da216c0665
commit ccb6edeb8b
6 changed files with 55 additions and 22 deletions

View File

@ -170,6 +170,9 @@ struct _GdkDisplayClass
GdkDragProtocol *protocol, GdkDragProtocol *protocol,
guint *version); guint *version);
void (*before_process_all_updates) (GdkDisplay *display);
void (*after_process_all_updates) (GdkDisplay *display);
/* Signals */ /* Signals */
void (*closed) (GdkDisplay *display, void (*closed) (GdkDisplay *display,
gboolean is_error); gboolean is_error);

View File

@ -4039,19 +4039,18 @@ gdk_window_process_updates_internal (GdkWindow *window)
cairo_region_get_extents (update_area, &clip_box); cairo_region_get_extents (update_area, &clip_box);
end_implicit = gdk_window_begin_implicit_paint (window, &clip_box); end_implicit = gdk_window_begin_implicit_paint (window, &clip_box);
expose_region = cairo_region_copy (update_area); expose_region = cairo_region_copy (update_area);
impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
if (!end_implicit) if (!end_implicit)
{ {
/* Rendering is not double buffered by gdk, do outstanding /* Rendering is not double buffered by gdk, do outstanding
* moves and queue antiexposure immediately. No need to do * moves and queue antiexposure immediately. No need to do
* any tricks */ * any tricks */
gdk_window_flush_outstanding_moves (window); gdk_window_flush_outstanding_moves (window);
impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
save_region = impl_class->queue_antiexpose (window, update_area); save_region = impl_class->queue_antiexpose (window, update_area);
} }
/* Render the invalid areas to the implicit paint, by sending exposes. /* Render the invalid areas to the implicit paint, by sending exposes.
* May flush if non-double buffered widget draw. */ * May flush if non-double buffered widget draw. */
_gdk_windowing_window_process_updates_recurse (window, expose_region); impl_class->process_updates_recurse (window, expose_region);
if (end_implicit) if (end_implicit)
{ {
@ -4060,17 +4059,12 @@ gdk_window_process_updates_internal (GdkWindow *window)
/* By this time we know that any outstanding expose for this /* By this time we know that any outstanding expose for this
* area is invalid and we can avoid it, so queue an antiexpose. * area is invalid and we can avoid it, so queue an antiexpose.
* However, it may be that due to an non-double buffered expose
* we have already started drawing to the window, so it would * we have already started drawing to the window, so it would
* be to late to anti-expose now. Since this is merely an * be to late to anti-expose now. Since this is merely an
* optimization we just avoid doing it at all in that case. * optimization we just avoid doing it at all in that case.
*/ */
if (window->implicit_paint != NULL && if (window->implicit_paint != NULL && !window->implicit_paint->flushed)
!window->implicit_paint->flushed) save_region = impl_class->queue_antiexpose (window, update_area);
{
impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
save_region = impl_class->queue_antiexpose (window, update_area);
}
gdk_window_end_implicit_paint (window); gdk_window_end_implicit_paint (window);
} }
@ -4093,11 +4087,39 @@ gdk_window_process_updates_internal (GdkWindow *window)
static void static void
flush_all_displays (void) flush_all_displays (void)
{ {
GSList *displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); GSList *displays, *l;
GSList *tmp_list;
for (tmp_list = displays; tmp_list; tmp_list = tmp_list->next) displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
gdk_display_flush (tmp_list->data); for (l = displays; l; l = l->next)
gdk_display_flush (l->data);
g_slist_free (displays);
}
static void
before_process_all_updates (void)
{
GSList *displays, *l;
GdkDisplayClass *display_class;
displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
display_class = GDK_DISPLAY_GET_CLASS (displays->data);
for (l = displays; l; l = l->next)
display_class->before_process_all_updates (l->data);
g_slist_free (displays);
}
static void
after_process_all_updates (void)
{
GSList *displays, *l;
GdkDisplayClass *display_class;
displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
display_class = GDK_DISPLAY_GET_CLASS (displays->data);
for (l = displays; l; l = l->next)
display_class->after_process_all_updates (l->data);
g_slist_free (displays); g_slist_free (displays);
} }
@ -4145,7 +4167,7 @@ gdk_window_process_all_updates (void)
update_windows = NULL; update_windows = NULL;
update_idle = 0; update_idle = 0;
_gdk_windowing_before_process_all_updates (); before_process_all_updates ();
g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL); g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
@ -4170,7 +4192,7 @@ gdk_window_process_all_updates (void)
flush_all_displays (); flush_all_displays ();
_gdk_windowing_after_process_all_updates (); after_process_all_updates ();
in_process_all_updates = FALSE; in_process_all_updates = FALSE;

View File

@ -251,6 +251,9 @@ struct _GdkWindowImplClass
GdkDragContext * (*drag_begin) (GdkWindow *window, GdkDragContext * (*drag_begin) (GdkWindow *window,
GdkDevice *device, GdkDevice *device,
GList *targets); GList *targets);
void (*process_updates_recurse) (GdkWindow *window,
cairo_region_t *region);
}; };
/* Interface Functions */ /* Interface Functions */

View File

@ -2703,5 +2703,8 @@ _gdk_display_x11_class_init (GdkDisplayX11Class * class)
display_class->get_maximal_cursor_size = _gdk_x11_display_get_maximal_cursor_size; display_class->get_maximal_cursor_size = _gdk_x11_display_get_maximal_cursor_size;
display_class->supports_cursor_alpha = _gdk_x11_display_supports_cursor_alpha; display_class->supports_cursor_alpha = _gdk_x11_display_supports_cursor_alpha;
display_class->supports_cursor_color = _gdk_x11_display_supports_cursor_color; display_class->supports_cursor_color = _gdk_x11_display_supports_cursor_color;
display_class->before_process_all_updates = _gdk_x11_display_before_process_all_updates;
display_class->after_process_all_updates = _gdk_x11_display_after_process_all_updates;
} }

View File

@ -173,6 +173,8 @@ void _gdk_x11_display_get_default_cursor_size (GdkDisplay *display,
void _gdk_x11_display_get_maximal_cursor_size (GdkDisplay *display, void _gdk_x11_display_get_maximal_cursor_size (GdkDisplay *display,
guint *width, guint *width,
guint *height); guint *height);
void _gdk_x11_display_before_process_all_updates (GdkDisplay *display);
void _gdk_x11_display_after_process_all_updates (GdkDisplay *display);
void _gdk_x11_precache_atoms (GdkDisplay *display, void _gdk_x11_precache_atoms (GdkDisplay *display,
const gchar * const *atom_names, const gchar * const *atom_names,

View File

@ -4862,20 +4862,20 @@ gdk_x11_window_set_composited (GdkWindow *window,
#endif #endif
} }
void static void
_gdk_windowing_window_process_updates_recurse (GdkWindow *window, gdk_x11_window_process_updates_recurse (GdkWindow *window,
cairo_region_t *region) cairo_region_t *region)
{ {
_gdk_window_process_updates_recurse (window, region); _gdk_window_process_updates_recurse (window, region);
} }
void void
_gdk_windowing_before_process_all_updates (void) _gdk_x11_display_before_process_all_updates (GdkDisplay *display)
{ {
} }
void void
_gdk_windowing_after_process_all_updates (void) _gdk_x11_display_after_process_all_updates (GdkDisplay *display)
{ {
} }
@ -5051,5 +5051,5 @@ gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass)
impl_class->destroy_notify = gdk_x11_window_destroy_notify; impl_class->destroy_notify = gdk_x11_window_destroy_notify;
impl_class->register_dnd = _gdk_x11_window_register_dnd; impl_class->register_dnd = _gdk_x11_window_register_dnd;
impl_class->drag_begin = _gdk_x11_window_drag_begin; impl_class->drag_begin = _gdk_x11_window_drag_begin;
impl_class->process_updates_recurse = gdk_x11_window_process_updates_recurse;
} }