3 * GtkClipboard is used for clipboard handling. This demo shows how to
4 * copy and paste text to and from the clipboard.
6 * It also shows how to transfer images via the clipboard or via
7 * drag-and-drop, and how to make clipboard contents persist after
8 * the application exits. Clipboard persistence requires a clipboard
15 static GtkWidget *window = NULL;
18 copy_button_clicked (GtkWidget *button,
22 GtkClipboard *clipboard;
24 entry = GTK_WIDGET (user_data);
26 /* Get the clipboard object */
27 clipboard = gtk_widget_get_clipboard (entry,
28 GDK_SELECTION_CLIPBOARD);
30 /* Set clipboard text */
31 gtk_clipboard_set_text (clipboard, gtk_entry_get_text (GTK_ENTRY (entry)), -1);
35 paste_received (GtkClipboard *clipboard,
41 entry = GTK_WIDGET (user_data);
43 /* Set the entry text */
45 gtk_entry_set_text (GTK_ENTRY (entry), text);
49 paste_button_clicked (GtkWidget *button,
53 GtkClipboard *clipboard;
55 entry = GTK_WIDGET (user_data);
57 /* Get the clipboard object */
58 clipboard = gtk_widget_get_clipboard (entry,
59 GDK_SELECTION_CLIPBOARD);
61 /* Request the contents of the clipboard, contents_received will be
62 called when we do get the contents.
64 gtk_clipboard_request_text (clipboard,
65 paste_received, entry);
69 get_image_pixbuf (GtkImage *image)
74 switch (gtk_image_get_storage_type (image))
76 case GTK_IMAGE_PIXBUF:
77 return g_object_ref (gtk_image_get_pixbuf (image));
79 gtk_image_get_stock (image, &stock_id, &size);
80 return gtk_widget_render_icon (GTK_WIDGET (image),
81 stock_id, size, NULL);
83 g_warning ("Image storage type %d not handled",
84 gtk_image_get_storage_type (image));
90 drag_begin (GtkWidget *widget,
91 GdkDragContext *context,
96 pixbuf = get_image_pixbuf (GTK_IMAGE (data));
97 gtk_drag_set_icon_pixbuf (context, pixbuf, -2, -2);
98 g_object_unref (pixbuf);
102 drag_data_get (GtkWidget *widget,
103 GdkDragContext *context,
104 GtkSelectionData *selection_data,
111 pixbuf = get_image_pixbuf (GTK_IMAGE (data));
112 gtk_selection_data_set_pixbuf (selection_data, pixbuf);
113 g_object_unref (pixbuf);
117 drag_data_received (GtkWidget *widget,
118 GdkDragContext *context,
121 GtkSelectionData *selection_data,
128 if (selection_data->length > 0)
130 pixbuf = gtk_selection_data_get_pixbuf (selection_data);
131 gtk_image_set_from_pixbuf (GTK_IMAGE (data), pixbuf);
132 g_object_unref (pixbuf);
137 copy_image (GtkMenuItem *item,
140 GtkClipboard *clipboard;
143 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
144 pixbuf = get_image_pixbuf (GTK_IMAGE (data));
146 gtk_clipboard_set_image (clipboard, pixbuf);
147 g_object_unref (pixbuf);
151 paste_image (GtkMenuItem *item,
154 GtkClipboard *clipboard;
157 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
158 pixbuf = gtk_clipboard_wait_for_image (clipboard);
162 gtk_image_set_from_pixbuf (GTK_IMAGE (data), pixbuf);
163 g_object_unref (pixbuf);
168 button_press (GtkWidget *widget,
169 GdkEventButton *button,
175 if (button->button != 3)
178 menu = gtk_menu_new ();
180 item = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, NULL);
181 g_signal_connect (item, "activate", G_CALLBACK (copy_image), data);
182 gtk_widget_show (item);
183 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
185 item = gtk_image_menu_item_new_from_stock (GTK_STOCK_PASTE, NULL);
186 g_signal_connect (item, "activate", G_CALLBACK (paste_image), data);
187 gtk_widget_show (item);
188 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
190 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, button->time);
195 do_clipboard (GtkWidget *do_widget)
199 GtkWidget *vbox, *hbox;
201 GtkWidget *entry, *button;
202 GtkWidget *ebox, *image;
203 GtkClipboard *clipboard;
205 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
206 gtk_window_set_screen (GTK_WINDOW (window),
207 gtk_widget_get_screen (do_widget));
208 gtk_window_set_title (GTK_WINDOW (window), "Clipboard demo");
210 g_signal_connect (window, "destroy",
211 G_CALLBACK (gtk_widget_destroyed), &window);
213 vbox = gtk_vbox_new (FALSE, 0);
214 gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
216 gtk_container_add (GTK_CONTAINER (window), vbox);
218 label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
220 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
222 hbox = gtk_hbox_new (FALSE, 4);
223 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
224 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
226 /* Create the first entry */
227 entry = gtk_entry_new ();
228 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
230 /* Create the button */
231 button = gtk_button_new_from_stock (GTK_STOCK_COPY);
232 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
233 g_signal_connect (button, "clicked",
234 G_CALLBACK (copy_button_clicked), entry);
236 label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry");
237 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
239 hbox = gtk_hbox_new (FALSE, 4);
240 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
241 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
243 /* Create the second entry */
244 entry = gtk_entry_new ();
245 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
247 /* Create the button */
248 button = gtk_button_new_from_stock (GTK_STOCK_PASTE);
249 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
250 g_signal_connect (button, "clicked",
251 G_CALLBACK (paste_button_clicked), entry);
253 label = gtk_label_new ("Images can be transferred via the clipboard, too");
254 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
256 hbox = gtk_hbox_new (FALSE, 4);
257 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
258 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
260 /* Create the first image */
261 image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
262 GTK_ICON_SIZE_BUTTON);
263 ebox = gtk_event_box_new ();
264 gtk_container_add (GTK_CONTAINER (ebox), image);
265 gtk_container_add (GTK_CONTAINER (hbox), ebox);
267 /* make ebox a drag source */
268 gtk_drag_source_set (ebox, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
269 gtk_drag_source_add_image_targets (ebox);
270 g_signal_connect (ebox, "drag-begin",
271 G_CALLBACK (drag_begin), image);
272 g_signal_connect (ebox, "drag-data-get",
273 G_CALLBACK (drag_data_get), image);
275 /* accept drops on ebox */
276 gtk_drag_dest_set (ebox, GTK_DEST_DEFAULT_ALL,
277 NULL, 0, GDK_ACTION_COPY);
278 gtk_drag_dest_add_image_targets (ebox);
279 g_signal_connect (ebox, "drag-data-received",
280 G_CALLBACK (drag_data_received), image);
282 /* context menu on ebox */
283 g_signal_connect (ebox, "button-press-event",
284 G_CALLBACK (button_press), image);
286 /* Create the second image */
287 image = gtk_image_new_from_stock (GTK_STOCK_STOP,
288 GTK_ICON_SIZE_BUTTON);
289 ebox = gtk_event_box_new ();
290 gtk_container_add (GTK_CONTAINER (ebox), image);
291 gtk_container_add (GTK_CONTAINER (hbox), ebox);
293 /* make ebox a drag source */
294 gtk_drag_source_set (ebox, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
295 gtk_drag_source_add_image_targets (ebox);
296 g_signal_connect (ebox, "drag-begin",
297 G_CALLBACK (drag_begin), image);
298 g_signal_connect (ebox, "drag-data-get",
299 G_CALLBACK (drag_data_get), image);
301 /* accept drops on ebox */
302 gtk_drag_dest_set (ebox, GTK_DEST_DEFAULT_ALL,
303 NULL, 0, GDK_ACTION_COPY);
304 gtk_drag_dest_add_image_targets (ebox);
305 g_signal_connect (ebox, "drag-data-received",
306 G_CALLBACK (drag_data_received), image);
308 /* context menu on ebox */
309 g_signal_connect (ebox, "button-press-event",
310 G_CALLBACK (button_press), image);
312 /* tell the clipboard manager to make the data persistent */
313 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
314 gtk_clipboard_set_can_store (clipboard, NULL, 0);
317 if (!GTK_WIDGET_VISIBLE (window))
318 gtk_widget_show_all (window);
321 gtk_widget_destroy (window);