MODULE customlayout ; (* m2-GTK4 example - a custom layout manager from Modula-2. The shim's M2LayoutManager positions the parent's children in a single column using the Modula-2 measure/allocate callbacks. Build: make examples Run: ./build/examples/customlayout *) 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 GtkLabel IMPORT gtk_label_new; FROM GtkWidget IMPORT gtk_widget_set_parent, gtk_widget_get_first_child, gtk_widget_get_next_sibling, gtk_widget_set_layout_manager; FROM M2GtkShim IMPORT m2_gtk_widget_new, m2_layout_manager_new, m2_layout_allocate_child; FROM GtkClosures IMPORT Connect2; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.CustomLayout"; RowHeight = 36; PROCEDURE Measure (widget: ADDRESS; orientation: INTEGER; for_size: INTEGER; VAR minimum, natural: INTEGER; user: ADDRESS); BEGIN minimum := 240; natural := 240 END Measure; PROCEDURE Allocate (widget: ADDRESS; width, height, baseline: INTEGER; user: ADDRESS); VAR child: ADDRESS; i: INTEGER; BEGIN i := 0; child := gtk_widget_get_first_child(widget); WHILE child # NIL DO m2_layout_allocate_child(child, 8, i * RowHeight, width - 16, RowHeight - 4); INC(i); child := gtk_widget_get_next_sibling(child) END END Allocate; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, parent, manager: ADDRESS; BEGIN parent := m2_gtk_widget_new(NIL, NIL, NIL); manager := m2_layout_manager_new(ADR(Measure), ADR(Allocate), NIL, NIL); gtk_widget_set_layout_manager(parent, manager); gtk_widget_set_parent(gtk_label_new("row one"), parent); gtk_widget_set_parent(gtk_label_new("row two"), parent); gtk_widget_set_parent(gtk_label_new("row three"), parent); gtk_widget_set_parent(gtk_label_new("row four"), parent); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Custom Layout"); gtk_window_set_default_size(window, 300, 220); gtk_window_set_child(window, parent); 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 customlayout.