/src/wrappers/gtk/examples/gtk-demo/clipboard.e

http://github.com/tybor/Liberty · Specman e · 349 lines · 21 code · 65 blank · 263 comment · 2 complexity · 9e7fc3e4523b061a180f99100e21be6d MD5 · raw file

  1. indexing
  2. description: "."
  3. copyright: "[
  4. Copyright (C) 2006 Paolo Redaelli, GTK+ team
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public License
  7. as published by the Free Software Foundation; either version 2.1 of
  8. the License, or (at your option) any later version.
  9. This library is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public
  14. License along with this library; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  16. 02110-1301 USA
  17. ]"
  18. class CLIPBOARD
  19. creation make
  20. feature
  21. -- /* Clipboard
  22. -- *
  23. -- * GtkClipboard is used for clipboard handling. This demo shows how to
  24. -- * copy and paste text to and from the clipboard.
  25. -- *
  26. -- * It also shows how to transfer images via the clipboard or via
  27. -- * drag-and-drop, and how to make clipboard contents persist after
  28. -- * the application exits. Clipboard persistence requires a clipboard
  29. -- * manager to run.
  30. -- */
  31. -- #include <gtk/gtk.h>
  32. -- #include <string.h>
  33. -- static GtkWidget *window = NULL;
  34. -- void
  35. -- copy_button_clicked (GtkWidget *button,
  36. -- gpointer user_data)
  37. -- {
  38. -- GtkWidget *entry;
  39. -- GtkClipboard *clipboard;
  40. -- entry = GTK_WIDGET (user_data);
  41. -- /* Get the clipboard object */
  42. -- clipboard = gtk_widget_get_clipboard (entry,
  43. -- GDK_SELECTION_CLIPBOARD);
  44. -- /* Set clipboard text */
  45. -- gtk_clipboard_set_text (clipboard, gtk_entry_get_text (GTK_ENTRY (entry)), -1);
  46. -- }
  47. -- void
  48. -- paste_received (GtkClipboard *clipboard,
  49. -- const gchar *text,
  50. -- gpointer user_data)
  51. -- {
  52. -- GtkWidget *entry;
  53. -- entry = GTK_WIDGET (user_data);
  54. -- /* Set the entry text */
  55. -- if(text)
  56. -- gtk_entry_set_text (GTK_ENTRY (entry), text);
  57. -- }
  58. -- void
  59. -- paste_button_clicked (GtkWidget *button,
  60. -- gpointer user_data)
  61. -- {
  62. -- GtkWidget *entry;
  63. -- GtkClipboard *clipboard;
  64. -- entry = GTK_WIDGET (user_data);
  65. -- /* Get the clipboard object */
  66. -- clipboard = gtk_widget_get_clipboard (entry,
  67. -- GDK_SELECTION_CLIPBOARD);
  68. -- /* Request the contents of the clipboard, contents_received will be
  69. -- called when we do get the contents.
  70. -- */
  71. -- gtk_clipboard_request_text (clipboard,
  72. -- paste_received, entry);
  73. -- }
  74. -- static GdkPixbuf *
  75. -- get_image_pixbuf (GtkImage *image)
  76. -- {
  77. -- gchar *stock_id;
  78. -- GtkIconSize size;
  79. -- switch (gtk_image_get_storage_type (image))
  80. -- {
  81. -- case GTK_IMAGE_PIXBUF:
  82. -- return g_object_ref (gtk_image_get_pixbuf (image));
  83. -- case GTK_IMAGE_STOCK:
  84. -- gtk_image_get_stock (image, &stock_id, &size);
  85. -- return gtk_widget_render_icon (GTK_WIDGET (image),
  86. -- stock_id, size, NULL);
  87. -- default:
  88. -- g_warning ("Image storage type %d not handled",
  89. -- gtk_image_get_storage_type (image));
  90. -- return NULL;
  91. -- }
  92. -- }
  93. -- static void
  94. -- drag_begin (GtkWidget *widget,
  95. -- GdkDragContext *context,
  96. -- gpointer data)
  97. -- {
  98. -- GdkPixbuf *pixbuf;
  99. -- pixbuf = get_image_pixbuf (GTK_IMAGE (data));
  100. -- gtk_drag_set_icon_pixbuf (context, pixbuf, -2, -2);
  101. -- g_object_unref (pixbuf);
  102. -- }
  103. -- void
  104. -- drag_data_get (GtkWidget *widget,
  105. -- GdkDragContext *context,
  106. -- GtkSelectionData *selection_data,
  107. -- guint info,
  108. -- guint time,
  109. -- gpointer data)
  110. -- {
  111. -- GdkPixbuf *pixbuf;
  112. -- pixbuf = get_image_pixbuf (GTK_IMAGE (data));
  113. -- gtk_selection_data_set_pixbuf (selection_data, pixbuf);
  114. -- g_object_unref (pixbuf);
  115. -- }
  116. -- static void
  117. -- drag_data_received (GtkWidget *widget,
  118. -- GdkDragContext *context,
  119. -- gint x,
  120. -- gint y,
  121. -- GtkSelectionData *selection_data,
  122. -- guint info,
  123. -- guint32 time,
  124. -- gpointer data)
  125. -- {
  126. -- GdkPixbuf *pixbuf;
  127. -- if (selection_data->length > 0)
  128. -- {
  129. -- pixbuf = gtk_selection_data_get_pixbuf (selection_data);
  130. -- gtk_image_set_from_pixbuf (GTK_IMAGE (data), pixbuf);
  131. -- g_object_unref (pixbuf);
  132. -- }
  133. -- }
  134. -- static void
  135. -- copy_image (GtkMenuItem *item,
  136. -- gpointer data)
  137. -- {
  138. -- GtkClipboard *clipboard;
  139. -- GdkPixbuf *pixbuf;
  140. -- clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
  141. -- pixbuf = get_image_pixbuf (GTK_IMAGE (data));
  142. -- gtk_clipboard_set_image (clipboard, pixbuf);
  143. -- g_object_unref (pixbuf);
  144. -- }
  145. -- static void
  146. -- paste_image (GtkMenuItem *item,
  147. -- gpointer data)
  148. -- {
  149. -- GtkClipboard *clipboard;
  150. -- GdkPixbuf *pixbuf;
  151. -- clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
  152. -- pixbuf = gtk_clipboard_wait_for_image (clipboard);
  153. -- if (pixbuf)
  154. -- {
  155. -- gtk_image_set_from_pixbuf (GTK_IMAGE (data), pixbuf);
  156. -- g_object_unref (pixbuf);
  157. -- }
  158. -- }
  159. -- static gboolean
  160. -- button_press (GtkWidget *widget,
  161. -- GdkEventButton *button,
  162. -- gpointer data)
  163. -- {
  164. -- GtkWidget *menu;
  165. -- GtkWidget *item;
  166. -- if (button->button != 3)
  167. -- return FALSE;
  168. -- menu = gtk_menu_new ();
  169. -- item = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, NULL);
  170. -- g_signal_connect (item, "activate", G_CALLBACK (copy_image), data);
  171. -- gtk_widget_show (item);
  172. -- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
  173. -- item = gtk_image_menu_item_new_from_stock (GTK_STOCK_PASTE, NULL);
  174. -- g_signal_connect (item, "activate", G_CALLBACK (paste_image), data);
  175. -- gtk_widget_show (item);
  176. -- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
  177. -- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, button->time);
  178. -- return TRUE;
  179. -- }
  180. -- GtkWidget *
  181. -- do_clipboard (GtkWidget *do_widget)
  182. -- {
  183. -- if (!window)
  184. -- {
  185. -- GtkWidget *vbox, *hbox;
  186. -- GtkWidget *label;
  187. -- GtkWidget *entry, *button;
  188. -- GtkWidget *ebox, *image;
  189. -- GtkClipboard *clipboard;
  190. -- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  191. -- g_signal_connect (window, "destroy",
  192. -- G_CALLBACK (gtk_widget_destroyed), &window);
  193. -- vbox = gtk_vbox_new (FALSE, 0);
  194. -- gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
  195. -- gtk_container_add (GTK_CONTAINER (window), vbox);
  196. -- label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
  197. -- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
  198. -- hbox = gtk_hbox_new (FALSE, 4);
  199. -- gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
  200. -- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  201. -- /* Create the first entry */
  202. -- entry = gtk_entry_new ();
  203. -- gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
  204. -- /* Create the button */
  205. -- button = gtk_button_new_from_stock (GTK_STOCK_COPY);
  206. -- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
  207. -- g_signal_connect (button, "clicked",
  208. -- G_CALLBACK (copy_button_clicked), entry);
  209. -- label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry");
  210. -- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
  211. -- hbox = gtk_hbox_new (FALSE, 4);
  212. -- gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
  213. -- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  214. -- /* Create the second entry */
  215. -- entry = gtk_entry_new ();
  216. -- gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
  217. -- /* Create the button */
  218. -- button = gtk_button_new_from_stock (GTK_STOCK_PASTE);
  219. -- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
  220. -- g_signal_connect (button, "clicked",
  221. -- G_CALLBACK (paste_button_clicked), entry);
  222. -- label = gtk_label_new ("Images can be transferred via the clipboard, too");
  223. -- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
  224. -- hbox = gtk_hbox_new (FALSE, 4);
  225. -- gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
  226. -- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  227. -- /* Create the first image */
  228. -- image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
  229. -- GTK_ICON_SIZE_BUTTON);
  230. -- ebox = gtk_event_box_new ();
  231. -- gtk_container_add (GTK_CONTAINER (ebox), image);
  232. -- gtk_container_add (GTK_CONTAINER (hbox), ebox);
  233. -- /* make ebox a drag source */
  234. -- gtk_drag_source_set (ebox, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
  235. -- gtk_drag_source_add_image_targets (ebox);
  236. -- g_signal_connect (ebox, "drag_begin",
  237. -- G_CALLBACK (drag_begin), image);
  238. -- g_signal_connect (ebox, "drag_data_get",
  239. -- G_CALLBACK (drag_data_get), image);
  240. -- /* accept drops on ebox */
  241. -- gtk_drag_dest_set (ebox, GTK_DEST_DEFAULT_ALL,
  242. -- NULL, 0, GDK_ACTION_COPY);
  243. -- gtk_drag_dest_add_image_targets (ebox);
  244. -- g_signal_connect (ebox, "drag_data_received",
  245. -- G_CALLBACK (drag_data_received), image);
  246. -- /* context menu on ebox */
  247. -- g_signal_connect (ebox, "button_press_event",
  248. -- G_CALLBACK (button_press), image);
  249. -- /* Create the second image */
  250. -- image = gtk_image_new_from_stock (GTK_STOCK_STOP,
  251. -- GTK_ICON_SIZE_BUTTON);
  252. -- ebox = gtk_event_box_new ();
  253. -- gtk_container_add (GTK_CONTAINER (ebox), image);
  254. -- gtk_container_add (GTK_CONTAINER (hbox), ebox);
  255. -- /* make ebox a drag source */
  256. -- gtk_drag_source_set (ebox, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
  257. -- gtk_drag_source_add_image_targets (ebox);
  258. -- g_signal_connect (ebox, "drag_begin",
  259. -- G_CALLBACK (drag_begin), image);
  260. -- g_signal_connect (ebox, "drag_data_get",
  261. -- G_CALLBACK (drag_data_get), image);
  262. -- /* accept drops on ebox */
  263. -- gtk_drag_dest_set (ebox, GTK_DEST_DEFAULT_ALL,
  264. -- NULL, 0, GDK_ACTION_COPY);
  265. -- gtk_drag_dest_add_image_targets (ebox);
  266. -- g_signal_connect (ebox, "drag_data_received",
  267. -- G_CALLBACK (drag_data_received), image);
  268. -- /* context menu on ebox */
  269. -- g_signal_connect (ebox, "button_press_event",
  270. -- G_CALLBACK (button_press), image);
  271. -- /* tell the clipboard manager to make the data persistent */
  272. -- clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
  273. -- gtk_clipboard_set_can_store (clipboard, NULL, 0);
  274. -- }
  275. -- if (!GTK_WIDGET_VISIBLE (window))
  276. -- gtk_widget_show_all (window);
  277. -- else
  278. -- {
  279. -- gtk_widget_destroy (window);
  280. -- window = NULL;
  281. -- }
  282. -- return window;
  283. -- }
  284. end