[gtk/new-clipboard-demo: 2/2] gtk-demo: Rewrite the clipboard demo




commit ebb58b7cbcc65206d7fb5699e411caadadb16117
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Dec 12 13:13:11 2021 -0500

    gtk-demo: Rewrite the clipboard demo
    
    This is more in line with the current clipboard
    api, and shows handling colors and files.

 demos/gtk-demo/clipboard.c        | 378 +++++++++++++++++++++++++-------------
 demos/gtk-demo/clipboard.ui       | 255 +++++++++++++++++++++++++
 demos/gtk-demo/demo.gresource.xml |   1 +
 3 files changed, 503 insertions(+), 131 deletions(-)
---
diff --git a/demos/gtk-demo/clipboard.c b/demos/gtk-demo/clipboard.c
index 45556a2ed6..f7348bcdc1 100644
--- a/demos/gtk-demo/clipboard.c
+++ b/demos/gtk-demo/clipboard.c
@@ -1,12 +1,7 @@
 /* Clipboard
  *
  * 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
- * drag-and-drop, and how to make clipboard contents persist after
- * the application exits. Clipboard persistence requires a clipboard
- * manager to run.
+ * copy and paste text, images, colors or files to and from the clipboard.
  */
 
 #include <glib/gi18n.h>
@@ -14,22 +9,52 @@
 #include <string.h>
 #include "demoimage.h"
 
-static GtkWidget *window = NULL;
-
 static void
-copy_button_clicked (GtkWidget *button,
-                     gpointer   user_data)
+copy_button_clicked (GtkStack *source_stack,
+                     gpointer  user_data)
 {
-  GtkWidget *entry;
   GdkClipboard *clipboard;
+  const char *visible_child_name;
+  GtkWidget *visible_child;
 
-  entry = GTK_WIDGET (user_data);
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (source_stack));
 
-  /* Get the clipboard object */
-  clipboard = gtk_widget_get_clipboard (entry);
+  visible_child = gtk_stack_get_visible_child (source_stack);
+  visible_child_name = gtk_stack_get_visible_child_name (source_stack);
 
-  /* Set clipboard text */
-  gdk_clipboard_set_text (clipboard, gtk_editable_get_text (GTK_EDITABLE (entry)));
+  if (strcmp (visible_child_name, "Text") == 0)
+    {
+      gdk_clipboard_set_text (clipboard, gtk_editable_get_text (GTK_EDITABLE (visible_child)));
+    }
+  else if (strcmp (visible_child_name, "Image") == 0)
+    {
+      GtkWidget *child;
+
+      for (child = gtk_widget_get_first_child (visible_child); child; child = gtk_widget_get_next_sibling 
(child))
+        {
+          if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (child)))
+            {
+              GtkWidget *image = gtk_widget_get_first_child (child);
+              gdk_clipboard_set (clipboard, GDK_TYPE_PAINTABLE, gtk_image_get_paintable (GTK_IMAGE (image)));
+              break;
+            }
+        }
+    }
+  else if (strcmp (visible_child_name, "Color") == 0)
+    {
+      GdkRGBA color;
+
+      gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (visible_child), &color);
+      gdk_clipboard_set (clipboard, GDK_TYPE_RGBA, &color);
+    }
+  else if (strcmp (visible_child_name, "File") == 0)
+    {
+      gdk_clipboard_set (clipboard, G_TYPE_FILE, g_object_get_data (G_OBJECT (visible_child), "file"), NULL);
+    }
+  else
+    {
+      g_print ("TODO");
+    }
 }
 
 static void
