clipboard.mod 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. MODULE clipboard ;
  2. (*
  3. m2-GTK4 example - clipboard copy/paste between two entries.
  4. "Copy" puts the first entry's text on the clipboard; "Paste" reads the
  5. clipboard asynchronously and puts it in the second entry.
  6. Build: make examples
  7. Run: ./build/examples/clipboard
  8. *)
  9. FROM Gio IMPORT g_application_run;
  10. FROM GtkApplication IMPORT gtk_application_new;
  11. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  12. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  13. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  14. FROM GtkEnums IMPORT GtkVertical, GtkHorizontal;
  15. FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_set_placeholder_text;
  16. FROM GtkEditable IMPORT gtk_editable_get_text, gtk_editable_set_text;
  17. FROM GtkButton IMPORT gtk_button_new_with_label;
  18. FROM GtkWidget IMPORT gtk_widget_set_margin_top,
  19. gtk_widget_set_margin_bottom, gtk_widget_set_margin_start,
  20. gtk_widget_set_margin_end;
  21. FROM Gdk IMPORT gdk_display_get_default, gdk_display_get_clipboard;
  22. FROM GdkClipboard IMPORT gdk_clipboard_set_text,
  23. gdk_clipboard_read_text_async, gdk_clipboard_read_text_finish;
  24. FROM GError IMPORT GError;
  25. FROM GtkClosures IMPORT Connect2;
  26. FROM GtkUtils IMPORT CStrToM2, Free, ClearError;
  27. FROM SYSTEM IMPORT ADDRESS, ADR;
  28. FROM libc IMPORT printf;
  29. CONST
  30. AppId = "org.example.m2gtk4.Clipboard";
  31. VAR
  32. clipboard, sourceEntry, destEntry: ADDRESS;
  33. PROCEDURE OnCopy (button: ADDRESS; user: ADDRESS);
  34. VAR
  35. text: ARRAY [0..255] OF CHAR;
  36. BEGIN
  37. CStrToM2(gtk_editable_get_text(sourceEntry), text);
  38. gdk_clipboard_set_text(clipboard, text)
  39. END OnCopy;
  40. (* void on_read(GObject *source, GAsyncResult *result, gpointer user) *)
  41. PROCEDURE OnRead (source: ADDRESS; result: ADDRESS; user: ADDRESS);
  42. VAR
  43. s: ADDRESS;
  44. err: GError;
  45. text: ARRAY [0..255] OF CHAR;
  46. BEGIN
  47. err := NIL;
  48. s := gdk_clipboard_read_text_finish(clipboard, result, err);
  49. IF s = NIL THEN
  50. ClearError(err)
  51. ELSE
  52. CStrToM2(s, text);
  53. gtk_editable_set_text(destEntry, text);
  54. Free(s)
  55. END
  56. END OnRead;
  57. PROCEDURE OnPaste (button: ADDRESS; user: ADDRESS);
  58. BEGIN
  59. gdk_clipboard_read_text_async(clipboard, NIL, ADR(OnRead), NIL)
  60. END OnPaste;
  61. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  62. VAR
  63. window, box, buttons, copyButton, pasteButton: ADDRESS;
  64. BEGIN
  65. clipboard := gdk_display_get_clipboard(gdk_display_get_default());
  66. sourceEntry := gtk_entry_new();
  67. gtk_entry_set_placeholder_text(sourceEntry, "type some text");
  68. destEntry := gtk_entry_new();
  69. gtk_entry_set_placeholder_text(destEntry, "pasted text appears here");
  70. copyButton := gtk_button_new_with_label("Copy");
  71. Connect2(copyButton, "clicked", OnCopy, NIL);
  72. pasteButton := gtk_button_new_with_label("Paste");
  73. Connect2(pasteButton, "clicked", OnPaste, NIL);
  74. buttons := gtk_box_new(GtkHorizontal, 8);
  75. gtk_box_append(buttons, copyButton);
  76. gtk_box_append(buttons, pasteButton);
  77. box := gtk_box_new(GtkVertical, 8);
  78. gtk_box_set_spacing(box, 8);
  79. gtk_widget_set_margin_top(box, 12);
  80. gtk_widget_set_margin_bottom(box, 12);
  81. gtk_widget_set_margin_start(box, 12);
  82. gtk_widget_set_margin_end(box, 12);
  83. gtk_box_append(box, sourceEntry);
  84. gtk_box_append(box, buttons);
  85. gtk_box_append(box, destEntry);
  86. window := gtk_application_window_new(application);
  87. gtk_window_set_title(window, "m2-GTK4 Clipboard");
  88. gtk_window_set_default_size(window, 360, 180);
  89. gtk_window_set_child(window, box);
  90. gtk_window_present(window)
  91. END OnActivate;
  92. VAR
  93. app: ADDRESS;
  94. BEGIN
  95. app := gtk_application_new(AppId, 0);
  96. IF app = NIL THEN
  97. printf("gtk_application_new failed\n");
  98. HALT(1)
  99. END;
  100. Connect2(app, "activate", OnActivate, NIL);
  101. g_application_run(app, 0, NIL)
  102. END clipboard.