Vendor chez-qt and gherkin-runtime; fix treesitter FFI guard and qt_chez_shim build

ober

91c25d0511c17e53a9baf5de0e0d58fdf5566a4c

diff --git a/CLAUDE.md b/CLAUDE.md
index eb0b676..d3417ce 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -37,7 +37,7 @@ Common pitfalls when step 3 fails:
 - **`library (std ...) not found`**: The Docker image has a stale jerboa `std/` tree. New modules must be added to the sync list in the `linux-static-qt-docker` Makefile target AND compiled into the WPO step in `build-binary-qt.ss`.
 - **`Dynamic loading not supported`**: Any `load-shared-object` call must be guarded with the `JEMACS_STATIC` env var check (the binary sets `JEMACS_STATIC=1`).
 - **`final:` or other unsupported keywords**: jerbuild doesn't support all Gerbil `defstruct` keywords — remove them.
-- **Dependencies not in gerbil-qt**: This project uses `~/mine/chez-qt`, NOT `~/mine/gerbil-qt`. The `CHEZ_QT_SHIM_DIR` must point to `.` (local project root) for runtime, and `vendor/` for the build header.
+- **Dependencies not in gerbil-qt**: This project uses `vendor/chez-qt` (vendored from `github.com/ober/chez-qt`), NOT `~/mine/gerbil-qt`. The `CHEZ_QT_SHIM_DIR` must point to `.` (local project root) for runtime, and `vendor/` for the build header.
 
 Do NOT rely on `make run-qt` (interpreted mode) as proof the binary works — the static binary has different constraints (no `load-shared-object`, all libraries must be compiled in).
 
diff --git a/Dockerfile b/Dockerfile
index a497737..1e36542 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -252,12 +252,14 @@ COPY --from=pcre2-src . /deps/chez-pcre2
 COPY --from=sci-src . /deps/chez-scintilla
 COPY --from=qt-src . /deps/chez-qt
 COPY --from=qtshim-src . /deps/gerbil-qt
+# qt_chez_shim.c is maintained in vendor/ (not in chez-qt) — copy it in
+COPY vendor/qt_chez_shim.c vendor/qt_shim.h /deps/chez-qt/
 
 # Pre-compile all Chez library dependencies.
 # These .so files are baked into the image so jemacs builds only
 # need to compile jemacs-specific modules.
 RUN /opt/chez/bin/scheme \
-      --libdirs /deps/jerboa/lib:/deps/gherkin/src:/deps/jsh/src:/deps/chez-pcre2:/deps/chez-scintilla/src:/deps/chez-qt \
+      --libdirs /deps/jerboa/lib:/deps/gherkin:/deps/jsh/src:/deps/chez-pcre2:/deps/chez-scintilla/src:/deps/chez-qt \
       --compile-imported-libraries \
       --script /dev/stdin <<'EOF'
 #!chezscheme
diff --git a/Makefile b/Makefile
index a86bff4..7c1bbe0 100644
--- a/Makefile
+++ b/Makefile
@@ -1,13 +1,14 @@
 SCHEME = scheme
 JERBOA    = $(HOME)/mine/jerboa
 JSH       = vendor/jerboa-shell/src
-GHERKIN   = $(HOME)/mine/gherkin/src
-LIBDIRS   = --libdirs lib:$(JERBOA)/lib:$(JSH):$(GHERKIN):$(HOME)/mine/chez-pcre2:$(HOME)/mine/chez-scintilla/src:$(HOME)/mine/chez-qt
+GHERKIN   = vendor/gherkin-runtime
+CHEZ_QT   = vendor/chez-qt
+LIBDIRS   = --libdirs lib:$(JERBOA)/lib:$(JSH):$(GHERKIN):$(HOME)/mine/chez-pcre2:$(HOME)/mine/chez-scintilla/src:$(CHEZ_QT)
 JERBUILD  = $(SCHEME) --libdirs $(JERBOA)/lib --script $(JERBOA)/jerbuild.ss
-export LD_LIBRARY_PATH := .:$(HOME)/mine/chez-pcre2:$(HOME)/mine/chez-scintilla:$(HOME)/mine/chez-qt:vendor/jerboa-shell:$(LD_LIBRARY_PATH)
+export LD_LIBRARY_PATH := .:$(HOME)/mine/chez-pcre2:$(HOME)/mine/chez-scintilla:vendor/jerboa-shell:$(LD_LIBRARY_PATH)
 export CHEZ_SCINTILLA_LIB := $(HOME)/mine/chez-scintilla
 export CHEZ_PCRE2_LIB := $(HOME)/mine/chez-pcre2
