]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/clipboard.c
Add clipboard demo.
[~andy/gtk] / demos / gtk-demo / clipboard.c
1 /* Clipboard
2  *
3  * GtkClipboard is used for clipboard handling. This demo shows how to
4  * copy and paste text to and from the clipboard.
5  */
6
7 #include <config.h>
8 #include <gtk/gtk.h>
9 #include <string.h>
10
11 static GtkWidget *window = NULL;
12
13 void
14 copy_button_clicked (GtkWidget *button,
15                      gpointer   user_data)
16 {
17   GtkWidget *entry;
18   GtkClipboard *clipboard;
19
20   entry = GTK_WIDGET (user_data);
21   
22   /* Get the clipboard object */
23   clipboard = gtk_widget_get_clipboard (entry,
24                                         GDK_SELECTION_CLIPBOARD);
25
26   /* Set clipboard text */
27   gtk_clipboard_set_text (clipboard, gtk_entry_get_text (GTK_ENTRY (entry)), -1);
28 }
29
30 void
31 paste_received (GtkClipboard *clipboard,
32                 const gchar  *text,
33                 gpointer      user_data)
34 {
35   GtkWidget *entry;
36
37   entry = GTK_WIDGET (user_data);
38   
39   /* Set the entry text */
40   gtk_entry_set_text (GTK_ENTRY (entry), text);
41 }
42
43 void
44 paste_button_clicked (GtkWidget *button,
45                      gpointer   user_data)
46 {
47   GtkWidget *entry;
48   GtkClipboard *clipboard;
49
50   entry = GTK_WIDGET (user_data);
51   
52   /* Get the clipboard object */
53   clipboard = gtk_widget_get_clipboard (entry,
54                                         GDK_SELECTION_CLIPBOARD);
55
56   /* Request the contents of the clipboard, contents_received will be
57      called when we do get the contents.
58    */
59   gtk_clipboard_request_text (clipboard,
60                               paste_received, entry);
61 }
62
63 GtkWidget *
64 do_clipboard (GtkWidget *do_widget)
65 {
66   if (!window)
67     {
68       GtkWidget *vbox, *hbox;
69       GtkWidget *label;
70       GtkWidget *entry, *button;
71       
72       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
73       vbox = gtk_vbox_new (FALSE, 0);
74       gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
75       
76       gtk_container_add (GTK_CONTAINER (window), vbox);
77
78       label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
79       
80       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
81
82       hbox = gtk_hbox_new (FALSE, 4);
83       gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
84       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
85
86       /* Create the first entry */
87       entry = gtk_entry_new ();
88       gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
89       
90       /* Create the button */
91       button = gtk_button_new_from_stock (GTK_STOCK_COPY);
92       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
93       g_signal_connect (button, "clicked",
94                         G_CALLBACK (copy_button_clicked), entry);
95
96       label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry");
97       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
98
99       hbox = gtk_hbox_new (FALSE, 4);
100       gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
101       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
102
103       /* Create the second entry */
104       entry = gtk_entry_new ();
105       gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
106       
107       /* Create the button */
108       button = gtk_button_new_from_stock (GTK_STOCK_PASTE);
109       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
110       g_signal_connect (button, "clicked",
111                         G_CALLBACK (paste_button_clicked), entry);
112       
113     }
114
115   if (!GTK_WIDGET_VISIBLE (window))
116     gtk_widget_show_all (window);
117   else
118     {
119       gtk_widget_destroy (window);
120       window = NULL;
121     }
122
123   return window;
124 }