@@ -37,149 +62,240 @@ paste_received (GObject      *source_object,
                 GAsyncResult *result,
                 gpointer      user_data)
 {
+  GtkStack *dest_stack = user_data;
   GdkClipboard *clipboard;
-  GtkWidget *entry;
-  char *text;
+  const GValue *value;
   GError *error = NULL;
+  GtkWidget *child;
 
   clipboard = GDK_CLIPBOARD (source_object);
-  entry = GTK_WIDGET (user_data);
 
-  /* Get the resulting text of the read operation */
-  text = gdk_clipboard_read_text_finish (clipboard, result, &error);
-
-  if (text)
+  value = gdk_clipboard_read_value_finish (clipboard, result, &error);
+  if (value)
     {
-      /* Set the entry text */
-      gtk_editable_set_text (GTK_EDITABLE (entry), text);
-      g_free (text);
+      if (G_VALUE_HOLDS (value, G_TYPE_FILE))
+        {
+          GFile *file;
+
+          gtk_stack_set_visible_child_name (dest_stack, "File");
+          child = gtk_stack_get_visible_child (dest_stack);
+
+          file = g_value_get_object (value);
+          g_object_set (child, "label", g_file_peek_path (file), NULL);
+        }
+      else if (G_VALUE_HOLDS (value, GDK_TYPE_RGBA))
+        {
+          GdkRGBA *color;
+
+          gtk_stack_set_visible_child_name (dest_stack, "Color");
+          child = gtk_widget_get_first_child (gtk_stack_get_visible_child (dest_stack));
+
+          color = g_value_get_boxed (value);
+          g_object_set (child, "rgba", color, NULL);
+        }
+      else if (G_VALUE_HOLDS (value, GDK_TYPE_PAINTABLE))
+        {
+          GdkPaintable *paintable;
+
+          gtk_stack_set_visible_child_name (dest_stack, "Image");
+          child = gtk_stack_get_visible_child (dest_stack);
+
+          paintable = g_value_get_object (value);
+          g_object_set (child, "paintable", paintable, NULL);
+        }
+      else if (G_VALUE_HOLDS (value, G_TYPE_STRING))
+        {
+          gtk_stack_set_visible_child_name (dest_stack, "Text");
+          child = gtk_stack_get_visible_child (dest_stack);
+
+          gtk_label_set_label (GTK_LABEL (child), g_value_get_string (value));
+        }
     }
   else
     {
-      GtkWidget *dialog;
-
-      /* Show an error about why pasting failed.
-       * Usually you probably want to ignore such failures,
-       * but for demonstration purposes, we show the error.
-       */
-      dialog = gtk_message_dialog_new (GTK_WINDOW (window),
-                                       GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
-                                       GTK_MESSAGE_ERROR,
-                                       GTK_BUTTONS_CLOSE,
-                                       "Could not paste text: %s",
-                                       error->message);
-      g_signal_connect (dialog, "response",
-                        G_CALLBACK (gtk_window_destroy), NULL);
-      gtk_widget_show (dialog);
-
+      g_print ("%s\n", error->message);
       g_error_free (error);
     }
 }
 
 static void
