MODULE layouts ; (* m2-GTK4 example - the second container batch. A GtkPaned splits the window: start - a GtkFrame containing a GtkExpander end - a GtkOverlay whose main child is a GtkListBox, with a corner label on top Activating a list row updates the status label underneath. Build: make examples Run: ./build/examples/layouts *) FROM Gio IMPORT g_application_run; FROM GtkApplication IMPORT gtk_application_new; FROM GtkApplicationWindow IMPORT gtk_application_window_new; FROM GtkWindow IMPORT 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; FROM GtkEnums IMPORT GtkVertical, GtkHorizontal, GtkAlignEnd, GtkAlignStart, GtkSelectionSingle; FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text; FROM GtkWidget IMPORT gtk_widget_set_vexpand, gtk_widget_set_halign, gtk_widget_set_valign, gtk_widget_set_margin_top, gtk_widget_set_margin_end; FROM GtkFrame IMPORT gtk_frame_new, gtk_frame_set_child; FROM GtkExpander IMPORT gtk_expander_new, gtk_expander_set_child, gtk_expander_set_expanded; FROM GtkPaned IMPORT gtk_paned_new, gtk_paned_set_start_child, gtk_paned_set_end_child, gtk_paned_set_position; FROM GtkOverlay IMPORT gtk_overlay_new, gtk_overlay_set_child, gtk_overlay_add_overlay; FROM GtkListBox IMPORT gtk_list_box_new, gtk_list_box_append, gtk_list_box_row_new, gtk_list_box_row_set_child, gtk_list_box_row_get_index, gtk_list_box_set_selection_mode; FROM GtkClosures IMPORT Connect2, Connect3; FROM GtkUtils IMPORT IntToStr, StrAppend; FROM SYSTEM IMPORT ADDRESS; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Layouts"; VAR status: ADDRESS; (* 3-argument: "row-activated" carries the GtkListBoxRow *) PROCEDURE OnRowActivated (listbox: ADDRESS; row: ADDRESS; user: ADDRESS); VAR buf: ARRAY [0..15] OF CHAR; line: ARRAY [0..63] OF CHAR; BEGIN line[0] := 0C; StrAppend(line, "activated row "); IntToStr(gtk_list_box_row_get_index(row), buf); StrAppend(line, buf); gtk_label_set_text(status, line) END OnRowActivated; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, paned, frame, expander, overlay, overlayLabel, listbox, row: ADDRESS; i: INTEGER; text: ARRAY [0..15] OF CHAR; BEGIN status := gtk_label_new("Select a row"); (* start pane: frame > expander > label *) expander := gtk_expander_new("Details"); gtk_expander_set_child(expander, gtk_label_new("Collapsible content")); gtk_expander_set_expanded(expander, 1); frame := gtk_frame_new("Left pane"); gtk_frame_set_child(frame, expander); (* end pane: overlay > list box, plus a top-right corner label *) listbox := gtk_list_box_new(); gtk_list_box_set_selection_mode(listbox, GtkSelectionSingle); FOR i := 0 TO 4 DO IntToStr(i, text); row := gtk_list_box_row_new(); gtk_list_box_row_set_child(row, gtk_label_new(text)); gtk_list_box_append(listbox, row) END; overlayLabel := gtk_label_new("overlay"); overlay := gtk_overlay_new(); gtk_overlay_set_child(overlay, listbox); gtk_overlay_add_overlay(overlay, overlayLabel); gtk_widget_set_halign(overlayLabel, GtkAlignEnd); gtk_widget_set_valign(overlayLabel, GtkAlignStart); gtk_widget_set_margin_top(overlayLabel, 8); gtk_widget_set_margin_end(overlayLabel, 8); paned := gtk_paned_new(GtkHorizontal); gtk_paned_set_start_child(paned, frame); gtk_paned_set_end_child(paned, overlay); gtk_paned_set_position(paned, 180); gtk_widget_set_vexpand(paned, 1); Connect3(listbox, "row-activated", OnRowActivated, NIL); box := gtk_box_new(GtkVertical, 8); gtk_box_append(box, paned); gtk_box_append(box, status); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Layouts"); gtk_window_set_default_size(window, 520, 340); 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 layouts.