-export CHEZ_QT_LIB := $(HOME)/mine/chez-qt
+export CHEZ_QT_LIB := $(CURDIR)
 export CHEZ_QT_SHIM_DIR := .
 
 .PHONY: all build rebuild run test-tier0 test-tier2 test-tier3 test-tier4 test-tier5 test-org test-extra test clean clean-generated \
@@ -49,8 +50,9 @@ libqt_shim.so: vendor/qt_shim.cpp
 	  -o libqt_shim.so \
 	  -lQt6Core -lQt6Gui -lQt6Widgets -lqscintilla2_qt6 -lvterm -lutil
 
-qt_chez_shim.so: vendor/qt_chez_shim.c vendor/qt_shim.h
-	gcc -shared -fPIC -O2 -o qt_chez_shim.so vendor/qt_chez_shim.c -Ivendor -Wall
+qt_chez_shim.so: vendor/qt_chez_shim.c vendor/qt_shim.h libqt_shim.so
+	gcc -shared -fPIC -O2 -o qt_chez_shim.so vendor/qt_chez_shim.c -Ivendor -Wall \
+	  -DQT_SCINTILLA_AVAILABLE -L. -lqt_shim -Wl,-rpath,'$$ORIGIN'
 
 run-qt: build repl_shim.so libqt_shim.so vterm_shim.so qt_chez_shim.so
 	LD_PRELOAD=./qt_chez_shim.so $(SCHEME) $(LIBDIRS) --script qt-main.ss
@@ -248,11 +250,11 @@ GID     := $(shell id -g)
 
 # Dependency source directories (all ~/mine/* local checkouts)
 JERBOA_SRC   ?= $(HOME)/mine/jerboa
-GHERKIN_SRC  ?= $(HOME)/mine/gherkin
+GHERKIN_SRC  ?= $(CURDIR)/vendor/gherkin-runtime
 JSH_SRC      ?= $(HOME)/mine/jerboa-shell
 PCRE2_SRC    ?= $(HOME)/mine/chez-pcre2
 SCI_SRC      ?= $(HOME)/mine/chez-scintilla
-QT_SRC       ?= $(HOME)/mine/chez-qt
+QT_SRC       ?= $(CURDIR)/vendor/chez-qt
 QTSHIM_SRC   ?= $(HOME)/mine/gerbil-qt
 JSH_COREUTILS_LIB ?= $(JSH_SRC)/rust-coreutils/target/x86_64-unknown-linux-musl/release/libjsh_coreutils.a
 
@@ -318,8 +320,6 @@ build-jemacs-qt-static: check-root
 	  ar rcs /deps/gerbil-qt/vendor/libqt_shim.a \
 	    /deps/gerbil-qt/vendor/qt_shim_static.o; \
 	fi && \
