[gtk+/wip/otte/clipboard: 99/102] gtk-demo: Port to GdkClipboard



commit b4d2df4a182c859f309e617b1b704daecbb2c1ad
Author: Benjamin Otte <otte redhat com>
Date:   Sat Dec 2 14:39:37 2017 +0100

    gtk-demo: Port to GdkClipboard

 demos/gtk-demo/clipboard.c |   93 +++++++++++++++++++++++--------------------
 demos/gtk-demo/main.c      |    2 +-
 2 files changed, 51 insertions(+), 44 deletions(-)
---
diff --git a/demos/gtk-demo/clipboard.c b/demos/gtk-demo/clipboard.c
index 18d7e0d..e8934ea 100644
--- a/demos/gtk-demo/clipboard.c
+++ b/demos/gtk-demo/clipboard.c
@@ -1,6 +1,6 @@
 /* Clipboard
  *
- * GtkClipboard is used for clipboard handling. This demo shows how to
+ * GdkClipboard is used for clipboard handling. This demo shows how to
  * copy and paste text to and from the clipboard.
  *
  * It also shows how to transfer images via the clipboard or via
@@ -93,20 +93,24 @@ paste_button_clicked (GtkWidget *button,
   gdk_clipboard_read_text_async (clipboard, NULL, paste_received, entry);
 }
 
-static cairo_surface_t *
-get_image_surface (GtkImage *image)
+static GdkTexture *
+get_image_texture (GtkImage *image)
 {
   const gchar *icon_name;
   GtkIconTheme *icon_theme;
+  GtkIconInfo *icon_info;
 
   switch (gtk_image_get_storage_type (image))
     {
-    case GTK_IMAGE_SURFACE:
-      return cairo_surface_reference (gtk_image_get_surface (image));
+    case GTK_IMAGE_TEXTURE:
+      return g_object_ref (gtk_image_get_texture (image));
     case GTK_IMAGE_ICON_NAME:
       icon_name = gtk_image_get_icon_name (image);
       icon_theme = gtk_icon_theme_get_for_display (gtk_widget_get_display (GTK_WIDGET (image)));
-      return gtk_icon_theme_load_surface (icon_theme, icon_name, 48, 1, NULL, 
GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
+      icon_info = gtk_icon_theme_lookup_icon (icon_theme, icon_name, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK);
+      if (icon_info == NULL)
+        return NULL;
+      return gtk_icon_info_load_texture (icon_info);
     default:
       g_warning ("Image storage type %d not handled",
                  gtk_image_get_storage_type (image));
@@ -119,14 +123,11 @@ drag_begin (GtkWidget      *widget,
             GdkDragContext *context,
             gpointer        data)
 {
-  cairo_surface_t *surface;
+  GdkTexture *texture;
 
-  surface = get_image_surface (GTK_IMAGE (widget));
-  if (surface)
-    {
-      cairo_surface_set_device_offset (surface, -2, -2);
-      gtk_drag_set_icon_surface (context, surface);
-    }
+  texture = get_image_texture (GTK_IMAGE (widget));
+  if (texture)
+    gtk_drag_set_icon_texture (context, texture, -2, -2);
 }
 
 void
@@ -137,11 +138,11 @@ drag_data_get (GtkWidget        *widget,
                guint             time,
                gpointer          data)
 {
-  cairo_surface_t *surface;
+  GdkTexture *texture;
 
-  surface = get_image_surface (GTK_IMAGE (data));
-  if (surface)
-    gtk_selection_data_set_surface (selection_data, surface);
+  texture = get_image_texture (GTK_IMAGE (widget));
+  if (texture)
+    gtk_selection_data_set_texture (selection_data, texture);
 }
 
 static void
@@ -155,11 +156,11 @@ drag_data_received (GtkWidget        *widget,
 {
   if (gtk_selection_data_get_length (selection_data) > 0)
     {
-      cairo_surface_t *surface;
+      GdkTexture *texture;
 
-      surface = gtk_selection_data_get_surface (selection_data);
-      gtk_image_set_from_surface (GTK_IMAGE (data), surface);
-      cairo_surface_destroy (surface);
+      texture = gtk_selection_data_get_texture (selection_data);
+      gtk_image_set_from_texture (GTK_IMAGE (data), texture);
+      g_object_unref (texture);
     }
 }
 
@@ -167,34 +168,45 @@ static void
 copy_image (GtkMenuItem *item,
             gpointer     data)
 {
-  GtkClipboard *clipboard;
-  cairo_surface_t *surface;
+  GdkClipboard *clipboard;
+  GdkTexture *texture;
 
-  clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
-  surface = get_image_surface (GTK_IMAGE (data));
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (data));
+  texture = get_image_texture (GTK_IMAGE (data));
 
-  if (surface)
+  if (texture)
     {
-      gtk_clipboard_set_surface (clipboard, surface);
-      cairo_surface_destroy (surface);
+      gdk_clipboard_set_texture (clipboard, texture);
+      g_object_unref (texture);
     }
 }
 
 static void
+paste_image_received (GObject      *source,
+                      GAsyncResult *result,
+                      gpointer      data)
+{
+  GdkTexture *texture;
+
+  texture = gdk_clipboard_read_texture_finish (GDK_CLIPBOARD (source), result, NULL);
+  if (texture == NULL)
+    return;
+    
+  gtk_image_set_from_texture (GTK_IMAGE (data), texture);
+  g_object_unref (texture);
+}
+
+static void
 paste_image (GtkMenuItem *item,
              gpointer     data)
 {
-  GtkClipboard *clipboard;
-  cairo_surface_t *surface;
-
-  clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
-  surface = gtk_clipboard_wait_for_surface (clipboard);
+  GdkClipboard *clipboard;
 
-  if (surface)
-    {
-      gtk_image_set_from_surface (GTK_IMAGE (data), surface);
-      cairo_surface_destroy (surface);
-    }
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (data));
+  gdk_clipboard_read_texture_async (clipboard,
+                                    NULL,
+                                    paste_image_received,
+                                    data);
 }
 
 static gboolean
@@ -236,7 +248,6 @@ do_clipboard (GtkWidget *do_widget)
       GtkWidget *label;
       GtkWidget *entry, *button;
       GtkWidget *image;
-      GtkClipboard *clipboard;
 
       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
       gtk_window_set_display (GTK_WINDOW (window),
@@ -338,10 +349,6 @@ do_clipboard (GtkWidget *do_widget)
       /* context menu on image */
       g_signal_connect (image, "button-press-event",
                         G_CALLBACK (button_press), image);
-
-      /* tell the clipboard manager to make the data persistent */
-      clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
-      gtk_clipboard_set_can_store (clipboard, NULL);
     }
 
   if (!gtk_widget_get_visible (window))
diff --git a/demos/gtk-demo/main.c b/demos/gtk-demo/main.c
index f13d9d1..a5e7388 100644
--- a/demos/gtk-demo/main.c
+++ b/demos/gtk-demo/main.c
@@ -256,7 +256,7 @@ static gchar *types[] =
   "GtkTreeIter ",
   "GtkTreeViewColumn ",
   "GdkDisplayManager ",
-  "GtkClipboard ",
+  "GdkClipboard ",
   "GtkIconSize ",
   "GtkImage ",
   "GdkDragContext ",


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