MODULE clipboard ; (* m2-GTK4 example - clipboard copy/paste between two entries. "Copy" puts the first entry's text on the clipboard; "Paste" reads the clipboard asynchronously and puts it in the second entry. Build: make examples Run: ./build/examples/clipboard *) FROM Gio IMPORT g_application_run; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title, gtk_window_set_default_size, gtk_window_set_child, gtk_window_present; FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing; FROM GtkEnums IMPORT GtkVertical, GtkHorizontal; FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_set_placeholder_text; FROM GtkEditable IMPORT gtk_editable_get_text, gtk_editable_set_text; FROM GtkButton IMPORT gtk_button_new_with_label; FROM GtkWidget IMPORT gtk_widget_set_margin_top, gtk_widget_set_margin_bottom, gtk_widget_set_margin_start, gtk_widget_set_margin_end; FROM Gdk IMPORT gdk_display_get_default, gdk_display_get_clipboard; FROM GdkClipboard IMPORT gdk_clipboard_set_text, gdk_clipboard_read_text_async, gdk_clipboard_read_text_finish; FROM GError IMPORT GError; FROM GtkClosures IMPORT Connect2; FROM GtkUtils IMPORT CStrToM2, Free, ClearError; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Clipboard"; VAR clipboard, sourceEntry, destEntry: ADDRESS; PROCEDURE OnCopy (button: ADDRESS; user: ADDRESS); VAR text: ARRAY [0..255] OF CHAR; BEGIN CStrToM2(gtk_editable_get_text(sourceEntry), text); gdk_clipboard_set_text(clipboard, text) END OnCopy; (* void on_read(GObject *source, GAsyncResult *result, gpointer user) *) PROCEDURE OnRead (source: ADDRESS; result: ADDRESS; user: ADDRESS); VAR s: ADDRESS; err: GError; text: ARRAY [0..255] OF CHAR; BEGIN err := NIL; s := gdk_clipboard_read_text_finish(clipboard, result, err); IF s = NIL THEN ClearError(err) ELSE CStrToM2(s, text); gtk_editable_set_text(destEntry, text); Free(s) END END OnRead; PROCEDURE OnPaste (button: ADDRESS; user: ADDRESS); BEGIN gdk_clipboard_read_text_async(clipboard, NIL, ADR(OnRead), NIL) END OnPaste; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, buttons, copyButton, pasteButton: ADDRESS; BEGIN clipboard := gdk_display_get_clipboard(gdk_display_get_default()); sourceEntry := gtk_entry_new(); gtk_entry_set_placeholder_text(sourceEntry, "type some text"); destEntry := gtk_entry_new(); gtk_entry_set_placeholder_text(destEntry, "pasted text appears here"); copyButton := gtk_button_new_with_label("Copy"); Connect2(copyButton, "clicked", OnCopy, NIL); pasteButton := gtk_button_new_with_label("Paste"); Connect2(pasteButton, "clicked", OnPaste, NIL); buttons := gtk_box_new(GtkHorizontal, 8); gtk_box_append(buttons, copyButton); gtk_box_append(buttons, pasteButton); box := gtk_box_new(GtkVertical, 8); gtk_box_set_spacing(box, 8); gtk_widget_set_margin_top(box, 12); gtk_widget_set_margin_bottom(box, 12); gtk_widget_set_margin_start(box, 12); gtk_widget_set_margin_end(box, 12); gtk_box_append(box, sourceEntry); gtk_box_append(box, buttons); gtk_box_append(box, destEntry); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Clipboard"); gtk_window_set_default_size(window, 360, 180); gtk_window_set_child(window, box); gtk_window_present(window) END OnActivate; VAR app: ADDRESS; BEGIN app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("gtk_application_new failed\n"); HALT(1) END; Connect2(app, "activate", OnActivate, NIL); g_application_run(app, 0, NIL) END clipboard.