MODULE counter ; (* m2-GTK4 example - a button that updates a label. Demonstrates the widget/layout set (GtkWindow > GtkBox > label & button) and a "clicked" signal handler that mutates Modula-2 state. Build: make examples Run: ./build/examples/counter *) 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; FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text; FROM GtkButton IMPORT gtk_button_new_with_label; FROM GtkUtils IMPORT IntToStr, Connect; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Counter"; VAR label: ADDRESS; count: INTEGER; (* void clicked(GtkButton *button, gpointer user_data) *) PROCEDURE OnClicked (button: ADDRESS; data: ADDRESS); VAR text: ARRAY [0..31] OF CHAR; BEGIN INC(count); IntToStr(count, text); gtk_label_set_text(label, text) END OnClicked; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, button: ADDRESS; text: ARRAY [0..31] OF CHAR; BEGIN window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Counter"); gtk_window_set_default_size(window, 320, 180); box := gtk_box_new(GtkVertical, 12); gtk_box_set_spacing(box, 12); count := 0; IntToStr(count, text); label := gtk_label_new(text); gtk_box_append(box, label); button := gtk_button_new_with_label("Click me"); Connect(button, "clicked", ADR(OnClicked), NIL); gtk_box_append(box, button); 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; Connect(app, "activate", ADR(OnActivate), NIL); g_application_run(app, 0, NIL) END counter.