]> Pileus Git - ~andy/gtk/commitdiff
Invalidate window on configure
authorKristian Høgsberg <krh@bitplanet.net>
Fri, 7 Jan 2011 15:16:17 +0000 (10:16 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Sat, 5 Feb 2011 21:11:54 +0000 (16:11 -0500)
This will trigger a repaint of the window, but it may be more efficient
to just copy back the old surface contents and let gtk+ just update the
changed parts.

gdk/wayland/gdkwindow-wayland.c

index a331529c4ed08ca127bd181b8253774b3eb75cfd..45d921be4e29f08fe1fc3f0d9460cdf758b26cb6 100644 (file)
@@ -106,6 +106,7 @@ struct _GdkWindowImplWayland
   struct wl_buffer *buffer;
   EGLImageKHR *pending_image;
   EGLImageKHR *next_image;
+  unsigned int mapped : 1;
 
   cairo_surface_t *cairo_surface;
   GLuint texture;
@@ -159,6 +160,8 @@ _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));
+  GdkRectangle area;
+  cairo_region_t *region;
 
   fprintf(stderr, "update size, window %p\n", impl->wrapper);
 
@@ -179,11 +182,23 @@ _gdk_wayland_window_update_size (GdkWindow *window)
 
       impl->image = NULL;
 
-      wl_buffer_destroy(impl->buffer);
-      impl->buffer = NULL;
+      if (impl->buffer)
+       {
+         wl_buffer_destroy(impl->buffer);
+         impl->buffer = NULL;
+       }
 
       fprintf(stderr, " - cleared image\n");
     }
+
+  area.x = 0;
+  area.y = 0;
+  area.width = window->width;
+  area.height = window->height;
+
+  region = cairo_region_create_rectangle (&area);
+  _gdk_window_invalidate_for_expose (window, region);
+  cairo_region_destroy (region);
 }
 
 GdkWindow *
@@ -318,19 +333,6 @@ _gdk_wayland_window_attach_image (GdkWindow *window, EGLImageKHR image)
 
   impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
 
-  if (impl->pending_image)
-    {
-      if (impl->next_image && impl->next_image != impl->image)
-       display_wayland->destroy_image(display_wayland->egl_display,
-                                      impl->next_image);
-
-      impl->next_image = image;
-
-      return;
-    }
-
-  impl->pending_image = image;
-
   wl_visual =
     wl_display_get_premultiplied_argb_visual(display_wayland->wl_display);
 
@@ -345,8 +347,7 @@ _gdk_wayland_window_attach_image (GdkWindow *window, EGLImageKHR image)
   g_object_ref(impl);
 
   fprintf(stderr, "attach %p %dx%d (image %p, name %d)\n",
-         window, window->width, window->height,
-         impl->pending_image, name);
+         window, window->width, window->height, image, name);
 }
 
 static void
@@ -1269,9 +1270,11 @@ gdk_wayland_window_process_updates_recurse (GdkWindow *window,
   int i, n;
 
   if (impl->buffer == NULL)
+    _gdk_wayland_window_attach_image (window, impl->image);
+  if (!impl->mapped)
     {
-      _gdk_wayland_window_attach_image (window, impl->image);
       wl_surface_map_toplevel (impl->surface);
+      impl->mapped = TRUE;
     }
 
   n = cairo_region_num_rectangles(region);