textview: Port dnd icon to be a GdkPaintable
authorBenjamin Otte <otte@redhat.com>
Mon, 26 Mar 2018 04:49:55 +0000 (06:49 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 26 Mar 2018 16:16:37 +0000 (18:16 +0200)
gtk/gtktextutil.c
gtk/gtktextutil.h
gtk/gtktextview.c

index 236aac5c792950b629f0f87cbce08d8f2f2948dc..ae17123e0ae29cba1ed3d6395368cfeb20e24c50 100644 (file)
@@ -261,14 +261,15 @@ G_GNUC_END_IGNORE_DEPRECATIONS
   gtk_style_context_get (context, "font", &values->font, NULL);
 }
 
-cairo_surface_t *
-_gtk_text_util_create_rich_drag_icon (GtkWidget     *widget,
-                                      GtkTextBuffer *buffer,
-                                      GtkTextIter   *start,
-                                      GtkTextIter   *end)
+GdkPaintable *
+gtk_text_util_create_rich_drag_icon (GtkWidget     *widget,
+                                     GtkTextBuffer *buffer,
+                                     GtkTextIter   *start,
+                                     GtkTextIter   *end)
 {
   GtkAllocation      allocation;
-  cairo_surface_t   *surface;
+  GdkPaintable      *paintable;
+  GtkSnapshot       *snapshot;
   gint               layout_width, layout_height;
   GtkTextBuffer     *new_buffer;
   GtkTextLayout     *layout;
@@ -331,11 +332,10 @@ _gtk_text_util_create_rich_drag_icon (GtkWidget     *widget,
   layout_width = MIN (layout_width, DRAG_ICON_MAX_WIDTH);
   layout_height = MIN (layout_height, DRAG_ICON_MAX_HEIGHT);
 
-  surface = gdk_surface_create_similar_surface (gtk_widget_get_surface (widget),
-                                               CAIRO_CONTENT_COLOR_ALPHA,
-                                               layout_width, layout_height);
-
-  cr = cairo_create (surface);
+  snapshot = gtk_snapshot_new (FALSE, NULL, "RichTextDragIcon");
+  cr = gtk_snapshot_append_cairo (snapshot,
+                                  &GRAPHENE_RECT_INIT (0, 0, layout_width, layout_height),
+                                  "Text");
 
   gtk_text_layout_draw (layout, widget, cr);
 
@@ -343,7 +343,9 @@ _gtk_text_util_create_rich_drag_icon (GtkWidget     *widget,
   g_object_unref (layout);
   g_object_unref (new_buffer);
 
-  return surface;
+  paintable = gtk_snapshot_free_to_paintable (snapshot);
+
+  return paintable;
 }
 
 static gint
index 8f6a12d9ae29d7b180b610f295a58706ba449258..a657e586cef67cf6a1c62f76334fb89907731e36 100644 (file)
@@ -41,7 +41,7 @@ void _gtk_text_util_append_special_char_menuitems (GtkMenuShell              *me
 GdkPaintable *    gtk_text_util_create_drag_icon  (GtkWidget     *widget,
                                                    gchar         *text,
                                                    gsize          len);
-cairo_surface_t * _gtk_text_util_create_rich_drag_icon (GtkWidget     *widget,
+GdkPaintable *    gtk_text_util_create_rich_drag_icon (GtkWidget     *widget,
                                                    GtkTextBuffer *buffer,
                                                    GtkTextIter   *start,
                                                    GtkTextIter   *end);
index bd91df47f23f65b187326ea2b4dc849089b6e0f8..202c5e9d0f39e4fc958cf882f74e972efca115c6 100644 (file)
@@ -7692,17 +7692,17 @@ drag_begin_cb (GtkWidget      *widget,
   GtkTextBuffer   *buffer = gtk_text_view_get_buffer (text_view);
   GtkTextIter      start;
   GtkTextIter      end;
-  cairo_surface_t *surface = NULL;
+  GdkPaintable    *paintable = NULL;
 
   g_signal_handlers_disconnect_by_func (widget, drag_begin_cb, NULL);
 
   if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
-    surface = _gtk_text_util_create_rich_drag_icon (widget, buffer, &start, &end);
+    paintable = gtk_text_util_create_rich_drag_icon (widget, buffer, &start, &end);
 
-  if (surface)
+  if (paintable)
     {
-      gtk_drag_set_icon_surface (context, surface);
-      cairo_surface_destroy (surface);
+      gtk_drag_set_icon_paintable (context, paintable, 0, 0);
+      g_object_unref (paintable);
     }
   else
     {