-paste_button_clicked (GtkWidget *button,
-                      gpointer   user_data)
+paste_button_clicked (GtkStack *dest_stack,
+                      gpointer  user_data)
 {
-  GtkWidget *entry;
   GdkClipboard *clipboard;
+  GdkContentFormats *formats;
+
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (dest_stack));
+  formats = gdk_clipboard_get_formats (clipboard);
+
+  if (gdk_content_formats_contain_gtype (formats, G_TYPE_FILE))
+    gdk_clipboard_read_value_async (clipboard, G_TYPE_FILE, 0, NULL, paste_received, dest_stack);
+  else if (gdk_content_formats_contain_gtype (formats, GDK_TYPE_RGBA))
+    gdk_clipboard_read_value_async (clipboard, GDK_TYPE_RGBA, 0, NULL, paste_received, dest_stack);
+  else if (gdk_content_formats_contain_gtype (formats, GDK_TYPE_PAINTABLE))
+    gdk_clipboard_read_value_async (clipboard, GDK_TYPE_PAINTABLE, 0, NULL, paste_received, dest_stack);
+  else if (gdk_content_formats_contain_gtype (formats, G_TYPE_STRING))
+    gdk_clipboard_read_value_async (clipboard, G_TYPE_STRING, 0, NULL, paste_received, dest_stack);
+}
+
+static void
+update_copy_button_sensitivity (GtkWidget *source_stack)
+{
+  GtkButton *copy_button;
+  const char *visible_child_name;
+  GtkWidget *visible_child;
+  gboolean sensitive;
+
+  copy_button = GTK_BUTTON (g_object_get_data (G_OBJECT (source_stack), "copy-button"));
 
-  entry = GTK_WIDGET (user_data);
+  visible_child = gtk_stack_get_visible_child (GTK_STACK (source_stack));
+  visible_child_name = gtk_stack_get_visible_child_name (GTK_STACK (source_stack));
+  if (strcmp (visible_child_name, "Text") == 0)
+    {
+      sensitive = strlen (gtk_editable_get_text (GTK_EDITABLE (visible_child))) > 0;
+    }
+  else if (strcmp (visible_child_name, "Color") == 0 ||
+           strcmp (visible_child_name, "Image") == 0)
+    {
+      sensitive = TRUE;
+    }
+  else if (strcmp (visible_child_name, "File") == 0)
+    {
+      sensitive = g_object_get_data (G_OBJECT (visible_child), "file") != NULL;
+    }
+  else
+    {
+      sensitive = FALSE;
+    }
 
-  /* Get the clipboard object */
-  clipboard = gtk_widget_get_clipboard (entry);
+  gtk_widget_set_sensitive (GTK_WIDGET (copy_button), sensitive);
+}
 
