MODULE popover ; (* m2-GTK4 example - popovers. A button pops up a GtkPopover with some content, and a GtkMenuButton opens a GtkPopoverMenu built from a GMenu (with a working Quit item). Build: make examples Run: ./build/examples/popover *) 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_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; FROM GtkButton IMPORT gtk_button_new_with_label; FROM GtkPopover IMPORT gtk_popover_new, gtk_popover_set_child, gtk_popover_popup; FROM GtkPopoverMenu IMPORT gtk_popover_menu_new_from_model; FROM GtkMenuButton IMPORT gtk_menu_button_new, gtk_menu_button_set_icon_name, gtk_menu_button_set_popover; FROM GtkWidget IMPORT gtk_widget_set_parent, gtk_widget_set_margin_top, gtk_widget_set_margin_bottom, gtk_widget_set_margin_start, gtk_widget_set_margin_end; FROM GMenu IMPORT g_menu_new, g_menu_append; FROM GSimpleAction IMPORT g_simple_action_new; FROM GActionMap IMPORT g_action_map_add_action; FROM GtkClosures IMPORT Connect2; FROM GtkUtils IMPORT Connect; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Popover"; VAR app, popover: ADDRESS; PROCEDURE OnQuit (action: ADDRESS; param: ADDRESS; data: ADDRESS); BEGIN g_application_quit(app) END OnQuit; PROCEDURE OnShow (button: ADDRESS; user: ADDRESS); BEGIN gtk_popover_popup(popover) END OnShow; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, button, content, menu, menuButton, action: ADDRESS; BEGIN action := g_simple_action_new("quit", NIL); Connect(action, "activate", ADR(OnQuit), NIL); g_action_map_add_action(application, action); button := gtk_button_new_with_label("Show popover"); content := gtk_label_new("Popover content"); popover := gtk_popover_new(); gtk_popover_set_child(popover, content); gtk_widget_set_parent(popover, button); Connect2(button, "clicked", OnShow, NIL); menu := g_menu_new(); g_menu_append(menu, "Quit", "app.quit"); menuButton := gtk_menu_button_new(); gtk_menu_button_set_icon_name(menuButton, "open-menu-symbolic"); gtk_menu_button_set_popover(menuButton, gtk_popover_menu_new_from_model(menu)); box := gtk_box_new(GtkVertical, 12); gtk_box_set_spacing(box, 12); 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); gtk_box_append(box, button); gtk_box_append(box, menuButton); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Popover"); gtk_window_set_default_size(window, 360, 160); gtk_window_set_child(window, box); gtk_window_present(window) END OnActivate; 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 popover.