MODULE inputs ; (* m2-GTK4 example - a small form built from the input widgets. GtkEntry + GtkCheckButton + GtkSwitch + GtkScale, with signal handlers that rebuild a status label on every change. Demonstrates Connect(), CStrToM2(), StrAppend() and IntToStr() together. Build: make examples Run: ./build/examples/inputs *) 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 GtkWidget IMPORT gtk_widget_set_margin_top, gtk_widget_set_margin_bottom, gtk_widget_set_margin_start, gtk_widget_set_margin_end; FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text; FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_set_placeholder_text; FROM GtkEditable IMPORT gtk_editable_get_text; FROM GtkCheckButton IMPORT gtk_check_button_new_with_label, gtk_check_button_get_active; FROM GtkSwitch IMPORT gtk_switch_new, gtk_switch_get_active; FROM GtkScale IMPORT gtk_scale_new_with_range, gtk_scale_set_digits; FROM GtkRange IMPORT gtk_range_get_value; FROM GtkUtils IMPORT Connect, CStrToM2, StrAppend, IntToStr; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Inputs"; VAR entry, check, sw, scale, status: ADDRESS; PROCEDURE UpdateStatus; VAR name: ARRAY [0..63] OF CHAR; value: ARRAY [0..31] OF CHAR; line: ARRAY [0..191] OF CHAR; BEGIN line[0] := 0C; StrAppend(line, "name: "); CStrToM2(gtk_editable_get_text(entry), name); IF name[0] = 0C THEN StrAppend(line, "(empty)") ELSE StrAppend(line, name) END; StrAppend(line, " feature: "); IF gtk_check_button_get_active(check) # 0 THEN StrAppend(line, "on") ELSE StrAppend(line, "off") END; StrAppend(line, " switch: "); IF gtk_switch_get_active(sw) # 0 THEN StrAppend(line, "on") ELSE StrAppend(line, "off") END; StrAppend(line, " value: "); IntToStr(TRUNC(gtk_range_get_value(scale)), value); StrAppend(line, value); gtk_label_set_text(status, line) END UpdateStatus; PROCEDURE OnEntryChanged (editable: ADDRESS; data: ADDRESS); BEGIN UpdateStatus END OnEntryChanged; PROCEDURE OnToggled (button: ADDRESS; data: ADDRESS); BEGIN UpdateStatus END OnToggled; (* void notify(GObject *obj, GParamSpec *pspec, gpointer data) *) PROCEDURE OnSwitchNotify (obj: ADDRESS; pspec: ADDRESS; data: ADDRESS); BEGIN UpdateStatus END OnSwitchNotify; PROCEDURE OnScaleChanged (range: ADDRESS; data: ADDRESS); BEGIN UpdateStatus END OnScaleChanged; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box: ADDRESS; BEGIN box := gtk_box_new(GtkVertical, 10); gtk_box_set_spacing(box, 10); gtk_widget_set_margin_top(box, 14); gtk_widget_set_margin_bottom(box, 14); gtk_widget_set_margin_start(box, 14); gtk_widget_set_margin_end(box, 14); entry := gtk_entry_new(); gtk_entry_set_placeholder_text(entry, "type your name"); Connect(entry, "changed", ADR(OnEntryChanged), NIL); gtk_box_append(box, entry); check := gtk_check_button_new_with_label("Enable feature"); Connect(check, "toggled", ADR(OnToggled), NIL); gtk_box_append(box, check); sw := gtk_switch_new(); Connect(sw, "notify::active", ADR(OnSwitchNotify), NIL); gtk_box_append(box, sw); scale := gtk_scale_new_with_range(GtkHorizontal, 0.0, 100.0, 1.0); gtk_scale_set_digits(scale, 0); Connect(scale, "value-changed", ADR(OnScaleChanged), NIL); gtk_box_append(box, scale); status := gtk_label_new(" "); gtk_box_append(box, status); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Inputs"); gtk_window_set_default_size(window, 460, 240); gtk_window_set_child(window, box); gtk_window_present(window); UpdateStatus 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; Connect(app, "activate", ADR(OnActivate), NIL); g_application_run(app, 0, NIL) END inputs.