Quellcode durchsuchen

feat: GNOME (libadwaita) widgets - stacks, switchers, navigation, adaptive

Add 27 hand-written libadwaita modules covering the GNOME widgets that
were still missing, bringing the Adw coverage to 46 classes:

- view stacks: AdwViewStack, AdwViewStackPage, AdwViewStackPages
- switchers: AdwViewSwitcher, AdwViewSwitcherBar, AdwViewSwitcherTitle,
    AdwInlineViewSwitcher
- navigation: AdwNavigationView, AdwNavigationPage
- windows: AdwWindow, AdwWindowTitle
- adaptive containers: AdwClampScrollable, AdwClampLayout,
    AdwSqueezer, AdwSqueezerPage, AdwWrapBox, AdwWrapLayout
- misc widgets: AdwBin, AdwSpinner, AdwSpinnerPaintable, AdwAvatar,
    AdwButtonContent, AdwSplitButton, AdwButtonRow, AdwSpinRow,
    AdwPasswordEntryRow
- AdwEnums: shared Adw enums (view switcher policy, inline display mode,
    squeezer transition, fold threshold, length unit, justify, wrap,
    pack direction)

Also:
- tests/test_adw_widgets.mod: builds and checks every new widget
- examples/adw_widgets.mod: AdwApplicationWindow + toolbar view +
    view-switcher title + view stack + banner + squeezer + wrap box
- Makefile: build the adw_widgets example when libadwaita is present
- README: document the new modules and update counts

Test suite: 42 passed. gir-verify: 0 unexpected.
Eric Streit vor 3 Tagen
Ursprung
Commit
870b10bf12

+ 1 - 1
Makefile

@@ -26,7 +26,7 @@ EXAMPLES := hello counter inputs containers actions headerbar editor layouts fil
 # Include the libadwaita test/example only when libadwaita is installed.
 ifneq ($(ADWLIBS),)
 TESTS    += test_adw
-EXAMPLES += adw
+EXAMPLES += adw adw_widgets
 endif
 
 .PHONY: all tests examples demos check clean gir gir-check gir-verify

+ 16 - 5
README.md

@@ -14,15 +14,16 @@ Verified with `gm2` 16.0.1 (experimental), GTK 4.18.6 and libadwaita 1.7.6.
 
 ## Features
 
-- **159 hand-written binding modules** across GLib, GObject, Gio, GTK4
+- **186 hand-written binding modules** across GLib, GObject, Gio, GTK4
   and libadwaita — windows, widgets, inputs, containers, model-backed
   views, actions/menus/accelerators, dialogs, CSS, drawing (Cairo/Pango),
   rich text, gestures, drag-and-drop, media, OpenGL, printing,
-  expressions/constraints/shortcuts, settings, and more.
+  expressions/constraints/shortcuts, settings, and the GNOME (libadwaita)
+  widgets (view stacks, switchers, navigation, adaptive containers), and more.
 - **Pure-Modula-2 helpers**: `GtkUtils` (string/number conversion,
   `Connect`, `SetAccel`, ownership and `GError` helpers) and
   `GtkClosures` (per-connection signal contexts with cleanup).
-- **41 tests**, **26 runnable examples**, and an **m2 gtk-demo**
+- **42 tests**, **26 runnable examples**, and an **m2 gtk-demo**
   browser (`demos/`) modelled on GTK's own `gtk4-demo`.
 - **Generator + verifier**: `tools/gir2def.py` turns a `.gir` file into
   `.def` files; `tools/gir_verify.py` checks every generated identifier
@@ -224,13 +225,23 @@ make demos
 
 | Module | Contents |
 |---|---|
-| `AdwApplication`, `AdwApplicationWindow` | Adwaita application and window |
+| `AdwApplication`, `AdwApplicationWindow`, `AdwWindow`, `AdwWindowTitle` | Adwaita application, window, title |
 | `AdwHeaderBar`, `AdwToolbarView` | header bar and toolbar view |
+| `AdwViewStack`, `AdwViewStackPage`, `AdwViewStackPages` | animated page stack |
+| `AdwViewSwitcher`, `AdwViewSwitcherBar`, `AdwViewSwitcherTitle`, `AdwInlineViewSwitcher` | view switchers |
+| `AdwNavigationView`, `AdwNavigationPage` | push/pop navigation |
 | `AdwPreferencesPage`, `AdwPreferencesGroup`, `AdwPreferencesRow` | preferences layout |
 | `AdwActionRow`, `AdwSwitchRow`, `AdwEntryRow`, `AdwComboRow`, `AdwExpanderRow` | settings rows |
-| `AdwStatusPage`, `AdwBanner`, `AdwClamp` | status/banner/clamp |
+| `AdwButtonRow`, `AdwSpinRow`, `AdwPasswordEntryRow` | button, spin and password rows |
+| `AdwClamp`, `AdwClampScrollable`, `AdwClampLayout` | clamping containers/layouts |
+| `AdwSqueezer`, `AdwSqueezerPage` | show-the-largest-that-fits |
+| `AdwWrapBox`, `AdwWrapLayout` | wrapping lines |
+| `AdwBin`, `AdwSpinner`, `AdwSpinnerPaintable`, `AdwAvatar` | misc widgets |
+| `AdwButtonContent`, `AdwSplitButton` | rich button content |
+| `AdwStatusPage`, `AdwBanner` | status/banner |
 | `AdwToast`, `AdwToastOverlay` | transient notifications |
 | `AdwAboutWindow`, `AdwMessageDialog` | about and message dialogs |
+| `AdwEnums` | shared Adw enums (view switcher, justify, wrap, length units) |
 
 ### Helpers and the C shim (`lib/`)
 

+ 136 - 0
examples/adw_widgets.mod

@@ -0,0 +1,136 @@
+MODULE adw_widgets ;
+
+(*
+   m2-GTK4 example - a showcase of the GNOME (libadwaita) widgets bound
+   in this slice:
+
+     AdwApplicationWindow > AdwToolbarView
+       top bar - AdwHeaderBar with an AdwViewSwitcherTitle
+       content - GtkBox >
+                   AdwBanner
+                   AdwSqueezer (two labels; shows the one that fits)
+                   AdwWrapBox (wrapping labels)
+                 AdwViewStack  > page "Home"   - AdwAvatar
+                               > page "About"  - AdwSpinner + button
+                                                  with AdwButtonContent
+
+   Build:  make examples
+   Run:    ./build/examples/adw_widgets
+*)
+
+FROM Gio IMPORT g_application_run;
+FROM AdwApplication IMPORT adw_application_new;
+FROM AdwApplicationWindow IMPORT adw_application_window_new,
+   adw_application_window_set_content;
+FROM AdwHeaderBar IMPORT adw_header_bar_new,
+   adw_header_bar_set_title_widget;
+FROM AdwToolbarView IMPORT adw_toolbar_view_new, adw_toolbar_view_add_top_bar,
+   adw_toolbar_view_set_content;
+FROM AdwViewSwitcherTitle IMPORT adw_view_switcher_title_new,
+   adw_view_switcher_title_set_title, adw_view_switcher_title_set_subtitle,
+   adw_view_switcher_title_set_stack;
+FROM AdwViewStack IMPORT adw_view_stack_new, adw_view_stack_add_titled,
+   adw_view_stack_add_titled_with_icon;
+FROM AdwBanner IMPORT adw_banner_new, adw_banner_set_revealed;
+FROM AdwSqueezer IMPORT adw_squeezer_new, adw_squeezer_add;
+FROM AdwWrapBox IMPORT adw_wrap_box_new, adw_wrap_box_append;
+FROM AdwAvatar IMPORT adw_avatar_new;
+FROM AdwSpinner IMPORT adw_spinner_new;
+FROM AdwButtonContent IMPORT adw_button_content_new,
+   adw_button_content_set_label, adw_button_content_set_icon_name;
+FROM GtkWindow IMPORT gtk_window_present, gtk_window_set_default_size;
+FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
+FROM GtkButton IMPORT gtk_button_new, gtk_button_set_child;
+FROM GtkLabel IMPORT gtk_label_new;
+FROM GtkEnums IMPORT GtkVertical;
+FROM GtkClosures IMPORT Connect2;
+FROM SYSTEM IMPORT ADDRESS;
+FROM libc IMPORT printf;
+
+CONST
+   AppId = "org.example.m2gtk4.AdwWidgets";
+
+PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
+VAR
+   window, toolbar, header, switcherTitle, stack, home, about: ADDRESS;
+   box, banner, squeezer, wrap, avatar, spinner, button: ADDRESS;
+   content: ADDRESS;
+BEGIN
+   window := adw_application_window_new(application);
+   gtk_window_set_default_size(window, 420, 420);
+
+   stack := adw_view_stack_new();
+
+   (* page: Home *)
+   home := gtk_box_new(GtkVertical, 18);
+   gtk_box_set_spacing(home, 18);
+   avatar := adw_avatar_new(64, "Eric", 1);
+   gtk_box_append(home, avatar);
+   gtk_box_append(home, gtk_label_new("Welcome to the GNOME widgets demo."));
+   content := adw_view_stack_add_titled(stack, home, "home", "Home");
+
+   (* page: About *)
+   about := gtk_box_new(GtkVertical, 18);
+   gtk_box_set_spacing(about, 18);
+   spinner := adw_spinner_new();
+   gtk_box_append(about, spinner);
+   button := gtk_button_new();
+   content := adw_button_content_new();
+   adw_button_content_set_icon_name(content, "emblem-system-symbolic");
+   adw_button_content_set_label(content, "Preferences");
+   gtk_button_set_child(button, content);
+   gtk_box_append(about, button);
+   content := adw_view_stack_add_titled_with_icon(stack, about, "about",
+                                                  "About",
+                                                  "help-about-symbolic");
+
+   (* title that becomes a switcher when the window is wide *)
+   switcherTitle := adw_view_switcher_title_new();
+   adw_view_switcher_title_set_title(switcherTitle, "m2-GTK4");
+   adw_view_switcher_title_set_subtitle(switcherTitle, "GNOME widgets");
+   adw_view_switcher_title_set_stack(switcherTitle, stack);
+
+   header := adw_header_bar_new();
+   adw_header_bar_set_title_widget(header, switcherTitle);
+
+   toolbar := adw_toolbar_view_new();
+   adw_toolbar_view_add_top_bar(toolbar, header);
+
+   (* content: banner + squeezer + wrapbox + the stack *)
+   box := gtk_box_new(GtkVertical, 12);
+   gtk_box_set_spacing(box, 12);
+
+   banner := adw_banner_new("This is an AdwBanner");
+   adw_banner_set_revealed(banner, 1);
+   gtk_box_append(box, banner);
+
+   squeezer := adw_squeezer_new();
+   content := adw_squeezer_add(squeezer, gtk_label_new("Wide layout"));
+   content := adw_squeezer_add(squeezer, gtk_label_new("Narrow"));
+   gtk_box_append(box, squeezer);
+
+   wrap := adw_wrap_box_new();
+   adw_wrap_box_append(wrap, gtk_label_new("one"));
+   adw_wrap_box_append(wrap, gtk_label_new("two"));
+   adw_wrap_box_append(wrap, gtk_label_new("three"));
+   adw_wrap_box_append(wrap, gtk_label_new("four"));
+   gtk_box_append(box, wrap);
+
+   gtk_box_append(box, stack);
+
+   adw_toolbar_view_set_content(toolbar, box);
+   adw_application_window_set_content(window, toolbar);
+   gtk_window_present(window)
+END OnActivate;
+
+VAR
+   app: ADDRESS;
+BEGIN
+   app := adw_application_new(AppId, 0);
+   IF app = NIL THEN
+      printf("adw_application_new failed\n");
+      HALT(1)
+   END;
+   Connect2(app, "activate", OnActivate, NIL);
+   g_application_run(app, 0, NIL)
+END adw_widgets.

+ 64 - 0
src/AdwAvatar.def