-  /* Request the contents of the clipboard, contents_received will be
-     called when we do get the contents.
-   */
-  gdk_clipboard_read_text_async (clipboard, NULL, paste_received, entry);
+static void
+source_changed_cb (GtkButton  *copy_button,
+                   GParamSpec *pspec,
+                   GtkWidget  *source_stack)
+{
+  update_copy_button_sensitivity (source_stack);
+}
+
+static void
+text_changed_cb (GtkButton  *copy_button,
+                 GParamSpec *pspec,
+                 GtkWidget  *entry)
+{
+  update_copy_button_sensitivity (gtk_widget_get_ancestor (entry, GTK_TYPE_STACK));
+}
+
+static void
+file_button_set_file (GtkButton *button,
+                      GFile     *file)
+{
+  gtk_label_set_label (GTK_LABEL (gtk_button_get_child (button)), g_file_peek_path (file));
+  g_object_set_data_full (G_OBJECT (button), "file", g_object_ref (file), g_object_unref);
+}
+
+static void
+file_chooser_response (GtkNativeDialog *dialog,
+                       int              response,
+                       GtkButton       *button)
+{
+  gtk_native_dialog_hide (dialog);
+
+  if (response == GTK_RESPONSE_ACCEPT)
+    {
+      GFile *file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
+      file_button_set_file (button, file);
+      g_object_unref (file);
+
+      update_copy_button_sensitivity (gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_STACK));
+    }
+
+  gtk_native_dialog_destroy (dialog);
+}
+
+static void
+open_file_cb (GtkWidget *button)
+{
+  GtkFileChooserNative *chooser;
+
+  chooser = gtk_file_chooser_native_new ("Choose a file",
+                                         GTK_WINDOW (gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW)),
+                                         GTK_FILE_CHOOSER_ACTION_OPEN,
+                                         "_Open",
+                                         "_Cancel");
+
+  g_signal_connect (chooser, "response", G_CALLBACK (file_chooser_response), button);
+  gtk_native_dialog_show (GTK_NATIVE_DIALOG (chooser));
+}
+
+static void
+update_paste_button_sensitivity (GdkClipboard *clipboard,
+                                 GtkWidget    *paste_button)
+{
+  GdkContentFormats *formats;
+  gboolean sensitive = FALSE;
+
+  formats = gdk_clipboard_get_formats (clipboard);
+
+  if (gdk_content_formats_contain_gtype (formats, G_TYPE_FILE) ||
+      gdk_content_formats_contain_gtype (formats, GDK_TYPE_RGBA) ||
+      gdk_content_formats_contain_gtype (formats, GDK_TYPE_PAINTABLE) ||
+      gdk_content_formats_contain_gtype (formats, G_TYPE_STRING))
+    sensitive = TRUE;
+
+  gtk_widget_set_sensitive (paste_button, sensitive);
+}
+
+static void
+unset_clipboard_handler (gpointer data)
+{
+  GdkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET (data));
+
+  g_signal_handlers_disconnect_by_func (clipboard, update_paste_button_sensitivity, data);
 }
 
 GtkWidget *
 do_clipboard (GtkWidget *do_widget)
 {
+  static GtkWidget *window = NULL;
+
   if (!window)
     {
-      GtkWidget *vbox, *hbox;
-      GtkWidget *label;
-      GtkWidget *entry, *button;
-      GtkWidget *image;
-
-      window = gtk_window_new ();
-      gtk_window_set_display (GTK_WINDOW (window),
-                              gtk_widget_get_display (do_widget));
-      gtk_window_set_title (GTK_WINDOW (window), "Clipboard");
+      GtkBuilderScope *scope;
+      GtkBuilder *builder;
+      GObject *copy_button;
+      GObject *source_stack;
+      GtkWidget *paste_button;
+
+      scope = gtk_builder_cscope_new ();
+      gtk_builder_cscope_add_callback_symbols (GTK_BUILDER_CSCOPE (scope),
+                                               "copy_button_clicked", G_CALLBACK (copy_button_clicked),
+                                               "paste_button_clicked", G_CALLBACK (paste_button_clicked),
+                                               "source_changed_cb", G_CALLBACK (source_changed_cb),
+                                               "text_changed_cb", G_CALLBACK (text_changed_cb),
+                                               "open_file_cb", G_CALLBACK (open_file_cb),
+                                               NULL);
+
+      builder = gtk_builder_new ();
+      gtk_builder_set_scope (builder, scope);
+      gtk_builder_add_from_resource (builder, "/clipboard/clipboard.ui", NULL);
+
+      window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
       g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
+      gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
+
+      copy_button = gtk_builder_get_object (builder, "copy_button");
+      source_stack = gtk_builder_get_object (builder, "source_stack");
+      g_object_set_data (source_stack, "copy-button", copy_button);
+
+      paste_button = GTK_WIDGET (gtk_builder_get_object (builder, "paste_button"));
+      g_signal_connect (gtk_widget_get_clipboard (paste_button), "changed",
+                        G_CALLBACK (update_paste_button_sensitivity), paste_button);
+      g_object_set_data_full (G_OBJECT (paste_button), "clipboard-handler", paste_button, 
unset_clipboard_handler);
 
-      vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-      gtk_widget_set_margin_start (vbox, 8);
-      gtk_widget_set_margin_end (vbox, 8);
-      gtk_widget_set_margin_top (vbox, 8);
-      gtk_widget_set_margin_bottom (vbox, 8);
-
-      gtk_window_set_child (GTK_WINDOW (window), vbox);
-
-      label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
-
-      gtk_box_append (GTK_BOX (vbox), label);
-
-      hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
-      gtk_widget_set_margin_start (hbox, 8);
-      gtk_widget_set_margin_end (hbox, 8);
-      gtk_widget_set_margin_top (hbox, 8);
-      gtk_widget_set_margin_bottom (hbox, 8);
-      gtk_box_append (GTK_BOX (vbox), hbox);
-
-      /* Create the first entry */
-      entry = gtk_entry_new ();
-      gtk_box_append (GTK_BOX (hbox), entry);
-
-      /* Create the button */
-      button = gtk_button_new_with_mnemonic (_("_Copy"));
-      gtk_box_append (GTK_BOX (hbox), button);
-      g_signal_connect (button, "clicked",
-                        G_CALLBACK (copy_button_clicked), entry);
-
-      label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry");
-      gtk_box_append (GTK_BOX (vbox), label);
-
-      hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
-      gtk_widget_set_margin_start (hbox, 8);
-      gtk_widget_set_margin_end (hbox, 8);
-      gtk_widget_set_margin_top (hbox, 8);
-      gtk_widget_set_margin_bottom (hbox, 8);
-      gtk_box_append (GTK_BOX (vbox), hbox);
-
-      /* Create the second entry */
-      entry = gtk_entry_new ();
-      gtk_box_append (GTK_BOX (hbox), entry);
-
-      /* Create the button */
-      button = gtk_button_new_with_mnemonic (_("_Paste"));
-      gtk_box_append (GTK_BOX (hbox), button);
-      g_signal_connect (button, "clicked",
-                        G_CALLBACK (paste_button_clicked), entry);
-
-      label = gtk_label_new ("Images can be transferred via the clipboard, too");
-      gtk_box_append (GTK_BOX (vbox), label);
-
-      hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
-      gtk_widget_set_margin_start (hbox, 8);
-      gtk_widget_set_margin_end (hbox, 8);
-      gtk_widget_set_margin_top (hbox, 8);
-      gtk_widget_set_margin_bottom (hbox, 8);
-      gtk_box_append (GTK_BOX (vbox), hbox);
-
-      /* Create the first image */
-      image = demo_image_new ("dialog-warning");
-      gtk_box_append (GTK_BOX (hbox), image);
-
-      /* Create the second image */
-      image = demo_image_new ("process-stop");
-      gtk_box_append (GTK_BOX (hbox), image);
-
-      /* Create the third image */
-      image = demo_image_new ("weather-clear");
-      gtk_box_append (GTK_BOX (hbox), image);
+      g_object_unref (builder);
+      g_object_unref (scope);
     }
 
   if (!gtk_widget_get_visible (window))
diff --git a/demos/gtk-demo/clipboard.ui b/demos/gtk-demo/clipboard.ui
new file mode 100644
index 0000000000..08fa51e9f8
--- /dev/null
+++ b/demos/gtk-demo/clipboard.ui
@@ -0,0 +1,255 @@
+
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow" id="window">
+    <property name="resizable">1</property>
+    <property name="title">Clipboard</property>
+    <child>
+      <object class="GtkBox">
+        <property name="orientation">vertical</property>
+        <property name="margin-start">12</property>
+        <property name="margin-end">12</property>
+        <property name="margin-top">12</property>
+        <property name="margin-bottom">12</property>
+        <property name="spacing">12</property>
+        <child>
+          <object class="GtkLabel">
+            <property name="label">“Copy” will copy the selected data the clipboard, “Paste” will present 
the current clipboard contents</property>
+            <property name="wrap">1</property>
+            <property name="max-width-chars">40</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkBox">
+            <property name="spacing">12</property>
+            <child>
+              <object class="GtkDropDown" id="source_chooser">
+                <property name="valign">center</property>
+                <property name="model">
+                  <object class="GtkStringList">
+                    <items>
+                      <item>Text</item>
+                      <item>Color</item>
+                      <item>Image</item>
+                      <item>File</item>
+                    </items>
+                  </object>
+                </property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkStack" id="source_stack">
+                <signal name="notify::visible-child" handler="source_changed_cb" object="copy_button"/>
+                <property name="vexpand">1</property>
+                <binding name="visible-child-name">
+                  <lookup name="string" type="GtkStringObject">
+                    <lookup name="selected-item">
+                      source_chooser
+                    </lookup>
+                  </lookup>
+                </binding>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">Text</property>
+                    <property name="child">
+                      <object class="GtkEntry" id="source_text">
+                        <property name="valign">center</property>
+                        <signal name="notify::text" handler="text_changed_cb" object="copy_button"/>
+                        <property name="text">Copy this!</property>
+                      </object>
+                    </property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">Color</property>
+                    <property name="child">
+                      <object class="GtkColorButton" id="source_color">
+                        <property name="valign">center</property>
+                        <property name="rgba">purple</property>
+                      </object>
+                    </property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">Image</property>
+                    <property name="child">
+                      <object class="GtkBox">
+                        <property name="valign">center</property>
+                        <style>
+                          <class name="linked"/>
+                        </style>
+                        <child>
+                          <object class="GtkToggleButton" id="image_rose">
+                            <property name="active">1</property>
+                            <child>
+                              <object class="GtkImage">
+                                <style>
+                                  <class name="large-icons"/>
+                                </style>
+                                <property 
name="paintable">resource:///transparent/portland-rose.jpg</property>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkToggleButton" id="image_floppy">
+                            <property name="group">image_rose</property>
+                            <child>
+                              <object class="GtkImage">
+                                <style>
+                                  <class name="large-icons"/>
+                                </style>
+                                <property name="paintable">resource:///images/floppybuddy.gif</property>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkToggleButton" id="image_logo">
+                            <property name="group">image_floppy</property>
+                            <child>
+                              <object class="GtkImage">
+                                <style>
+                                  <class name="large-icons"/>
+                                </style>
+                                <property name="paintable">resource:///images/org.gtk.Demo4.svg</property>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">File</property>
+                    <property name="child">
+                      <object class="GtkButton" id="source_file">
+                        <property name="valign">center</property>
+                        <property name="child">
+                          <object class="GtkLabel">
+                            <property name="label">—</property>
+                            <property name="xalign">0</property>
+                            <property name="ellipsize">start</property>
+                          </object>
+                        </property>
+                        <signal name="clicked" handler="open_file_cb"/>
+                      </object>
+                    </property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkButton" id="copy_button">
+                <property name="valign">center</property>
+                <property name="label" translatable="yes">_Copy</property>
+                <signal name="clicked" handler="copy_button_clicked" object="source_stack"/>
+                <property name="use-underline">1</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkSeparator">
+          </object>
+        </child>
+        <child>
+          <object class="GtkBox">
+            <property name="spacing">12</property>
+            <child>
+              <object class="GtkButton" id="paste_button">
+                <property name="label" translatable="yes">_Paste</property>
+                <signal name="clicked" handler="paste_button_clicked" object="dest_stack"/>
+                <property name="use-underline">1</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkLabel">
+                <property name="xalign">0</property>
+                <binding name="label">
+                  <lookup name="visible-child-name" type="GtkStack">
+                    dest_stack
+                  </lookup>
+                </binding>
+              </object>
+            </child>
+            <child>
+              <object class="GtkStack" id="dest_stack">
+                <property name="halign">end</property>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name"></property>
+                    <property name="child">
+                      <object class="GtkLabel">
+                      </object>
+                    </property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">Text</property>
+                    <property name="child">
+                      <object class="GtkLabel">
+                        <property name="halign">end</property>
+                        <property name="xalign">0</property>
+                        <property name="ellipsize">end</property>
+                      </object>
+                    </property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">Image</property>
+                    <property name="child">
+                      <object class="GtkImage">
+                        <property name="halign">end</property>
+                        <style>
+                          <class name="large-icons"/>
+                        </style>
+                      </object>
+                    </property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">Color</property>
+                    <property name="child">
+                      <object class="GtkBox">
+                        <property name="halign">end</property>
+                        <child>
+                          <object class="GtkColorSwatch">
+                            <property name="accessible-role">img</property>
+                            <property name="can-focus">0</property>
+                            <property name="selectable">0</property>
+                            <property name="has-menu">0</property>
+                          </object>
+                        </child>
+                      </object>
+                    </property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">File</property>
+                    <property name="child">
+                      <object class="GtkLabel">
+                        <property name="halign">end</property>
+                        <property name="xalign">0</property>
+                        <property name="hexpand">1</property>
+                        <property name="ellipsize">start</property>
+                      </object>
+                    </property>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index 83e798fd25..f1caed2b8d 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -15,6 +15,7 @@
     <file>demo.ui</file>
   </gresource>
   <gresource prefix="/clipboard">
+    <file>clipboard.ui</file>
     <file>demoimage.c</file>
     <file>demoimage.h</file>
   </gresource>


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