surface: Simplify destroy implementation

Without child surfaces, there is no need to recurse.
This commit is contained in:
Matthias Clasen 2019-03-24 16:24:30 -04:00
parent 3248bdc726
commit 9b54f124e5
5 changed files with 28 additions and 51 deletions

View File

@ -258,7 +258,6 @@ gdk_surface_broadway_ref_cairo_surface (GdkSurface *surface)
static void
_gdk_broadway_surface_destroy (GdkSurface *surface,
gboolean recursing,
gboolean foreign_destroy)
{
GdkSurfaceImplBroadway *impl;

View File

@ -636,8 +636,6 @@ surface_remove_from_pointer_info (GdkSurface *surface,
/**
* _gdk_surface_destroy_hierarchy:
* @surface: a #GdkSurface
* @recursing: If %TRUE, then this is being called because a parent
* was destroyed.
* @recursing_native: If %TRUE, then this is being called because a native parent
* was destroyed. This generally means that the call to the
* windowing system to destroy the surface can be omitted, since
@ -653,8 +651,6 @@ surface_remove_from_pointer_info (GdkSurface *surface,
**/
static void
_gdk_surface_destroy_hierarchy (GdkSurface *surface,
gboolean recursing,
gboolean recursing_native,
gboolean foreign_destroy)
{
GdkSurfaceImplClass *impl_class;
@ -667,42 +663,32 @@ _gdk_surface_destroy_hierarchy (GdkSurface *surface,
display = gdk_surface_get_display (surface);
switch (surface->surface_type)
if (surface->gl_paint_context)
{
default:
g_assert_not_reached ();
break;
case GDK_SURFACE_TOPLEVEL:
case GDK_SURFACE_TEMP:
if (surface->gl_paint_context)
{
/* Make sure to destroy if current */
g_object_run_dispose (G_OBJECT (surface->gl_paint_context));
g_object_unref (surface->gl_paint_context);
surface->gl_paint_context = NULL;
}
if (surface->frame_clock)
{
g_object_run_dispose (G_OBJECT (surface->frame_clock));
gdk_surface_set_frame_clock (surface, NULL);
}
_gdk_surface_clear_update_area (surface);
impl_class = GDK_SURFACE_IMPL_GET_CLASS (surface->impl);
impl_class->destroy (surface, recursing_native, foreign_destroy);
surface->state |= GDK_SURFACE_STATE_WITHDRAWN;
surface->destroyed = TRUE;
surface_remove_from_pointer_info (surface, display);
g_object_notify_by_pspec (G_OBJECT (surface), properties[PROP_STATE]);
g_object_notify_by_pspec (G_OBJECT (surface), properties[PROP_MAPPED]);
break;
/* Make sure to destroy if current */
g_object_run_dispose (G_OBJECT (surface->gl_paint_context));
g_object_unref (surface->gl_paint_context);
surface->gl_paint_context = NULL;
}
if (surface->frame_clock)
{
g_object_run_dispose (G_OBJECT (surface->frame_clock));
gdk_surface_set_frame_clock (surface, NULL);
}
_gdk_surface_clear_update_area (surface);
impl_class = GDK_SURFACE_IMPL_GET_CLASS (surface->impl);
impl_class->destroy (surface, foreign_destroy);
surface->state |= GDK_SURFACE_STATE_WITHDRAWN;
surface->destroyed = TRUE;
surface_remove_from_pointer_info (surface, display);
g_object_notify_by_pspec (G_OBJECT (surface), properties[PROP_STATE]);
g_object_notify_by_pspec (G_OBJECT (surface), properties[PROP_MAPPED]);
}
/**
@ -720,7 +706,7 @@ void
_gdk_surface_destroy (GdkSurface *surface,
gboolean foreign_destroy)
{
_gdk_surface_destroy_hierarchy (surface, FALSE, FALSE, foreign_destroy);
_gdk_surface_destroy_hierarchy (surface, foreign_destroy);
}
/**
@ -738,7 +724,7 @@ _gdk_surface_destroy (GdkSurface *surface,
void
gdk_surface_destroy (GdkSurface *surface)
{
_gdk_surface_destroy_hierarchy (surface, FALSE, FALSE, FALSE);
_gdk_surface_destroy_hierarchy (surface, FALSE);
g_object_unref (surface);
}

View File

@ -100,18 +100,12 @@ struct _GdkSurfaceImplClass
/* Called to do the windowing system specific part of gdk_surface_destroy(),
*
* surface: The window being destroyed
* recursing: If TRUE, then this is being called because a parent
* was destroyed. This generally means that the call to the windowing
* system to destroy the surface can be omitted, since it will be
* destroyed as a result of the parent being destroyed.
* Unless @foreign_destroy
* foreign_destroy: If TRUE, the surface or a parent was destroyed by some
* external agency. The surface has already been destroyed and no
* windowing system calls should be made. (This may never happen
* for some windowing systems.)
*/
void (* destroy) (GdkSurface *surface,
gboolean recursing,
gboolean foreign_destroy);

View File

@ -2847,7 +2847,6 @@ gdk_surface_wayland_input_shape_combine_region (GdkSurface *surface,
static void
gdk_wayland_surface_destroy (GdkSurface *surface,
gboolean recursing,
gboolean foreign_destroy)
{
GdkWaylandDisplay *display;

View File

@ -992,8 +992,7 @@ gdk_toplevel_x11_free_contents (GdkDisplay *display,
static void
gdk_x11_surface_destroy (GdkSurface *surface,
gboolean recursing,
gboolean foreign_destroy)
gboolean foreign_destroy)
{
GdkSurfaceImplX11 *impl = GDK_SURFACE_IMPL_X11 (surface->impl);
GdkToplevelX11 *toplevel;
@ -1013,7 +1012,7 @@ gdk_x11_surface_destroy (GdkSurface *surface,
impl->cairo_surface = NULL;
}
if (!recursing && !foreign_destroy)
if (!foreign_destroy)
XDestroyWindow (GDK_SURFACE_XDISPLAY (surface), GDK_SURFACE_XID (surface));
}