gdk_surface_freeze_toplevel_updates (surface);
}
-/**
- * gdk_x11_surface_foreign_new_for_display:
- * @display: (type GdkX11Display): the #GdkDisplay where the window handle comes from.
- * @window: an Xlib Window
- *
- * Wraps a native window in a #GdkSurface. The function will try to
- * look up the window using gdk_x11_surface_lookup_for_display() first.
- * If it does not find it there, it will create a new window.
- *
- * This may fail if the window has been destroyed. If the window
- * was already known to GDK, a new reference to the existing
- * #GdkSurface is returned.
- *
- * Returns: (transfer full): a #GdkSurface wrapper for the native
- * window, or %NULL if the window has been destroyed. The wrapper
- * will be newly created, if one doesn’t exist already.
- */
-GdkSurface *
-gdk_x11_surface_foreign_new_for_display (GdkDisplay *display,
- Window window)
-{
- GdkX11Screen *screen;
- GdkSurface *win;
- GdkSurfaceImplX11 *impl;
- GdkX11Display *display_x11;
- XWindowAttributes attrs;
- Window root, parent;
- Window *children = NULL;
- guint nchildren;
- gboolean result;
-
- g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
-
- display_x11 = GDK_X11_DISPLAY (display);
-
- if ((win = gdk_x11_surface_lookup_for_display (display, window)) != NULL)
- return g_object_ref (win);
-
- gdk_x11_display_error_trap_push (display);
- result = XGetWindowAttributes (display_x11->xdisplay, window, &attrs);
- if (gdk_x11_display_error_trap_pop (display) || !result)
- return NULL;
-
- /* FIXME: This is pretty expensive.
- * Maybe the caller should supply the parent
- */
- gdk_x11_display_error_trap_push (display);
- result = XQueryTree (display_x11->xdisplay, window, &root, &parent, &children, &nchildren);
- if (gdk_x11_display_error_trap_pop (display) || !result)
- return NULL;
-
- if (children)
- XFree (children);
-
- screen = _gdk_x11_display_screen_for_xrootwin (display, root);
- if (screen == NULL)
- return NULL;
-
- win = _gdk_display_create_surface (display);
- win->impl = g_object_new (GDK_TYPE_SURFACE_IMPL_X11, NULL);
- win->impl_surface = win;
-
- impl = GDK_SURFACE_IMPL_X11 (win->impl);
- impl->wrapper = win;
- impl->surface_scale = GDK_X11_SCREEN (screen)->surface_scale;
-
- /* Always treat foreigns as toplevels */
- win->parent = NULL;
-
- impl->xid = window;
-
- win->x = attrs.x / impl->surface_scale;
- win->y = attrs.y / impl->surface_scale;
- impl->unscaled_width = attrs.width;
- impl->unscaled_height = attrs.height;
- win->width = attrs.width / impl->surface_scale;
- win->height = attrs.height / impl->surface_scale;
- win->surface_type = GDK_SURFACE_FOREIGN;
- win->destroyed = FALSE;
-
- if (attrs.map_state == IsUnmapped)
- win->state = GDK_SURFACE_STATE_WITHDRAWN;
- else
- win->state = 0;
- win->viewable = TRUE;
-
- g_object_ref (win);
- _gdk_x11_display_add_window (display, &GDK_SURFACE_XID (win), win);
-
- /* Update the clip region, etc */
- _gdk_surface_update_size (win);
-
- return win;
-}
-
static void
gdk_toplevel_x11_free_contents (GdkDisplay *display,
GdkToplevelX11 *toplevel)