| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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.
|