MODULE test_widgets ; (* m2-GTK4 test - widget graph + signal + state round-trip. Builds label/button inside a box, wires "clicked" to a handler that updates the label, then emits "clicked" three times with g_signal_emit_by_name() and reads the label text back through CStrToM2(). This exercises GtkBox, GtkLabel, GtkButton, the signal helper and the C-string helper together. Requires a display. *) FROM Gio IMPORT g_application_run, g_application_quit; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child; FROM GtkBox IMPORT gtk_box_new, gtk_box_append; FROM GtkEnums IMPORT GtkVertical; FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text, gtk_label_get_text; FROM GtkButton IMPORT gtk_button_new_with_label; FROM GObject IMPORT g_signal_emit_by_name; FROM GtkUtils IMPORT IntToStr, Connect, CStrToM2; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestWidgets"; VAR app, label, button: ADDRESS; clicks: INTEGER; passed: BOOLEAN; (* void clicked(GtkButton *button, gpointer user_data) *) PROCEDURE OnClicked (b: ADDRESS; data: ADDRESS); VAR text: ARRAY [0..31] OF CHAR; BEGIN INC(clicks); IntToStr(clicks, text); gtk_label_set_text(label, text) END OnClicked; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box: ADDRESS; got: ARRAY [0..31] OF CHAR; i: INTEGER; BEGIN clicks := 0; passed := TRUE; label := gtk_label_new("0"); button := gtk_button_new_with_label("+1"); Connect(button, "clicked", ADR(OnClicked), NIL); box := gtk_box_new(GtkVertical, 6); gtk_box_append(box, label); gtk_box_append(box, button); window := gtk_application_window_new(application); gtk_window_set_child(window, box); FOR i := 1 TO 3 DO g_signal_emit_by_name(button, "clicked") END; CStrToM2(gtk_label_get_text(label), got); IF (clicks # 3) OR (got[0] # '3') OR (got[1] # 0C) THEN printf("clicks=%d label=[%s]\n", clicks, got); passed := FALSE END; g_application_quit(application) END OnActivate; VAR rc: INTEGER; BEGIN app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("test_widgets: FAIL (no app)\n"); HALT(1) END; Connect(app, "activate", ADR(OnActivate), NIL); rc := g_application_run(app, 0, NIL); IF passed THEN printf("test_widgets: PASS\n"); HALT(0) ELSE printf("test_widgets: FAIL\n"); HALT(1) END END test_widgets.