mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 21:51:08 +00:00
gtk-demo: Rewrite the clipboard demo
This is more in line with the current clipboard api, and shows handling colors and files.
This commit is contained in:
parent
e72df9cd5f
commit
ebb58b7cbc
@ -1,12 +1,7 @@
|
|||||||
/* Clipboard
|
/* Clipboard
|
||||||
*
|
*
|
||||||
* GdkClipboard 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.
|
* copy and paste text, images, colors or files 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.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
@ -14,22 +9,52 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "demoimage.h"
|
#include "demoimage.h"
|
||||||
|
|
||||||
static GtkWidget *window = NULL;
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copy_button_clicked (GtkWidget *button,
|
copy_button_clicked (GtkStack *source_stack,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GtkWidget *entry;
|
|
||||||
GdkClipboard *clipboard;
|
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 */
|
visible_child = gtk_stack_get_visible_child (source_stack);
|
||||||
clipboard = gtk_widget_get_clipboard (entry);
|
visible_child_name = gtk_stack_get_visible_child_name (source_stack);
|
||||||
|
|
||||||
/* Set clipboard text */
|
if (strcmp (visible_child_name, "Text") == 0)
|
||||||
gdk_clipboard_set_text (clipboard, gtk_editable_get_text (GTK_EDITABLE (entry)));
|
{
|
||||||
|
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
|
static void
|
||||||
@ -37,149 +62,240 @@ paste_received (GObject *source_object,
|
|||||||
GAsyncResult *result,
|
GAsyncResult *result,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
|
GtkStack *dest_stack = user_data;
|
||||||
GdkClipboard *clipboard;
|
GdkClipboard *clipboard;
|
||||||
GtkWidget *entry;
|
const GValue *value;
|
||||||
char *text;
|
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
GtkWidget *child;
|
||||||
|
|
||||||
clipboard = GDK_CLIPBOARD (source_object);
|
clipboard = GDK_CLIPBOARD (source_object);
|
||||||
entry = GTK_WIDGET (user_data);
|
|
||||||
|
|
||||||
/* Get the resulting text of the read operation */
|
value = gdk_clipboard_read_value_finish (clipboard, result, &error);
|
||||||
text = gdk_clipboard_read_text_finish (clipboard, result, &error);
|
if (value)
|
||||||
|
|
||||||
if (text)
|
|
||||||
{
|
{
|
||||||
/* Set the entry text */
|
if (G_VALUE_HOLDS (value, G_TYPE_FILE))
|
||||||
gtk_editable_set_text (GTK_EDITABLE (entry), text);
|
{
|
||||||
g_free (text);
|
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
|
else
|
||||||
{
|
{
|
||||||
GtkWidget *dialog;
|
g_print ("%s\n", error->message);
|
||||||
|
|
||||||
/* 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_error_free (error);
|
g_error_free (error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
paste_button_clicked (GtkWidget *button,
|
paste_button_clicked (GtkStack *dest_stack,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GtkWidget *entry;
|
|
||||||
GdkClipboard *clipboard;
|
GdkClipboard *clipboard;
|
||||||
|
GdkContentFormats *formats;
|
||||||
|
|
||||||
entry = GTK_WIDGET (user_data);
|
clipboard = gtk_widget_get_clipboard (GTK_WIDGET (dest_stack));
|
||||||
|
formats = gdk_clipboard_get_formats (clipboard);
|
||||||
|
|
||||||
/* Get the clipboard object */
|
if (gdk_content_formats_contain_gtype (formats, G_TYPE_FILE))
|
||||||
clipboard = gtk_widget_get_clipboard (entry);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/* Request the contents of the clipboard, contents_received will be
|
static void
|
||||||
called when we do get the contents.
|
update_copy_button_sensitivity (GtkWidget *source_stack)
|
||||||
*/
|
{
|
||||||
gdk_clipboard_read_text_async (clipboard, NULL, paste_received, entry);
|
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"));
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_widget_set_sensitive (GTK_WIDGET (copy_button), sensitive);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 *
|
GtkWidget *
|
||||||
do_clipboard (GtkWidget *do_widget)
|
do_clipboard (GtkWidget *do_widget)
|
||||||
{
|
{
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
GtkWidget *vbox, *hbox;
|
GtkBuilderScope *scope;
|
||||||
GtkWidget *label;
|
GtkBuilder *builder;
|
||||||
GtkWidget *entry, *button;
|
GObject *copy_button;
|
||||||
GtkWidget *image;
|
GObject *source_stack;
|
||||||
|
GtkWidget *paste_button;
|
||||||
|
|
||||||
window = gtk_window_new ();
|
scope = gtk_builder_cscope_new ();
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_builder_cscope_add_callback_symbols (GTK_BUILDER_CSCOPE (scope),
|
||||||
gtk_widget_get_display (do_widget));
|
"copy_button_clicked", G_CALLBACK (copy_button_clicked),
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Clipboard");
|
"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);
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
copy_button = gtk_builder_get_object (builder, "copy_button");
|
||||||
gtk_widget_set_margin_start (vbox, 8);
|
source_stack = gtk_builder_get_object (builder, "source_stack");
|
||||||
gtk_widget_set_margin_end (vbox, 8);
|
g_object_set_data (source_stack, "copy-button", copy_button);
|
||||||
gtk_widget_set_margin_top (vbox, 8);
|
|
||||||
gtk_widget_set_margin_bottom (vbox, 8);
|
|
||||||
|
|
||||||
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
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);
|
||||||
|
|
||||||
label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
|
g_object_unref (builder);
|
||||||
|
g_object_unref (scope);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
|
255
demos/gtk-demo/clipboard.ui
Normal file
255
demos/gtk-demo/clipboard.ui
Normal file
@ -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>
|
@ -15,6 +15,7 @@
|
|||||||
<file>demo.ui</file>
|
<file>demo.ui</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
<gresource prefix="/clipboard">
|
<gresource prefix="/clipboard">
|
||||||
|
<file>clipboard.ui</file>
|
||||||
<file>demoimage.c</file>
|
<file>demoimage.c</file>
|
||||||
<file>demoimage.h</file>
|
<file>demoimage.h</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
|
Loading…
Reference in New Issue
Block a user