From 56de871bf3ebde866a65e107eb3c40bc43c3f438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 6 Jan 2011 16:51:12 -0500 Subject: [PATCH] Create and attach buffer at process_updates time This way we don't try to show the buffer until we've handle the initial expose. --- gdk/wayland/gdkdisplay-wayland.c | 2 +- gdk/wayland/gdkwindow-wayland.c | 90 ++++++++++++++++++++++---------- gdk/wayland/gdkwindow-wayland.h | 44 +--------------- 3 files changed, 63 insertions(+), 73 deletions(-) diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c index 86a36f07c3..fefa1f55cd 100644 --- a/gdk/wayland/gdkdisplay-wayland.c +++ b/gdk/wayland/gdkdisplay-wayland.c @@ -169,7 +169,7 @@ shell_handle_configure(void *data, struct wl_shell *shell, window->height = height; _gdk_window_update_size (window); - _gdk_wayland_window_update_size (GDK_WINDOW_IMPL_WAYLAND (window->impl)); + _gdk_wayland_window_update_size (window); g_object_ref(window); diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index 371f9d026a..a331529c4e 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -80,21 +80,59 @@ _gdk_wayland_window_init (GdkWaylandWindow *wayland_window) { } +#define GDK_TYPE_WINDOW_IMPL_WAYLAND (_gdk_window_impl_wayland_get_type ()) +#define GDK_WINDOW_IMPL_WAYLAND(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WINDOW_IMPL_WAYLAND, GdkWindowImplWayland)) +#define GDK_WINDOW_IMPL_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WINDOW_IMPL_WAYLAND, GdkWindowImplWaylandClass)) +#define GDK_IS_WINDOW_IMPL_WAYLAND(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WINDOW_IMPL_WAYLAND)) +#define GDK_IS_WINDOW_IMPL_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WINDOW_IMPL_WAYLAND)) +#define GDK_WINDOW_IMPL_WAYLAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WINDOW_IMPL_WAYLAND, GdkWindowImplWaylandClass)) + +typedef struct _GdkWindowImplWayland GdkWindowImplWayland; +typedef struct _GdkWindowImplWaylandClass GdkWindowImplWaylandClass; + +struct _GdkWindowImplWayland +{ + GdkWindowImpl parent_instance; + + GdkWindow *wrapper; + + GdkToplevelWayland *toplevel; /* Toplevel-specific information */ + GdkCursor *cursor; + GHashTable *device_cursor; + + gint8 toplevel_window_type; + + struct wl_surface *surface; + struct wl_buffer *buffer; + EGLImageKHR *pending_image; + EGLImageKHR *next_image; + + cairo_surface_t *cairo_surface; + GLuint texture; + EGLImageKHR image; + +}; + +struct _GdkWindowImplWaylandClass +{ + GdkWindowImplClass parent_class; +}; + G_DEFINE_TYPE (GdkWindowImplWayland, _gdk_window_impl_wayland, GDK_TYPE_WINDOW_IMPL) static void _gdk_window_impl_wayland_init (GdkWindowImplWayland *impl) -{ +{ impl->toplevel_window_type = -1; impl->device_cursor = g_hash_table_new_full (NULL, NULL, NULL, - (GDestroyNotify) gdk_cursor_unref); + (GDestroyNotify) gdk_cursor_unref); } GdkToplevelWayland * _gdk_wayland_window_get_toplevel (GdkWindow *window) { GdkWindowImplWayland *impl; - + g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); if (!WINDOW_IS_TOPLEVEL (window)) @@ -116,8 +154,9 @@ _gdk_wayland_window_get_toplevel (GdkWindow *window) * cairo surface) when its size has changed. **/ void -_gdk_wayland_window_update_size (GdkWindowImplWayland *impl) +_gdk_wayland_window_update_size (GdkWindow *window) { + GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); GdkDisplayWayland *display_wayland = GDK_DISPLAY_WAYLAND (gdk_window_get_display (impl->wrapper)); @@ -140,6 +179,9 @@ _gdk_wayland_window_update_size (GdkWindowImplWayland *impl) impl->image = NULL; + wl_buffer_destroy(impl->buffer); + impl->buffer = NULL; + fprintf(stderr, " - cleared image\n"); } } @@ -270,7 +312,6 @@ _gdk_wayland_window_attach_image (GdkWindow *window, EGLImageKHR image) GdkWindowImplWayland *impl; EGLint name, stride; struct wl_visual *wl_visual; - struct wl_buffer *buffer; if (GDK_WINDOW_DESTROYED (window)) return; @@ -296,12 +337,10 @@ _gdk_wayland_window_attach_image (GdkWindow *window, EGLImageKHR image) display_wayland->export_drm_image (display_wayland->egl_display, image, &name, NULL, &stride); - buffer = wl_drm_create_buffer(display_wayland->drm, - name, window->width, window->height, - stride, wl_visual); - wl_surface_attach (impl->surface, buffer, 0, 0); - wl_surface_map_toplevel (impl->surface); - wl_buffer_destroy(buffer); + impl->buffer = wl_drm_create_buffer(display_wayland->drm, + name, window->width, window->height, + stride, wl_visual); + wl_surface_attach (impl->surface, impl->buffer, 0, 0); g_object_ref(impl); @@ -433,10 +472,11 @@ gdk_wayland_window_show (GdkWindow *window, gboolean already_mapped) GdkToplevelWayland *toplevel; GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); + display = gdk_window_get_display (window); + display_wayland = GDK_DISPLAY_WAYLAND (display); + if (WINDOW_IS_TOPLEVEL (window)) { - display = gdk_window_get_display (window); - display_wayland = GDK_DISPLAY_WAYLAND (display); toplevel = _gdk_wayland_window_get_toplevel (window); if (toplevel->user_time != 0 && @@ -445,13 +485,12 @@ gdk_wayland_window_show (GdkWindow *window, gboolean already_mapped) gdk_wayland_window_set_user_time (window, display_wayland->user_time); } - display = gdk_window_get_display (window); - display_wayland = GDK_DISPLAY_WAYLAND (display); - impl->surface = wl_compositor_create_surface(display_wayland->compositor); wl_surface_set_user_data(impl->surface, window); _gdk_make_event (window, GDK_MAP, NULL, FALSE); + + fprintf(stderr, "window show, faked map event\n"); } static void @@ -554,7 +593,7 @@ gdk_window_wayland_move_resize (GdkWindow *window, if (height > 0) window->height = height; - _gdk_wayland_window_update_size (GDK_WINDOW_IMPL_WAYLAND (window->impl)); + _gdk_wayland_window_update_size (window); } static void @@ -1189,12 +1228,6 @@ gdk_wayland_window_configure_finished (GdkWindow *window) impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); fprintf(stderr, "configure %p finished\n", window); - - gdk_wayland_window_ref_cairo_surface (GDK_WINDOW (impl)); - - _gdk_wayland_window_attach_image (window, impl->image); - - cairo_surface_destroy (impl->cairo_surface); } static void @@ -1231,15 +1264,15 @@ static void gdk_wayland_window_process_updates_recurse (GdkWindow *window, cairo_region_t *region) { -#if 0 GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); cairo_rectangle_int_t rect; int i, n; - gdk_wayland_window_ref_cairo_surface (window); - - _gdk_wayland_window_attach_image (window, impl->image); - cairo_surface_destroy (impl->cairo_surface); + if (impl->buffer == NULL) + { + _gdk_wayland_window_attach_image (window, impl->image); + wl_surface_map_toplevel (impl->surface); + } n = cairo_region_num_rectangles(region); for (i = 0; i < n; i++) @@ -1248,7 +1281,6 @@ gdk_wayland_window_process_updates_recurse (GdkWindow *window, wl_surface_damage (impl->surface, rect.x, rect.y, rect.width, rect.height); } -#endif _gdk_window_process_updates_recurse (window, region); } diff --git a/gdk/wayland/gdkwindow-wayland.h b/gdk/wayland/gdkwindow-wayland.h index f33afdf504..62d40de4bd 100644 --- a/gdk/wayland/gdkwindow-wayland.h +++ b/gdk/wayland/gdkwindow-wayland.h @@ -39,50 +39,8 @@ G_BEGIN_DECLS typedef struct _GdkToplevelWayland GdkToplevelWayland; -typedef struct _GdkWindowImplWayland GdkWindowImplWayland; -typedef struct _GdkWindowImplWaylandClass GdkWindowImplWaylandClass; typedef struct _GdkXPositionInfo GdkXPositionInfo; -/* Window implementation for Wayland - */ - -#define GDK_TYPE_WINDOW_IMPL_WAYLAND (_gdk_window_impl_wayland_get_type ()) -#define GDK_WINDOW_IMPL_WAYLAND(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WINDOW_IMPL_WAYLAND, GdkWindowImplWayland)) -#define GDK_WINDOW_IMPL_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WINDOW_IMPL_WAYLAND, GdkWindowImplWaylandClass)) -#define GDK_IS_WINDOW_IMPL_WAYLAND(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WINDOW_IMPL_WAYLAND)) -#define GDK_IS_WINDOW_IMPL_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WINDOW_IMPL_WAYLAND)) -#define GDK_WINDOW_IMPL_WAYLAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WINDOW_IMPL_WAYLAND, GdkWindowImplWaylandClass)) - -struct _GdkWindowImplWayland -{ - GdkWindowImpl parent_instance; - - GdkWindow *wrapper; - - GdkToplevelWayland *toplevel; /* Toplevel-specific information */ - GdkCursor *cursor; - GHashTable *device_cursor; - - gint8 toplevel_window_type; - guint no_bg : 1; /* Set when the window background is temporarily - * unset during resizing and scaling */ - guint override_redirect : 1; - - struct wl_surface *surface; - EGLImageKHR *pending_image; - EGLImageKHR *next_image; - - cairo_surface_t *cairo_surface; - GLuint texture; - EGLImageKHR image; - -}; - -struct _GdkWindowImplWaylandClass -{ - GdkWindowImplClass parent_class; -}; - struct _GdkToplevelWayland { @@ -143,7 +101,7 @@ void _gdk_wayland_window_get_offsets (GdkWindow *window, gint *x_offset, gint *y_offset); -void _gdk_wayland_window_update_size (GdkWindowImplWayland *drawable); +void _gdk_wayland_window_update_size (GdkWindow *window); G_END_DECLS