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 g_signal_connect (window, "destroy",
207 G_CALLBACK (gtk_widget_destroyed), &window);
209 vbox = gtk_vbox_new (FALSE, 0);
210 gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
212 gtk_container_add (GTK_CONTAINER (window), vbox);
214 label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
216 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
218 hbox = gtk_hbox_new (FALSE, 4);
219 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
220 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
222 /* Create the first entry */
223 entry = gtk_entry_new ();
224 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
226 /* Create the button */
227 button = gtk_button_new_from_stock (GTK_STOCK_COPY);
228 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
229 g_signal_connect (button, "clicked",
230 G_CALLBACK (copy_button_clicked), entry);
232 label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry");
233 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
235 hbox = gtk_hbox_new (FALSE, 4);
236 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
237 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
239 /* Create the second entry */
240 entry = gtk_entry_new ();
241 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
243 /* Create the button */
244 button = gtk_button_new_from_stock (GTK_STOCK_PASTE);
245 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
246 g_signal_connect (button, "clicked",
247 G_CALLBACK (paste_button_clicked), entry);
249 label = gtk_label_new ("Images can be transferred via the clipboard, too");
250 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
252 hbox = gtk_hbox_new (FALSE, 4);
253 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
254 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
256 /* Create the first image */
257 image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
258 GTK_ICON_SIZE_BUTTON);
259 ebox = gtk_event_box_new ();
260 gtk_container_add (GTK_CONTAINER (ebox), image);
261 gtk_container_add (GTK_CONTAINER (hbox), ebox);
263 /* make ebox a drag source */
264 gtk_drag_source_set (ebox, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
265 gtk_drag_source_add_image_targets (ebox);
266 g_signal_connect (ebox, "drag-begin",
267 G_CALLBACK (drag_begin), image);
268 g_signal_connect (ebox, "drag-data-get",
269 G_CALLBACK (drag_data_get), image);
271 /* accept drops on ebox */
272 gtk_drag_dest_set (ebox, GTK_DEST_DEFAULT_ALL,
273 NULL, 0, GDK_ACTION_COPY);
274 gtk_drag_dest_add_image_targets (ebox);
275 g_signal_connect (ebox, "drag-data-received",
276 G_CALLBACK (drag_data_received), image);
278 /* context menu on ebox */
279 g_signal_connect (ebox, "button-press-event",
280 G_CALLBACK (button_press), image);
282 /* Create the second image */
283 image = gtk_image_new_from_stock (GTK_STOCK_STOP,
284 GTK_ICON_SIZE_BUTTON);
285 ebox = gtk_event_box_new ();
286 gtk_container_add (GTK_CONTAINER (ebox), image);
287 gtk_container_add (GTK_CONTAINER (hbox), ebox);
289 /* make ebox a drag source */
290 gtk_drag_source_set (ebox, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
291 gtk_drag_source_add_image_targets (ebox);
292 g_signal_connect (ebox, "drag-begin",
293 G_CALLBACK (drag_begin), image);
294 g_signal_connect (ebox, "drag-data-get",
295 G_CALLBACK (drag_data_get), image);
297 /* accept drops on ebox */
298 gtk_drag_dest_set (ebox, GTK_DEST_DEFAULT_ALL,
299 NULL, 0, GDK_ACTION_COPY);
300 gtk_drag_dest_add_image_targets (ebox);
301 g_signal_connect (ebox, "drag-data-received",
302 G_CALLBACK (drag_data_received), image);
304 /* context menu on ebox */
305 g_signal_connect (ebox, "button-press-event",
306 G_CALLBACK (button_press), image);
308 /* tell the clipboard manager to make the data persistent */
309 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
310 gtk_clipboard_set_can_store (clipboard, NULL, 0);
313 if (!GTK_WIDGET_VISIBLE (window))
314 gtk_widget_show_all (window);
317 gtk_widget_destroy (window);