mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-13 22:10:08 +00:00
surface: Simplify destroy implementation
Without child surfaces, there is no need to recurse.
This commit is contained in:
parent
3248bdc726
commit
9b54f124e5
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user