[gtk+] x11: Simplify drag cancel animation setup



commit 709cc0860351a2f77fcdf76396aab61a1e2899a0
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Jan 8 11:30:44 2016 -0500

    x11: Simplify drag cancel animation setup
    
    Instead of creating an intermediate pixbuf, just render
    the window surface onto the new surface. Doing things this
    way lets us avoid the cairo_surface_mark_dirty() call in
    gdk_pixbuf_get_from_window(), which is not generally safe
    to call on 'random' surfaces - it asserts that the surface
    has no mime data attached, and the X11 backend uses mime
    data for damage tracking purposes...

 gdk/x11/gdkdnd-x11.c |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)
---
diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c
index dd07252..86ecb82 100644
--- a/gdk/x11/gdkdnd-x11.c
+++ b/gdk/x11/gdkdnd-x11.c
@@ -2557,25 +2557,31 @@ gdk_x11_drag_context_drop_done (GdkDragContext *context,
 {
   GdkX11DragContext *x11_context = GDK_X11_DRAG_CONTEXT (context);
   GdkDragAnim *anim;
-  GdkPixbuf *pixbuf;
+  cairo_surface_t *win_surface;
   cairo_surface_t *surface;
   cairo_pattern_t *pattern;
+  cairo_t *cr;
 
   if (success)
     return;
 
-  pixbuf = gdk_pixbuf_get_from_window (x11_context->drag_window,
-                                       0, 0,
-                                       gdk_window_get_width (x11_context->drag_window),
-                                       gdk_window_get_height (x11_context->drag_window));
-  surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 0, x11_context->drag_window);
+  win_surface = _gdk_window_ref_cairo_surface (x11_context->drag_window);
+  surface = gdk_window_create_similar_surface (x11_context->drag_window,
+                                               cairo_surface_get_content (win_surface),
+                                               gdk_window_get_width (x11_context->drag_window),
+                                               gdk_window_get_height (x11_context->drag_window));
+  cr = cairo_create (surface);
+  cairo_set_source_surface (cr, win_surface, 0, 0);
+  cairo_paint (cr);
+  cairo_destroy (cr);
+  cairo_surface_destroy (win_surface);
+
   pattern = cairo_pattern_create_for_surface (surface);
 
   gdk_window_set_background_pattern (x11_context->drag_window, pattern);
 
   cairo_pattern_destroy (pattern);
   cairo_surface_destroy (surface);
-  g_object_unref (pixbuf);
 
   anim = g_slice_new0 (GdkDragAnim);
   anim->context = g_object_ref (x11_context);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]