@@ -0,0 +1,64 @@
+DEFINITION MODULE FOR "C" AdwAvatar ;
+
+(*
+   m2-GTK4 - AdwAvatar: a round avatar showing an image, an icon or the
+   initials of a name.  Mapped onto <libadwaita-1/adw-avatar.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwAvatar,
+   adw_avatar_new,
+   adw_avatar_get_text, adw_avatar_set_text,
+   adw_avatar_get_icon_name, adw_avatar_set_icon_name,
+   adw_avatar_get_custom_image, adw_avatar_set_custom_image,
+   adw_avatar_get_show_initials, adw_avatar_set_show_initials,
+   adw_avatar_get_size, adw_avatar_set_size,
+   adw_avatar_draw_to_texture;
+
+TYPE
+   AdwAvatar = ADDRESS;
+
+(* GtkWidget *adw_avatar_new(int size, const char *text,
+                             gboolean show_initials) *)
+PROCEDURE adw_avatar_new (size: INTEGER; text: ARRAY OF CHAR;
+                          show_initials: INTEGER) : AdwAvatar;
+
+(* const char *adw_avatar_get_text(AdwAvatar *self) *)
+PROCEDURE adw_avatar_get_text (self: AdwAvatar) : ADDRESS;
+
+(* void adw_avatar_set_text(AdwAvatar *self, const char *text) *)
+PROCEDURE adw_avatar_set_text (self: AdwAvatar; text: ARRAY OF CHAR);
+
+(* const char *adw_avatar_get_icon_name(AdwAvatar *self) *)
+PROCEDURE adw_avatar_get_icon_name (self: AdwAvatar) : ADDRESS;
+
+(* void adw_avatar_set_icon_name(AdwAvatar *self, const char *icon_name) *)
+PROCEDURE adw_avatar_set_icon_name (self: AdwAvatar;
+                                    icon_name: ARRAY OF CHAR);
+
+(* GdkPaintable *adw_avatar_get_custom_image(AdwAvatar *self) *)
+PROCEDURE adw_avatar_get_custom_image (self: AdwAvatar) : ADDRESS;
+
+(* void adw_avatar_set_custom_image(AdwAvatar *self, GdkPaintable *custom_image) *)
+PROCEDURE adw_avatar_set_custom_image (self: AdwAvatar; custom_image: ADDRESS);
+
+(* gboolean adw_avatar_get_show_initials(AdwAvatar *self) *)
+PROCEDURE adw_avatar_get_show_initials (self: AdwAvatar) : INTEGER;
+
+(* void adw_avatar_set_show_initials(AdwAvatar *self, gboolean show_initials) *)
+PROCEDURE adw_avatar_set_show_initials (self: AdwAvatar;
+                                        show_initials: INTEGER);
+
+(* int adw_avatar_get_size(AdwAvatar *self) *)
+PROCEDURE adw_avatar_get_size (self: AdwAvatar) : INTEGER;
+
+(* void adw_avatar_set_size(AdwAvatar *self, int size) *)
+PROCEDURE adw_avatar_set_size (self: AdwAvatar; size: INTEGER);
+
+(* GdkTexture *adw_avatar_draw_to_texture(AdwAvatar *self, int scale_factor) *)
+PROCEDURE adw_avatar_draw_to_texture (self: AdwAvatar; scale_factor: INTEGER)
+                                      : ADDRESS;
+
+END AdwAvatar.

+ 28 - 0
src/AdwBin.def

@@ -0,0 +1,28 @@
+DEFINITION MODULE FOR "C" AdwBin ;
+
+(*
+   m2-GTK4 - AdwBin: a simple single-child container with Adwaita
+   behaviour (useful as a custom-widget base).  Mapped onto
+   <libadwaita-1/adw-bin.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwBin,
+   adw_bin_new,
+   adw_bin_get_child, adw_bin_set_child;
+
+TYPE
+   AdwBin = ADDRESS;
+
+(* GtkWidget *adw_bin_new(void) *)
+PROCEDURE adw_bin_new () : AdwBin;
+
+(* GtkWidget *adw_bin_get_child(AdwBin *self) *)
+PROCEDURE adw_bin_get_child (self: AdwBin) : ADDRESS;
+
+(* void adw_bin_set_child(AdwBin *self, GtkWidget *child) *)
+PROCEDURE adw_bin_set_child (self: AdwBin; child: ADDRESS);
+
+END AdwBin.

+ 59 - 0
src/AdwButtonContent.def

@@ -0,0 +1,59 @@
+DEFINITION MODULE FOR "C" AdwButtonContent ;
+
+(*
+   m2-GTK4 - AdwButtonContent: an icon-and-label content widget for a
+   GtkButton.  Mapped onto <libadwaita-1/adw-button-content.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwButtonContent,
+   adw_button_content_new,
+   adw_button_content_get_icon_name, adw_button_content_set_icon_name,
+   adw_button_content_get_label, adw_button_content_set_label,
+   adw_button_content_get_use_underline,
+   adw_button_content_set_use_underline,
+   adw_button_content_get_can_shrink, adw_button_content_set_can_shrink;
+
+TYPE
+   AdwButtonContent = ADDRESS;
+
+(* GtkWidget *adw_button_content_new(void) *)
+PROCEDURE adw_button_content_new () : AdwButtonContent;
+
+(* const char *adw_button_content_get_icon_name(AdwButtonContent *self) *)
+PROCEDURE adw_button_content_get_icon_name (self: AdwButtonContent) : ADDRESS;
+
+(* void adw_button_content_set_icon_name(AdwButtonContent *self,
+                                         const char *icon_name) *)
+PROCEDURE adw_button_content_set_icon_name (self: AdwButtonContent;
+                                            icon_name: ARRAY OF CHAR);
+
+(* const char *adw_button_content_get_label(AdwButtonContent *self) *)
+PROCEDURE adw_button_content_get_label (self: AdwButtonContent) : ADDRESS;
+
+(* void adw_button_content_set_label(AdwButtonContent *self,
+                                      const char *label) *)
+PROCEDURE adw_button_content_set_label (self: AdwButtonContent;
+                                        label: ARRAY OF CHAR);
+
+(* gboolean adw_button_content_get_use_underline(AdwButtonContent *self) *)
+PROCEDURE adw_button_content_get_use_underline (self: AdwButtonContent)
+                                                : INTEGER;
+
+(* void adw_button_content_set_use_underline(AdwButtonContent *self,
+                                              gboolean use_underline) *)
+PROCEDURE adw_button_content_set_use_underline (self: AdwButtonContent;
+                                                use_underline: INTEGER);
+
+(* gboolean adw_button_content_get_can_shrink(AdwButtonContent *self) *)
+PROCEDURE adw_button_content_get_can_shrink (self: AdwButtonContent)
+                                             : INTEGER;
+
+(* void adw_button_content_set_can_shrink(AdwButtonContent *self,
+                                           gboolean can_shrink) *)
+PROCEDURE adw_button_content_set_can_shrink (self: AdwButtonContent;
+                                             can_shrink: INTEGER);
+
+END AdwButtonContent.

+ 39 - 0
src/AdwButtonRow.def

@@ -0,0 +1,39 @@
+DEFINITION MODULE FOR "C" AdwButtonRow ;
+
+(*
+   m2-GTK4 - AdwButtonRow: an activatable row with a label and optional
+   start/end icons.  Mapped onto <libadwaita-1/adw-button-row.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwButtonRow,
+   adw_button_row_new,
+   adw_button_row_get_start_icon_name,
+   adw_button_row_set_start_icon_name,
+   adw_button_row_get_end_icon_name, adw_button_row_set_end_icon_name;
+
+TYPE
+   AdwButtonRow = ADDRESS;
+
+(* GtkWidget *adw_button_row_new(void) *)
+PROCEDURE adw_button_row_new () : AdwButtonRow;
+
+(* const char *adw_button_row_get_start_icon_name(AdwButtonRow *self) *)
+PROCEDURE adw_button_row_get_start_icon_name (self: AdwButtonRow) : ADDRESS;
+
+(* void adw_button_row_set_start_icon_name(AdwButtonRow *self,
+                                           const char *icon_name) *)
+PROCEDURE adw_button_row_set_start_icon_name (self: AdwButtonRow;
+                                              icon_name: ARRAY OF CHAR);
+
+(* const char *adw_button_row_get_end_icon_name(AdwButtonRow *self) *)
+PROCEDURE adw_button_row_get_end_icon_name (self: AdwButtonRow) : ADDRESS;
+
+(* void adw_button_row_set_end_icon_name(AdwButtonRow *self,
+                                         const char *icon_name) *)
+PROCEDURE adw_button_row_set_end_icon_name (self: AdwButtonRow;
+                                            icon_name: ARRAY OF CHAR);
+
+END AdwButtonRow.

+ 49 - 0
src/AdwClampLayout.def

@@ -0,0 +1,49 @@
+DEFINITION MODULE FOR "C" AdwClampLayout ;
+
+(*
+   m2-GTK4 - AdwClampLayout: a GtkLayoutManager that clamps its child to
+   a maximum size.  Mapped onto <libadwaita-1/adw-clamp.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+FROM AdwEnums IMPORT AdwLengthUnit;
+
+EXPORT UNQUALIFIED
+   AdwClampLayout,
+   adw_clamp_layout_new,
+   adw_clamp_layout_get_maximum_size, adw_clamp_layout_set_maximum_size,
+   adw_clamp_layout_get_tightening_threshold,
+   adw_clamp_layout_set_tightening_threshold,
+   adw_clamp_layout_get_unit, adw_clamp_layout_set_unit;
+
+TYPE
+   AdwClampLayout = ADDRESS;
+
+(* GtkLayoutManager *adw_clamp_layout_new(void) *)
+PROCEDURE adw_clamp_layout_new () : AdwClampLayout;
+
+(* int adw_clamp_layout_get_maximum_size(AdwClampLayout *self) *)
+PROCEDURE adw_clamp_layout_get_maximum_size (self: AdwClampLayout) : INTEGER;
+
+(* void adw_clamp_layout_set_maximum_size(AdwClampLayout *self,
+                                          int maximum_size) *)
+PROCEDURE adw_clamp_layout_set_maximum_size (self: AdwClampLayout;
+                                             maximum_size: INTEGER);
+
+(* int adw_clamp_layout_get_tightening_threshold(AdwClampLayout *self) *)
+PROCEDURE adw_clamp_layout_get_tightening_threshold (self: AdwClampLayout)
+                                                     : INTEGER;
+
+(* void adw_clamp_layout_set_tightening_threshold(AdwClampLayout *self,
+                                                  int tightening_threshold) *)
+PROCEDURE adw_clamp_layout_set_tightening_threshold (self: AdwClampLayout;
+                                                     tightening_threshold: INTEGER);
+
+(* AdwLengthUnit adw_clamp_layout_get_unit(AdwClampLayout *self) *)
+PROCEDURE adw_clamp_layout_get_unit (self: AdwClampLayout) : AdwLengthUnit;
+
+(* void adw_clamp_layout_set_unit(AdwClampLayout *self, AdwLengthUnit unit) *)
+PROCEDURE adw_clamp_layout_set_unit (self: AdwClampLayout;
+                                     unit: AdwLengthUnit);
+
+END AdwClampLayout.

+ 63 - 0
src/AdwClampScrollable.def

@@ -0,0 +1,63 @@
+DEFINITION MODULE FOR "C" AdwClampScrollable ;
+
+(*
+   m2-GTK4 - AdwClampScrollable: a scrollable that clamps its child to a
+   maximum size.  Mapped onto <libadwaita-1/adw-clamp.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+FROM AdwEnums IMPORT AdwLengthUnit;
+
+EXPORT UNQUALIFIED
+   AdwClampScrollable,
+   adw_clamp_scrollable_new,
+   adw_clamp_scrollable_get_child, adw_clamp_scrollable_set_child,
+   adw_clamp_scrollable_get_maximum_size,
+   adw_clamp_scrollable_set_maximum_size,
+   adw_clamp_scrollable_get_tightening_threshold,
+   adw_clamp_scrollable_set_tightening_threshold,
+   adw_clamp_scrollable_get_unit, adw_clamp_scrollable_set_unit;
+
+TYPE
+   AdwClampScrollable = ADDRESS;
+
+(* GtkWidget *adw_clamp_scrollable_new(void) *)
+PROCEDURE adw_clamp_scrollable_new () : AdwClampScrollable;
+
+(* GtkWidget *adw_clamp_scrollable_get_child(AdwClampScrollable *self) *)
+PROCEDURE adw_clamp_scrollable_get_child (self: AdwClampScrollable) : ADDRESS;
+
+(* void adw_clamp_scrollable_set_child(AdwClampScrollable *self,
+                                       GtkWidget *child) *)
+PROCEDURE adw_clamp_scrollable_set_child (self: AdwClampScrollable;
+                                          child: ADDRESS);
+
+(* int adw_clamp_scrollable_get_maximum_size(AdwClampScrollable *self) *)
+PROCEDURE adw_clamp_scrollable_get_maximum_size (self: AdwClampScrollable)
+                                                 : INTEGER;
+
+(* void adw_clamp_scrollable_set_maximum_size(AdwClampScrollable *self,
+                                              int maximum_size) *)
+PROCEDURE adw_clamp_scrollable_set_maximum_size (self: AdwClampScrollable;
+                                                 maximum_size: INTEGER);
+
+(* int adw_clamp_scrollable_get_tightening_threshold(
+        AdwClampScrollable *self) *)
+PROCEDURE adw_clamp_scrollable_get_tightening_threshold
+              (self: AdwClampScrollable) : INTEGER;
+
+(* void adw_clamp_scrollable_set_tightening_threshold(
+          AdwClampScrollable *self, int tightening_threshold) *)
+PROCEDURE adw_clamp_scrollable_set_tightening_threshold
+              (self: AdwClampScrollable; tightening_threshold: INTEGER);
+
+(* AdwLengthUnit adw_clamp_scrollable_get_unit(AdwClampScrollable *self) *)
+PROCEDURE adw_clamp_scrollable_get_unit (self: AdwClampScrollable)
+                                         : AdwLengthUnit;
+
+(* void adw_clamp_scrollable_set_unit(AdwClampScrollable *self,
+                                      AdwLengthUnit unit) *)
+PROCEDURE adw_clamp_scrollable_set_unit (self: AdwClampScrollable;
+                                         unit: AdwLengthUnit);
+
+END AdwClampScrollable.

+ 61 - 0
src/AdwEnums.def

@@ -0,0 +1,61 @@
+DEFINITION MODULE FOR "C" AdwEnums ;
+
+(*
+   m2-GTK4 - enumerations shared by the libadwaita (Adw) widgets: view
+   switcher policy, inline switcher display mode, squeezer transitions,
+   length units, and the justification / wrap / pack direction used by
+   the adaptive containers.  Mapped onto <libadwaita-1/adw-enums.h>.
+*)
+
+EXPORT UNQUALIFIED
+   AdwViewSwitcherPolicy, AdwViewSwitcherNarrow, AdwViewSwitcherWide,
+   AdwInlineViewSwitcherDisplayMode,
+   AdwInlineViewSwitcherLabels, AdwInlineViewSwitcherIcons,
+   AdwInlineViewSwitcherBoth,
+   AdwSqueezerTransitionType,
+   AdwSqueezerTransitionNone, AdwSqueezerTransitionCrossfade,
+   AdwFoldThresholdPolicy, AdwFoldThresholdMinimum, AdwFoldThresholdNatural,
+   AdwLengthUnit, AdwLengthPx, AdwLengthPt, AdwLengthSp,
+   AdwJustifyMode, AdwJustifyNone, AdwJustifyFill, AdwJustifySpread,
+   AdwWrapPolicy, AdwWrapMinimum, AdwWrapNatural,
+   AdwPackDirection, AdwPackStartToEnd, AdwPackEndToStart;
+
+TYPE
+   AdwViewSwitcherPolicy = CARDINAL;
+   AdwInlineViewSwitcherDisplayMode = CARDINAL;
+   AdwSqueezerTransitionType = CARDINAL;
+   AdwFoldThresholdPolicy = CARDINAL;
+   AdwLengthUnit = CARDINAL;
+   AdwJustifyMode = CARDINAL;
+   AdwWrapPolicy = CARDINAL;
+   AdwPackDirection = CARDINAL;
+
+CONST
+   AdwViewSwitcherNarrow = 0;   (* ADW_VIEW_SWITCHER_POLICY_NARROW *)
+   AdwViewSwitcherWide   = 1;   (* ADW_VIEW_SWITCHER_POLICY_WIDE *)
+
+   AdwInlineViewSwitcherLabels = 0;  (* ADW_INLINE_VIEW_SWITCHER_LABELS *)
+   AdwInlineViewSwitcherIcons  = 1;  (* ADW_INLINE_VIEW_SWITCHER_ICONS *)
+   AdwInlineViewSwitcherBoth   = 2;  (* ADW_INLINE_VIEW_SWITCHER_BOTH *)
+
+   AdwSqueezerTransitionNone      = 0;  (* ADW_SQUEEZER_TRANSITION_TYPE_NONE *)
+   AdwSqueezerTransitionCrossfade = 1;  (* ADW_SQUEEZER_TRANSITION_TYPE_CROSSFADE *)
+
+   AdwFoldThresholdMinimum = 0;  (* ADW_FOLD_THRESHOLD_POLICY_MINIMUM *)
+   AdwFoldThresholdNatural = 1;  (* ADW_FOLD_THRESHOLD_POLICY_NATURAL *)
+
+   AdwLengthPx = 0;   (* ADW_LENGTH_UNIT_PX *)
+   AdwLengthPt = 1;   (* ADW_LENGTH_UNIT_PT *)
+   AdwLengthSp = 2;   (* ADW_LENGTH_UNIT_SP *)
+
+   AdwJustifyNone   = 0;   (* ADW_JUSTIFY_NONE *)
+   AdwJustifyFill   = 1;   (* ADW_JUSTIFY_FILL *)
+   AdwJustifySpread = 2;   (* ADW_JUSTIFY_SPREAD *)
+
+   AdwWrapMinimum = 0;     (* ADW_WRAP_MINIMUM *)
+   AdwWrapNatural = 1;     (* ADW_WRAP_NATURAL *)
+
+   AdwPackStartToEnd = 0;  (* ADW_PACK_START_TO_END *)
+   AdwPackEndToStart = 1;  (* ADW_PACK_END_TO_START *)
+
+END AdwEnums.

+ 72 - 0
src/AdwInlineViewSwitcher.def

@@ -0,0 +1,72 @@
+DEFINITION MODULE FOR "C" AdwInlineViewSwitcher ;
+
+(*
+   m2-GTK4 - AdwInlineViewSwitcher: a compact inline switcher for the
+   pages of an AdwViewStack, shown as icons, labels or both.  Mapped
+   onto <libadwaita-1/adw-inline-view-switcher.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+FROM AdwEnums IMPORT AdwInlineViewSwitcherDisplayMode;
+
+EXPORT UNQUALIFIED
+   AdwInlineViewSwitcher,
+   adw_inline_view_switcher_new,
+   adw_inline_view_switcher_get_stack, adw_inline_view_switcher_set_stack,
+   adw_inline_view_switcher_get_display_mode,
+   adw_inline_view_switcher_set_display_mode,
+   adw_inline_view_switcher_get_homogeneous,
+   adw_inline_view_switcher_set_homogeneous,
+   adw_inline_view_switcher_get_can_shrink,
+   adw_inline_view_switcher_set_can_shrink;
+
+TYPE
+   AdwInlineViewSwitcher = ADDRESS;
+
+(* GtkWidget *adw_inline_view_switcher_new(void) *)
+PROCEDURE adw_inline_view_switcher_new () : AdwInlineViewSwitcher;
+
+(* AdwViewStack *adw_inline_view_switcher_get_stack(
+                   AdwInlineViewSwitcher *self) *)
+PROCEDURE adw_inline_view_switcher_get_stack (self: AdwInlineViewSwitcher)
+                                              : ADDRESS;
+
+(* void adw_inline_view_switcher_set_stack(AdwInlineViewSwitcher *self,
+                                            AdwViewStack *stack) *)
+PROCEDURE adw_inline_view_switcher_set_stack (self: AdwInlineViewSwitcher;
+                                              stack: ADDRESS);
+
+(* AdwInlineViewSwitcherDisplayMode adw_inline_view_switcher_get_display_mode(
+        AdwInlineViewSwitcher *self) *)
+PROCEDURE adw_inline_view_switcher_get_display_mode
+              (self: AdwInlineViewSwitcher)
+              : AdwInlineViewSwitcherDisplayMode;
+
+(* void adw_inline_view_switcher_set_display_mode(
+          AdwInlineViewSwitcher *self,
+          AdwInlineViewSwitcherDisplayMode mode) *)
+PROCEDURE adw_inline_view_switcher_set_display_mode
+              (self: AdwInlineViewSwitcher;
+               mode: AdwInlineViewSwitcherDisplayMode);
+
+(* gboolean adw_inline_view_switcher_get_homogeneous(
+              AdwInlineViewSwitcher *self) *)
+PROCEDURE adw_inline_view_switcher_get_homogeneous
+              (self: AdwInlineViewSwitcher) : INTEGER;
+
+(* void adw_inline_view_switcher_set_homogeneous(
+          AdwInlineViewSwitcher *self, gboolean homogeneous) *)
+PROCEDURE adw_inline_view_switcher_set_homogeneous
+              (self: AdwInlineViewSwitcher; homogeneous: INTEGER);
+
+(* gboolean adw_inline_view_switcher_get_can_shrink(
+              AdwInlineViewSwitcher *self) *)
+PROCEDURE adw_inline_view_switcher_get_can_shrink
+              (self: AdwInlineViewSwitcher) : INTEGER;
+
+(* void adw_inline_view_switcher_set_can_shrink(
+          AdwInlineViewSwitcher *self, gboolean can_shrink) *)
+PROCEDURE adw_inline_view_switcher_set_can_shrink
+              (self: AdwInlineViewSwitcher; can_shrink: INTEGER);
+
+END AdwInlineViewSwitcher.

+ 64 - 0
src/AdwNavigationPage.def

@@ -0,0 +1,64 @@
+DEFINITION MODULE FOR "C" AdwNavigationPage ;
+
+(*
+   m2-GTK4 - AdwNavigationPage: a page pushed onto an AdwNavigationView.
+   Mapped onto <libadwaita-1/adw-navigation-view.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwNavigationPage,
+   adw_navigation_page_new, adw_navigation_page_new_with_tag,
+   adw_navigation_page_get_child, adw_navigation_page_set_child,
+   adw_navigation_page_get_title, adw_navigation_page_set_title,
+   adw_navigation_page_get_tag, adw_navigation_page_set_tag,
+   adw_navigation_page_get_can_pop, adw_navigation_page_set_can_pop;
+
+TYPE
+   AdwNavigationPage = ADDRESS;
+
+(* GtkWidget *adw_navigation_page_new(GtkWidget *child, const char *title) *)
+PROCEDURE adw_navigation_page_new (child: ADDRESS;
+                                   title: ARRAY OF CHAR) : AdwNavigationPage;
+
+(* GtkWidget *adw_navigation_page_new_with_tag(GtkWidget *child,
+                                               const char *title,
+                                               const char *tag) *)
+PROCEDURE adw_navigation_page_new_with_tag (child: ADDRESS;
+                                            title, tag: ARRAY OF CHAR)
+                                           : AdwNavigationPage;
+
+(* GtkWidget *adw_navigation_page_get_child(AdwNavigationPage *self) *)
+PROCEDURE adw_navigation_page_get_child (self: AdwNavigationPage) : ADDRESS;
+
+(* void adw_navigation_page_set_child(AdwNavigationPage *self,
+                                      GtkWidget *child) *)
+PROCEDURE adw_navigation_page_set_child (self: AdwNavigationPage;
+                                         child: ADDRESS);
+
+(* const char *adw_navigation_page_get_title(AdwNavigationPage *self) *)
+PROCEDURE adw_navigation_page_get_title (self: AdwNavigationPage) : ADDRESS;
+
+(* void adw_navigation_page_set_title(AdwNavigationPage *self,
+                                      const char *title) *)
+PROCEDURE adw_navigation_page_set_title (self: AdwNavigationPage;
+                                         title: ARRAY OF CHAR);
+
+(* const char *adw_navigation_page_get_tag(AdwNavigationPage *self) *)
+PROCEDURE adw_navigation_page_get_tag (self: AdwNavigationPage) : ADDRESS;
+
+(* void adw_navigation_page_set_tag(AdwNavigationPage *self,
+                                    const char *tag) *)
+PROCEDURE adw_navigation_page_set_tag (self: AdwNavigationPage;
+                                       tag: ARRAY OF CHAR);
+
+(* gboolean adw_navigation_page_get_can_pop(AdwNavigationPage *self) *)
+PROCEDURE adw_navigation_page_get_can_pop (self: AdwNavigationPage) : INTEGER;
+
+(* void adw_navigation_page_set_can_pop(AdwNavigationPage *self,
+                                        gboolean can_pop) *)
+PROCEDURE adw_navigation_page_set_can_pop (self: AdwNavigationPage;
+                                           can_pop: INTEGER);
+
+END AdwNavigationPage.

+ 133 - 0
src/AdwNavigationView.def

@@ -0,0 +1,133 @@
+DEFINITION MODULE FOR "C" AdwNavigationView ;
+
+(*
+   m2-GTK4 - AdwNavigationView: a stack of full-window navigation pages
+   pushed/popped with animation (the Adwaita navigation pattern).  Mapped
+   onto <libadwaita-1/adw-navigation-view.h>.
+
+   Note: adw_navigation_view_replace() and replace_with_tags() are
+   variadic and are intentionally left out.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwNavigationView,
+   adw_navigation_view_new,
+   adw_navigation_view_add, adw_navigation_view_remove,
+   adw_navigation_view_push, adw_navigation_view_push_by_tag,
+   adw_navigation_view_pop,
+   adw_navigation_view_pop_to_page, adw_navigation_view_pop_to_tag,
+   adw_navigation_view_get_previous_page, adw_navigation_view_find_page,
+   adw_navigation_view_get_visible_page,
+   adw_navigation_view_get_visible_page_tag,
+   adw_navigation_view_get_navigation_stack,
+   adw_navigation_view_get_animate_transitions,
+   adw_navigation_view_set_animate_transitions,
+   adw_navigation_view_get_pop_on_escape,
+   adw_navigation_view_set_pop_on_escape,
+   adw_navigation_view_get_hhomogeneous,
+   adw_navigation_view_set_hhomogeneous,
+   adw_navigation_view_get_vhomogeneous,
+   adw_navigation_view_set_vhomogeneous;
+
+TYPE
+   AdwNavigationView = ADDRESS;
+
+(* GtkWidget *adw_navigation_view_new(void) *)
+PROCEDURE adw_navigation_view_new () : AdwNavigationView;
+
+(* void adw_navigation_view_add(AdwNavigationView *self,
+                                AdwNavigationPage *page) *)
+PROCEDURE adw_navigation_view_add (self: AdwNavigationView; page: ADDRESS);
+
+(* void adw_navigation_view_remove(AdwNavigationView *self,
+                                   AdwNavigationPage *page) *)
+PROCEDURE adw_navigation_view_remove (self: AdwNavigationView; page: ADDRESS);
+
+(* void adw_navigation_view_push(AdwNavigationView *self,
+                                 AdwNavigationPage *page) *)
+PROCEDURE adw_navigation_view_push (self: AdwNavigationView; page: ADDRESS);
+
+(* void adw_navigation_view_push_by_tag(AdwNavigationView *self,
+                                        const char *tag) *)
+PROCEDURE adw_navigation_view_push_by_tag (self: AdwNavigationView;
+                                           tag: ARRAY OF CHAR);
+
+(* gboolean adw_navigation_view_pop(AdwNavigationView *self) *)
+PROCEDURE adw_navigation_view_pop (self: AdwNavigationView) : INTEGER;
+
+(* gboolean adw_navigation_view_pop_to_page(AdwNavigationView *self,
+                                            AdwNavigationPage *page) *)
+PROCEDURE adw_navigation_view_pop_to_page (self: AdwNavigationView;
+                                           page: ADDRESS) : INTEGER;
+
+(* gboolean adw_navigation_view_pop_to_tag(AdwNavigationView *self,
+                                           const char *tag) *)
+PROCEDURE adw_navigation_view_pop_to_tag (self: AdwNavigationView;
+                                          tag: ARRAY OF CHAR) : INTEGER;
+
+(* AdwNavigationPage *adw_navigation_view_get_previous_page(
+                        AdwNavigationView *self, AdwNavigationPage *page) *)
+PROCEDURE adw_navigation_view_get_previous_page (self: AdwNavigationView;
+                                                 page: ADDRESS) : ADDRESS;
+
+(* AdwNavigationPage *adw_navigation_view_find_page(AdwNavigationView *self,
+                                                     const char *tag) *)
+PROCEDURE adw_navigation_view_find_page (self: AdwNavigationView;
+                                         tag: ARRAY OF CHAR) : ADDRESS;
+
+(* AdwNavigationPage *adw_navigation_view_get_visible_page(
+                        AdwNavigationView *self) *)
+PROCEDURE adw_navigation_view_get_visible_page (self: AdwNavigationView)
+                                                : ADDRESS;
+
+(* const char *adw_navigation_view_get_visible_page_tag(
+                AdwNavigationView *self) *)
+PROCEDURE adw_navigation_view_get_visible_page_tag (self: AdwNavigationView)
+                                                    : ADDRESS;
+
+(* GListModel *adw_navigation_view_get_navigation_stack(
+                AdwNavigationView *self) *)
+PROCEDURE adw_navigation_view_get_navigation_stack
+              (self: AdwNavigationView) : ADDRESS;
+
+(* gboolean adw_navigation_view_get_animate_transitions(
+              AdwNavigationView *self) *)
+PROCEDURE adw_navigation_view_get_animate_transitions
+              (self: AdwNavigationView) : INTEGER;
+
+(* void adw_navigation_view_set_animate_transitions(
+          AdwNavigationView *self, gboolean animate_transitions) *)
+PROCEDURE adw_navigation_view_set_animate_transitions
+              (self: AdwNavigationView; animate_transitions: INTEGER);
+
+(* gboolean adw_navigation_view_get_pop_on_escape(
+              AdwNavigationView *self) *)
+PROCEDURE adw_navigation_view_get_pop_on_escape
+              (self: AdwNavigationView) : INTEGER;
+
+(* void adw_navigation_view_set_pop_on_escape(AdwNavigationView *self,
+                                              gboolean pop_on_escape) *)
+PROCEDURE adw_navigation_view_set_pop_on_escape
+              (self: AdwNavigationView; pop_on_escape: INTEGER);
+
+(* gboolean adw_navigation_view_get_hhomogeneous(AdwNavigationView *self) *)
+PROCEDURE adw_navigation_view_get_hhomogeneous (self: AdwNavigationView)
+                                                : INTEGER;
+
+(* void adw_navigation_view_set_hhomogeneous(AdwNavigationView *self,
+                                              gboolean hhomogeneous) *)
+PROCEDURE adw_navigation_view_set_hhomogeneous (self: AdwNavigationView;
+                                                hhomogeneous: INTEGER);
+
+(* gboolean adw_navigation_view_get_vhomogeneous(AdwNavigationView *self) *)
+PROCEDURE adw_navigation_view_get_vhomogeneous (self: AdwNavigationView)
+                                                : INTEGER;
+
+(* void adw_navigation_view_set_vhomogeneous(AdwNavigationView *self,
+                                              gboolean vhomogeneous) *)
+PROCEDURE adw_navigation_view_set_vhomogeneous (self: AdwNavigationView;
+                                                vhomogeneous: INTEGER);
+
+END AdwNavigationView.

+ 21 - 0
src/AdwPasswordEntryRow.def

@@ -0,0 +1,21 @@
+DEFINITION MODULE FOR "C" AdwPasswordEntryRow ;
+
+(*
+   m2-GTK4 - AdwPasswordEntryRow: an AdwEntryRow that masks its text and
+   offers a "peek" icon.  Mapped onto
+   <libadwaita-1/adw-password-entry-row.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwPasswordEntryRow,
+   adw_password_entry_row_new;
+
+TYPE
+   AdwPasswordEntryRow = ADDRESS;
+
+(* GtkWidget *adw_password_entry_row_new(void) *)
+PROCEDURE adw_password_entry_row_new () : AdwPasswordEntryRow;
+
+END AdwPasswordEntryRow.

+ 109 - 0
src/AdwSpinRow.def

@@ -0,0 +1,109 @@
+DEFINITION MODULE FOR "C" AdwSpinRow ;
+
+(*
+   m2-GTK4 - AdwSpinRow: a preferences row with an embedded spin button.
+   Mapped onto <libadwaita-1/adw-spin-row.h>.
+
+   adw_spin_row_get_update_policy()/set_update_policy() use the
+   AdwSpinRowUpdatePolicy values (ADW_SPIN_ROW_UPDATE_ALWAYS = 0,
+   ADW_SPIN_ROW_UPDATE_IF_MAPPED = 1).
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwSpinRow,
+   adw_spin_row_new, adw_spin_row_new_with_range, adw_spin_row_configure,
+   adw_spin_row_get_adjustment, adw_spin_row_set_adjustment,
+   adw_spin_row_get_climb_rate, adw_spin_row_set_climb_rate,
+   adw_spin_row_get_digits, adw_spin_row_set_digits,
+   adw_spin_row_get_value, adw_spin_row_set_value,
+   adw_spin_row_set_range,
+   adw_spin_row_get_numeric, adw_spin_row_set_numeric,
+   adw_spin_row_get_snap_to_ticks, adw_spin_row_set_snap_to_ticks,
+   adw_spin_row_get_wrap, adw_spin_row_set_wrap,
+   adw_spin_row_get_update_policy, adw_spin_row_set_update_policy,
+   adw_spin_row_update;
+
+TYPE
+   AdwSpinRow = ADDRESS;
+
+CONST
+   AdwSpinRowUpdateAlways    = 0;  (* ADW_SPIN_ROW_UPDATE_ALWAYS *)
+   AdwSpinRowUpdateIfMapped  = 1;  (* ADW_SPIN_ROW_UPDATE_IF_MAPPED *)
+
+(* GtkWidget *adw_spin_row_new(GtkAdjustment *adjustment, double climb_rate,
+                               guint digits) *)
+PROCEDURE adw_spin_row_new (adjustment: ADDRESS; climb_rate: REAL;
+                            digits: CARDINAL) : AdwSpinRow;
+
+(* GtkWidget *adw_spin_row_new_with_range(double min, double max,
+                                          double step) *)
+PROCEDURE adw_spin_row_new_with_range (min, max, step: REAL) : AdwSpinRow;
+
+(* void adw_spin_row_configure(AdwSpinRow *self, GtkAdjustment *adjustment,
+                               double climb_rate, guint digits) *)
+PROCEDURE adw_spin_row_configure (self: AdwSpinRow; adjustment: ADDRESS;
+                                  climb_rate: REAL; digits: CARDINAL);
+
+(* GtkAdjustment *adw_spin_row_get_adjustment(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_get_adjustment (self: AdwSpinRow) : ADDRESS;
+
+(* void adw_spin_row_set_adjustment(AdwSpinRow *self,
+                                    GtkAdjustment *adjustment) *)
+PROCEDURE adw_spin_row_set_adjustment (self: AdwSpinRow;
+                                       adjustment: ADDRESS);
+
+(* double adw_spin_row_get_climb_rate(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_get_climb_rate (self: AdwSpinRow) : REAL;
+
+(* void adw_spin_row_set_climb_rate(AdwSpinRow *self, double climb_rate) *)
+PROCEDURE adw_spin_row_set_climb_rate (self: AdwSpinRow; climb_rate: REAL);
+
+(* guint adw_spin_row_get_digits(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_get_digits (self: AdwSpinRow) : CARDINAL;
+
+(* void adw_spin_row_set_digits(AdwSpinRow *self, guint digits) *)
+PROCEDURE adw_spin_row_set_digits (self: AdwSpinRow; digits: CARDINAL);
+
+(* double adw_spin_row_get_value(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_get_value (self: AdwSpinRow) : REAL;
+
+(* void adw_spin_row_set_value(AdwSpinRow *self, double value) *)
+PROCEDURE adw_spin_row_set_value (self: AdwSpinRow; value: REAL);
+
+(* void adw_spin_row_set_range(AdwSpinRow *self, double min, double max) *)
+PROCEDURE adw_spin_row_set_range (self: AdwSpinRow; min, max: REAL);
+
+(* gboolean adw_spin_row_get_numeric(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_get_numeric (self: AdwSpinRow) : INTEGER;
+
+(* void adw_spin_row_set_numeric(AdwSpinRow *self, gboolean numeric) *)
+PROCEDURE adw_spin_row_set_numeric (self: AdwSpinRow; numeric: INTEGER);
+
+(* gboolean adw_spin_row_get_snap_to_ticks(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_get_snap_to_ticks (self: AdwSpinRow) : INTEGER;
+
+(* void adw_spin_row_set_snap_to_ticks(AdwSpinRow *self,
+                                       gboolean snap_to_ticks) *)
+PROCEDURE adw_spin_row_set_snap_to_ticks (self: AdwSpinRow;
+                                          snap_to_ticks: INTEGER);
+
+(* gboolean adw_spin_row_get_wrap(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_get_wrap (self: AdwSpinRow) : INTEGER;
+
+(* void adw_spin_row_set_wrap(AdwSpinRow *self, gboolean wrap) *)
+PROCEDURE adw_spin_row_set_wrap (self: AdwSpinRow; wrap: INTEGER);
+
+(* AdwSpinRowUpdatePolicy adw_spin_row_get_update_policy(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_get_update_policy (self: AdwSpinRow) : CARDINAL;
+
+(* void adw_spin_row_set_update_policy(AdwSpinRow *self,
+                                       AdwSpinRowUpdatePolicy policy) *)
+PROCEDURE adw_spin_row_set_update_policy (self: AdwSpinRow;
+                                          policy: CARDINAL);
+
+(* void adw_spin_row_update(AdwSpinRow *self) *)
+PROCEDURE adw_spin_row_update (self: AdwSpinRow);
+
+END AdwSpinRow.

+ 20 - 0
src/AdwSpinner.def

@@ -0,0 +1,20 @@
+DEFINITION MODULE FOR "C" AdwSpinner ;
+
+(*
+   m2-GTK4 - AdwSpinner: the Adwaita spinning progress indicator.
+   Mapped onto <libadwaita-1/adw-spinner.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwSpinner,
+   adw_spinner_new;
+
+TYPE
+   AdwSpinner = ADDRESS;
+
+(* GtkWidget *adw_spinner_new(void) *)
+PROCEDURE adw_spinner_new () : AdwSpinner;
+
+END AdwSpinner.

+ 31 - 0
src/AdwSpinnerPaintable.def

@@ -0,0 +1,31 @@
+DEFINITION MODULE FOR "C" AdwSpinnerPaintable ;
+
+(*
+   m2-GTK4 - AdwSpinnerPaintable: a GdkPaintable that renders the
+   Adwaita spinner for a given widget.  Mapped onto
+   <libadwaita-1/adw-spinner-paintable.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwSpinnerPaintable,
+   adw_spinner_paintable_new,
+   adw_spinner_paintable_get_widget, adw_spinner_paintable_set_widget;
+
+TYPE
+   AdwSpinnerPaintable = ADDRESS;
+
+(* GdkPaintable *adw_spinner_paintable_new(GtkWidget *widget) *)
+PROCEDURE adw_spinner_paintable_new (widget: ADDRESS) : AdwSpinnerPaintable;
+
+(* GtkWidget *adw_spinner_paintable_get_widget(AdwSpinnerPaintable *self) *)
+PROCEDURE adw_spinner_paintable_get_widget (self: AdwSpinnerPaintable)
+                                            : ADDRESS;
+
+(* void adw_spinner_paintable_set_widget(AdwSpinnerPaintable *self,
+                                         GtkWidget *widget) *)
+PROCEDURE adw_spinner_paintable_set_widget (self: AdwSpinnerPaintable;
+                                            widget: ADDRESS);
+
+END AdwSpinnerPaintable.

+ 108 - 0
src/AdwSplitButton.def

@@ -0,0 +1,108 @@
+DEFINITION MODULE FOR "C" AdwSplitButton ;
+
+(*
+   m2-GTK4 - AdwSplitButton: a button with a dropdown arrow that shows a
+   menu or popover.  Mapped onto <libadwaita-1/adw-split-button.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwSplitButton,
+   adw_split_button_new,
+   adw_split_button_get_label, adw_split_button_set_label,
+   adw_split_button_get_icon_name, adw_split_button_set_icon_name,
+   adw_split_button_get_child, adw_split_button_set_child,
+   adw_split_button_get_use_underline,
+   adw_split_button_set_use_underline,
+   adw_split_button_get_can_shrink, adw_split_button_set_can_shrink,
+   adw_split_button_get_direction, adw_split_button_set_direction,
+   adw_split_button_get_dropdown_tooltip,
+   adw_split_button_set_dropdown_tooltip,
+   adw_split_button_get_menu_model, adw_split_button_set_menu_model,
+   adw_split_button_get_popover, adw_split_button_set_popover,
+   adw_split_button_popup, adw_split_button_popdown;
+
+TYPE
+   AdwSplitButton = ADDRESS;
+
+(* GtkWidget *adw_split_button_new(void) *)
+PROCEDURE adw_split_button_new () : AdwSplitButton;
+
+(* const char *adw_split_button_get_label(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_label (self: AdwSplitButton) : ADDRESS;
+
+(* void adw_split_button_set_label(AdwSplitButton *self, const char *label) *)
+PROCEDURE adw_split_button_set_label (self: AdwSplitButton;
+                                      label: ARRAY OF CHAR);
+
+(* const char *adw_split_button_get_icon_name(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_icon_name (self: AdwSplitButton) : ADDRESS;
+
+(* void adw_split_button_set_icon_name(AdwSplitButton *self,
+                                       const char *icon_name) *)
+PROCEDURE adw_split_button_set_icon_name (self: AdwSplitButton;
+                                          icon_name: ARRAY OF CHAR);
+
+(* GtkWidget *adw_split_button_get_child(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_child (self: AdwSplitButton) : ADDRESS;
+
+(* void adw_split_button_set_child(AdwSplitButton *self, GtkWidget *child) *)
+PROCEDURE adw_split_button_set_child (self: AdwSplitButton; child: ADDRESS);
+
+(* gboolean adw_split_button_get_use_underline(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_use_underline (self: AdwSplitButton) : INTEGER;
+
+(* void adw_split_button_set_use_underline(AdwSplitButton *self,
+                                           gboolean use_underline) *)
+PROCEDURE adw_split_button_set_use_underline (self: AdwSplitButton;
+                                              use_underline: INTEGER);
+
+(* gboolean adw_split_button_get_can_shrink(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_can_shrink (self: AdwSplitButton) : INTEGER;
+
+(* void adw_split_button_set_can_shrink(AdwSplitButton *self,
+                                        gboolean can_shrink) *)
+PROCEDURE adw_split_button_set_can_shrink (self: AdwSplitButton;
+                                           can_shrink: INTEGER);
+
+(* GtkArrowType adw_split_button_get_direction(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_direction (self: AdwSplitButton) : CARDINAL;
+
+(* void adw_split_button_set_direction(AdwSplitButton *self,
+                                       GtkArrowType direction) *)
+PROCEDURE adw_split_button_set_direction (self: AdwSplitButton;
+                                          direction: CARDINAL);
+
+(* const char *adw_split_button_get_dropdown_tooltip(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_dropdown_tooltip (self: AdwSplitButton)
+                                                 : ADDRESS;
+
+(* void adw_split_button_set_dropdown_tooltip(AdwSplitButton *self,
+                                              const char *tooltip) *)
+PROCEDURE adw_split_button_set_dropdown_tooltip (self: AdwSplitButton;
+                                                 tooltip: ARRAY OF CHAR);
+
+(* GMenuModel *adw_split_button_get_menu_model(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_menu_model (self: AdwSplitButton) : ADDRESS;
+
+(* void adw_split_button_set_menu_model(AdwSplitButton *self,
+                                        GMenuModel *menu_model) *)
+PROCEDURE adw_split_button_set_menu_model (self: AdwSplitButton;
+                                           menu_model: ADDRESS);
+
+(* GtkPopover *adw_split_button_get_popover(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_get_popover (self: AdwSplitButton) : ADDRESS;
+
+(* void adw_split_button_set_popover(AdwSplitButton *self,
+                                     GtkPopover *popover) *)
+PROCEDURE adw_split_button_set_popover (self: AdwSplitButton;
+                                        popover: ADDRESS);
+
+(* void adw_split_button_popup(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_popup (self: AdwSplitButton);
+
+(* void adw_split_button_popdown(AdwSplitButton *self) *)
+PROCEDURE adw_split_button_popdown (self: AdwSplitButton);
+
+END AdwSplitButton.

+ 115 - 0
src/AdwSqueezer.def

@@ -0,0 +1,115 @@
+DEFINITION MODULE FOR "C" AdwSqueezer ;
+
+(*
+   m2-GTK4 - AdwSqueezer: a container that shows the largest child that
+   fits, transitioning between children as it grows/shrinks.  Mapped
+   onto <libadwaita-1/adw-squeezer.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+FROM AdwEnums IMPORT AdwSqueezerTransitionType, AdwFoldThresholdPolicy;
+
+EXPORT UNQUALIFIED
+   AdwSqueezer,
+   adw_squeezer_new,
+   adw_squeezer_add, adw_squeezer_remove,
+   adw_squeezer_get_page, adw_squeezer_get_pages,
+   adw_squeezer_get_visible_child, adw_squeezer_get_homogeneous,
+   adw_squeezer_set_homogeneous, adw_squeezer_get_allow_none,
+   adw_squeezer_set_allow_none, adw_squeezer_get_interpolate_size,
+   adw_squeezer_set_interpolate_size, adw_squeezer_get_transition_duration,
+   adw_squeezer_set_transition_duration, adw_squeezer_get_transition_type,
+   adw_squeezer_set_transition_type, adw_squeezer_get_transition_running,
+   adw_squeezer_get_switch_threshold_policy,
+   adw_squeezer_set_switch_threshold_policy,
+   adw_squeezer_get_xalign, adw_squeezer_set_xalign,
+   adw_squeezer_get_yalign, adw_squeezer_set_yalign;
+
+TYPE
+   AdwSqueezer = ADDRESS;
+
+(* GtkWidget *adw_squeezer_new(void) *)
+PROCEDURE adw_squeezer_new () : AdwSqueezer;
+
+(* AdwSqueezerPage *adw_squeezer_add(AdwSqueezer *self, GtkWidget *child) *)
+PROCEDURE adw_squeezer_add (self: AdwSqueezer; child: ADDRESS) : ADDRESS;
+
+(* void adw_squeezer_remove(AdwSqueezer *self, GtkWidget *child) *)
+PROCEDURE adw_squeezer_remove (self: AdwSqueezer; child: ADDRESS);
+
+(* AdwSqueezerPage *adw_squeezer_get_page(AdwSqueezer *self,
+                                           GtkWidget *child) *)
+PROCEDURE adw_squeezer_get_page (self: AdwSqueezer; child: ADDRESS) : ADDRESS;
+
+(* GtkSelectionModel *adw_squeezer_get_pages(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_pages (self: AdwSqueezer) : ADDRESS;
+
+(* GtkWidget *adw_squeezer_get_visible_child(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_visible_child (self: AdwSqueezer) : ADDRESS;
+
+(* gboolean adw_squeezer_get_homogeneous(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_homogeneous (self: AdwSqueezer) : INTEGER;
+
+(* void adw_squeezer_set_homogeneous(AdwSqueezer *self, gboolean homogeneous) *)
+PROCEDURE adw_squeezer_set_homogeneous (self: AdwSqueezer;
+                                        homogeneous: INTEGER);
+
+(* gboolean adw_squeezer_get_allow_none(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_allow_none (self: AdwSqueezer) : INTEGER;
+
+(* void adw_squeezer_set_allow_none(AdwSqueezer *self, gboolean allow_none) *)
+PROCEDURE adw_squeezer_set_allow_none (self: AdwSqueezer; allow_none: INTEGER);
+
+(* gboolean adw_squeezer_get_interpolate_size(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_interpolate_size (self: AdwSqueezer) : INTEGER;
+
+(* void adw_squeezer_set_interpolate_size(AdwSqueezer *self,
+                                          gboolean interpolate_size) *)
+PROCEDURE adw_squeezer_set_interpolate_size (self: AdwSqueezer;
+                                             interpolate_size: INTEGER);
+
+(* guint adw_squeezer_get_transition_duration(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_transition_duration (self: AdwSqueezer)
+                                                : CARDINAL;
+
+(* void adw_squeezer_set_transition_duration(AdwSqueezer *self,
+                                             guint duration) *)
+PROCEDURE adw_squeezer_set_transition_duration (self: AdwSqueezer;
+                                                duration: CARDINAL);
+
+(* AdwSqueezerTransitionType adw_squeezer_get_transition_type(
+        AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_transition_type (self: AdwSqueezer)
+                                            : AdwSqueezerTransitionType;
+
+(* void adw_squeezer_set_transition_type(AdwSqueezer *self,
+                                         AdwSqueezerTransitionType transition) *)
+PROCEDURE adw_squeezer_set_transition_type (self: AdwSqueezer;
+                                            transition: AdwSqueezerTransitionType);
+
+(* gboolean adw_squeezer_get_transition_running(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_transition_running (self: AdwSqueezer) : INTEGER;
+
+(* AdwFoldThresholdPolicy adw_squeezer_get_switch_threshold_policy(
+        AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_switch_threshold_policy (self: AdwSqueezer)
+                                                    : AdwFoldThresholdPolicy;
+
+(* void adw_squeezer_set_switch_threshold_policy(AdwSqueezer *self,
+                                                   AdwFoldThresholdPolicy policy) *)
+PROCEDURE adw_squeezer_set_switch_threshold_policy
+              (self: AdwSqueezer; policy: AdwFoldThresholdPolicy);
+
+(* float adw_squeezer_get_xalign(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_xalign (self: AdwSqueezer) : SHORTREAL;
+
+(* void adw_squeezer_set_xalign(AdwSqueezer *self, float xalign) *)
+PROCEDURE adw_squeezer_set_xalign (self: AdwSqueezer; xalign: SHORTREAL);
+
+(* float adw_squeezer_get_yalign(AdwSqueezer *self) *)
+PROCEDURE adw_squeezer_get_yalign (self: AdwSqueezer) : SHORTREAL;
+
+(* void adw_squeezer_set_yalign(AdwSqueezer *self, float yalign) *)
+PROCEDURE adw_squeezer_set_yalign (self: AdwSqueezer; yalign: SHORTREAL);
+
+END AdwSqueezer.

+ 29 - 0
src/AdwSqueezerPage.def

@@ -0,0 +1,29 @@
+DEFINITION MODULE FOR "C" AdwSqueezerPage ;
+
+(*
+   m2-GTK4 - AdwSqueezerPage: the per-child object of an AdwSqueezer.
+   Mapped onto <libadwaita-1/adw-squeezer.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwSqueezerPage,
+   adw_squeezer_page_get_child,
+   adw_squeezer_page_get_enabled, adw_squeezer_page_set_enabled;
+
+TYPE
+   AdwSqueezerPage = ADDRESS;
+
+(* GtkWidget *adw_squeezer_page_get_child(AdwSqueezerPage *self) *)
+PROCEDURE adw_squeezer_page_get_child (self: AdwSqueezerPage) : ADDRESS;
+
+(* gboolean adw_squeezer_page_get_enabled(AdwSqueezerPage *self) *)
+PROCEDURE adw_squeezer_page_get_enabled (self: AdwSqueezerPage) : INTEGER;
+
+(* void adw_squeezer_page_set_enabled(AdwSqueezerPage *self,
+                                      gboolean enabled) *)
+PROCEDURE adw_squeezer_page_set_enabled (self: AdwSqueezerPage;
+                                         enabled: INTEGER);
+
+END AdwSqueezerPage.

+ 137 - 0
src/AdwViewStack.def

@@ -0,0 +1,137 @@
+DEFINITION MODULE FOR "C" AdwViewStack ;
+
+(*
+   m2-GTK4 - AdwViewStack: a stack of pages with animated transitions,
+   the Adwaita counterpart of GtkStack.  Mapped onto
+   <libadwaita-1/adw-view-stack.h>.
+
+   Pages are added with add_named()/add_titled(); the visible page is
+   selected by widget or by name.  get_pages() returns the page model
+   that a view switcher binds to.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwViewStack,
+   adw_view_stack_new,
+   adw_view_stack_add, adw_view_stack_add_named, adw_view_stack_add_titled,
+   adw_view_stack_add_titled_with_icon,
+   adw_view_stack_remove, adw_view_stack_get_child_by_name,
+   adw_view_stack_get_page, adw_view_stack_get_pages,
+   adw_view_stack_get_visible_child, adw_view_stack_set_visible_child,
+   adw_view_stack_get_visible_child_name,
+   adw_view_stack_set_visible_child_name,
+   adw_view_stack_get_enable_transitions,
+   adw_view_stack_set_enable_transitions,
+   adw_view_stack_get_transition_duration,
+   adw_view_stack_set_transition_duration,
+   adw_view_stack_get_transition_running,
+   adw_view_stack_get_hhomogeneous, adw_view_stack_set_hhomogeneous,
+   adw_view_stack_get_vhomogeneous, adw_view_stack_set_vhomogeneous;
+
+TYPE
+   AdwViewStack = ADDRESS;
+
+(* GtkWidget *adw_view_stack_new(void) *)
+PROCEDURE adw_view_stack_new () : AdwViewStack;
+
+(* AdwViewStackPage *adw_view_stack_add(AdwViewStack *self,
+                                        GtkWidget *child) *)
+PROCEDURE adw_view_stack_add (self: AdwViewStack; child: ADDRESS)
+                              : ADDRESS;
+
+(* AdwViewStackPage *adw_view_stack_add_named(AdwViewStack *self,
+                                              GtkWidget *child,
+                                              const char *name) *)
+PROCEDURE adw_view_stack_add_named (self: AdwViewStack; child: ADDRESS;
+                                    name: ARRAY OF CHAR) : ADDRESS;
+
+(* AdwViewStackPage *adw_view_stack_add_titled(AdwViewStack *self,
+                                               GtkWidget *child,
+                                               const char *name,
+                                               const char *title) *)
+PROCEDURE adw_view_stack_add_titled (self: AdwViewStack; child: ADDRESS;
+                                     name, title: ARRAY OF CHAR) : ADDRESS;
+
+(* AdwViewStackPage *adw_view_stack_add_titled_with_icon(AdwViewStack *self,
+                                                          GtkWidget *child,
+                                                          const char *name,
+                                                          const char *title,
+                                                          const char *icon_name) *)
+PROCEDURE adw_view_stack_add_titled_with_icon (self: AdwViewStack;
+                                               child: ADDRESS;
+                                               name, title,
+                                               icon_name: ARRAY OF CHAR)
+                                              : ADDRESS;
+
+(* void adw_view_stack_remove(AdwViewStack *self, GtkWidget *child) *)
+PROCEDURE adw_view_stack_remove (self: AdwViewStack; child: ADDRESS);
+
+(* GtkWidget *adw_view_stack_get_child_by_name(AdwViewStack *self,
+                                               const char *name) *)
+PROCEDURE adw_view_stack_get_child_by_name (self: AdwViewStack;
+                                            name: ARRAY OF CHAR) : ADDRESS;
+
+(* AdwViewStackPage *adw_view_stack_get_page(AdwViewStack *self,
+                                             GtkWidget *child) *)
+PROCEDURE adw_view_stack_get_page (self: AdwViewStack; child: ADDRESS)
+                                   : ADDRESS;
+
+(* GtkSelectionModel *adw_view_stack_get_pages(AdwViewStack *self) *)
+PROCEDURE adw_view_stack_get_pages (self: AdwViewStack) : ADDRESS;
+
+(* GtkWidget *adw_view_stack_get_visible_child(AdwViewStack *self) *)
+PROCEDURE adw_view_stack_get_visible_child (self: AdwViewStack) : ADDRESS;
+
+(* void adw_view_stack_set_visible_child(AdwViewStack *self,
+                                         GtkWidget *child) *)
+PROCEDURE adw_view_stack_set_visible_child (self: AdwViewStack;
+                                            child: ADDRESS);
+
+(* const char *adw_view_stack_get_visible_child_name(AdwViewStack *self) *)
+PROCEDURE adw_view_stack_get_visible_child_name (self: AdwViewStack) : ADDRESS;
+
+(* void adw_view_stack_set_visible_child_name(AdwViewStack *self,
+                                              const char *name) *)
+PROCEDURE adw_view_stack_set_visible_child_name (self: AdwViewStack;
+                                                 name: ARRAY OF CHAR);
+
+(* gboolean adw_view_stack_get_enable_transitions(AdwViewStack *self) *)
+PROCEDURE adw_view_stack_get_enable_transitions (self: AdwViewStack) : INTEGER;
+
+(* void adw_view_stack_set_enable_transitions(AdwViewStack *self,
+                                              gboolean enable_transitions) *)
+PROCEDURE adw_view_stack_set_enable_transitions (self: AdwViewStack;
+                                                 enable_transitions: INTEGER);
+
+(* guint adw_view_stack_get_transition_duration(AdwViewStack *self) *)
+PROCEDURE adw_view_stack_get_transition_duration (self: AdwViewStack)
+                                                  : CARDINAL;
+
+(* void adw_view_stack_set_transition_duration(AdwViewStack *self,
+                                               guint duration) *)
+PROCEDURE adw_view_stack_set_transition_duration (self: AdwViewStack;
+                                                  duration: CARDINAL);
+
+(* gboolean adw_view_stack_get_transition_running(AdwViewStack *self) *)
+PROCEDURE adw_view_stack_get_transition_running (self: AdwViewStack)
+                                                 : INTEGER;
+
+(* gboolean adw_view_stack_get_hhomogeneous(AdwViewStack *self) *)
+PROCEDURE adw_view_stack_get_hhomogeneous (self: AdwViewStack) : INTEGER;
+
+(* void adw_view_stack_set_hhomogeneous(AdwViewStack *self,
+                                        gboolean hhomogeneous) *)
+PROCEDURE adw_view_stack_set_hhomogeneous (self: AdwViewStack;
+                                           hhomogeneous: INTEGER);
+
+(* gboolean adw_view_stack_get_vhomogeneous(AdwViewStack *self) *)
+PROCEDURE adw_view_stack_get_vhomogeneous (self: AdwViewStack) : INTEGER;
+
+(* void adw_view_stack_set_vhomogeneous(AdwViewStack *self,
+                                        gboolean vhomogeneous) *)
+PROCEDURE adw_view_stack_set_vhomogeneous (self: AdwViewStack;
+                                           vhomogeneous: INTEGER);
+
+END AdwViewStack.

+ 90 - 0
src/AdwViewStackPage.def

@@ -0,0 +1,90 @@
+DEFINITION MODULE FOR "C" AdwViewStackPage ;
+
+(*
+   m2-GTK4 - AdwViewStackPage: the per-page metadata object of an
+   AdwViewStack (title, icon, badge, attention dot).  Mapped onto
+   <libadwaita-1/adw-view-stack.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwViewStackPage,
+   adw_view_stack_page_get_child, adw_view_stack_page_get_name,
+   adw_view_stack_page_set_name,
+   adw_view_stack_page_get_title, adw_view_stack_page_set_title,
+   adw_view_stack_page_get_icon_name, adw_view_stack_page_set_icon_name,
+   adw_view_stack_page_get_use_underline,
+   adw_view_stack_page_set_use_underline,
+   adw_view_stack_page_get_needs_attention,
+   adw_view_stack_page_set_needs_attention,
+   adw_view_stack_page_get_badge_number,
+   adw_view_stack_page_set_badge_number,
+   adw_view_stack_page_get_visible, adw_view_stack_page_set_visible;
+
+TYPE
+   AdwViewStackPage = ADDRESS;
+
+(* GtkWidget *adw_view_stack_page_get_child(AdwViewStackPage *self) *)
+PROCEDURE adw_view_stack_page_get_child (self: AdwViewStackPage) : ADDRESS;
+
+(* const char *adw_view_stack_page_get_name(AdwViewStackPage *self) *)
+PROCEDURE adw_view_stack_page_get_name (self: AdwViewStackPage) : ADDRESS;
+
+(* void adw_view_stack_page_set_name(AdwViewStackPage *self,
+                                     const char *name) *)
+PROCEDURE adw_view_stack_page_set_name (self: AdwViewStackPage;
+                                        name: ARRAY OF CHAR);
+
+(* const char *adw_view_stack_page_get_title(AdwViewStackPage *self) *)
+PROCEDURE adw_view_stack_page_get_title (self: AdwViewStackPage) : ADDRESS;
+
+(* void adw_view_stack_page_set_title(AdwViewStackPage *self,
+                                      const char *title) *)
+PROCEDURE adw_view_stack_page_set_title (self: AdwViewStackPage;
+                                         title: ARRAY OF CHAR);
+
+(* const char *adw_view_stack_page_get_icon_name(AdwViewStackPage *self) *)
+PROCEDURE adw_view_stack_page_get_icon_name (self: AdwViewStackPage) : ADDRESS;
+
+(* void adw_view_stack_page_set_icon_name(AdwViewStackPage *self,
+                                          const char *icon_name) *)
+PROCEDURE adw_view_stack_page_set_icon_name (self: AdwViewStackPage;
+                                             icon_name: ARRAY OF CHAR);
+
+(* gboolean adw_view_stack_page_get_use_underline(AdwViewStackPage *self) *)
+PROCEDURE adw_view_stack_page_get_use_underline (self: AdwViewStackPage)
+                                                 : INTEGER;
+
+(* void adw_view_stack_page_set_use_underline(AdwViewStackPage *self,
+                                              gboolean use_underline) *)
+PROCEDURE adw_view_stack_page_set_use_underline (self: AdwViewStackPage;
+                                                 use_underline: INTEGER);
+
+(* gboolean adw_view_stack_page_get_needs_attention(AdwViewStackPage *self) *)
+PROCEDURE adw_view_stack_page_get_needs_attention (self: AdwViewStackPage)
+                                                   : INTEGER;
+
+(* void adw_view_stack_page_set_needs_attention(AdwViewStackPage *self,
+                                                gboolean needs_attention) *)
+PROCEDURE adw_view_stack_page_set_needs_attention (self: AdwViewStackPage;
+                                                   needs_attention: INTEGER);
+
+(* guint adw_view_stack_page_get_badge_number(AdwViewStackPage *self) *)
+PROCEDURE adw_view_stack_page_get_badge_number (self: AdwViewStackPage)
+                                                : CARDINAL;
+
+(* void adw_view_stack_page_set_badge_number(AdwViewStackPage *self,
+                                             guint badge_number) *)
+PROCEDURE adw_view_stack_page_set_badge_number (self: AdwViewStackPage;
+                                                badge_number: CARDINAL);
+
+(* gboolean adw_view_stack_page_get_visible(AdwViewStackPage *self) *)
+PROCEDURE adw_view_stack_page_get_visible (self: AdwViewStackPage) : INTEGER;
+
+(* void adw_view_stack_page_set_visible(AdwViewStackPage *self,
+                                        gboolean visible) *)
+PROCEDURE adw_view_stack_page_set_visible (self: AdwViewStackPage;
+                                           visible: INTEGER);
+
+END AdwViewStackPage.

+ 29 - 0
src/AdwViewStackPages.def

@@ -0,0 +1,29 @@
+DEFINITION MODULE FOR "C" AdwViewStackPages ;
+
+(*
+   m2-GTK4 - AdwViewStackPages: the GtkSelectionModel describing the
+   pages of an AdwViewStack (returned by adw_view_stack_get_pages()).
+   Mapped onto <libadwaita-1/adw-view-stack.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwViewStackPages,
+   adw_view_stack_pages_get_selected_page,
+   adw_view_stack_pages_set_selected_page;
+
+TYPE
+   AdwViewStackPages = ADDRESS;
+
+(* AdwViewStackPage *adw_view_stack_pages_get_selected_page(
+                        AdwViewStackPages *self) *)
+PROCEDURE adw_view_stack_pages_get_selected_page (self: AdwViewStackPages)
+                                                  : ADDRESS;
+
+(* void adw_view_stack_pages_set_selected_page(AdwViewStackPages *self,
+                                               AdwViewStackPage *page) *)
+PROCEDURE adw_view_stack_pages_set_selected_page (self: AdwViewStackPages;
+                                                  page: ADDRESS);
+
+END AdwViewStackPages.

+ 43 - 0
src/AdwViewSwitcher.def

@@ -0,0 +1,43 @@
+DEFINITION MODULE FOR "C" AdwViewSwitcher ;
+
+(*
+   m2-GTK4 - AdwViewSwitcher: a horizontal, icon-and-label switcher for
+   the pages of an AdwViewStack.  Mapped onto
+   <libadwaita-1/adw-view-switcher.h>.
+
+   The policy (narrow/wide) is chosen with the AdwViewSwitcherPolicy
+   constants from AdwEnums.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+FROM AdwEnums IMPORT AdwViewSwitcherPolicy;
+
+EXPORT UNQUALIFIED
+   AdwViewSwitcher,
+   adw_view_switcher_new,
+   adw_view_switcher_get_policy, adw_view_switcher_set_policy,
+   adw_view_switcher_get_stack, adw_view_switcher_set_stack;
+
+TYPE
+   AdwViewSwitcher = ADDRESS;
+
+(* GtkWidget *adw_view_switcher_new(void) *)
+PROCEDURE adw_view_switcher_new () : AdwViewSwitcher;
+
+(* AdwViewSwitcherPolicy adw_view_switcher_get_policy(AdwViewSwitcher *self) *)
+PROCEDURE adw_view_switcher_get_policy (self: AdwViewSwitcher)
+                                        : AdwViewSwitcherPolicy;
+
+(* void adw_view_switcher_set_policy(AdwViewSwitcher *self,
+                                     AdwViewSwitcherPolicy policy) *)
+PROCEDURE adw_view_switcher_set_policy (self: AdwViewSwitcher;
+                                        policy: AdwViewSwitcherPolicy);
+
+(* AdwViewStack *adw_view_switcher_get_stack(AdwViewSwitcher *self) *)
+PROCEDURE adw_view_switcher_get_stack (self: AdwViewSwitcher) : ADDRESS;
+
+(* void adw_view_switcher_set_stack(AdwViewSwitcher *self,
+                                    AdwViewStack *stack) *)
+PROCEDURE adw_view_switcher_set_stack (self: AdwViewSwitcher; stack: ADDRESS);
+
+END AdwViewSwitcher.

+ 40 - 0
src/AdwViewSwitcherBar.def

@@ -0,0 +1,40 @@
+DEFINITION MODULE FOR "C" AdwViewSwitcherBar ;
+
+(*
+   m2-GTK4 - AdwViewSwitcherBar: a bottom bar holding a view switcher,
+   typically revealed when the window is narrow.  Mapped onto
+   <libadwaita-1/adw-view-switcher-bar.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwViewSwitcherBar,
+   adw_view_switcher_bar_new,
+   adw_view_switcher_bar_get_reveal, adw_view_switcher_bar_set_reveal,
+   adw_view_switcher_bar_get_stack, adw_view_switcher_bar_set_stack;
+
+TYPE
+   AdwViewSwitcherBar = ADDRESS;
+
+(* GtkWidget *adw_view_switcher_bar_new(void) *)
+PROCEDURE adw_view_switcher_bar_new () : AdwViewSwitcherBar;
+
+(* gboolean adw_view_switcher_bar_get_reveal(AdwViewSwitcherBar *self) *)
+PROCEDURE adw_view_switcher_bar_get_reveal (self: AdwViewSwitcherBar)
+                                            : INTEGER;
+
+(* void adw_view_switcher_bar_set_reveal(AdwViewSwitcherBar *self,
+                                          gboolean reveal) *)
+PROCEDURE adw_view_switcher_bar_set_reveal (self: AdwViewSwitcherBar;
+                                            reveal: INTEGER);
+
+(* AdwViewStack *adw_view_switcher_bar_get_stack(AdwViewSwitcherBar *self) *)
+PROCEDURE adw_view_switcher_bar_get_stack (self: AdwViewSwitcherBar) : ADDRESS;
+
+(* void adw_view_switcher_bar_set_stack(AdwViewSwitcherBar *self,
+                                         AdwViewStack *stack) *)
+PROCEDURE adw_view_switcher_bar_set_stack (self: AdwViewSwitcherBar;
+                                           stack: ADDRESS);
+
+END AdwViewSwitcherBar.

+ 72 - 0
src/AdwViewSwitcherTitle.def

@@ -0,0 +1,72 @@
+DEFINITION MODULE FOR "C" AdwViewSwitcherTitle ;
+
+(*
+   m2-GTK4 - AdwViewSwitcherTitle: a window title that turns into a view
+   switcher, or hides it, depending on the available width.  Mapped onto
+   <libadwaita-1/adw-view-switcher-title.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwViewSwitcherTitle,
+   adw_view_switcher_title_new,
+   adw_view_switcher_title_get_title, adw_view_switcher_title_set_title,
+   adw_view_switcher_title_get_subtitle,
+   adw_view_switcher_title_set_subtitle,
+   adw_view_switcher_title_get_stack, adw_view_switcher_title_set_stack,
+   adw_view_switcher_title_get_view_switcher_enabled,
+   adw_view_switcher_title_set_view_switcher_enabled,
+   adw_view_switcher_title_get_title_visible;
+
+TYPE
+   AdwViewSwitcherTitle = ADDRESS;
+
+(* GtkWidget *adw_view_switcher_title_new(void) *)
+PROCEDURE adw_view_switcher_title_new () : AdwViewSwitcherTitle;
+
+(* const char *adw_view_switcher_title_get_title(AdwViewSwitcherTitle *self) *)
+PROCEDURE adw_view_switcher_title_get_title (self: AdwViewSwitcherTitle)
+                                             : ADDRESS;
+
+(* void adw_view_switcher_title_set_title(AdwViewSwitcherTitle *self,
+                                           const char *title) *)
+PROCEDURE adw_view_switcher_title_set_title (self: AdwViewSwitcherTitle;
+                                             title: ARRAY OF CHAR);
+
+(* const char *adw_view_switcher_title_get_subtitle(
+                 AdwViewSwitcherTitle *self) *)
+PROCEDURE adw_view_switcher_title_get_subtitle (self: AdwViewSwitcherTitle)
+                                                : ADDRESS;
+
+(* void adw_view_switcher_title_set_subtitle(AdwViewSwitcherTitle *self,
+                                              const char *subtitle) *)
+PROCEDURE adw_view_switcher_title_set_subtitle (self: AdwViewSwitcherTitle;
+                                                subtitle: ARRAY OF CHAR);
+
+(* AdwViewStack *adw_view_switcher_title_get_stack(
+                   AdwViewSwitcherTitle *self) *)
+PROCEDURE adw_view_switcher_title_get_stack (self: AdwViewSwitcherTitle)
+                                             : ADDRESS;
+
+(* void adw_view_switcher_title_set_stack(AdwViewSwitcherTitle *self,
+                                           AdwViewStack *stack) *)
+PROCEDURE adw_view_switcher_title_set_stack (self: AdwViewSwitcherTitle;
+                                             stack: ADDRESS);
+
+(* gboolean adw_view_switcher_title_get_view_switcher_enabled(
+              AdwViewSwitcherTitle *self) *)
+PROCEDURE adw_view_switcher_title_get_view_switcher_enabled
+              (self: AdwViewSwitcherTitle) : INTEGER;
+
+(* void adw_view_switcher_title_set_view_switcher_enabled(
+          AdwViewSwitcherTitle *self, gboolean enabled) *)
+PROCEDURE adw_view_switcher_title_set_view_switcher_enabled
+              (self: AdwViewSwitcherTitle; enabled: INTEGER);
+
+(* gboolean adw_view_switcher_title_get_title_visible(
+              AdwViewSwitcherTitle *self) *)
+PROCEDURE adw_view_switcher_title_get_title_visible
+              (self: AdwViewSwitcherTitle) : INTEGER;
+
+END AdwViewSwitcherTitle.

+ 51 - 0
src/AdwWindow.def

@@ -0,0 +1,51 @@
+DEFINITION MODULE FOR "C" AdwWindow ;
+
+(*
+   m2-GTK4 - AdwWindow: a GtkWindow with Adwaita behaviour and support
+   for adaptive breakpoints.  Mapped onto
+   <libadwaita-1/adw-window.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwWindow,
+   adw_window_new,
+   adw_window_get_content, adw_window_set_content,
+   adw_window_add_breakpoint, adw_window_get_current_breakpoint,
+   adw_window_get_dialogs, adw_window_get_visible_dialog,
+   adw_window_get_adaptive_preview, adw_window_set_adaptive_preview;
+
+TYPE
+   AdwWindow = ADDRESS;
+
+(* GtkWidget *adw_window_new(void) *)
+PROCEDURE adw_window_new () : AdwWindow;
+
+(* GtkWidget *adw_window_get_content(AdwWindow *self) *)
+PROCEDURE adw_window_get_content (self: AdwWindow) : ADDRESS;
+
+(* void adw_window_set_content(AdwWindow *self, GtkWidget *content) *)
+PROCEDURE adw_window_set_content (self: AdwWindow; content: ADDRESS);
+
+(* void adw_window_add_breakpoint(AdwWindow *self, AdwBreakpoint *breakpoint) *)
+PROCEDURE adw_window_add_breakpoint (self: AdwWindow; breakpoint: ADDRESS);
+
+(* AdwBreakpoint *adw_window_get_current_breakpoint(AdwWindow *self) *)
+PROCEDURE adw_window_get_current_breakpoint (self: AdwWindow) : ADDRESS;
+
+(* GListModel *adw_window_get_dialogs(AdwWindow *self) *)
+PROCEDURE adw_window_get_dialogs (self: AdwWindow) : ADDRESS;
+
+(* AdwDialog *adw_window_get_visible_dialog(AdwWindow *self) *)
+PROCEDURE adw_window_get_visible_dialog (self: AdwWindow) : ADDRESS;
+
+(* gboolean adw_window_get_adaptive_preview(AdwWindow *self) *)
+PROCEDURE adw_window_get_adaptive_preview (self: AdwWindow) : INTEGER;
+
+(* void adw_window_set_adaptive_preview(AdwWindow *self,
+                                        gboolean adaptive_preview) *)
+PROCEDURE adw_window_set_adaptive_preview (self: AdwWindow;
+                                           adaptive_preview: INTEGER);
+
+END AdwWindow.

+ 39 - 0
src/AdwWindowTitle.def

@@ -0,0 +1,39 @@
+DEFINITION MODULE FOR "C" AdwWindowTitle ;
+
+(*
+   m2-GTK4 - AdwWindowTitle: a title/subtitle pair with the Adwaita
+   window-title ellipsizing behaviour.  Mapped onto
+   <libadwaita-1/adw-window-title.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+
+EXPORT UNQUALIFIED
+   AdwWindowTitle,
+   adw_window_title_new,
+   adw_window_title_get_title, adw_window_title_set_title,
+   adw_window_title_get_subtitle, adw_window_title_set_subtitle;
+
+TYPE
+   AdwWindowTitle = ADDRESS;
+
+(* GtkWidget *adw_window_title_new(const char *title, const char *subtitle) *)
+PROCEDURE adw_window_title_new (title, subtitle: ARRAY OF CHAR)
+                                : AdwWindowTitle;
+
+(* const char *adw_window_title_get_title(AdwWindowTitle *self) *)
+PROCEDURE adw_window_title_get_title (self: AdwWindowTitle) : ADDRESS;
+
+(* void adw_window_title_set_title(AdwWindowTitle *self, const char *title) *)
+PROCEDURE adw_window_title_set_title (self: AdwWindowTitle;
+                                      title: ARRAY OF CHAR);
+
+(* const char *adw_window_title_get_subtitle(AdwWindowTitle *self) *)
+PROCEDURE adw_window_title_get_subtitle (self: AdwWindowTitle) : ADDRESS;
+
+(* void adw_window_title_set_subtitle(AdwWindowTitle *self,
+                                      const char *subtitle) *)
+PROCEDURE adw_window_title_set_subtitle (self: AdwWindowTitle;
+                                         subtitle: ARRAY OF CHAR);
+
+END AdwWindowTitle.

+ 162 - 0
src/AdwWrapBox.def

@@ -0,0 +1,162 @@
+DEFINITION MODULE FOR "C" AdwWrapBox ;
+
+(*
+   m2-GTK4 - AdwWrapBox: a box whose children wrap onto multiple lines.
+   Mapped onto <libadwaita-1/adw-wrap-box.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+FROM AdwEnums IMPORT AdwJustifyMode, AdwWrapPolicy, AdwPackDirection,
+   AdwLengthUnit;
+
+EXPORT UNQUALIFIED
+   AdwWrapBox,
+   adw_wrap_box_new,
+   adw_wrap_box_append, adw_wrap_box_prepend,
+   adw_wrap_box_insert_child_after, adw_wrap_box_reorder_child_after,
+   adw_wrap_box_remove,
+   adw_wrap_box_get_justify, adw_wrap_box_set_justify,
+   adw_wrap_box_get_justify_last_line, adw_wrap_box_set_justify_last_line,
+   adw_wrap_box_get_wrap_policy, adw_wrap_box_set_wrap_policy,
+   adw_wrap_box_get_wrap_reverse, adw_wrap_box_set_wrap_reverse,
+   adw_wrap_box_get_align, adw_wrap_box_set_align,
+   adw_wrap_box_get_pack_direction, adw_wrap_box_set_pack_direction,
+   adw_wrap_box_get_line_homogeneous, adw_wrap_box_set_line_homogeneous,
+   adw_wrap_box_get_line_spacing, adw_wrap_box_set_line_spacing,
+   adw_wrap_box_get_line_spacing_unit, adw_wrap_box_set_line_spacing_unit,
+   adw_wrap_box_get_child_spacing, adw_wrap_box_set_child_spacing,
+   adw_wrap_box_get_child_spacing_unit, adw_wrap_box_set_child_spacing_unit,
+   adw_wrap_box_get_natural_line_length,
+   adw_wrap_box_set_natural_line_length,
+   adw_wrap_box_get_natural_line_length_unit,
+   adw_wrap_box_set_natural_line_length_unit;
+
+TYPE
+   AdwWrapBox = ADDRESS;
+
+(* GtkWidget *adw_wrap_box_new(void) *)
+PROCEDURE adw_wrap_box_new () : AdwWrapBox;
+
+(* void adw_wrap_box_append(AdwWrapBox *self, GtkWidget *child) *)
+PROCEDURE adw_wrap_box_append (self: AdwWrapBox; child: ADDRESS);
+
+(* void adw_wrap_box_prepend(AdwWrapBox *self, GtkWidget *child) *)
+PROCEDURE adw_wrap_box_prepend (self: AdwWrapBox; child: ADDRESS);
+
+(* void adw_wrap_box_insert_child_after(AdwWrapBox *self, GtkWidget *child,
+                                        GtkWidget *sibling) *)
+PROCEDURE adw_wrap_box_insert_child_after (self: AdwWrapBox; child,
+                                           sibling: ADDRESS);
+
+(* void adw_wrap_box_reorder_child_after(AdwWrapBox *self, GtkWidget *child,
+                                         GtkWidget *sibling) *)
+PROCEDURE adw_wrap_box_reorder_child_after (self: AdwWrapBox; child,
+                                            sibling: ADDRESS);
+
+(* void adw_wrap_box_remove(AdwWrapBox *self, GtkWidget *child) *)
+PROCEDURE adw_wrap_box_remove (self: AdwWrapBox; child: ADDRESS);
+
+(* AdwJustifyMode adw_wrap_box_get_justify(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_justify (self: AdwWrapBox) : AdwJustifyMode;
+
+(* void adw_wrap_box_set_justify(AdwWrapBox *self, AdwJustifyMode justify) *)
+PROCEDURE adw_wrap_box_set_justify (self: AdwWrapBox;
+                                    justify: AdwJustifyMode);
+
+(* gboolean adw_wrap_box_get_justify_last_line(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_justify_last_line (self: AdwWrapBox) : INTEGER;
+
+(* void adw_wrap_box_set_justify_last_line(AdwWrapBox *self,
+                                           gboolean justify_last_line) *)
+PROCEDURE adw_wrap_box_set_justify_last_line (self: AdwWrapBox;
+                                              justify_last_line: INTEGER);
+
+(* AdwWrapPolicy adw_wrap_box_get_wrap_policy(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_wrap_policy (self: AdwWrapBox) : AdwWrapPolicy;
+
+(* void adw_wrap_box_set_wrap_policy(AdwWrapBox *self,
+                                     AdwWrapPolicy wrap_policy) *)
+PROCEDURE adw_wrap_box_set_wrap_policy (self: AdwWrapBox;
+                                        wrap_policy: AdwWrapPolicy);
+
+(* gboolean adw_wrap_box_get_wrap_reverse(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_wrap_reverse (self: AdwWrapBox) : INTEGER;
+
+(* void adw_wrap_box_set_wrap_reverse(AdwWrapBox *self,
+                                      gboolean wrap_reverse) *)
+PROCEDURE adw_wrap_box_set_wrap_reverse (self: AdwWrapBox;
+                                         wrap_reverse: INTEGER);
+
+(* float adw_wrap_box_get_align(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_align (self: AdwWrapBox) : SHORTREAL;
+
+(* void adw_wrap_box_set_align(AdwWrapBox *self, float align) *)
+PROCEDURE adw_wrap_box_set_align (self: AdwWrapBox; align: SHORTREAL);
+
+(* AdwPackDirection adw_wrap_box_get_pack_direction(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_pack_direction (self: AdwWrapBox)
+                                           : AdwPackDirection;
+
+(* void adw_wrap_box_set_pack_direction(AdwWrapBox *self,
+                                        AdwPackDirection pack_direction) *)
+PROCEDURE adw_wrap_box_set_pack_direction (self: AdwWrapBox;
+                                           pack_direction: AdwPackDirection);
+
+(* gboolean adw_wrap_box_get_line_homogeneous(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_line_homogeneous (self: AdwWrapBox) : INTEGER;
+
+(* void adw_wrap_box_set_line_homogeneous(AdwWrapBox *self,
+                                          gboolean homogeneous) *)
+PROCEDURE adw_wrap_box_set_line_homogeneous (self: AdwWrapBox;
+                                             homogeneous: INTEGER);
+
+(* int adw_wrap_box_get_line_spacing(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_line_spacing (self: AdwWrapBox) : INTEGER;
+
+(* void adw_wrap_box_set_line_spacing(AdwWrapBox *self, int line_spacing) *)
+PROCEDURE adw_wrap_box_set_line_spacing (self: AdwWrapBox;
+                                         line_spacing: INTEGER);
+
+(* AdwLengthUnit adw_wrap_box_get_line_spacing_unit(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_line_spacing_unit (self: AdwWrapBox)
+                                              : AdwLengthUnit;
+
+(* void adw_wrap_box_set_line_spacing_unit(AdwWrapBox *self,
+                                           AdwLengthUnit unit) *)
+PROCEDURE adw_wrap_box_set_line_spacing_unit (self: AdwWrapBox;
+                                              unit: AdwLengthUnit);
+
+(* int adw_wrap_box_get_child_spacing(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_child_spacing (self: AdwWrapBox) : INTEGER;
+
+(* void adw_wrap_box_set_child_spacing(AdwWrapBox *self, int child_spacing) *)
+PROCEDURE adw_wrap_box_set_child_spacing (self: AdwWrapBox;
+                                          child_spacing: INTEGER);
+
+(* AdwLengthUnit adw_wrap_box_get_child_spacing_unit(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_child_spacing_unit (self: AdwWrapBox)
+                                               : AdwLengthUnit;
+
+(* void adw_wrap_box_set_child_spacing_unit(AdwWrapBox *self,
+                                            AdwLengthUnit unit) *)
+PROCEDURE adw_wrap_box_set_child_spacing_unit (self: AdwWrapBox;
+                                               unit: AdwLengthUnit);
+
+(* int adw_wrap_box_get_natural_line_length(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_natural_line_length (self: AdwWrapBox) : INTEGER;
+
+(* void adw_wrap_box_set_natural_line_length(AdwWrapBox *self,
+                                             int natural_line_length) *)
+PROCEDURE adw_wrap_box_set_natural_line_length (self: AdwWrapBox;
+                                                natural_line_length: INTEGER);
+
+(* AdwLengthUnit adw_wrap_box_get_natural_line_length_unit(AdwWrapBox *self) *)
+PROCEDURE adw_wrap_box_get_natural_line_length_unit (self: AdwWrapBox)
+                                                     : AdwLengthUnit;
+
+(* void adw_wrap_box_set_natural_line_length_unit(AdwWrapBox *self,
+                                                  AdwLengthUnit unit) *)
+PROCEDURE adw_wrap_box_set_natural_line_length_unit (self: AdwWrapBox;
+                                                     unit: AdwLengthUnit);
+
+END AdwWrapBox.

+ 153 - 0
src/AdwWrapLayout.def

@@ -0,0 +1,153 @@
+DEFINITION MODULE FOR "C" AdwWrapLayout ;
+
+(*
+   m2-GTK4 - AdwWrapLayout: the GtkLayoutManager used by AdwWrapBox to
+   lay children out on wrapping lines.  Mapped onto
+   <libadwaita-1/adw-wrap-box.h>.
+*)
+
+FROM SYSTEM IMPORT ADDRESS;
+FROM AdwEnums IMPORT AdwJustifyMode, AdwWrapPolicy, AdwPackDirection,
+   AdwLengthUnit;
+
+EXPORT UNQUALIFIED
+   AdwWrapLayout,
+   adw_wrap_layout_new,
+   adw_wrap_layout_get_justify, adw_wrap_layout_set_justify,
+   adw_wrap_layout_get_justify_last_line,
+   adw_wrap_layout_set_justify_last_line,
+   adw_wrap_layout_get_wrap_policy, adw_wrap_layout_set_wrap_policy,
+   adw_wrap_layout_get_wrap_reverse, adw_wrap_layout_set_wrap_reverse,
+   adw_wrap_layout_get_align, adw_wrap_layout_set_align,
+   adw_wrap_layout_get_pack_direction, adw_wrap_layout_set_pack_direction,
+   adw_wrap_layout_get_line_homogeneous,
+   adw_wrap_layout_set_line_homogeneous,
+   adw_wrap_layout_get_line_spacing, adw_wrap_layout_set_line_spacing,
+   adw_wrap_layout_get_line_spacing_unit,
+   adw_wrap_layout_set_line_spacing_unit,
+   adw_wrap_layout_get_child_spacing, adw_wrap_layout_set_child_spacing,
+   adw_wrap_layout_get_child_spacing_unit,
+   adw_wrap_layout_set_child_spacing_unit,
+   adw_wrap_layout_get_natural_line_length,
+   adw_wrap_layout_set_natural_line_length,
+   adw_wrap_layout_get_natural_line_length_unit,
+   adw_wrap_layout_set_natural_line_length_unit;
+
+TYPE
+   AdwWrapLayout = ADDRESS;
+
+(* GtkLayoutManager *adw_wrap_layout_new(void) *)
+PROCEDURE adw_wrap_layout_new () : AdwWrapLayout;
+
+(* AdwJustifyMode adw_wrap_layout_get_justify(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_justify (self: AdwWrapLayout) : AdwJustifyMode;
+
+(* void adw_wrap_layout_set_justify(AdwWrapLayout *self,
+                                    AdwJustifyMode justify) *)
+PROCEDURE adw_wrap_layout_set_justify (self: AdwWrapLayout;
+                                       justify: AdwJustifyMode);
+
+(* gboolean adw_wrap_layout_get_justify_last_line(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_justify_last_line (self: AdwWrapLayout)
+                                                 : INTEGER;
+
+(* void adw_wrap_layout_set_justify_last_line(AdwWrapLayout *self,
+                                              gboolean justify_last_line) *)
+PROCEDURE adw_wrap_layout_set_justify_last_line (self: AdwWrapLayout;
+                                                 justify_last_line: INTEGER);
+
+(* AdwWrapPolicy adw_wrap_layout_get_wrap_policy(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_wrap_policy (self: AdwWrapLayout)
+                                           : AdwWrapPolicy;
+
+(* void adw_wrap_layout_set_wrap_policy(AdwWrapLayout *self,
+                                        AdwWrapPolicy wrap_policy) *)
+PROCEDURE adw_wrap_layout_set_wrap_policy (self: AdwWrapLayout;
+                                           wrap_policy: AdwWrapPolicy);
+
+(* gboolean adw_wrap_layout_get_wrap_reverse(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_wrap_reverse (self: AdwWrapLayout) : INTEGER;
+
+(* void adw_wrap_layout_set_wrap_reverse(AdwWrapLayout *self,
+                                         gboolean wrap_reverse) *)
+PROCEDURE adw_wrap_layout_set_wrap_reverse (self: AdwWrapLayout;
+                                            wrap_reverse: INTEGER);
+
+(* float adw_wrap_layout_get_align(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_align (self: AdwWrapLayout) : SHORTREAL;
+
+(* void adw_wrap_layout_set_align(AdwWrapLayout *self, float align) *)
+PROCEDURE adw_wrap_layout_set_align (self: AdwWrapLayout; align: SHORTREAL);
+
+(* AdwPackDirection adw_wrap_layout_get_pack_direction(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_pack_direction (self: AdwWrapLayout)
+                                              : AdwPackDirection;
+
+(* void adw_wrap_layout_set_pack_direction(AdwWrapLayout *self,
+                                           AdwPackDirection pack_direction) *)
+PROCEDURE adw_wrap_layout_set_pack_direction (self: AdwWrapLayout;
+                                              pack_direction: AdwPackDirection);
+
+(* gboolean adw_wrap_layout_get_line_homogeneous(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_line_homogeneous (self: AdwWrapLayout)
+                                                : INTEGER;
+
+(* void adw_wrap_layout_set_line_homogeneous(AdwWrapLayout *self,
+                                             gboolean homogeneous) *)
+PROCEDURE adw_wrap_layout_set_line_homogeneous (self: AdwWrapLayout;
+                                                homogeneous: INTEGER);
+
+(* int adw_wrap_layout_get_line_spacing(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_line_spacing (self: AdwWrapLayout) : INTEGER;
+
+(* void adw_wrap_layout_set_line_spacing(AdwWrapLayout *self,
+                                         int line_spacing) *)
+PROCEDURE adw_wrap_layout_set_line_spacing (self: AdwWrapLayout;
+                                            line_spacing: INTEGER);
+
+(* AdwLengthUnit adw_wrap_layout_get_line_spacing_unit(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_line_spacing_unit (self: AdwWrapLayout)
+                                                 : AdwLengthUnit;
+
+(* void adw_wrap_layout_set_line_spacing_unit(AdwWrapLayout *self,
+                                              AdwLengthUnit unit) *)
+PROCEDURE adw_wrap_layout_set_line_spacing_unit (self: AdwWrapLayout;
+                                                 unit: AdwLengthUnit);
+
+(* int adw_wrap_layout_get_child_spacing(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_child_spacing (self: AdwWrapLayout) : INTEGER;
+
+(* void adw_wrap_layout_set_child_spacing(AdwWrapLayout *self,
+                                          int child_spacing) *)
+PROCEDURE adw_wrap_layout_set_child_spacing (self: AdwWrapLayout;
+                                             child_spacing: INTEGER);
+
+(* AdwLengthUnit adw_wrap_layout_get_child_spacing_unit(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_child_spacing_unit (self: AdwWrapLayout)
+                                                  : AdwLengthUnit;
+
+(* void adw_wrap_layout_set_child_spacing_unit(AdwWrapLayout *self,
+                                               AdwLengthUnit unit) *)
+PROCEDURE adw_wrap_layout_set_child_spacing_unit (self: AdwWrapLayout;
+                                                  unit: AdwLengthUnit);
+
+(* int adw_wrap_layout_get_natural_line_length(AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_natural_line_length (self: AdwWrapLayout)
+                                                   : INTEGER;
+
+(* void adw_wrap_layout_set_natural_line_length(AdwWrapLayout *self,
+                                                int natural_line_length) *)
+PROCEDURE adw_wrap_layout_set_natural_line_length
+              (self: AdwWrapLayout; natural_line_length: INTEGER);
+
+(* AdwLengthUnit adw_wrap_layout_get_natural_line_length_unit(
+        AdwWrapLayout *self) *)
+PROCEDURE adw_wrap_layout_get_natural_line_length_unit
+              (self: AdwWrapLayout) : AdwLengthUnit;
+
+(* void adw_wrap_layout_set_natural_line_length_unit(AdwWrapLayout *self,
+                                                     AdwLengthUnit unit) *)
+PROCEDURE adw_wrap_layout_set_natural_line_length_unit
+              (self: AdwWrapLayout; unit: AdwLengthUnit);
+
+END AdwWrapLayout.

+ 2 - 2
tests/run_tests.sh

@@ -17,7 +17,7 @@ TESTS="test_glib test_version test_widgets test_inputs test_inputs2 test_contain
 if pkg-config --exists libadwaita-1 2>/dev/null; then
   CFLAGS="$CFLAGS $(pkg-config --cflags libadwaita-1)"
   LIBS="$LIBS $(pkg-config --libs libadwaita-1)"
-  TESTS="$TESTS test_adw"
+  TESTS="$TESTS test_adw test_adw_widgets"
 fi
 
 # OpenGL (GtkGLArea examples/tests).
@@ -63,7 +63,7 @@ for t in $TESTS; do
        "$ROOT/tests/$t.mod" "$OBJ/GtkUtils.o" "$OBJ/GtkClosures.o" \
        "$OBJ/m2gtkshim.o" $DEMO_OBJS -o "$BIN/$t" $LIBS
   case "$t" in
-    test_widgets|test_inputs|test_inputs2|test_containers|test_containers2|test_actions|test_closure|test_headerbar|test_filedialog|test_views|test_builder|test_utility|test_css|test_popover|test_dialogs|test_models|test_drawing|test_gestures|test_models2|test_widgets3|test_shim|test_shim2|test_shim3|test_dnd|test_media|test_gl|test_print|test_text|test_expr|test_constraints|test_shortcuts|test_snapshot|test_lastwidgets|test_adw|test_application|test_demos) needs_display=1 ;;
+    test_widgets|test_inputs|test_inputs2|test_containers|test_containers2|test_actions|test_closure|test_headerbar|test_filedialog|test_views|test_builder|test_utility|test_css|test_popover|test_dialogs|test_models|test_drawing|test_gestures|test_models2|test_widgets3|test_shim|test_shim2|test_shim3|test_dnd|test_media|test_gl|test_print|test_text|test_expr|test_constraints|test_shortcuts|test_snapshot|test_lastwidgets|test_adw|test_application|test_demos|test_adw_widgets) needs_display=1 ;;
     *) needs_display=0 ;;
   esac
   if [ "$needs_display" = 1 ] && [ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ]; then

+ 222 - 0
tests/test_adw_widgets.mod

@@ -0,0 +1,222 @@
+MODULE test_adw_widgets ;
+
+(*
+   m2-GTK4 test - the newly bound libadwaita (GNOME) widgets: view
+   stack/switchers, navigation view, adaptive containers, rows, avatar
+   and friends.  Requires a display.
+*)
+
+FROM GtkApplication IMPORT gtk_application_new;
+FROM Gio IMPORT g_application_run, g_application_quit;
+FROM GtkWindow IMPORT gtk_window_set_title, gtk_window_set_default_size,
+   gtk_window_present;
+FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
+FROM GtkEnums IMPORT GtkVertical;
+FROM GtkLabel IMPORT gtk_label_new;
+FROM GtkUtils IMPORT Connect;
+FROM AdwWindow IMPORT adw_window_new, adw_window_set_content;
+FROM AdwViewStack IMPORT adw_view_stack_new, adw_view_stack_add_titled,
+   adw_view_stack_add_titled_with_icon, adw_view_stack_set_visible_child_name,
+   adw_view_stack_get_visible_child_name;
+FROM AdwViewSwitcher IMPORT adw_view_switcher_new,
+   adw_view_switcher_set_stack, adw_view_switcher_get_policy;
+FROM AdwViewSwitcherBar IMPORT adw_view_switcher_bar_new,
+   adw_view_switcher_bar_set_stack, adw_view_switcher_bar_set_reveal;
+FROM AdwViewSwitcherTitle IMPORT adw_view_switcher_title_new,
+   adw_view_switcher_title_set_title, adw_view_switcher_title_set_subtitle,
+   adw_view_switcher_title_set_stack;
+FROM AdwInlineViewSwitcher IMPORT adw_inline_view_switcher_new,
+   adw_inline_view_switcher_set_stack,
+   adw_inline_view_switcher_set_display_mode;
+FROM AdwEnums IMPORT AdwInlineViewSwitcherLabels;
+FROM AdwNavigationView IMPORT adw_navigation_view_new,
+   adw_navigation_view_push, adw_navigation_view_get_visible_page,
+   adw_navigation_view_pop;
+FROM AdwNavigationPage IMPORT adw_navigation_page_new;
+FROM AdwWindowTitle IMPORT adw_window_title_new;
+FROM AdwBin IMPORT adw_bin_new, adw_bin_set_child;
+FROM AdwSpinner IMPORT adw_spinner_new;
+FROM AdwSpinnerPaintable IMPORT adw_spinner_paintable_new;
+FROM AdwAvatar IMPORT adw_avatar_new;
+FROM AdwButtonContent IMPORT adw_button_content_new,
+   adw_button_content_set_label, adw_button_content_set_icon_name;
+FROM AdwSplitButton IMPORT adw_split_button_new, adw_split_button_set_label;
+FROM AdwButtonRow IMPORT adw_button_row_new,
+   adw_button_row_set_start_icon_name, adw_button_row_set_end_icon_name;
+FROM AdwSpinRow IMPORT adw_spin_row_new_with_range;
+FROM AdwPasswordEntryRow IMPORT adw_password_entry_row_new;
+FROM AdwClampScrollable IMPORT adw_clamp_scrollable_new,
+   adw_clamp_scrollable_set_maximum_size;
+FROM AdwClampLayout IMPORT adw_clamp_layout_new;
+FROM AdwSqueezer IMPORT adw_squeezer_new, adw_squeezer_add;
+FROM AdwWrapBox IMPORT adw_wrap_box_new, adw_wrap_box_append;
+FROM AdwWrapLayout IMPORT adw_wrap_layout_new;
+FROM SYSTEM IMPORT ADDRESS, ADR;
+FROM libc IMPORT printf;
+
+CONST
+   AppId = "org.example.m2gtk4.TestAdwWidgets";
+
+VAR
+   app: ADDRESS;
+   passed: BOOLEAN;
+   failures: INTEGER;
+
+PROCEDURE Check (cond: BOOLEAN; what: ARRAY OF CHAR);
+BEGIN
+   IF cond THEN
+      printf("  ok - %s\n", what)
+   ELSE
+      printf("  NOT OK - %s\n", what);
+      INC(failures)
+   END
+END Check;
+
+PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
+VAR
+   window, box, stack, p1, p2, switcher, bar, title, inl, nav, np1, np2: ADDRESS;
+   clamp, cliplayout, wrap, wraplayout, squeeze, avatar: ADDRESS;
+   content, split, brow, spin, pw, bin, spinner, sp, wt: ADDRESS;
+   visible: ADDRESS;
+BEGIN
+   failures := 0;
+
+   (* AdwViewStack + pages + switchers *)
+   stack := adw_view_stack_new();
+   p1 := adw_view_stack_add_titled (stack, gtk_label_new("One"),
+                                    "one", "Page One");
+   p2 := adw_view_stack_add_titled_with_icon (stack, gtk_label_new("Two"),
+                                              "two", "Page Two",
+                                              "go-home-symbolic");
+   Check((stack # NIL) AND (p1 # NIL) AND (p2 # NIL), "AdwViewStack pages");
+
+   adw_view_stack_set_visible_child_name (stack, "two");
+   visible := adw_view_stack_get_visible_child_name (stack);
+   Check(visible # NIL, "AdwViewStack visible page name");
+
+   switcher := adw_view_switcher_new();
+   adw_view_switcher_set_stack (switcher, stack);
+   Check(adw_view_switcher_get_policy (switcher) = 0, "AdwViewSwitcher policy");
+
+   bar := adw_view_switcher_bar_new();
+   adw_view_switcher_bar_set_stack (bar, stack);
+   adw_view_switcher_bar_set_reveal (bar, 1);
+   Check(bar # NIL, "AdwViewSwitcherBar");
+
+   title := adw_view_switcher_title_new();
+   adw_view_switcher_title_set_title (title, "Demo");
+   adw_view_switcher_title_set_subtitle (title, "GNOME widgets");
+   adw_view_switcher_title_set_stack (title, stack);
+   Check(title # NIL, "AdwViewSwitcherTitle");
+
+   inl := adw_inline_view_switcher_new();
+   adw_inline_view_switcher_set_stack (inl, stack);
+   adw_inline_view_switcher_set_display_mode (inl, AdwInlineViewSwitcherLabels);
+   Check(inl # NIL, "AdwInlineViewSwitcher");
+
+   (* AdwNavigationView *)
+   nav := adw_navigation_view_new();
+   np1 := adw_navigation_page_new (gtk_label_new("Root"), "Root");
+   adw_navigation_view_push (nav, np1);
+   np2 := adw_navigation_page_new (gtk_label_new("Child"), "Child");
+   adw_navigation_view_push (nav, np2);
+   Check(adw_navigation_view_get_visible_page (nav) = np2,
+         "AdwNavigationView push");
+   Check(adw_navigation_view_pop (nav) # 0, "AdwNavigationView pop");
+   Check(adw_navigation_view_get_visible_page (nav) = np1,
+         "AdwNavigationView visible after pop");
+
+   (* adaptive containers *)
+   clamp := adw_clamp_scrollable_new();
+   adw_clamp_scrollable_set_maximum_size (clamp, 400);
+   Check(clamp # NIL, "AdwClampScrollable");
+
+   cliplayout := adw_clamp_layout_new();
+   Check(cliplayout # NIL, "AdwClampLayout");
+
+   wrap := adw_wrap_box_new();
+   adw_wrap_box_append (wrap, gtk_label_new("a"));
+   adw_wrap_box_append (wrap, gtk_label_new("b"));
+   Check(wrap # NIL, "AdwWrapBox");
+
+   wraplayout := adw_wrap_layout_new();
+   Check(wraplayout # NIL, "AdwWrapLayout");
+
+   squeeze := adw_squeezer_new();
+   visible := adw_squeezer_add (squeeze, gtk_label_new("wide"));
+   visible := adw_squeezer_add (squeeze, gtk_label_new("narrow"));
+   Check(squeeze # NIL, "AdwSqueezer");
+
+   (* rows and misc *)
+   avatar := adw_avatar_new (32, "Eric", 1);
+   Check(avatar # NIL, "AdwAvatar");
+
+   content := adw_button_content_new();
+   adw_button_content_set_icon_name (content, "go-home-symbolic");
+   adw_button_content_set_label (content, "Home");
+   Check(content # NIL, "AdwButtonContent");
+
+   split := adw_split_button_new();
+   adw_split_button_set_label (split, "Split");
+   Check(split # NIL, "AdwSplitButton");
+
+   brow := adw_button_row_new();
+   adw_button_row_set_start_icon_name (brow, "go-home-symbolic");
+   adw_button_row_set_end_icon_name (brow, "go-next-symbolic");
+   Check(brow # NIL, "AdwButtonRow");
+
+   spin := adw_spin_row_new_with_range (0.0, 10.0, 1.0);
+   Check(spin # NIL, "AdwSpinRow");
+
+   pw := adw_password_entry_row_new();
+   Check(pw # NIL, "AdwPasswordEntryRow");
+
+   bin := adw_bin_new();
+   adw_bin_set_child (bin, gtk_label_new("bin"));
+   Check(bin # NIL, "AdwBin");
+
+   spinner := adw_spinner_new();
+   sp := adw_spinner_paintable_new (spinner);
+   Check((spinner # NIL) AND (sp # NIL), "AdwSpinner / AdwSpinnerPaintable");
+
+   wt := adw_window_title_new ("Title", "Subtitle");
+   Check(wt # NIL, "AdwWindowTitle");
+
+   (* put a few of them in the window *)
+   box := gtk_box_new (GtkVertical, 12);
+   gtk_box_append (box, gtk_label_new("libadwaita widgets"));
+   gtk_box_append (box, avatar);
+   gtk_box_append (box, split);
+   gtk_box_append (box, spinner);
+
+   window := adw_window_new();
+   gtk_window_set_title (window, "Adw widgets");
+   gtk_window_set_default_size (window, 360, 300);
+   adw_window_set_content (window, box);
+   gtk_window_present (window);
+
+   passed := (failures = 0);
+   g_application_quit (application)
+END OnActivate;
+
+VAR
+   rc: INTEGER;
+BEGIN
+   passed := FALSE;
+   failures := 0;
+   app := gtk_application_new(AppId, 0);
+   IF app = NIL THEN
+      printf("test_adw_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_adw_widgets: PASS\n");
+      HALT(0)
+   ELSE
+      printf("test_adw_widgets: FAIL\n");
+      HALT(1)
+   END
+END test_adw_widgets.