Migrate chez-qt to jerboa-qt: 2 libs (jerboa-qt ffi + jerboa-qt qt), 796 FFI bindings. C bridge renamed jerboa_qt_shim.c. 26 examples updated. Qt6 detected via pkg-config. Source 2/2 transpile clean; shim build needs gerbil-qt vendor archive (libqt_shim).

ober

d779f2762b9980c459d62d12c3406e2777b83933

diff --git a/.gitignore b/.gitignore
index 6c1c914..f002dc2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 *.so
 *.wpo
+.jerbuild-hashes
diff --git a/Makefile b/Makefile
index 8753a29..247fbcb 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,7 @@
-# chez-qt — Chez Scheme bindings for Qt6
-#
-# Depends on gerbil-qt for the C++ shim (vendor/qt_shim.h + vendor/libqt_shim.so)
+JERBOA_HOME ?= $(HOME)/mine/jerboa
+SCHEME      ?= $(JERBOA_HOME)/.chez/bin/scheme
+JERBUILD    ?= $(JERBOA_HOME)/jerbuild
+LIBDIRS      = lib:$(JERBOA_HOME)/lib
 
 GERBIL_QT_DIR := $(HOME)/mine/gerbil-qt
 VENDOR_DIR    := $(GERBIL_QT_DIR)/vendor
@@ -8,27 +9,49 @@ VENDOR_DIR    := $(GERBIL_QT_DIR)/vendor
 QT_CFLAGS  := $(shell pkg-config --cflags Qt6Widgets 2>/dev/null)
 QT_LIBS    := $(shell pkg-config --libs Qt6Widgets 2>/dev/null || echo "-lQt6Widgets")
 
-CC       ?= gcc
-CFLAGS   ?= -O2 -fPIC -Wall
-SCHEME   ?= scheme
+CC ?= cc
+CFLAGS ?= -O2 -fPIC -Wall
 
-export CHEZ_QT_LIB := $(CURDIR)
-export LD_LIBRARY_PATH := $(VENDOR_DIR):$(LD_LIBRARY_PATH)
+UNAME_S := $(shell uname -s)
+ifeq ($(UNAME_S),Darwin)
+  SHARED_FLAG = -dynamiclib
+  SO_EXT      = .so
+  LD_VAR      = DYLD_LIBRARY_PATH
+else
+  SHARED_FLAG = -shared
+  SO_EXT      = .so
+  LD_VAR      = LD_LIBRARY_PATH
+endif
 
-.PHONY: all clean test libs
+SHIM := jerboa_qt_shim$(SO_EXT)
 
-all: qt_chez_shim.so libs
+.PHONY: all build transpile test clean shim vendor-check
 
-qt_chez_shim.so: qt_chez_shim.c $(VENDOR_DIR)/qt_shim.h
-	$(CC) $(CFLAGS) -I$(VENDOR_DIR) -shared -o $@ $< \
+all: build
+
+vendor-check:
+	@if [ ! -f $(VENDOR_DIR)/qt_shim.h ] || [ ! -f $(VENDOR_DIR)/libqt_shim$(SO_EXT) ]; then \
+	  echo "WARN: gerbil-qt vendor missing (expected $(VENDOR_DIR))."; \
+	  echo "WARN: skip shim build."; exit 1; \
+	fi
+
+shim: vendor-check $(SHIM)
+
+$(SHIM): jerboa_qt_shim.c $(VENDOR_DIR)/qt_shim.h
+	$(CC) $(CFLAGS) $(SHARED_FLAG) -I$(VENDOR_DIR) -o $@ $< \
 		-L$(VENDOR_DIR) -lqt_shim -Wl,-rpath,$(VENDOR_DIR) $(QT_LIBS)
 
-libs: qt_chez_shim.so
-	$(SCHEME) --libdirs . --compile-imported-libraries --program compile-libs.ss
+transpile:
+	$(JERBUILD) transpile src lib --force
+
+build: transpile shim
 
-test: all
-	QT_QPA_PLATFORM=offscreen $(SCHEME) --libdirs . --script qt-test.ss
+test: build
+	JERBOA_QT_LIB=$(CURDIR) \
+	$(LD_VAR)=$(CURDIR):$(VENDOR_DIR) \
+	QT_QPA_PLATFORM=offscreen \
+	$(SCHEME) --libdirs "$(LIBDIRS)" --script tests/qt-test.ss
 
 clean:
-	rm -f qt_chez_shim.so
-	rm -f chez-qt/*.so
+	rm -f $(SHIM) qt_chez_shim.so
+	rm -rf lib
diff --git a/chez-qt/ffi.ss b/chez-qt/ffi.ss
deleted file mode 100644
index ffa3e38..0000000
--- a/chez-qt/ffi.ss
+++ /dev/null
@@ -1,3314 +0,0 @@
-;;; ffi.ss — Low-level FFI bindings to Qt via qt_shim + qt_chez_shim
-;;;
-;;; Loads shared libraries and defines foreign-procedure bindings.
-;;; The high-level API lives in qt.ss.
-
-(library (chez-qt ffi)
-  (export
-    ;; Callback registration (called once at init)
-    ffi-set-void-callback ffi-set-string-callback
-    ffi-set-int-callback ffi-set-bool-callback
-
-    ;; Application lifecycle
-    ffi-qt-app-create ffi-qt-app-exec ffi-qt-app-quit
-    ffi-qt-app-process-events ffi-qt-app-destroy ffi-qt-app-is-running
-
-    ;; Widget base
-    ffi-qt-widget-create ffi-qt-widget-show ffi-qt-widget-hide
-    ffi-qt-widget-close ffi-qt-widget-set-enabled ffi-qt-widget-is-enabled
-    ffi-qt-widget-set-visible ffi-qt-widget-is-visible
-    ffi-qt-widget-set-updates-enabled ffi-qt-widget-set-attribute
-    ffi-qt-send-key-event
-    ffi-qt-widget-set-fixed-size ffi-qt-widget-set-minimum-size
-    ffi-qt-widget-set-maximum-size
-    ffi-qt-widget-set-minimum-width ffi-qt-widget-set-minimum-height
-    ffi-qt-widget-set-maximum-width ffi-qt-widget-set-maximum-height
-    ffi-qt-widget-set-cursor ffi-qt-widget-unset-cursor
-    ffi-qt-widget-resize ffi-qt-widget-set-style-sheet
-    ffi-qt-widget-set-tooltip ffi-qt-widget-set-font-size
-    ffi-qt-widget-destroy
-
-    ;; Main Window
-    ffi-qt-main-window-create ffi-qt-main-window-set-title
-    ffi-qt-main-window-set-central-widget
-
-    ;; Layouts
-    ffi-qt-vbox-layout-create ffi-qt-hbox-layout-create
-    ffi-qt-layout-add-widget ffi-qt-layout-add-stretch
-    ffi-qt-layout-set-spacing ffi-qt-layout-set-margins
-
-    ;; Labels
-    ffi-qt-label-create ffi-qt-label-set-text ffi-qt-label-text
-    ffi-qt-label-set-alignment ffi-qt-label-set-word-wrap
-
-    ;; Push Button
-    ffi-qt-push-button-create ffi-qt-push-button-set-text
-    ffi-qt-push-button-text ffi-qt-push-button-on-clicked
-
-    ;; Line Edit
-    ffi-qt-line-edit-create ffi-qt-line-edit-set-text ffi-qt-line-edit-text
-    ffi-qt-line-edit-set-placeholder ffi-qt-line-edit-set-read-only
-    ffi-qt-line-edit-set-echo-mode
-    ffi-qt-line-edit-on-text-changed ffi-qt-line-edit-on-return-pressed
-
-    ;; Check Box
-    ffi-qt-check-box-create ffi-qt-check-box-set-text
-    ffi-qt-check-box-set-checked ffi-qt-check-box-is-checked
-    ffi-qt-check-box-on-toggled
-
-    ;; Combo Box
-    ffi-qt-combo-box-create ffi-qt-combo-box-add-item
-    ffi-qt-combo-box-set-current-index ffi-qt-combo-box-current-index
-    ffi-qt-combo-box-current-text ffi-qt-combo-box-count
-    ffi-qt-combo-box-clear ffi-qt-combo-box-on-current-index-changed
-
-    ;; Text Edit
-    ffi-qt-text-edit-create ffi-qt-text-edit-set-text ffi-qt-text-edit-text
-    ffi-qt-text-edit-set-placeholder ffi-qt-text-edit-set-read-only
-    ffi-qt-text-edit-append ffi-qt-text-edit-clear
-    ffi-qt-text-edit-scroll-to-bottom ffi-qt-text-edit-html
-    ffi-qt-text-edit-on-text-changed
-
-    ;; Spin Box
-    ffi-qt-spin-box-create ffi-qt-spin-box-set-value ffi-qt-spin-box-value
-    ffi-qt-spin-box-set-range ffi-qt-spin-box-set-single-step
-    ffi-qt-spin-box-set-prefix ffi-qt-spin-box-set-suffix
-    ffi-qt-spin-box-on-value-changed
-
-    ;; Dialog
-    ffi-qt-dialog-create ffi-qt-dialog-exec ffi-qt-dialog-accept
-    ffi-qt-dialog-reject ffi-qt-dialog-set-title
-
-    ;; Message Box
-    ffi-qt-message-box-information ffi-qt-message-box-warning
-    ffi-qt-message-box-question ffi-qt-message-box-critical
-
-    ;; File Dialog
-    ffi-qt-file-dialog-open-file ffi-qt-file-dialog-save-file
-    ffi-qt-file-dialog-open-directory
-
-    ;; Menu Bar
-    ffi-qt-main-window-menu-bar
-
-    ;; Menu
-    ffi-qt-menu-bar-add-menu ffi-qt-menu-add-menu
-    ffi-qt-menu-add-action ffi-qt-menu-add-separator
-
-    ;; Action
-    ffi-qt-action-create ffi-qt-action-set-text ffi-qt-action-text
-    ffi-qt-action-set-shortcut ffi-qt-action-set-enabled ffi-qt-action-is-enabled
-    ffi-qt-action-set-checkable ffi-qt-action-is-checkable
-    ffi-qt-action-set-checked ffi-qt-action-is-checked
-    ffi-qt-action-set-tooltip ffi-qt-action-set-status-tip
-    ffi-qt-action-on-triggered ffi-qt-action-on-toggled
-
-    ;; Toolbar
-    ffi-qt-toolbar-create ffi-qt-main-window-add-toolbar
-    ffi-qt-toolbar-add-action ffi-qt-toolbar-add-separator
-    ffi-qt-toolbar-add-widget ffi-qt-toolbar-set-movable
-    ffi-qt-toolbar-set-icon-size
-
-    ;; Status Bar
-    ffi-qt-main-window-set-status-bar-text
-
-    ;; Grid Layout
-    ffi-qt-grid-layout-create ffi-qt-grid-layout-add-widget
-    ffi-qt-grid-layout-set-row-stretch ffi-qt-grid-layout-set-column-stretch
-    ffi-qt-grid-layout-set-row-minimum-height
-    ffi-qt-grid-layout-set-column-minimum-width
-
-    ;; Timer
-    ffi-qt-timer-create ffi-qt-timer-start ffi-qt-timer-stop
-    ffi-qt-timer-set-single-shot ffi-qt-timer-is-active
-    ffi-qt-timer-interval ffi-qt-timer-set-interval
-    ffi-qt-timer-on-timeout ffi-qt-timer-single-shot
-    ffi-qt-timer-destroy
-
-    ;; Clipboard
-    ffi-qt-clipboard-text ffi-qt-clipboard-set-text
-    ffi-qt-clipboard-on-changed
-
-    ;; Tree Widget
-    ffi-qt-tree-widget-create ffi-qt-tree-widget-set-column-count
-    ffi-qt-tree-widget-column-count ffi-qt-tree-widget-set-header-label
-    ffi-qt-tree-widget-set-header-item-text
-    ffi-qt-tree-widget-add-top-level-item ffi-qt-tree-widget-top-level-item-count
-    ffi-qt-tree-widget-top-level-item ffi-qt-tree-widget-current-item
-    ffi-qt-tree-widget-set-current-item
-    ffi-qt-tree-widget-expand-item ffi-qt-tree-widget-collapse-item
-    ffi-qt-tree-widget-expand-all ffi-qt-tree-widget-collapse-all
-    ffi-qt-tree-widget-clear
-    ffi-qt-tree-widget-on-current-item-changed
-    ffi-qt-tree-widget-on-item-double-clicked
-    ffi-qt-tree-widget-on-item-expanded ffi-qt-tree-widget-on-item-collapsed
-
-    ;; Tree Widget Item
-    ffi-qt-tree-item-create ffi-qt-tree-item-set-text ffi-qt-tree-item-text
-    ffi-qt-tree-item-add-child ffi-qt-tree-item-child-count
-    ffi-qt-tree-item-child ffi-qt-tree-item-parent
-    ffi-qt-tree-item-set-expanded ffi-qt-tree-item-is-expanded
-
-    ;; List Widget
-    ffi-qt-list-widget-create ffi-qt-list-widget-add-item
-    ffi-qt-list-widget-insert-item ffi-qt-list-widget-remove-item
-    ffi-qt-list-widget-current-row ffi-qt-list-widget-set-current-row
-    ffi-qt-list-widget-item-text ffi-qt-list-widget-count
-    ffi-qt-list-widget-clear
-    ffi-qt-list-widget-set-item-data ffi-qt-list-widget-item-data
-    ffi-qt-list-widget-on-current-row-changed
-    ffi-qt-list-widget-on-item-double-clicked
-
-    ;; Table Widget
-    ffi-qt-table-widget-create ffi-qt-table-widget-set-item
-    ffi-qt-table-widget-item-text
-    ffi-qt-table-widget-set-horizontal-header-item
-    ffi-qt-table-widget-set-vertical-header-item
-    ffi-qt-table-widget-set-row-count ffi-qt-table-widget-set-column-count
-    ffi-qt-table-widget-row-count ffi-qt-table-widget-column-count
-    ffi-qt-table-widget-current-row ffi-qt-table-widget-current-column
-    ffi-qt-table-widget-clear ffi-qt-table-widget-on-cell-clicked
-
-    ;; Tab Widget
-    ffi-qt-tab-widget-create ffi-qt-tab-widget-add-tab
-    ffi-qt-tab-widget-set-current-index ffi-qt-tab-widget-current-index
-    ffi-qt-tab-widget-count ffi-qt-tab-widget-set-tab-text
-    ffi-qt-tab-widget-on-current-changed
-
-    ;; Progress Bar
-    ffi-qt-progress-bar-create ffi-qt-progress-bar-set-value
-    ffi-qt-progress-bar-value ffi-qt-progress-bar-set-range
-    ffi-qt-progress-bar-set-format
-
-    ;; Slider
-    ffi-qt-slider-create ffi-qt-slider-set-value ffi-qt-slider-value
-    ffi-qt-slider-set-range ffi-qt-slider-set-single-step
-    ffi-qt-slider-set-tick-interval ffi-qt-slider-set-tick-position
-    ffi-qt-slider-on-value-changed
-
-    ;; Window State
-    ffi-qt-widget-show-minimized ffi-qt-widget-show-maximized
-    ffi-qt-widget-show-fullscreen ffi-qt-widget-show-normal
-    ffi-qt-widget-window-state ffi-qt-widget-move
-    ffi-qt-widget-x ffi-qt-widget-y ffi-qt-widget-width ffi-qt-widget-height
-    ffi-qt-widget-set-focus
-
-    ;; App Style Sheet
-    ffi-qt-app-set-style-sheet
-
-    ;; Scroll Area
-    ffi-qt-scroll-area-create ffi-qt-scroll-area-set-widget
-    ffi-qt-scroll-area-set-widget-resizable
-    ffi-qt-scroll-area-set-horizontal-scrollbar-policy
-    ffi-qt-scroll-area-set-vertical-scrollbar-policy
-
-    ;; Splitter
-    ffi-qt-splitter-create ffi-qt-splitter-add-widget
-    ffi-qt-splitter-insert-widget ffi-qt-splitter-index-of
-    ffi-qt-splitter-widget ffi-qt-splitter-count
-    ffi-qt-splitter-set-sizes-2 ffi-qt-splitter-set-sizes-3 ffi-qt-splitter-set-sizes-4 ffi-qt-splitter-size-at
-    ffi-qt-splitter-set-stretch-factor ffi-qt-splitter-set-handle-width
-    ffi-qt-splitter-set-collapsible ffi-qt-splitter-is-collapsible
-    ffi-qt-splitter-set-orientation
-
-    ;; Keyboard Events
-    ffi-qt-install-key-handler ffi-qt-install-key-handler-consuming
-    ffi-qt-last-key-code ffi-qt-last-key-modifiers ffi-qt-last-key-text
-    ffi-qt-last-key-autorepeat
-
-    ;; Pixmap
-    ffi-qt-pixmap-load ffi-qt-pixmap-width ffi-qt-pixmap-height
-    ffi-qt-pixmap-is-null ffi-qt-pixmap-scaled ffi-qt-pixmap-destroy
-    ffi-qt-pixmap-save ffi-qt-widget-grab
-    ffi-qt-label-set-pixmap
-
-    ;; Icon
-    ffi-qt-icon-create ffi-qt-icon-create-from-pixmap
-    ffi-qt-icon-is-null ffi-qt-icon-destroy
-    ffi-qt-push-button-set-icon ffi-qt-action-set-icon
-    ffi-qt-widget-set-window-icon
-
-    ;; Radio Button
-    ffi-qt-radio-button-create ffi-qt-radio-button-text
-    ffi-qt-radio-button-set-text
-    ffi-qt-radio-button-is-checked ffi-qt-radio-button-set-checked
-    ffi-qt-radio-button-on-toggled
-
-    ;; Button Group
-    ffi-qt-button-group-create ffi-qt-button-group-add-button
-    ffi-qt-button-group-remove-button ffi-qt-button-group-checked-id
-    ffi-qt-button-group-set-exclusive ffi-qt-button-group-is-exclusive
-    ffi-qt-button-group-on-clicked ffi-qt-button-group-destroy
-
-    ;; Group Box
-    ffi-qt-group-box-create ffi-qt-group-box-title
-    ffi-qt-group-box-set-title
-    ffi-qt-group-box-set-checkable ffi-qt-group-box-is-checkable
-    ffi-qt-group-box-set-checked ffi-qt-group-box-is-checked
-    ffi-qt-group-box-on-toggled
-
-    ;; Font
-    ffi-qt-font-create ffi-qt-font-family ffi-qt-font-point-size
-    ffi-qt-font-is-bold ffi-qt-font-set-bold
-    ffi-qt-font-is-italic ffi-qt-font-set-italic
-    ffi-qt-font-destroy ffi-qt-widget-set-font ffi-qt-widget-font
-
-    ;; Color
-    ffi-qt-color-create ffi-qt-color-create-name
-    ffi-qt-color-red ffi-qt-color-green ffi-qt-color-blue ffi-qt-color-alpha
-    ffi-qt-color-name ffi-qt-color-is-valid ffi-qt-color-destroy
-
-    ;; Constants
-    ffi-qt-const-align-left ffi-qt-const-align-right ffi-qt-const-align-center
-    ffi-qt-const-align-top ffi-qt-const-align-bottom
-    ffi-qt-const-echo-normal ffi-qt-const-echo-no-echo
-    ffi-qt-const-echo-password ffi-qt-const-echo-password-on-edit
-    ffi-qt-const-horizontal ffi-qt-const-vertical
-    ffi-qt-const-ticks-none ffi-qt-const-ticks-above
-    ffi-qt-const-ticks-below ffi-qt-const-ticks-both-sides
-    ffi-qt-const-window-no-state ffi-qt-const-window-minimized
-    ffi-qt-const-window-maximized ffi-qt-const-window-full-screen
-    ffi-qt-const-scrollbar-as-needed ffi-qt-const-scrollbar-always-off
-    ffi-qt-const-scrollbar-always-on
-    ffi-qt-const-cursor-arrow ffi-qt-const-cursor-cross
-    ffi-qt-const-cursor-wait ffi-qt-const-cursor-ibeam
-    ffi-qt-const-cursor-pointing-hand ffi-qt-const-cursor-forbidden
-    ffi-qt-const-cursor-busy
-
-    ;; Frame constants
-    ffi-qt-const-frame-no-frame ffi-qt-const-frame-box ffi-qt-const-frame-panel
-    ffi-qt-const-frame-win-panel ffi-qt-const-frame-hline ffi-qt-const-frame-vline
-    ffi-qt-const-frame-styled-panel
-    ffi-qt-const-frame-plain ffi-qt-const-frame-raised ffi-qt-const-frame-sunken
-
-    ;; Button box constants
-    ffi-qt-const-button-ok ffi-qt-const-button-cancel ffi-qt-const-button-apply
-    ffi-qt-const-button-close ffi-qt-const-button-yes ffi-qt-const-button-no
-    ffi-qt-const-button-reset ffi-qt-const-button-help ffi-qt-const-button-save
-    ffi-qt-const-button-discard
-    ffi-qt-const-button-role-invalid ffi-qt-const-button-role-accept
-    ffi-qt-const-button-role-reject ffi-qt-const-button-role-destructive
-    ffi-qt-const-button-role-action ffi-qt-const-button-role-help
-    ffi-qt-const-button-role-yes ffi-qt-const-button-role-no
-    ffi-qt-const-button-role-apply ffi-qt-const-button-role-reset
-
-    ;; Day-of-week constants
-    ffi-qt-const-monday ffi-qt-const-tuesday ffi-qt-const-wednesday
-    ffi-qt-const-thursday ffi-qt-const-friday ffi-qt-const-saturday ffi-qt-const-sunday
-
-    ;; Settings constants
-    ffi-qt-const-settings-native ffi-qt-const-settings-ini
-
-    ;; Completer constants
-    ffi-qt-const-completer-popup ffi-qt-const-completer-inline
-    ffi-qt-const-completer-unfiltered-popup
-
-    ;; Case sensitivity
-    ffi-qt-const-case-insensitive ffi-qt-const-case-sensitive
-
-    ;; Match filter mode
-    ffi-qt-const-match-starts-with ffi-qt-const-match-contains
-    ffi-qt-const-match-ends-with
-
-    ;; Validator state
-    ffi-qt-const-validator-invalid ffi-qt-const-validator-intermediate
-    ffi-qt-const-validator-acceptable
-
-    ;; PlainTextEdit wrap
-    ffi-qt-const-plain-no-wrap ffi-qt-const-plain-widget-wrap
-
-    ;; ToolButton constants
-    ffi-qt-const-delayed-popup ffi-qt-const-menu-button-popup ffi-qt-const-instant-popup
-    ffi-qt-const-no-arrow ffi-qt-const-up-arrow ffi-qt-const-down-arrow
-    ffi-qt-const-left-arrow ffi-qt-const-right-arrow
-    ffi-qt-const-tool-button-icon-only ffi-qt-const-tool-button-text-only
-    ffi-qt-const-tool-button-text-beside-icon ffi-qt-const-tool-button-text-under-icon
-
-    ;; Size policy
-    ffi-qt-const-size-fixed ffi-qt-const-size-minimum ffi-qt-const-size-minimum-expanding
-    ffi-qt-const-size-maximum ffi-qt-const-size-preferred ffi-qt-const-size-expanding
-    ffi-qt-const-size-ignored
-
-    ;; Graphics constants
-    ffi-qt-const-item-movable ffi-qt-const-item-selectable ffi-qt-const-item-focusable
-    ffi-qt-const-drag-none ffi-qt-const-drag-scroll ffi-qt-const-drag-rubber-band
-    ffi-qt-const-render-antialiasing ffi-qt-const-render-smooth-pixmap
-    ffi-qt-const-render-text-antialiasing
-
-    ;; Process state
-    ffi-qt-const-process-not-running ffi-qt-const-process-starting
-    ffi-qt-const-process-running
-
-    ;; MDI view mode
-    ffi-qt-const-mdi-subwindow ffi-qt-const-mdi-tabbed
-
-    ;; LCD constants
-    ffi-qt-const-lcd-dec ffi-qt-const-lcd-hex ffi-qt-const-lcd-oct ffi-qt-const-lcd-bin
-    ffi-qt-const-lcd-outline ffi-qt-const-lcd-filled ffi-qt-const-lcd-flat
-
-    ;; Dir filter flags
-    ffi-qt-const-dir-dirs ffi-qt-const-dir-files ffi-qt-const-dir-hidden
-    ffi-qt-const-dir-no-dot-and-dot-dot
-
-    ;; Cursor movement
-    ffi-qt-const-cursor-no-move ffi-qt-const-cursor-start ffi-qt-const-cursor-up
-    ffi-qt-const-cursor-start-of-line ffi-qt-const-cursor-start-of-block
-    ffi-qt-const-cursor-previous-char ffi-qt-const-cursor-previous-block
-    ffi-qt-const-cursor-end-of-line ffi-qt-const-cursor-end-of-block
-    ffi-qt-const-cursor-next-char ffi-qt-const-cursor-next-block
-    ffi-qt-const-cursor-end ffi-qt-const-cursor-down
-    ffi-qt-const-cursor-left ffi-qt-const-cursor-word-left
-    ffi-qt-const-cursor-next-word ffi-qt-const-cursor-right
-    ffi-qt-const-cursor-word-right ffi-qt-const-cursor-previous-word
-    ffi-qt-const-move-anchor ffi-qt-const-keep-anchor
-
-    ;; Find flags
-    ffi-qt-const-find-backward ffi-qt-const-find-case-sensitive
-    ffi-qt-const-find-whole-words
-
-    ;; Dock area
-    ffi-qt-const-dock-left ffi-qt-const-dock-right
-    ffi-qt-const-dock-top ffi-qt-const-dock-bottom
-
-    ;; Tray icon message type
-    ffi-qt-const-tray-no-icon ffi-qt-const-tray-information
-    ffi-qt-const-tray-warning ffi-qt-const-tray-critical
-
-    ;; Key constants
-    ffi-qt-const-key-escape ffi-qt-const-key-tab ffi-qt-const-key-backtab
-    ffi-qt-const-key-backspace ffi-qt-const-key-return ffi-qt-const-key-enter
-    ffi-qt-const-key-insert ffi-qt-const-key-delete ffi-qt-const-key-pause
-    ffi-qt-const-key-home ffi-qt-const-key-end
-    ffi-qt-const-key-left ffi-qt-const-key-up ffi-qt-const-key-right ffi-qt-const-key-down
-    ffi-qt-const-key-page-up ffi-qt-const-key-page-down
-    ffi-qt-const-key-f1 ffi-qt-const-key-f2 ffi-qt-const-key-f3 ffi-qt-const-key-f4
-    ffi-qt-const-key-f5 ffi-qt-const-key-f6 ffi-qt-const-key-f7 ffi-qt-const-key-f8
-    ffi-qt-const-key-f9 ffi-qt-const-key-f10 ffi-qt-const-key-f11 ffi-qt-const-key-f12
-    ffi-qt-const-key-space
-
-    ;; Keyboard modifiers
-    ffi-qt-const-mod-none ffi-qt-const-mod-shift ffi-qt-const-mod-control
-    ffi-qt-const-mod-alt ffi-qt-const-mod-meta
-
-    ;; Selection mode/behavior
-    ffi-qt-const-select-no-selection ffi-qt-const-select-single
-    ffi-qt-const-select-multi ffi-qt-const-select-extended ffi-qt-const-select-contiguous
-    ffi-qt-const-select-items ffi-qt-const-select-rows ffi-qt-const-select-columns
-
-    ;; Edit triggers
-    ffi-qt-const-no-edit-triggers ffi-qt-const-edit-double-click
-    ffi-qt-const-edit-selected-click ffi-qt-const-edit-any-key-pressed
-    ffi-qt-const-edit-all-triggers
-
-    ;; Sort order
-    ffi-qt-const-sort-ascending ffi-qt-const-sort-descending
-
-    ;; Header resize mode
-    ffi-qt-const-header-interactive ffi-qt-const-header-stretch
-    ffi-qt-const-header-fixed ffi-qt-const-header-resize-to-contents
-
-    ;; Check state
-    ffi-qt-const-unchecked ffi-qt-const-partially-checked ffi-qt-const-checked
-
-    ;; ListView flow
-    ffi-qt-const-flow-top-to-bottom ffi-qt-const-flow-left-to-right
-
-    ;; Font Dialog / Color Dialog
-    ffi-qt-font-dialog-get-font ffi-qt-color-dialog-get-color
-
-    ;; Stacked Widget
-    ffi-qt-stacked-widget-create ffi-qt-stacked-widget-add-widget
-    ffi-qt-stacked-widget-set-current-index ffi-qt-stacked-widget-current-index
-    ffi-qt-stacked-widget-count ffi-qt-stacked-widget-on-current-changed
-
-    ;; Dock Widget
-    ffi-qt-dock-widget-create ffi-qt-dock-widget-set-widget
-    ffi-qt-dock-widget-widget ffi-qt-dock-widget-set-title ffi-qt-dock-widget-title
-    ffi-qt-dock-widget-set-floating ffi-qt-dock-widget-is-floating
-    ffi-qt-main-window-add-dock-widget
-
-    ;; System Tray Icon
-    ffi-qt-system-tray-icon-create ffi-qt-system-tray-icon-set-tooltip
-    ffi-qt-system-tray-icon-set-icon ffi-qt-system-tray-icon-show
-    ffi-qt-system-tray-icon-hide ffi-qt-system-tray-icon-show-message
-    ffi-qt-system-tray-icon-set-context-menu
-    ffi-qt-system-tray-icon-on-activated
-    ffi-qt-system-tray-icon-is-available ffi-qt-system-tray-icon-destroy
-
-    ;; QPainter
-    ffi-qt-pixmap-create-blank ffi-qt-pixmap-fill
-    ffi-qt-painter-create ffi-qt-painter-end ffi-qt-painter-destroy
-    ffi-qt-painter-set-pen-color ffi-qt-painter-set-pen-width
-    ffi-qt-painter-set-brush-color ffi-qt-painter-set-font-painter
-    ffi-qt-painter-set-antialiasing
-    ffi-qt-painter-draw-line ffi-qt-painter-draw-rect ffi-qt-painter-fill-rect
-    ffi-qt-painter-draw-ellipse ffi-qt-painter-draw-text ffi-qt-painter-draw-text-rect
-    ffi-qt-painter-draw-pixmap ffi-qt-painter-draw-point ffi-qt-painter-draw-arc
-    ffi-qt-painter-save ffi-qt-painter-restore
-    ffi-qt-painter-translate ffi-qt-painter-rotate ffi-qt-painter-scale
-
-    ;; Drag and Drop
-    ffi-qt-widget-set-accept-drops
-    ffi-qt-drop-filter-install ffi-qt-drop-filter-last-text
-    ffi-qt-drop-filter-destroy ffi-qt-drag-text
-
-    ;; Double Spin Box
-    ffi-qt-double-spin-box-create ffi-qt-double-spin-box-set-value
-    ffi-qt-double-spin-box-value ffi-qt-double-spin-box-set-range
-    ffi-qt-double-spin-box-set-single-step ffi-qt-double-spin-box-set-decimals
-    ffi-qt-double-spin-box-decimals ffi-qt-double-spin-box-set-prefix
-    ffi-qt-double-spin-box-set-suffix ffi-qt-double-spin-box-on-value-changed
-
-    ;; Date Edit
-    ffi-qt-date-edit-create ffi-qt-date-edit-set-date
-    ffi-qt-date-edit-year ffi-qt-date-edit-month ffi-qt-date-edit-day
-    ffi-qt-date-edit-date-string ffi-qt-date-edit-set-minimum-date
-    ffi-qt-date-edit-set-maximum-date ffi-qt-date-edit-set-calendar-popup
-    ffi-qt-date-edit-set-display-format ffi-qt-date-edit-on-date-changed
-
-    ;; Time Edit
-    ffi-qt-time-edit-create ffi-qt-time-edit-set-time
-    ffi-qt-time-edit-hour ffi-qt-time-edit-minute ffi-qt-time-edit-second
-    ffi-qt-time-edit-time-string ffi-qt-time-edit-set-display-format
-    ffi-qt-time-edit-on-time-changed
-
-    ;; Frame
-    ffi-qt-frame-create ffi-qt-frame-set-frame-shape ffi-qt-frame-frame-shape
-    ffi-qt-frame-set-frame-shadow ffi-qt-frame-frame-shadow
-    ffi-qt-frame-set-line-width ffi-qt-frame-line-width ffi-qt-frame-set-mid-line-width
-
-    ;; Progress Dialog
-    ffi-qt-progress-dialog-create ffi-qt-progress-dialog-set-value
-    ffi-qt-progress-dialog-value ffi-qt-progress-dialog-set-range
-    ffi-qt-progress-dialog-set-label-text ffi-qt-progress-dialog-was-canceled
-    ffi-qt-progress-dialog-set-minimum-duration
-    ffi-qt-progress-dialog-set-auto-close ffi-qt-progress-dialog-set-auto-reset
-    ffi-qt-progress-dialog-reset ffi-qt-progress-dialog-on-canceled
-
-    ;; Input Dialog
-    ffi-qt-input-dialog-get-text ffi-qt-input-dialog-get-int
-    ffi-qt-input-dialog-get-double ffi-qt-input-dialog-get-item
-    ffi-qt-input-dialog-was-accepted
-
-    ;; Form Layout
-    ffi-qt-form-layout-create ffi-qt-form-layout-add-row
-    ffi-qt-form-layout-add-row-widget ffi-qt-form-layout-add-spanning-widget
-    ffi-qt-form-layout-row-count
-
-    ;; Shortcut
-    ffi-qt-shortcut-create ffi-qt-shortcut-set-key
-    ffi-qt-shortcut-set-enabled ffi-qt-shortcut-is-enabled
-    ffi-qt-shortcut-on-activated ffi-qt-shortcut-destroy
-
-    ;; Text Browser
-    ffi-qt-text-browser-create ffi-qt-text-browser-set-html
-    ffi-qt-text-browser-set-plain-text ffi-qt-text-browser-plain-text
-    ffi-qt-text-browser-set-open-external-links
-    ffi-qt-text-browser-set-source ffi-qt-text-browser-source
-    ffi-qt-text-browser-scroll-to-bottom ffi-qt-text-browser-append
-    ffi-qt-text-browser-html ffi-qt-text-browser-on-anchor-clicked
-
-    ;; Button Box
-    ffi-qt-button-box-create ffi-qt-button-box-button
-    ffi-qt-button-box-add-button
-    ffi-qt-button-box-on-accepted ffi-qt-button-box-on-rejected
-    ffi-qt-button-box-on-clicked
-
-    ;; Calendar
-    ffi-qt-calendar-create ffi-qt-calendar-set-selected-date
-    ffi-qt-calendar-selected-year ffi-qt-calendar-selected-month
-    ffi-qt-calendar-selected-day ffi-qt-calendar-selected-date-string
-    ffi-qt-calendar-set-minimum-date ffi-qt-calendar-set-maximum-date
-    ffi-qt-calendar-set-first-day-of-week ffi-qt-calendar-set-grid-visible
-    ffi-qt-calendar-is-grid-visible ffi-qt-calendar-set-navigation-bar-visible
-    ffi-qt-calendar-on-selection-changed ffi-qt-calendar-on-clicked
-
-    ;; QSettings
-    ffi-qt-settings-create ffi-qt-settings-create-file
-    ffi-qt-settings-set-string ffi-qt-settings-value-string
-    ffi-qt-settings-set-int ffi-qt-settings-value-int
-    ffi-qt-settings-set-double ffi-qt-settings-value-double
-    ffi-qt-settings-set-bool ffi-qt-settings-value-bool
-    ffi-qt-settings-contains ffi-qt-settings-remove
-    ffi-qt-settings-all-keys ffi-qt-settings-child-keys ffi-qt-settings-child-groups
-    ffi-qt-settings-begin-group ffi-qt-settings-end-group ffi-qt-settings-group
-    ffi-qt-settings-sync ffi-qt-settings-clear
-    ffi-qt-settings-file-name ffi-qt-settings-is-writable ffi-qt-settings-destroy
-
-    ;; QCompleter
-    ffi-qt-completer-create ffi-qt-completer-set-model-strings
-    ffi-qt-completer-set-case-sensitivity ffi-qt-completer-set-completion-mode
-    ffi-qt-completer-set-filter-mode ffi-qt-completer-set-max-visible-items
-    ffi-qt-completer-completion-count ffi-qt-completer-current-completion
-    ffi-qt-completer-set-completion-prefix
-    ffi-qt-completer-on-activated
-    ffi-qt-line-edit-set-completer ffi-qt-completer-destroy
-
-    ;; Tooltip / WhatsThis
-    ffi-qt-tooltip-show-text ffi-qt-tooltip-hide-text ffi-qt-tooltip-is-visible
-    ffi-qt-widget-tooltip ffi-qt-widget-set-whats-this ffi-qt-widget-whats-this
-
-    ;; QStandardItemModel
-    ffi-qt-standard-model-create ffi-qt-standard-model-destroy
-    ffi-qt-standard-model-row-count ffi-qt-standard-model-column-count
-    ffi-qt-standard-model-set-row-count ffi-qt-standard-model-set-column-count
-    ffi-qt-standard-model-set-item ffi-qt-standard-model-item
-    ffi-qt-standard-model-insert-row ffi-qt-standard-model-insert-column
-    ffi-qt-standard-model-remove-row ffi-qt-standard-model-remove-column
-    ffi-qt-standard-model-clear
-    ffi-qt-standard-model-set-horizontal-header
-    ffi-qt-standard-model-set-vertical-header
-
-    ;; QStandardItem
-    ffi-qt-standard-item-create ffi-qt-standard-item-text
-    ffi-qt-standard-item-set-text
-    ffi-qt-standard-item-tooltip ffi-qt-standard-item-set-tooltip
-    ffi-qt-standard-item-set-editable ffi-qt-standard-item-is-editable
-    ffi-qt-standard-item-set-enabled ffi-qt-standard-item-is-enabled
-    ffi-qt-standard-item-set-selectable ffi-qt-standard-item-is-selectable
-    ffi-qt-standard-item-set-checkable ffi-qt-standard-item-is-checkable
-    ffi-qt-standard-item-set-check-state ffi-qt-standard-item-check-state
-    ffi-qt-standard-item-set-icon
-    ffi-qt-standard-item-append-row ffi-qt-standard-item-row-count
-    ffi-qt-standard-item-column-count ffi-qt-standard-item-child
-
-    ;; QStringListModel
-    ffi-qt-string-list-model-create ffi-qt-string-list-model-destroy
-    ffi-qt-string-list-model-set-strings ffi-qt-string-list-model-strings
-    ffi-qt-string-list-model-row-count
-
-    ;; Views (common)
-    ffi-qt-view-set-model ffi-qt-view-set-selection-mode
-    ffi-qt-view-set-selection-behavior ffi-qt-view-set-alternating-row-colors
-    ffi-qt-view-set-sorting-enabled ffi-qt-view-set-edit-triggers
-
-    ;; QListView
-    ffi-qt-list-view-create ffi-qt-list-view-set-flow
-
-    ;; QTableView
-    ffi-qt-table-view-create ffi-qt-table-view-set-column-width
-    ffi-qt-table-view-set-row-height
-    ffi-qt-table-view-hide-column ffi-qt-table-view-show-column
-    ffi-qt-table-view-hide-row ffi-qt-table-view-show-row
-    ffi-qt-table-view-resize-columns-to-contents
-    ffi-qt-table-view-resize-rows-to-contents
-
-    ;; QTreeView
-    ffi-qt-tree-view-create ffi-qt-tree-view-expand-all ffi-qt-tree-view-collapse-all
-    ffi-qt-tree-view-set-indentation ffi-qt-tree-view-indentation
-    ffi-qt-tree-view-set-root-is-decorated ffi-qt-tree-view-set-header-hidden
-    ffi-qt-tree-view-set-column-width
-
-    ;; QHeaderView (via view)
-    ffi-qt-view-header-set-stretch-last-section
-    ffi-qt-view-header-set-section-resize-mode
-    ffi-qt-view-header-hide ffi-qt-view-header-show
-    ffi-qt-view-header-set-default-section-size
-
-    ;; QSortFilterProxyModel
-    ffi-qt-sort-filter-proxy-create ffi-qt-sort-filter-proxy-destroy
-    ffi-qt-sort-filter-proxy-set-source-model
-    ffi-qt-sort-filter-proxy-set-filter-regex
-    ffi-qt-sort-filter-proxy-set-filter-column
-    ffi-qt-sort-filter-proxy-set-filter-case-sensitivity
-    ffi-qt-sort-filter-proxy-set-filter-role
-    ffi-qt-sort-filter-proxy-sort ffi-qt-sort-filter-proxy-set-sort-role
-    ffi-qt-sort-filter-proxy-set-dynamic-sort-filter
-    ffi-qt-sort-filter-proxy-invalidate-filter
-    ffi-qt-sort-filter-proxy-row-count
-
-    ;; View signals + selection
-    ffi-qt-view-on-clicked ffi-qt-view-on-double-clicked
-    ffi-qt-view-on-activated ffi-qt-view-on-selection-changed
-    ffi-qt-view-last-clicked-row ffi-qt-view-last-clicked-col
-    ffi-qt-view-selected-rows ffi-qt-view-current-row
-
-    ;; Validators
-    ffi-qt-int-validator-create ffi-qt-double-validator-create
-    ffi-qt-regex-validator-create ffi-qt-validator-destroy
-    ffi-qt-validator-validate ffi-qt-line-edit-set-validator
-    ffi-qt-line-edit-has-acceptable-input
-
-    ;; QPlainTextEdit
-    ffi-qt-plain-text-edit-create ffi-qt-plain-text-edit-set-text
-    ffi-qt-plain-text-edit-text ffi-qt-plain-text-edit-append
-    ffi-qt-plain-text-edit-clear ffi-qt-plain-text-edit-set-read-only
-    ffi-qt-plain-text-edit-is-read-only ffi-qt-plain-text-edit-set-placeholder
-    ffi-qt-plain-text-edit-line-count ffi-qt-plain-text-edit-set-max-block-count
-    ffi-qt-plain-text-edit-cursor-line ffi-qt-plain-text-edit-cursor-column
-    ffi-qt-plain-text-edit-set-line-wrap
-    ffi-qt-plain-text-edit-on-text-changed
-    ;; Editor extensions
-    ffi-qt-plain-text-edit-cursor-position ffi-qt-plain-text-edit-set-cursor-position
-    ffi-qt-plain-text-edit-move-cursor
-    ffi-qt-plain-text-edit-select-all ffi-qt-plain-text-edit-selected-text
-    ffi-qt-plain-text-edit-selection-start ffi-qt-plain-text-edit-selection-end
-    ffi-qt-plain-text-edit-set-selection ffi-qt-plain-text-edit-has-selection
-    ffi-qt-plain-text-edit-insert-text ffi-qt-plain-text-edit-remove-selected-text
-    ffi-qt-plain-text-edit-undo ffi-qt-plain-text-edit-redo
-    ffi-qt-plain-text-edit-can-undo
-    ffi-qt-plain-text-edit-cut ffi-qt-plain-text-edit-copy ffi-qt-plain-text-edit-paste
-    ffi-qt-plain-text-edit-text-length ffi-qt-plain-text-edit-text-range
-    ffi-qt-plain-text-edit-line-from-position ffi-qt-plain-text-edit-line-end-position
-    ffi-qt-plain-text-edit-find-text
-    ffi-qt-plain-text-edit-ensure-cursor-visible ffi-qt-plain-text-edit-center-cursor
-    ffi-qt-text-document-create ffi-qt-plain-text-document-create
-    ffi-qt-text-document-destroy
-    ffi-qt-plain-text-edit-document ffi-qt-plain-text-edit-set-document
-    ffi-qt-text-document-is-modified ffi-qt-text-document-set-modified
-
-    ;; QToolButton
-    ffi-qt-tool-button-create ffi-qt-tool-button-set-text ffi-qt-tool-button-text
-    ffi-qt-tool-button-set-icon ffi-qt-tool-button-set-menu
-    ffi-qt-tool-button-set-popup-mode ffi-qt-tool-button-set-auto-raise
-    ffi-qt-tool-button-set-arrow-type ffi-qt-tool-button-set-tool-button-style
-    ffi-qt-tool-button-on-clicked
-
-    ;; Layout spacers / Size policy
-    ffi-qt-layout-add-spacing
-    ffi-qt-widget-set-size-policy ffi-qt-layout-set-stretch-factor
-
-    ;; Graphics Scene
-    ffi-qt-graphics-scene-create ffi-qt-graphics-scene-add-rect
-    ffi-qt-graphics-scene-add-ellipse ffi-qt-graphics-scene-add-line
-    ffi-qt-graphics-scene-add-text ffi-qt-graphics-scene-add-pixmap
-    ffi-qt-graphics-scene-remove-item ffi-qt-graphics-scene-clear
-    ffi-qt-graphics-scene-items-count ffi-qt-graphics-scene-set-background
-    ffi-qt-graphics-scene-destroy
-
-    ;; Graphics View
-    ffi-qt-graphics-view-create ffi-qt-graphics-view-set-render-hint
-    ffi-qt-graphics-view-set-drag-mode ffi-qt-graphics-view-fit-in-view
-    ffi-qt-graphics-view-scale ffi-qt-graphics-view-center-on
-
-    ;; Graphics Item
-    ffi-qt-graphics-item-set-pos ffi-qt-graphics-item-x ffi-qt-graphics-item-y
-    ffi-qt-graphics-item-set-pen ffi-qt-graphics-item-set-brush
-    ffi-qt-graphics-item-set-flags ffi-qt-graphics-item-set-tooltip
-    ffi-qt-graphics-item-set-zvalue ffi-qt-graphics-item-zvalue
-    ffi-qt-graphics-item-set-rotation ffi-qt-graphics-item-set-scale
-    ffi-qt-graphics-item-set-visible
-
-    ;; Paint Widget
-    ffi-qt-paint-widget-create ffi-qt-paint-widget-on-paint
-    ffi-qt-paint-widget-painter ffi-qt-paint-widget-update
-    ffi-qt-paint-widget-width ffi-qt-paint-widget-height
-
-    ;; QProcess
-    ffi-qt-process-create ffi-qt-process-start ffi-qt-process-write
-    ffi-qt-process-close-write ffi-qt-process-read-stdout ffi-qt-process-read-stderr
-    ffi-qt-process-wait-for-finished ffi-qt-process-exit-code ffi-qt-process-state
-    ffi-qt-process-kill ffi-qt-process-terminate
-    ffi-qt-process-on-finished ffi-qt-process-on-ready-read ffi-qt-process-destroy
-
-    ;; QWizard / QWizardPage
-    ffi-qt-wizard-create ffi-qt-wizard-add-page ffi-qt-wizard-set-start-id
-    ffi-qt-wizard-current-id ffi-qt-wizard-set-title ffi-qt-wizard-exec
-    ffi-qt-wizard-page-create ffi-qt-wizard-page-set-title
-    ffi-qt-wizard-page-set-subtitle ffi-qt-wizard-page-set-layout
-    ffi-qt-wizard-on-current-changed
-
-    ;; QMdiArea / QMdiSubWindow
-    ffi-qt-mdi-area-create ffi-qt-mdi-area-add-sub-window
-    ffi-qt-mdi-area-remove-sub-window ffi-qt-mdi-area-active-sub-window
-    ffi-qt-mdi-area-sub-window-count ffi-qt-mdi-area-cascade ffi-qt-mdi-area-tile
-    ffi-qt-mdi-area-set-view-mode ffi-qt-mdi-sub-window-set-title
-    ffi-qt-mdi-area-on-sub-window-activated
-
-    ;; QDial
-    ffi-qt-dial-create ffi-qt-dial-set-value ffi-qt-dial-value
-    ffi-qt-dial-set-range ffi-qt-dial-set-notches-visible ffi-qt-dial-set-wrapping
-    ffi-qt-dial-on-value-changed
-
-    ;; QLCDNumber
-    ffi-qt-lcd-create ffi-qt-lcd-display-int ffi-qt-lcd-display-double
-    ffi-qt-lcd-display-string ffi-qt-lcd-set-mode ffi-qt-lcd-set-segment-style
-
-    ;; QToolBox
-    ffi-qt-tool-box-create ffi-qt-tool-box-add-item
-    ffi-qt-tool-box-set-current-index ffi-qt-tool-box-current-index
-    ffi-qt-tool-box-count ffi-qt-tool-box-set-item-text
-    ffi-qt-tool-box-on-current-changed
-
-    ;; QUndoStack
-    ffi-qt-undo-stack-create ffi-qt-undo-stack-push
-    ffi-qt-undo-stack-undo ffi-qt-undo-stack-redo
-    ffi-qt-undo-stack-can-undo ffi-qt-undo-stack-can-redo
-    ffi-qt-undo-stack-undo-text ffi-qt-undo-stack-redo-text
-    ffi-qt-undo-stack-clear
-    ffi-qt-undo-stack-create-undo-action ffi-qt-undo-stack-create-redo-action
-    ffi-qt-undo-stack-destroy
-
-    ;; QFileSystemModel
-    ffi-qt-file-system-model-create ffi-qt-file-system-model-set-root-path
-    ffi-qt-file-system-model-set-filter ffi-qt-file-system-model-set-name-filters
-    ffi-qt-file-system-model-file-path ffi-qt-tree-view-set-file-system-root
-    ffi-qt-file-system-model-destroy
-
-    ;; Signal disconnect
-    ffi-qt-disconnect-all
-
-    ;; QSyntaxHighlighter
-    ffi-qt-syntax-highlighter-create ffi-qt-syntax-highlighter-destroy
-    ffi-qt-syntax-highlighter-add-rule ffi-qt-syntax-highlighter-add-keywords
-    ffi-qt-syntax-highlighter-add-multiline-rule
-    ffi-qt-syntax-highlighter-clear-rules ffi-qt-syntax-highlighter-rehighlight
-
-    ;; Line number area
-    ffi-qt-line-number-area-create ffi-qt-line-number-area-destroy
-    ffi-qt-line-number-area-set-visible
-    ffi-qt-line-number-area-set-bg-color ffi-qt-line-number-area-set-fg-color
-
-    ;; Extra selections
-    ffi-qt-plain-text-edit-clear-extra-selections
-    ffi-qt-plain-text-edit-add-extra-selection-line
-    ffi-qt-plain-text-edit-add-extra-selection-range
-    ffi-qt-plain-text-edit-apply-extra-selections
-
-    ;; Completer on editor
-    ffi-qt-completer-set-widget ffi-qt-completer-complete-rect
-
-    ;; QScintilla
-    ffi-qt-scintilla-create ffi-qt-scintilla-destroy
-    ffi-qt-scintilla-send-message ffi-qt-scintilla-send-message-string
-    ffi-qt-scintilla-receive-string
-    ffi-qt-scintilla-set-text ffi-qt-scintilla-get-text ffi-qt-scintilla-get-text-length
-    ffi-qt-scintilla-set-lexer-language ffi-qt-scintilla-get-lexer-language
-    ffi-qt-scintilla-lexer-set-color ffi-qt-scintilla-lexer-set-paper
-    ffi-qt-scintilla-lexer-set-font-attr
-    ffi-qt-scintilla-set-read-only ffi-qt-scintilla-is-read-only
-    ffi-qt-scintilla-set-margin-width ffi-qt-scintilla-set-margin-type
-    ffi-qt-scintilla-set-focus
-    ffi-qt-scintilla-on-text-changed ffi-qt-scintilla-on-char-added
-    ffi-qt-scintilla-on-save-point-reached ffi-qt-scintilla-on-save-point-left
-    ffi-qt-scintilla-on-margin-clicked ffi-qt-scintilla-on-modified)
-
-  (import (chezscheme))
-
-  ;; -----------------------------------------------------------------------
-  ;; Load shared libraries
-  ;; -----------------------------------------------------------------------
-
-  (define shim-dir
-    (or (getenv "CHEZ_QT_LIB")
-        (let ([script-dir (getenv "CHEZ_QT_SCRIPT_DIR")])
-          (and script-dir script-dir))
-        "."))
-
-  ;; In a static build (JEMACS_STATIC=1), both shims are compiled into the binary.
-  ;; With -Wl,--export-dynamic all symbols are visible; no load-shared-object needed.
-  ;; Chez's foreign-procedure resolves symbols from the binary's export table directly.
-  (define static-build?
-    (let ([v (getenv "JEMACS_STATIC")])
-      (and v (not (string=? v "")) (not (string=? v "0")))))
-
-  (define shlib-ext
-    (let ((mt (symbol->string (machine-type))))
-      (if (and (>= (string-length mt) 3)
-               (string=? (substring mt (- (string-length mt) 3) (string-length mt)) "osx"))
-          "dylib"
-          "so")))
-
-  ;; libqt_shim.{so,dylib} comes from gerbil-qt's vendor/ dir — use DYLD_LIBRARY_PATH/LD_LIBRARY_PATH or explicit env var
-  (define qt-shim-loaded
-    (if static-build?
-        #f   ; symbols already linked in; --export-dynamic makes them visible
-        (load-shared-object
-          (let ([qt-shim-dir (getenv "CHEZ_QT_SHIM_DIR")])
-            (if qt-shim-dir
-                (format "~a/libqt_shim.~a" qt-shim-dir shlib-ext)
-                (format "libqt_shim.~a" shlib-ext))))))
-
-  (define chez-shim-loaded
-    (if static-build?
-        #f   ; qt_chez_shim.c compiled into binary
-        (load-shared-object
-          (format "~a/qt_chez_shim.~a" shim-dir shlib-ext))))
-
-  ;; -----------------------------------------------------------------------
-  ;; Callback registration (Chez → C shim)
-  ;; -----------------------------------------------------------------------
-
-  (define ffi-set-void-callback
-    (foreign-procedure "chez_qt_set_void_callback" (void*) void))
-
-  (define ffi-set-string-callback
-    (foreign-procedure "chez_qt_set_string_callback" (void*) void))
-
-  (define ffi-set-int-callback
-    (foreign-procedure "chez_qt_set_int_callback" (void*) void))
-
-  (define ffi-set-bool-callback
-    (foreign-procedure "chez_qt_set_bool_callback" (void*) void))
-
-  ;; -----------------------------------------------------------------------
-  ;; Constants — hardcoded from Qt header values
-  ;; -----------------------------------------------------------------------
-
-  ;; Alignment (Qt::AlignmentFlag)
-  (define ffi-qt-const-align-left    #x0001)
-  (define ffi-qt-const-align-right   #x0002)
-  (define ffi-qt-const-align-center  #x0084)
-  (define ffi-qt-const-align-top     #x0020)
-  (define ffi-qt-const-align-bottom  #x0040)
-
-  ;; Echo mode (QLineEdit::EchoMode)
-  (define ffi-qt-const-echo-normal          0)
-  (define ffi-qt-const-echo-no-echo         1)
-  (define ffi-qt-const-echo-password        2)
-  (define ffi-qt-const-echo-password-on-edit 3)
-
-  ;; Orientation (Qt::Orientation)
-  (define ffi-qt-const-horizontal  #x1)
-  (define ffi-qt-const-vertical    #x2)
-
-  ;; Slider tick position (QSlider::TickPosition)
-  (define ffi-qt-const-ticks-none        0)
-  (define ffi-qt-const-ticks-above       1)
-  (define ffi-qt-const-ticks-below       2)
-  (define ffi-qt-const-ticks-both-sides  3)
-
-  ;; Window state (Qt::WindowState)
-  (define ffi-qt-const-window-no-state    #x00)
-  (define ffi-qt-const-window-minimized   #x01)
-  (define ffi-qt-const-window-maximized   #x02)
-  (define ffi-qt-const-window-full-screen #x04)
-
-  ;; Scrollbar policy (Qt::ScrollBarPolicy)
-  (define ffi-qt-const-scrollbar-as-needed  0)
-  (define ffi-qt-const-scrollbar-always-off 1)
-  (define ffi-qt-const-scrollbar-always-on  2)
-
-  ;; Cursor shape (Qt::CursorShape)
-  (define ffi-qt-const-cursor-arrow          0)
-  (define ffi-qt-const-cursor-cross          2)
-  (define ffi-qt-const-cursor-wait           3)
-  (define ffi-qt-const-cursor-ibeam          4)
-  (define ffi-qt-const-cursor-pointing-hand 13)
-  (define ffi-qt-const-cursor-forbidden     14)
-  (define ffi-qt-const-cursor-busy          16)
-
-  ;; -----------------------------------------------------------------------
-  ;; Application lifecycle
-  ;; -----------------------------------------------------------------------
-
-  (define ffi-qt-app-create
-    (foreign-procedure "chez_qt_application_create" () void*))
-
-  (define ffi-qt-app-exec
-    (foreign-procedure "qt_application_exec" (void*) int))
-
-  (define ffi-qt-app-quit
-    (foreign-procedure "qt_application_quit" (void*) void))
-
-  (define ffi-qt-app-process-events
-    (foreign-procedure "qt_application_process_events" (void*) void))
-
-  (define ffi-qt-app-destroy
-    (foreign-procedure "qt_application_destroy" (void*) void))
-
-  (define ffi-qt-app-is-running
-    (foreign-procedure "qt_application_is_running" () int))
-
-  (define ffi-qt-app-set-style-sheet
-    (foreign-procedure "qt_application_set_style_sheet" (void* string) void))
-
-  ;; -----------------------------------------------------------------------