|
|
@@ -0,0 +1,118 @@
|
|
|
+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.
|