-	cp /src/vendor/chez-qt-ffi-static.ss /deps/chez-qt/chez-qt/ffi.ss && \
-	cp /src/vendor/chez-qt-qt.ss /deps/chez-qt/chez-qt/qt.ss && \
 	/opt/chez/bin/scheme --libdirs /deps/chez-qt \
 	  --compile-imported-libraries --script /deps/chez-qt/compile-libs.ss && \
 	rm -f /deps/chez-qt/chez-qt/*.wpo && \
@@ -367,7 +367,7 @@ build-jemacs-qt-static: check-root
 	CHEZ_DIR=$(CHEZ_MUSL_DIR) \
 	JERBOA_DIR=/deps/jerboa/lib \
 	JSH_DIR=/deps/jsh/src \
-	GHERKIN_DIR=/deps/gherkin/src \
+	GHERKIN_DIR=/src/vendor/gherkin-runtime \
 	CHEZ_PCRE2_DIR=/deps/chez-pcre2 \
 	CHEZ_SCINTILLA_DIR=/deps/chez-scintilla/src \
 	CHEZ_QT_DIR=/deps/chez-qt \
@@ -380,7 +380,7 @@ build-jemacs-qt-static: check-root
 	TREE_SITTER_QUERIES_OBJ=/tmp/jemacs-build/treesitter_queries.o \
 	PKG_CONFIG_PATH=/opt/qt6-static/lib/pkgconfig \
 	/opt/chez/bin/scheme \
-	  --libdirs lib:/deps/jerboa/lib:/deps/jsh/src:/deps/gherkin/src:/deps/chez-pcre2:/deps/chez-scintilla/src:/deps/chez-qt \
+	  --libdirs lib:/deps/jerboa/lib:/deps/jsh/src:/src/vendor/gherkin-runtime:/deps/chez-pcre2:/deps/chez-scintilla/src:/deps/chez-qt \
 	  --script build-binary-qt.ss
 
 linux-static-qt-docker:
@@ -444,8 +444,8 @@ stress-test:
 stress-burn: build repl_shim.so libqt_shim.so vterm_shim.so qt_chez_shim.so
 	@echo "=== Starting jemacs-qt stress burn-in ==="
 	@rm -f $(HOME)/.jerboa-repl-port stress-test.log
-	@xvfb-run -a env LD_PRELOAD=./qt_chez_shim.so \
-	  $(SCHEME) $(LIBDIRS) --script qt-main.ss --repl 0 &
+	@xvfb-run -a env CHEZ_QT_SHIM_DIR=$(CURDIR) \
+	  $(SCHEME) $(LIBDIRS) --script $(CURDIR)/qt-main.ss --repl 0 &
 	@for i in $$(seq 1 30); do \
 	  [ -f $(HOME)/.jerboa-repl-port ] && break; \
 	  sleep 0.5; \
@@ -501,8 +501,8 @@ stress-burn-static:
 test-behavioral: build repl_shim.so libqt_shim.so vterm_shim.so qt_chez_shim.so
 	@echo "=== Starting jemacs-qt behavioral tests ==="
 	@rm -f $(HOME)/.jerboa-repl-port
-	@xvfb-run -a env LD_PRELOAD=./qt_chez_shim.so \
-	  $(SCHEME) $(LIBDIRS) --script qt-main.ss --repl 0 &
+	@xvfb-run -a env CHEZ_QT_SHIM_DIR=$(CURDIR) \
+	  $(SCHEME) $(LIBDIRS) --script $(CURDIR)/qt-main.ss --repl 0 &
 	@for i in $$(seq 1 30); do \
 	  [ -f $(HOME)/.jerboa-repl-port ] && break; \
 	  sleep 0.5; \
diff --git a/src/jerboa-emacs/treesitter.ss b/src/jerboa-emacs/treesitter.ss
index 7b9c812..6408edb 100644
--- a/src/jerboa-emacs/treesitter.ss
+++ b/src/jerboa-emacs/treesitter.ss
@@ -69,71 +69,80 @@
             (string-append dir "/treesitter_shim.so")))))))
 
 ;;;============================================================================
-;;; FFI bindings
+;;; FFI bindings — only evaluated when shim is available
+;;;
+;;; IMPORTANT: In Chez Scheme, (foreign-procedure ...) resolves the symbol at
+;;; DEFINITION time (when the form is evaluated), not at call time.  We must
+;;; therefore guard every binding with (if ts-shim-loaded ...) so that the
+;;; foreign-procedure forms are only evaluated after the .so is confirmed loaded.
+;;; Without this guard, loading the module crashes with
+;;; "no entry for ts_shim_parser_new" whenever treesitter_shim.so is absent.
 ;;;============================================================================
 
 ;; Parser lifecycle
 (define ffi-ts-parser-new
-  (foreign-procedure "ts_shim_parser_new" () void*))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_parser_new" () void*) #f))
 (define ffi-ts-parser-delete
-  (foreign-procedure "ts_shim_parser_delete" (void*) void))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_parser_delete" (void*) void) #f))
 (define ffi-ts-parser-set-language
-  (foreign-procedure "ts_shim_parser_set_language" (void* string) int))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_parser_set_language" (void* string) int) #f))
 
 ;; Parsing
 (define ffi-ts-parse-string
-  (foreign-procedure "ts_shim_parse_string" (void* void* string int) void*))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_parse_string" (void* void* string int) void*) #f))
 (define ffi-ts-parse-incremental
-  (foreign-procedure "ts_shim_parse_incremental"
-    (void* void* string int int int int int int int int int int) void*))
+  (if ts-shim-loaded
+    (foreign-procedure "ts_shim_parse_incremental"
+      (void* void* string int int int int int int int int int int) void*)
+    #f))
 (define ffi-ts-tree-delete
-  (foreign-procedure "ts_shim_tree_delete" (void*) void))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_tree_delete" (void*) void) #f))
 
 ;; Node slots
 (define ffi-ts-tree-root-node
-  (foreign-procedure "ts_shim_tree_root_node" (void* int) void))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_tree_root_node" (void* int) void) #f))
 (define ffi-ts-node-start-byte
-  (foreign-procedure "ts_shim_node_start_byte" (int) int))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_node_start_byte" (int) int) #f))
 (define ffi-ts-node-end-byte
-  (foreign-procedure "ts_shim_node_end_byte" (int) int))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_node_end_byte" (int) int) #f))
 (define ffi-ts-node-type
-  (foreign-procedure "ts_shim_node_type" (int) string))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_node_type" (int) string) #f))
 (define ffi-ts-node-is-null
-  (foreign-procedure "ts_shim_node_is_null" (int) int))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_node_is_null" (int) int) #f))
 
 ;; Query
 (define ffi-ts-query-new
-  (foreign-procedure "ts_shim_query_new" (string string int u8* u8*) void*))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_query_new" (string string int u8* u8*) void*) #f))
 (define ffi-ts-query-delete
-  (foreign-procedure "ts_shim_query_delete" (void*) void))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_query_delete" (void*) void) #f))
 
 ;; Query cursor
 (define ffi-ts-query-cursor-new
-  (foreign-procedure "ts_shim_query_cursor_new" () void*))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_query_cursor_new" () void*) #f))
 (define ffi-ts-query-cursor-delete
-  (foreign-procedure "ts_shim_query_cursor_delete" (void*) void))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_query_cursor_delete" (void*) void) #f))
 (define ffi-ts-query-cursor-exec
-  (foreign-procedure "ts_shim_query_cursor_exec" (void* void* int) void))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_query_cursor_exec" (void* void* int) void) #f))
 (define ffi-ts-query-cursor-set-byte-range
-  (foreign-procedure "ts_shim_query_cursor_set_byte_range" (void* int int) void))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_query_cursor_set_byte_range" (void* int int) void) #f))
 
 ;; Batch highlight captures
 (define ffi-ts-highlight-captures
-  (foreign-procedure "ts_shim_highlight_captures" (void* void* u8* int) int))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_highlight_captures" (void* void* u8* int) int) #f))
 
 ;; Capture name lookup
 (define ffi-ts-query-capture-name
-  (foreign-procedure "ts_shim_query_capture_name" (void* int) string))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_query_capture_name" (void* int) string) #f))
 
 ;; Changed ranges
 (define ffi-ts-tree-changed-ranges
-  (foreign-procedure "ts_shim_tree_changed_ranges" (void* void* u8* int) int))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_tree_changed_ranges" (void* void* u8* int) int) #f))
 
 ;; Embedded queries
 (define ffi-ts-get-highlight-query
-  (foreign-procedure "ts_shim_get_highlight_query" (string) string))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_get_highlight_query" (string) string) #f))
 (define ffi-ts-get-highlight-query-len
-  (foreign-procedure "ts_shim_get_highlight_query_len" (string) int))
+  (if ts-shim-loaded (foreign-procedure "ts_shim_get_highlight_query_len" (string) int) #f))
 
 ;;;============================================================================
 ;;; High-level Scheme API
@@ -141,11 +150,13 @@
 
 (def (ts-parser-create lang-name)
   "Create a parser configured for the given language.
-   Returns parser pointer or #f."
-  (let ((p (ffi-ts-parser-new)))
-    (if (= 1 (ffi-ts-parser-set-language p lang-name))
-      p
-      (begin (ffi-ts-parser-delete p) #f))))
+   Returns parser pointer or #f (also #f if tree-sitter shim not available)."
+  (if (not ts-shim-loaded)
+    #f
+    (let ((p (ffi-ts-parser-new)))
+      (if (= 1 (ffi-ts-parser-set-language p lang-name))
+        p
+        (begin (ffi-ts-parser-delete p) #f)))))
 
 (def (ts-parser-delete! parser)
   (when parser (ffi-ts-parser-delete parser)))
diff --git a/tests/test-behavioral.ss b/tests/test-behavioral.ss
index e4fe06b..8b8c2b5 100644
--- a/tests/test-behavioral.ss
+++ b/tests/test-behavioral.ss
@@ -177,7 +177,7 @@
     (lambda (e)
       (set! *phase-fail* (+ *phase-fail* 1))
       (displayln "FAIL: "
-                 (with-output-to-string (lambda () (display-exception e)))))
+                 (with-output-to-string (lambda () (display-condition e)))))
     (lambda ()
       (thunk)
       (set! *phase-pass* (+ *phase-pass* 1))
@@ -1438,7 +1438,7 @@
 
   (with-catch
     (lambda (e)
-      (displayln "FATAL: " (with-output-to-string (lambda () (display-exception e))))
+      (displayln "FATAL: " (with-output-to-string (lambda () (display-condition e))))
       (disconnect!)
       (exit 1))
     (lambda ()
diff --git a/vendor/chez-qt-ffi-static.ss b/vendor/chez-qt-ffi-static.ss
deleted file mode 100644
index f47ebba..0000000
--- a/vendor/chez-qt-ffi-static.ss
+++ /dev/null
@@ -1,3304 +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-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-attribute
-    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
-    ffi-qt-send-key-event
-
-    ;; 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
-