diff --git a/.gitignore b/.gitignore
index 5ebb457..90fd273 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,4 @@ example.sps
example
venv
foreign
+tmp
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 0cbb998..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,46 +0,0 @@
-ARG SCHEME=chibi
-ARG IMAGE=${SCHEME}:head
-FROM debian:trixie AS build
-RUN apt-get update && apt-get install -y \
-git ca-certificates make gcc libffi-dev libffi-dev wget xz-utils libcurl4
-RUN mkdir ${HOME}/.snow && echo "()" > ${HOME}/.snow/config.scm
-WORKDIR /build
-RUN wget https://gitlab.com/-/project/6808260/uploads/094ce726ce3c6cf8c14560f1e31aaea0/akku-1.1.0.amd64-linux.tar.xz \
- && tar -xf akku-1.1.0.amd64-linux.tar.xz \
- && mv akku-1.1.0.amd64-linux akku
-RUN git clone https://github.com/ashinn/chibi-scheme.git --depth=1
-RUN git clone https://codeberg.org/retropikzel/compile-scheme.git --depth=1
-WORKDIR /build/chibi-scheme
-RUN make
-RUN make install
-WORKDIR /build/compile-scheme
-RUN make build-gauche
-WORKDIR /build
-RUN git clone https://codeberg.org/foreign-c/foreign-c.git --depth=2
-
-ARG SCHEME=chibi
-ARG IMAGE=${SCHEME}:head
-FROM schemers/${IMAGE}
-RUN apt-get update && apt-get install -y make gcc libffi-dev libcurl4 gauche
-RUN mkdir ${HOME}/.snow && echo "()" > ${HOME}/.snow/config.scm
-COPY --from=build /build /build
-ARG SCHEME=chibi
-WORKDIR /build/compile-scheme
-RUN make install
-WORKDIR /build/chibi-scheme
-RUN make install
-WORKDIR /build/chibi-scheme
-RUN make install
-WORKDIR /build/akku
-RUN bash install.sh
-ENV PATH=/root/.local/bin:${PATH}
-RUN akku update
-WORKDIR /build/foreign-c
-RUN timeout 30 snow-chibi install --impls=${SCHEME} --always-yes "(srfi 64)" || true
-RUN timeout 30 snow-chibi install --impls=${SCHEME} --always-yes "(foreign c)" || true
-RUN make SCHEME=${SCHEME} build install
-WORKDIR /workdir
-RUN cp -r /build/foreign-c/foreign .
-COPY Makefile .
-COPY retropikzel retropikzel/
-
diff --git a/Dockerfile.jenkins b/Dockerfile.jenkins
index 1dbd00d..b1f118b 100644
--- a/Dockerfile.jenkins
+++ b/Dockerfile.jenkins
@@ -1,8 +1,5 @@
-FROM debian:trixie-slim
-RUN apt-get update && apt-get install -y \
- make ca-certificates git docker.io gauche time mit-scheme
-WORKDIR /cache
-RUN git clone https://codeberg.org/retropikzel/compile-scheme.git --depth=1
-WORKDIR /cache/compile-scheme
-RUN make build-gauche
-RUN make install
+FROM alpine
+RUN apk add make docker git
+RUN git clone https://codeberg.org/retropikzel/test-r7rs.git --depth=1
+RUN cd test-r7rs && ./configure && make && make install
+COPY --from=schemers/chibi:alpine-head /usr/local /usr/local
diff --git a/Jenkinsfile b/Jenkinsfile
index 06ddb9b..8ad1543 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -15,46 +15,18 @@ pipeline {
parameters {
string(name: 'R7RS_SCHEMES', defaultValue: 'chibi chicken gauche guile kawa mosh racket sagittarius stklos ypsilon', description: '')
string(name: 'R6RS_SCHEMES', defaultValue: 'chezscheme guile ikarus ironscheme mosh racket sagittarius ypsilon', description: '')
- string(name: 'LIBRARIES', defaultValue: 'system shell', description: '')
+ string(name: 'LIBRARIES', defaultValue: 'system named-pipes shell requests', description: '')
}
stages {
- stage('Tests') {
- parallel {
- stage('R6RS') {
- steps {
- script {
- params.LIBRARIES.split().each { LIBRARY ->
- stage("${LIBRARY}") {
- parallel params.R6RS_SCHEMES.split().collectEntries { SCHEME ->
- [(SCHEME): {
- def IMG="${SCHEME}:head"
- catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
- sh "timeout 600 make SCHEME=${SCHEME} LIBRARY=${LIBRARY} test-r6rs-docker"
- }
- }]
- }
- }
- }
- }
- }
- }
- stage('R7RS') {
- steps {
- script {
- params.LIBRARIES.split().each { LIBRARY ->
- stage("${LIBRARY}") {
- parallel params.R7RS_SCHEMES.split().collectEntries() { SCHEME ->
- [(SCHEME): {
- def IMG="${SCHEME}:head"
- if("${SCHEME}" == "chicken") {
- IMG="${SCHEME}:5"
- }
- catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
- sh "timeout 600 make SCHEME=${SCHEME} LIBRARY=${LIBRARY} test-r7rs-docker"
- }
- }]
- }
+ stage('Test R6RS Debian') {
+ steps {
+ script {
+ params.LIBRARIES.split().each { LIBRARY ->
+ params.R6RS_SCHEMES.split().each { SCHEME ->
+ stage("${SCHEME} ${LIBRARY}") {
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ sh "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} RNRS=r6rs test-docker"
}
}
}
@@ -62,6 +34,25 @@ pipeline {
}
}
}
-
+ stage('Test R7RS Debian') {
+ steps {
+ script {
+ params.LIBRARIES.split().each { LIBRARY ->
+ params.R7RS_SCHEMESsplit().each { SCHEME ->
+ stage("${SCHEME} ${LIBRARY}") {
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ sh "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} RNRS=r7rs test-docker"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ post {
+ always {
+ cleanWs()
+ }
}
}
diff --git a/Makefile b/Makefile
index 87d9b5e..52db121 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,6 @@
SCHEME=chibi
+DOCKER_TAG=latest
+IMAGE=${SCHEME}:${DOCKER_TAG}
RNRS=r7rs
LIBRARY=system
EXAMPLE=editor
@@ -13,84 +15,69 @@ TESTFILE=retropikzel/${LIBRARY}/test.scm
PKG=retropikzel-${LIBRARY}-${VERSION}.tgz
-DOCKERIMG=${SCHEME}:head
-ifeq "${SCHEME}" "chicken"
-DOCKERIMG="chicken:5"
+SFX=scm
+SNOW=snow-chibi --impls=${SCHEME} install --always-yes
+LIB_PATHS=
+ifeq "${RNRS}" "r6rs"
+SNOW=snow-chibi --impls=${SCHEME} install --always-yes --install-source-dir=. --install-library-dir=.
+SFX=sps
+LIB_PATHS=-I .akku/lib
+endif
+
+APT_PACKAGES=
+CSC_OPTIONS=
+ifeq "${LIBRARY}" "gi-repository"
+APT_PACKAGES=libgirepository-2.0-dev
+CSC_OPTIONS=-L -lgirepository-2.0 -L -lgobject-2.0 -L -lglib-2.0
endif
all: build
build: retropikzel/${LIBRARY}/LICENSE retropikzel/${LIBRARY}/VERSION
- rm -rf *.tgz
echo "
$$(cat retropikzel/${LIBRARY}/README.md)" > ${README}
- snow-chibi package --version=${VERSION} --authors=${AUTHOR} --doc=${README} --description="${DESCRIPTION}" ${LIBRARY_FILE}
+ snow-chibi package \
+ --always-yes \
+ --version=${VERSION} \
+ --authors=${AUTHOR} \
+ --doc=${README} \
+ --description="${DESCRIPTION}" \
+ ${LIBRARY_FILE}
install:
- snow-chibi install --impls=${SCHEME} ${SNOW_CHIBI_ARGS} ${PKG}
+ snow-chibi install --impls=${SCHEME} --always-yes ${PKG}
-uninstall:
- -snow-chibi remove --impls=${SCHEME} ${PKG}
+testfiles: build
+ rm -rf .tmp
+ mkdir -p .tmp
+ cp -r test-resources .tmp/
+ cp -r retropikzel .tmp/
+ cp ${PKG} .tmp/
+ # R6RS testfiles
+ printf "#!r6rs\n(import (except (rnrs) remove) (srfi :64) (foreign c) (retropikzel ${LIBRARY}))" > .tmp/test.sps
+ cat ${TESTFILE} >> .tmp/test.sps
+ # R7RS testfiles
+ echo "(import (scheme base) (scheme write) (scheme read) (scheme char) (scheme file) (scheme process-context) (srfi 64) (foreign c) (retropikzel ${LIBRARY}))" > .tmp/test.scm
+ cat ${TESTFILE} >> .tmp/test.scm
-init-venv: build
- rm -rf venv
- scheme-venv ${SCHEME} ${RNRS} venv
- echo "(import (scheme base) (scheme write) (scheme read) (scheme char) (scheme file) (scheme process-context) (srfi 64) (retropikzel ${LIBRARY}))" > venv/test.scm
- printf "#!r6rs\n(import (except (rnrs) remove) (srfi :64) (retropikzel ${LIBRARY}))" > venv/test.sps
- cat ${TESTFILE} >> venv/test.scm
- cat ${TESTFILE} >> venv/test.sps
- if [ "${RNRS}" = "r6rs" ]; then if [ -d ../foreign-c ]; then cp -r ../foreign-c/foreign venv/lib/; fi; fi
- if [ "${RNRS}" = "r6rs" ]; then cp -r retropikzel venv/lib/; fi
- #if [ "${SCHEME}" = "chezscheme" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
- #if [ "${SCHEME}" = "ikarus" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
- #if [ "${SCHEME}" = "ironscheme" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
- #if [ "${SCHEME}" = "racket" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
- if [ "${RNRS}" = "r6rs" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
- if [ "${SCHEME}" = "chicken" ]; then ./venv/bin/snow-chibi install --always-yes srfi.64; fi
- if [ "${SCHEME}-${RNRS}" = "mosh-r7rs" ]; then ./venv/bin/snow-chibi install --always-yes srfi.64; fi
- if [ "${RNRS}" = "r7rs" ]; then ./venv/bin/snow-chibi install ${PKG}; fi
+test: testfiles
+ cd .tmp && \
+ COMPILE_R7RS=${SCHEME} \
+ CSC_OPTIONS="${CSC_OPTIONS}" \
+ compile-r7rs \
+ -o test-program \
+ test.${SFX}
+ cd .tmp && ./test-program
-run-test: init-venv
- if [ "${RNRS}" = "r6rs" ]; then ./venv/bin/scheme-compile venv/test.sps; fi
- if [ "${RNRS}" = "r7rs" ]; then CSC_OPTIONS="-L -lcurl -L -lSDL2 -L -lSDL2_image" ./venv/bin/scheme-compile venv/test.scm; fi
- ./venv/test
-
-test-r7rs:
- echo "(import (scheme base) (scheme write) (scheme file) (scheme process-context) (foreign c) (retropikzel ${LIBRARY}) (srfi 64))" > test-r7rs.scm
- cat retropikzel/${LIBRARY}/test.scm >> test-r7rs.scm
- COMPILE_R7RS=${SCHEME} timeout 60 compile-scheme -I . -o test-r7rs test-r7rs.scm
- printf "\n" | timeout 60 ./test-r7rs
-
-test-r7rs-docker:
- echo "Building docker image..."
- docker build --build-arg IMAGE=${DOCKERIMG} --build-arg SCHEME=${SCHEME} --tag=foreign-c-library-test-${SCHEME} --quiet .
- docker run -t foreign-c-library-test-${SCHEME} sh -c "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} SNOW_CHIBI_ARGS=--always-yes build install test-r7rs"
-
-example.scm: ${EXAMPLE_FILE}.scm
- cp ${EXAMPLE_FILE}.scm example.scm
-
-example-r7rs: example.scm
- COMPILE_R7RS=${SCHEME} compile-scheme -I . -o example example.scm
- ./example
-
-test-r6rs:
- echo "(import (except (rnrs) remove) (foreign c) (retropikzel ${LIBRARY}) (srfi :64))" > test-r6rs.sps
- cat retropikzel/${LIBRARY}/test.scm >> test-r6rs.sps
- akku install chez-srfi akku-r7rs
- COMPILE_R7RS=${SCHEME} timeout 60 compile-scheme -I .akku/lib -o test-r6rs test-r6rs.sps
- timeout 60 ./test-r6rs
-
-test-r6rs-docker:
- echo "Building docker image..."
- docker build --build-arg IMAGE=${DOCKERIMG} --build-arg SCHEME=${SCHEME} --tag=foreign-c-library-test-${SCHEME} --quiet .
- docker run -t foreign-c-library-test-${SCHEME} sh -c "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} test-r6rs"
-
-example.sps: ${EXAMPLE_FILE}.sps
- cp ${EXAMPLE_FILE}.scm example.sps
-
-example-r6rs: example.sps
- akku install akku-r7rs "(foreign c)"
- COMPILE_R7RS=${SCHEME} compile-scheme -I .akku/lib -o example example.sps
- ./example
+test-docker: testfiles
+ cd .tmp && \
+ COMPILE_R7RS=${SCHEME} \
+ CSC_OPTIONS="${CSC_OPTIONS}" \
+ SNOW_PACKAGES="srfi.64 foreign.c" \
+ APT_PACKAGES="${APT_PACKAGES}" \
+ test-r7rs \
+ -o test-program \
+ test.${SFX} \
+ ${PKG}
clean:
git clean -X -f
diff --git a/retropikzel/gi-repository.scm b/retropikzel/gi-repository.scm
index 3aed587..8564c46 100644
--- a/retropikzel/gi-repository.scm
+++ b/retropikzel/gi-repository.scm
@@ -1,13 +1,437 @@
-(define-c-library libc
- '("stdlib.h")
- libc-name
- '((additional-versions ("6"))))
+(define-c-library libc '("stdlib.h") #f '())
+(define-c-procedure c-perror libc 'perror 'void '(pointer))
+
(define-c-library c-gi
'("girepository/girepository.h")
"girepository-2.0"
'((additional-versions ("0"))))
-(define-c-procedure gi-repository-new c-gi 'gi_repository_new 'pointer '())
-(define-c-procedure gi-repository-require c-gi 'gi_repository_require 'pointer '(pointer pointer pointer int pointer))
-(define-c-procedure gi-repository-find-by-name c-gi 'gi_repository_find_by_name 'pointer '(pointer pointer pointer))
-(define-c-procedure gi-function-info-invoke c-gi 'gi_function_info_invoke 'int '(pointer pointer int pointer int pointer pointer))
+
+
+(define-c-procedure c-gi-repository-new c-gi 'gi_repository_new 'pointer '())
+(define-c-procedure c-gi-repository-require c-gi 'gi_repository_require 'pointer '(pointer pointer pointer int pointer))
+(define-c-procedure c-gi-repository-find-by-name c-gi 'gi_repository_find_by_name 'pointer '(pointer pointer pointer))
+(define-c-procedure c-gi-repository-c-prefix c-gi 'gi_repository_get_c_prefix 'pointer '(pointer pointer))
+(define-c-procedure c-gi-repository-get-loaded-namespaces c-gi 'gi_repository_get_loaded_namespaces 'pointer '(pointer pointer))
+
+(define-c-procedure c-gi-base-info-get-name c-gi 'gi_base_info_get_name 'pointer '(pointer))
+(define-c-procedure c-gi-base-info-get-namespace c-gi 'gi_base_info_get_namespace 'pointer '(pointer))
+(define-c-procedure c-gi-base-info-get-typelib c-gi 'gi_base_info_get_typelib 'pointer '(pointer))
+(define-c-procedure c-gi-base-info-get-attribute c-gi 'gi_base_info_get_attribute 'pointer '(pointer pointer))
+(define-c-procedure c-gi-base-info-get-namespace c-gi 'gi_base_info_get_namespace 'pointer '(pointer))
+
+(define-c-procedure c-gi-function-info-invoke c-gi 'gi_function_info_invoke 'int '(pointer pointer int pointer int pointer pointer))
+
+(define-c-procedure c-gi-callable-info-get-return-type c-gi 'gi_callable_info_get_return_type 'pointer '(pointer))
+(define-c-procedure c-gi-callable-info-get-n-args c-gi 'gi_callable_info_get_n_args 'uint '(pointer))
+(define-c-procedure c-gi-callable-info-get-arg c-gi 'gi_callable_info_get_arg 'pointer '(pointer uint))
+
+(define-c-procedure c-gi-arg-info-get-type-info c-gi 'gi_arg_info_get_type_info 'pointer '(pointer))
+
+(define-c-procedure c-gi-type-info-get-tag c-gi 'gi_type_info_get_tag 'uint '(pointer))
+(define-c-procedure c-gi-type-info-get-interface c-gi 'gi_type_info_get_interface 'pointer '(pointer))
+
+(define-c-procedure c-gi-struct-info-find-method c-gi 'gi_struct_info_find_method 'pointer '(pointer pointer))
+
+(define-c-procedure c-gi-object-info-find-method c-gi 'gi_object_info_find_method 'pointer '(pointer pointer))
+(define-c-procedure c-gi-object-info-find-signal c-gi 'gi_object_info_find_signal 'pointer '(pointer pointer))
+
+(define-c-struct-type gerror '((domain u32) (code int) (message pointer)))
+
+(define GI-TYPE-TAG-VOID 0)
+(define GI-TYPE-TAG-BOOLEAN 1)
+(define GI-TYPE-TAG-INT8 2)
+(define GI-TYPE-TAG-UINT8 3)
+(define GI-TYPE-TAG-INT16 4)
+(define GI-TYPE-TAG-UINT16 5)
+(define GI-TYPE-TAG-INT32 6)
+(define GI-TYPE-TAG-UINT32 7)
+(define GI-TYPE-TAG-INT64 8)
+(define GI-TYPE-TAG-UINT64 9)
+(define GI-TYPE-TAG-FLOAT 10)
+(define GI-TYPE-TAG-DOUBLE 11)
+(define GI-TYPE-TAG-GTYPE 12)
+(define GI-TYPE-TAG-UTF8 13)
+(define GI-TYPE-TAG-FILENAME 14)
+(define GI-TYPE-TAG-ARRAY 15)
+(define GI-TYPE-TAG-INTERFACE 16)
+(define GI-TYPE-TAG-GLIST 17)
+(define GI-TYPE-TAG-GSLIST 18)
+(define GI-TYPE-TAG-GHASH 19)
+(define GI-TYPE-TAG-ERROR 20)
+(define GI-TYPE-TAG-UNICHAR 21)
+
+(define (gi-type->foreign-c-type type-info)
+ (let* ((tag (c-gi-type-info-get-tag type-info))
+ (result (cond ((= tag GI-TYPE-TAG-VOID)
+ ;; FIXME
+ 'callback)
+ ((= tag GI-TYPE-TAG-BOOLEAN) 'int)
+ ((= tag GI-TYPE-TAG-INT8) 'i8)
+ ((= tag GI-TYPE-TAG-UINT8) 'u8)
+ ((= tag GI-TYPE-TAG-INT16) 'i16)
+ ((= tag GI-TYPE-TAG-UINT16) 'u16)
+ ((= tag GI-TYPE-TAG-INT32) 'i32)
+ ((= tag GI-TYPE-TAG-UINT32) 'u32)
+ ((= tag GI-TYPE-TAG-INT64) 'i64)
+ ((= tag GI-TYPE-TAG-UINT64) 'u64)
+ ((= tag GI-TYPE-TAG-FLOAT) 'float)
+ ((= tag GI-TYPE-TAG-DOUBLE) 'double)
+ ((= tag GI-TYPE-TAG-GTYPE) 'int)
+ ((= tag GI-TYPE-TAG-UTF8) 'pointer)
+ ((= tag GI-TYPE-TAG-FILENAME) 'pointer)
+ ((= tag GI-TYPE-TAG-ARRAY) 'pointer)
+ ((= tag GI-TYPE-TAG-INTERFACE)
+ ;(display "HERE: interface name ")
+ ;(write (c-bytevector->string (c-gi-base-info-get-name (c-gi-type-info-get-interface type-info))))
+ ;(newline)
+ ;; FIXME Read type from type-info somehow
+ (cond ((or
+ (string=? (c-bytevector->string (c-gi-base-info-get-name (c-gi-type-info-get-interface type-info))) "ApplicationFlags")
+ (string=? (c-bytevector->string (c-gi-base-info-get-name (c-gi-type-info-get-interface type-info))) "WindowType"))
+ 'int)
+ (else 'pointer)))
+ ((= tag GI-TYPE-TAG-GLIST) 'pointer)
+ ((= tag GI-TYPE-TAG-GSLIST) 'pointer)
+ ((= tag GI-TYPE-TAG-GHASH) 'pointer)
+ ((= tag GI-TYPE-TAG-ERROR) 'pointer)
+ ((= tag GI-TYPE-TAG-UNICHAR) 'int)
+ (else (error "gi-type->foreign-c-type: Unknown gi-type"
+ (c-bytevector->string (c-gi-base-info-get-name (c-gi-type-info-get-interface type-info))))))))
+ result))
+
+(define-record-type
+ (make-gi-repository name cbv)
+ gi-repository?
+ (name gi-repository-name)
+ (cbv gi-repository-cbv))
+
+(define (gi-repository name version)
+ (let ((repository (c-gi-repository-new))
+ (err (c-bytevector-null)))
+ (call-with-address-of
+ err
+ (lambda (err-address)
+ (c-gi-repository-require repository
+ (string->c-bytevector name)
+ (string->c-bytevector version)
+ 0
+ err-address)))
+ (when (not (c-bytevector-null? err))
+ (let* ((error-list (c-bytevector->list err gerror))
+ (msg (c-bytevector->string (cdr (assoc 'message error-list)))))
+ (c-bytevector-free (cdr (assoc 'message error-list)))
+ (c-bytevector-free repository)
+ (error (string-append "load-gi-repository: " msg)
+ (car error-list)
+ (cadr error-list))))
+ (make-gi-repository name repository)))
+
+(define (gi-repository-info repository)
+ (let*
+ ((cbv (gi-repository-cbv repository))
+ (c-prefix (c-bytevector->string
+ (c-gi-repository-c-prefix cbv
+ (string->c-bytevector
+ (gi-repository-name repository)))))
+ (loaded-namespaces
+ (letrec* ((count-cbv (make-c-bytevector (c-type-size 'int)))
+ (namespaces (c-gi-repository-get-loaded-namespaces cbv count-cbv))
+ (count (c-bytevector-ref count-cbv 'int 0))
+ (looper
+ (lambda (index result)
+ (if (= index count)
+ result
+ (looper (+ index 1)
+ (append result
+ (list
+ (c-bytevector->string (c-bytevector-ref namespaces
+ 'pointer
+ (* (c-type-size 'pointer) index))))))))))
+ (looper 0 '())
+ ))
+ )
+ `((c-prefix . ,c-prefix)
+ (loaded-namespaces . ,loaded-namespaces)
+ )))
+
+(define (gi-function-info repository function-name)
+ (let ((info (c-gi-repository-find-by-name
+ (gi-repository-cbv repository)
+ (string->c-bytevector (gi-repository-name repository))
+ (string->c-bytevector function-name))))
+ (if (c-bytevector-null? info)
+ #f
+ (letrec*
+ ((return-info (c-gi-callable-info-get-return-type info))
+ (return-type (gi-type->foreign-c-type return-info))
+ (argument-count (c-gi-callable-info-get-n-args info))
+ (argument-types-loop
+ (lambda (index result)
+ (if (= index argument-count)
+ result
+ (argument-types-loop
+ (+ index 1)
+ (append
+ result
+ (list
+ (let* ((arg-info (c-gi-callable-info-get-arg info index))
+ (type-info (c-gi-arg-info-get-type-info arg-info))
+ (type (gi-type->foreign-c-type type-info)))
+ `((type . ,type)
+ (index . ,index)))))))))
+ (argument-types (argument-types-loop 0 '())))
+ `((namespace . ,(gi-repository-name repository))
+ (function-name . ,function-name)
+ (return-type . ,return-type)
+ (argument-count . ,argument-count)
+ (argument-types . ,argument-types)
+ (info-cbv . ,info))))))
+
+(define (gi-invoke repository name . args)
+ (when (not (gi-repository? repository))
+ (error "gi-invoke: repository argument must be gi-repository" repository))
+ (when (not (string? name))
+ (error "gi-invoke: name argument must be string" name))
+ (letrec*
+ ((function-info
+ (let ((function-info
+ (c-gi-repository-find-by-name
+ (gi-repository-cbv repository)
+ (string->c-bytevector (gi-repository-name repository))
+ (string->c-bytevector name))))
+ (when (c-bytevector-null? function-info)
+ (error "gi-invoke: Repository has not function"
+ (gi-repository-name repository)
+ name))
+ function-info))
+ (function-return-info (c-gi-callable-info-get-return-type function-info))
+ (return-type (gi-type->foreign-c-type function-return-info))
+ (n-args (let ((n-args (c-gi-callable-info-get-n-args function-info)))
+ (when (not (= n-args (length args)))
+ (error
+ (string-append "gi-invoke: Argument count mismatch, got "
+ (number->string (length args))
+ ", wanted "
+ (number->string n-args))
+ ;(gi-object-namespace object)
+ ;(gi-object-name object)
+ name))
+ n-args))
+ (arg-info-looper
+ (lambda (index result)
+ (if (or (= index n-args)
+ (= index (length args)))
+ result
+ (arg-info-looper
+ (+ index 1)
+ (append
+ result
+ (list
+ (let* ((arg-info (c-gi-callable-info-get-arg function-info index))
+ (type-info (c-gi-arg-info-get-type-info arg-info))
+ (type (gi-type->foreign-c-type type-info)))
+ (cons type (list-ref args index)))))))))
+ (arg-info (arg-info-looper 0 '()))
+ (arg-cbv (make-c-bytevector 1024))
+ (arg-cbv-offset 0)
+ (invoke-error (c-bytevector-null))
+ (return-value (make-c-bytevector 1024)))
+ (for-each
+ (lambda (arg)
+ (c-bytevector-set! arg-cbv
+ (car arg)
+ arg-cbv-offset
+ (if (string? (cdr arg))
+ (string->c-bytevector (cdr arg))
+ (cdr arg)))
+ (set! arg-cbv-offset (+ arg-cbv-offset (c-type-size (car arg)))))
+ arg-info)
+ (c-gi-function-info-invoke function-info
+ arg-cbv
+ n-args
+ (c-bytevector-null)
+ 0
+ return-value
+ invoke-error)
+ (when (not (symbol=? return-type 'void))
+ (c-bytevector-ref return-value return-type 0))))
+
+(define (gi-struct repository namespace name)
+ (let ((base-info
+ (c-gi-repository-find-by-name (gi-repository-cbv repository)
+ (string->c-bytevector namespace)
+ (string->c-bytevector name))))
+ (when (c-bytevector-null? base-info)
+ (c-perror (string->c-bytevector "(C perror) gi-object"))
+ (error "gi-object: ERROR" namespace name base-info))
+ base-info))
+
+(define (gi-struct-method-info struct method-name)
+ (let ((info (c-gi-struct-info-find-method struct (string->c-bytevector method-name))))
+ (if (c-bytevector-null? info)
+ #f
+ (letrec*
+ ((return-info (c-gi-callable-info-get-return-type info))
+ (return-type (gi-type->foreign-c-type return-info))
+ (argument-count (c-gi-callable-info-get-n-args info))
+ (argument-types-loop
+ (lambda (index result)
+ (if (= index argument-count)
+ result
+ (argument-types-loop
+ (+ index 1)
+ (append
+ result
+ (list
+ (let* ((arg-info (c-gi-callable-info-get-arg info index))
+ (type-info (c-gi-arg-info-get-type-info arg-info))
+ (type (gi-type->foreign-c-type type-info)))
+ `((type . ,type)
+ (index . ,index)))))))))
+ (argument-types (argument-types-loop 0 '())))
+ `((namespace . ,(gi-info-namespace struct))
+ (struct-name . ,(gi-info-name struct))
+ (method-name . ,method-name)
+ (return-type . ,return-type)
+ (argument-count . ,argument-count)
+ (argument-types . ,argument-types)
+ (info-cbv . ,info))))))
+
+(define (gi-struct-invoke struct method-name . args)
+ (let ((method-info (gi-struct-method-info struct method-name)))
+ (when (not method-info)
+ (error "gi-struct-invoke: Struct has no method" struct method-name))
+ (when (not (= (cdr (assoc 'argument-count method-info)) (length args)))
+ (error
+ (string-append "gi-struct-invoke: Argument count mismatch, got "
+ (number->string (length args))
+ ", wanted "
+ (number->string (cdr (assoc 'argument-count method-info))))
+ (gi-struct-namespace struct)
+ (gi-struct-name struct)
+ method-name))
+ (let
+ ((info-cbv (cdr (assoc 'info-cbv method-info)))
+ (arg-cbv (make-c-bytevector 1024))
+ (arg-cbv-offset 0)
+ (invoke-error (c-bytevector-null))
+ (return-value (make-c-bytevector 1024)))
+ (for-each
+ (lambda (arg)
+ (let ((value (list-ref args (cdr (assoc 'index arg)))))
+ (c-bytevector-set! arg-cbv
+ (cdr (assoc 'type arg))
+ arg-cbv-offset
+ (if (string? value)
+ (string->c-bytevector value)
+ value))
+ (set! arg-cbv-offset (+ arg-cbv-offset (c-type-size (cdr (assoc 'type arg)))))))
+ (cdr (assoc 'argument-types method-info)))
+ (c-gi-function-info-invoke info-cbv
+ arg-cbv
+ (cdr (assoc 'argument-count method-info))
+ (c-bytevector-null)
+ 0
+ return-value
+ invoke-error)
+ (if (not (symbol=? (cdr (assoc 'return-type method-info)) 'void))
+ (c-bytevector-ref return-value
+ (cdr (assoc 'return-type method-info))
+ 0)))))
+
+(define (gi-object repository namespace name)
+ (let ((base-info
+ (c-gi-repository-find-by-name (gi-repository-cbv repository)
+ (string->c-bytevector namespace)
+ (string->c-bytevector name))))
+ (when (c-bytevector-null? base-info)
+ (c-perror (string->c-bytevector "(C perror) gi-object"))
+ (error "gi-object: ERROR" namespace name base-info))
+ base-info))
+
+(define (gi-info-namespace info)
+ (c-bytevector->string (c-gi-base-info-get-namespace info)))
+(define gi-object-namespace gi-info-namespace)
+(define gi-struct-namespace gi-info-namespace)
+
+(define (gi-info-name info)
+ (c-bytevector->string (c-gi-base-info-get-name info)))
+(define gi-object-name gi-info-name)
+(define gi-struct-name gi-info-name)
+
+(define (gi-object-method-info object method-name)
+ (let ((info (c-gi-object-info-find-method object (string->c-bytevector method-name))))
+ (if (c-bytevector-null? info)
+ #f
+ (letrec*
+ ((return-info (c-gi-callable-info-get-return-type info))
+ (return-type (gi-type->foreign-c-type return-info))
+ (argument-count (c-gi-callable-info-get-n-args info))
+ (argument-types-loop
+ (lambda (index result)
+ (if (= index argument-count)
+ result
+ (argument-types-loop
+ (+ index 1)
+ (append
+ result
+ (list
+ (let* ((arg-info (c-gi-callable-info-get-arg info index))
+ (type-info (c-gi-arg-info-get-type-info arg-info))
+ (type (gi-type->foreign-c-type type-info)))
+ `((type . ,type)
+ (index . ,index)))))))))
+ (argument-types (argument-types-loop 0 '())))
+ `((namespace . ,(gi-info-namespace object))
+ (object-name . ,(gi-info-name object))
+ (method-name . ,method-name)
+ (return-type . ,return-type)
+ (argument-count . ,argument-count)
+ (argument-types . ,argument-types)
+ (info-cbv . ,info))))))
+
+(define (gi-object-invoke object method-name . args)
+ (let ((method-info (gi-object-method-info object method-name)))
+ (when (not method-info)
+ (error "gi-object-invoke: Object has no method" object method-name))
+ (when (not (= (cdr (assoc 'argument-count method-info)) (length args)))
+ (error
+ (string-append "gi-object-invoke: Argument count mismatch, got "
+ (number->string (length args))
+ ", wanted "
+ (number->string (cdr (assoc 'argument-count method-info))))
+ (gi-object-namespace object)
+ (gi-object-name object)
+ method-name))
+ (let
+ ((info-cbv (cdr (assoc 'info-cbv method-info)))
+ (arg-cbv (make-c-bytevector 1024))
+ (arg-cbv-offset 0)
+ (invoke-error (c-bytevector-null))
+ (return-value (make-c-bytevector 1024)))
+ (for-each
+ (lambda (arg)
+ (display "HERE: arg ")
+ (write arg)
+ (newline)
+ (let ((value (list-ref args (cdr (assoc 'index arg)))))
+ (c-bytevector-set! arg-cbv
+ (cdr (assoc 'type arg))
+ arg-cbv-offset
+ (if (string? value)
+ (string->c-bytevector value)
+ value))
+ (set! arg-cbv-offset (+ arg-cbv-offset (c-type-size (cdr (assoc 'type arg)))))))
+ (cdr (assoc 'argument-types method-info)))
+ (c-gi-function-info-invoke info-cbv
+ arg-cbv
+ (cdr (assoc 'argument-count method-info))
+ (c-bytevector-null)
+ 0
+ return-value
+ invoke-error)
+ (if (not (symbol=? (cdr (assoc 'return-type method-info)) 'void))
+ (c-bytevector-ref return-value
+ (cdr (assoc 'return-type method-info))
+ 0)))))
diff --git a/retropikzel/gi-repository.sld b/retropikzel/gi-repository.sld
index ee99592..b57a10b 100644
--- a/retropikzel/gi-repository.sld
+++ b/retropikzel/gi-repository.sld
@@ -3,8 +3,24 @@
(import (scheme base)
(scheme write)
(foreign c))
- (export gi-repository-new
- gi-repository-require
- gi-repository-find-by-name
- gi-function-info-invoke)
+ (export gi-repository
+ gi-repository-info
+ gi-function-info
+ gi-invoke
+
+ gi-struct
+ gi-struct-method-info
+ gi-struct-namespace
+ gi-struct-name
+ gi-struct-invoke
+
+ gi-object
+ gi-object-info
+ gi-object-namespace
+ gi-object-name
+ gi-object-method-info
+ gi-object-invoke
+ gi-info-namespace
+
+ )
(include "gi-repository.scm"))
diff --git a/retropikzel/gi-repository/test.scm b/retropikzel/gi-repository/test.scm
index 0dceca1..2a69829 100644
--- a/retropikzel/gi-repository/test.scm
+++ b/retropikzel/gi-repository/test.scm
@@ -1,55 +1,44 @@
-(test-begin "gi-repository")
+;(test-begin "gi-repository")
+(define-c-library libc '("stdlib.h" "stdio.h" "string.h" "stdio.h") #f ())
+(define-c-procedure c-puts libc 'puts 'int '(pointer))
-(define repository (gi-repository-new))
-(display repository)
+(define gtk (gi-repository "Gtk" "4.0"))
+(define gtk-application (gi-object gtk "Gtk" "Application"))
+(define gtk-window (gi-object gtk "Gtk" "ApplicationWindow"))
+
+(define gobject (gi-repository "GObject" "2.0"))
+(define gobject-object (gi-object gtk "GObject" "Object"))
+(define gobject-closure (gi-struct gtk "GObject" "Closure"))
+
+(define gio (gi-repository "Gio" "2.0"))
+(define gio-application (gi-object gio "Gio" "Application"))
+
+(define app (gi-object-invoke gtk-application "new" "org.hello.world" 0))
+
+;(display "HERE: method-info ")
+;(write (gi-object-method-info gtk-window "new"))
+;(newline)
+
+(define-c-callback
+ closure-process
+ 'void
+ '(pointer pointer int pointer pointer pointer)
+ (lambda (closure return-value n-param-values param-values invocation-hint marshal-data)
+ ;(c-puts (string->c-bytevector "HERE IN CLOSURE"))
+ (display "HERE: in closure")
+ (newline)
+ ))
+(define closure (gi-struct-invoke gobject-closure "new_simple" 128 closure-process))
+
+(gi-invoke gobject "signal_connect_closure" app "activate" closure 0)
+(display "HERE: method-info ")
+(write (gi-object-method-info gio-application "run"))
(newline)
-(define err (make-c-null))
-
-(call-with-address-of
- err
- (lambda (err-address)
- (gi-repository-require repository
- (string->c-utf8 "GLib")
- (string->c-utf8 "2.0")
- 0
- err-address)
- (when (not (c-null? err))
- (error "gi-repository-require failed"))))
+(display (gi-object-invoke gio-application "run" 0 (c-bytevector-null)))
+(newline)
-(define base-info
- (gi-repository-find-by-name repository
- (string->c-utf8 "GLib")
- (string->c-utf8 "assertion_message")))
-
-(when (c-null? base-info) (error "base-info failed"))
-
-(define args (make-c-bytevector (* (c-type-size 'pointer) 5)))
-
-(c-bytevector-pointer-set! args 0 (string->c-utf8 "domain"))
-(c-bytevector-pointer-set! args (c-type-size 'pointer) (string->c-utf8 "(retropikzel gi-repository)"))
-(c-bytevector-u8-set! args (* (c-type-size 'pointer) 2) 42)
-(c-bytevector-pointer-set! args (* (c-type-size 'pointer) 3) (string->c-utf8 "test.scm"))
-(c-bytevector-pointer-set! args (* (c-type-size 'pointer) 4) (string->c-utf8 "foobar"))
-
-(define return-value (make-c-bytevector (c-type-size 'int)))
-(define invoke-err (make-c-null))
-(call-with-address-of
- invoke-err
- (lambda (invoke-err-address)
- (let ((return-code
- (gi-function-info-invoke base-info
- args
- 5
- (make-c-null)
- 0
- (make-c-null)
- invoke-err-address)))
- (display "HERE: ")
- (write return-code)
- (newline)
- )))
-
-(test-end "gi-repository")
+;|#
+;(test-end "gi-repository")
diff --git a/retropikzel/requests/README.md b/retropikzel/requests/README.md
index 9acda97..323641d 100644
--- a/retropikzel/requests/README.md
+++ b/retropikzel/requests/README.md
@@ -1,7 +1,4 @@
-# requests
-
-Scheme library to make https requests. Built with
-[foreign c](https://sr.ht/~retropikzel/foreign-c/) and libcurl.
+Scheme library to make https requests. Built with (foreign c) and libcurl.
[Repository](https://git.sr.ht/~retropikzel/foreign-c-requests)
@@ -9,15 +6,11 @@ Scheme library to make https requests. Built with
[Jenkins](https://jenkins.scheme.org/job/foreign_c/job/foreign-c-requests/)
-
-
## Caveats
- Not yet working on Mosh
- No cookie reading support yet
-
-
## Dependencies
Depends on libcurl, on Debian/Ubuntu:
diff --git a/retropikzel/spite.scm b/retropikzel/spite.scm
index 6b2bcec..ae9eb93 100644
--- a/retropikzel/spite.scm
+++ b/retropikzel/spite.scm
@@ -3,19 +3,13 @@
(define exit? #f)
(define scale-x 1.0)
(define scale-y 1.0)
-(define events (list))
+(define events '())
(define current-bitmap-font #f)
(define current-line-size 1)
(define draw-color-r 0)
(define draw-color-g 0)
(define draw-color-b 0)
(define draw-color-a 255)
-(define-c-library sdl2*
- '("SDL2/SDL.h")
- "SDL2-2.0"
- `((additional-paths ("retropikzel/spite"
- "snow/retropikzel/spite"))
- (additional-versions ("0"))))
(define-c-library sdl2-image*
'("SDL2/SDL_image.h")
"SDL2_image-2.0"
@@ -23,67 +17,36 @@
"snow/retropikzel/spite"))
(additional-versions ("0"))))
-(define-c-procedure sdl-init sdl2* 'SDL_Init 'int '(int))
-(define-c-procedure sdl-get-window-flags sdl2* 'SDL_GetWindowFlags 'int '(pointer))
-(define-c-procedure sdl-create-window sdl2* 'SDL_CreateWindow 'pointer '(pointer int int int int int))
-(define-c-procedure sdl-create-renderer sdl2* 'SDL_CreateRenderer 'pointer '(pointer int int))
-(define-c-procedure sdl-render-setlogial-size sdl2* 'SDL_RenderSetLogicalSize 'int '(pointer int int))
-(define-c-procedure sdl-render-set-integer-scale sdl2* 'SDL_RenderSetIntegerScale 'int '(pointer int))
-(define-c-procedure sdl-set-render-draw-color sdl2* 'SDL_SetRenderDrawColor 'int '(pointer int int int int))
-(define-c-procedure sdl-render-clear sdl2* 'SDL_RenderClear 'int '(pointer))
-(define-c-procedure sdl-render-present sdl2* 'SDL_RenderPresent 'void '(pointer))
-(define-c-procedure sdl-get-key-from-scancode sdl2* 'SDL_GetKeyFromScancode 'int '(int))
-(define-c-procedure sdl-get-key-name sdl2* 'SDL_GetKeyName 'pointer '(int))
-(define-c-procedure sdl-poll-event sdl2* 'SDL_PollEvent 'int '(pointer))
(define-c-procedure sdl-img-load-texture sdl2-image* 'IMG_LoadTexture 'pointer '(pointer pointer))
-(define-c-procedure sdl-render-copy sdl2* 'SDL_RenderCopy 'int '(pointer pointer pointer pointer))
-(define-c-procedure sdl-render-draw-line sdl2* 'SDL_RenderDrawLine 'int '(pointer int int int int))
-(define-c-procedure sdl-render-draw-rect sdl2* 'SDL_RenderDrawRect 'int '(pointer pointer))
-(define-c-procedure sdl-render-fill-rect sdl2* 'SDL_RenderFillRect 'int '(pointer pointer))
-(define-c-procedure sdl-render-set-scale sdl2* 'SDL_RenderSetScale 'int '(pointer float float))
-(define-c-procedure sdl-create-texture-from-surface sdl2* 'SDL_CreateTextureFromSurface 'pointer '(pointer pointer))
-(define-c-procedure sdl-set-window-resizable sdl2* 'SDL_SetWindowResizable 'void '(pointer int))
-(define-c-procedure sdl-render-get-scale sdl2* 'SDL_RenderGetScale 'void '(pointer pointer pointer))
-(define-c-procedure sdl-render-geometry sdl2* 'SDL_RenderGeometry 'void '(pointer pointer pointer int pointer int))
(define window* #f)
(define renderer* #f)
(define event* (make-c-bytevector 4000))
(define draw-rect* (make-c-bytevector (* (c-type-size 'int) 4)))
(define draw-slice-rect* (make-c-bytevector (* (c-type-size 'int) 4)))
-(define fill-triangle-vertex-size 128) ;(+ (* (c-type-size 'int) 6) (* (c-type-size 'float) 2))
+(define fill-triangle-vertex-size (+ (* (c-type-size 'int) 6) (* (c-type-size 'float) 2)))
(define fill-triangle-vertex1* (make-c-bytevector fill-triangle-vertex-size 0))
(define fill-triangle-vertex2* (make-c-bytevector fill-triangle-vertex-size 0))
(define fill-triangle-vertex3* (make-c-bytevector fill-triangle-vertex-size 0))
(define fill-triangle-vertexes* (make-c-bytevector (* fill-triangle-vertex-size 3 0)))
-(c-bytevector-set! fill-triangle-vertexes*
- 'pointer
- (* fill-triangle-vertex-size 0)
- fill-triangle-vertex1*)
-(c-bytevector-set! fill-triangle-vertexes*
- 'pointer
- (* fill-triangle-vertex-size 1)
- fill-triangle-vertex2*)
-(c-bytevector-set! fill-triangle-vertexes*
- 'pointer
- (* fill-triangle-vertex-size 2)
- fill-triangle-vertex3*)
-
-(define update-procedure #f)
-(define draw-procedure #f)
+(c-bytevector-set!
+ fill-triangle-vertexes* 'pointer (* fill-triangle-vertex-size 0) fill-triangle-vertex1*)
+(c-bytevector-set!
+ fill-triangle-vertexes* 'pointer (* fill-triangle-vertex-size 1) fill-triangle-vertex2*)
+(c-bytevector-set!
+ fill-triangle-vertexes* 'pointer (* fill-triangle-vertex-size 2) fill-triangle-vertex3*)
(define main-loop-start-time 0)
(define delta-time 0)
-(define main-loop
- (lambda ()
- (set! main-loop-start-time (current-jiffy))
- (sdl2-events-get)
- (update-procedure delta-time (poll-events!))
- (render-clear)
- (draw-procedure)
- (render-present)
- (set! delta-time (/ (- (current-jiffy) main-loop-start-time) (jiffies-per-second)))
- (unless exit? (main-loop))))
+(define (main-loop update-procedure draw-procedure)
+ (set! main-loop-start-time (current-jiffy))
+ (sdl2-events-get)
+ (update-procedure delta-time (poll-events!))
+ (render-clear)
+ (draw-procedure)
+ (render-present)
+ (set! delta-time (/ (- (current-jiffy) main-loop-start-time) (jiffies-per-second)))
+ (unless exit? (main-loop update-procedure draw-procedure)))
(define sdl2-event->spite-event
(lambda (event)
@@ -99,8 +62,8 @@
'int
(+ (* (c-type-size 'int) 3)
(* (c-type-size 'u8) 4))))
- (keycode (sdl-get-key-from-scancode scancode))
- (key (c-bytevector->string (sdl-get-key-name keycode)))
+ (keycode (SDL_GetKeyFromScancode scancode))
+ (key (c-bytevector->string (SDL_GetKeyName keycode)))
(repeat? (= (c-bytevector-ref
event
'u8
@@ -152,7 +115,7 @@
(define sdl2-events-get
(lambda ()
- (let ((poll-result (sdl-poll-event event*)))
+ (let ((poll-result (SDL_PollEvent event*)))
(cond
((= poll-result 1)
(let ((event (sdl2-event->spite-event event*)))
@@ -163,12 +126,12 @@
(define render-clear
(lambda ()
- (sdl-set-render-draw-color renderer* 255 255 255 255)
- (sdl-render-clear renderer*)))
+ (SDL_SetRenderDrawColor renderer* 255 255 255 255)
+ (SDL_RenderClear renderer*)))
(define render-present
(lambda ()
- (sdl-render-present renderer*)))
+ (SDL_RenderPresent renderer*)))
(define-record-type image
(make-image pointer path)
@@ -189,7 +152,7 @@
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 1) y)
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 2) width)
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 3) height)
- (sdl-render-copy renderer* (image-pointer image) (c-bytevector-null) draw-rect*)))
+ (SDL_RenderCopy renderer* (image-pointer image) (c-bytevector-null) draw-rect*)))
(define draw-image-slice
(lambda (image x y width height slice-x slice-y slice-width slice-height)
@@ -201,7 +164,7 @@
(c-bytevector-set! draw-slice-rect* 'int (* (c-type-size 'int) 1) slice-y)
(c-bytevector-set! draw-slice-rect* 'int (* (c-type-size 'int) 2) slice-width)
(c-bytevector-set! draw-slice-rect* 'int (* (c-type-size 'int) 3) slice-height)
- (sdl-render-copy renderer* (image-pointer image) draw-slice-rect* draw-rect*)))
+ (SDL_RenderCopy renderer* (image-pointer image) draw-slice-rect* draw-rect*)))
(define (set-draw-color r g b . a)
(set! draw-color-r r)
@@ -224,21 +187,21 @@
(c-bytevector-set! fill-triangle-vertex3* 'int (* (c-type-size 'int) 4) draw-color-b)
(c-bytevector-set! fill-triangle-vertex3* 'int (* (c-type-size 'int) 5) draw-color-b)
- (sdl-set-render-draw-color renderer* r g b draw-color-a))
+ (SDL_SetRenderDrawColor renderer* r g b draw-color-a))
(define (set-line-size size)
(set! current-line-size size)
- (sdl-render-set-scale renderer* (inexact (/ size 1)) (inexact (/ size 1))))
+ (SDL_RenderSetScale renderer* (inexact (/ size 1)) (inexact (/ size 1))))
(define (draw-point x y)
- (sdl-render-draw-line renderer*
+ (SDL_RenderDrawLine renderer*
(exact (round (/ x current-line-size)))
(exact (round (/ y current-line-size)))
(exact (round (/ x current-line-size)))
(exact (round (/ y current-line-size)))))
(define (draw-line x1 y1 x2 y2)
- (sdl-render-draw-line renderer*
+ (SDL_RenderDrawLine renderer*
(exact (round (/ x1 current-line-size)))
(exact (round (/ y1 current-line-size)))
(exact (round (/ x2 current-line-size)))
@@ -249,14 +212,14 @@
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 1) y)
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 2) width)
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 3) height)
- (sdl-render-draw-rect renderer* draw-rect*))
+ (SDL_RenderDrawRect renderer* draw-rect*))
(define (fill-rectangle x y width height)
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 0) x)
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 1) y)
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 2) width)
(c-bytevector-set! draw-rect* 'int (* (c-type-size 'int) 3) height)
- (sdl-render-fill-rect renderer* draw-rect*))
+ (SDL_RenderFillRect renderer* draw-rect*))
(define (draw-triangle x1 y1 x2 y2 x3 y3)
(draw-line x1 y1 x2 y2)
@@ -274,23 +237,23 @@
(c-bytevector-set! fill-triangle-vertex3* 'int (* (c-type-size 'int) 0) x3)
(c-bytevector-set! fill-triangle-vertex3* 'int (* (c-type-size 'int) 1) y3)
-(sdl-render-geometry renderer* (c-bytevector-null) fill-triangle-vertexes* 3 (c-bytevector-null) 0))
+(SDL_RenderGeometry renderer* (c-bytevector-null) fill-triangle-vertexes* 3 (c-bytevector-null) 0))
(define (spite-option-set! name . value)
(cond
((equal? name 'allow-window-resizing)
(cond
((equal? value '(#t))
- (sdl-set-window-resizable window* 1))
+ (SDL_SetWindowResizable window* 1))
((equal? value '(#f))
- (sdl-set-window-resizable window* 0))
+ (SDL_SetWindowResizable window* 0))
(else (error "Wrong option value for 'allow-window-resizing, must be #t or #f"
value))))
((equal? name 'renderer-size)
(if (and (= (length value) 2)
(number? (car value))
(number? (cadr value)))
- (sdl-render-setlogial-size renderer* (car value) (cadr value))
+ (SDL_RenderSetLogicalSize renderer* (car value) (cadr value))
(error "Wrong option value for renderer-size, must be two numbers")))
(else (error "No such option!" name))))
@@ -299,28 +262,26 @@
(lambda ()
(let ((x (make-c-bytevector (c-type-size 'float)))
(y (make-c-bytevector (c-type-size 'float))))
- (sdl-render-get-scale renderer* x y)
+ (SDL_RenderGetScale renderer* x y)
(list (cons 'x (c-bytevector-ref x 'float 0))
(cons 'y (c-bytevector-ref y 'float 0))))))
(define spite-start
- (lambda (new-update-procedure new-draw-procedure)
- (set! update-procedure new-update-procedure)
- (set! draw-procedure new-draw-procedure)
+ (lambda (update-procedure draw-procedure)
(cond
((not started?)
(set! started? #t)
- (main-loop)))))
+ (main-loop update-procedure draw-procedure)))))
(define spite-init
(lambda (title width height)
(cond
((not started?)
- (sdl-init 32)
- (set! window* (sdl-create-window (string->c-bytevector title) 0 0 width height 4))
- (set! renderer* (sdl-create-renderer window* -1 2))
- (sdl-render-setlogial-size renderer* width height)
- (sdl-render-set-integer-scale renderer* 1)
+ (SDL_Init 32)
+ (set! window* (SDL_CreateWindow (string->c-bytevector title) 0 0 width height 4))
+ (set! renderer* (SDL_CreateRenderer window* -1 2))
+ (SDL_RenderSetLogicalSize renderer* width height)
+ (SDL_RenderSetIntegerScale renderer* 1)
(render-clear)
(render-present)
(set! spite-inited? #t)))))
diff --git a/retropikzel/spite.sld b/retropikzel/spite.sld
index c3db5f0..d11f613 100644
--- a/retropikzel/spite.sld
+++ b/retropikzel/spite.sld
@@ -7,6 +7,11 @@
(scheme file)
(scheme load)
(scheme time)
+ (c2foreign-c sdl2 init)
+ (c2foreign-c sdl2 video)
+ (c2foreign-c sdl2 render)
+ (c2foreign-c sdl2 events)
+ (c2foreign-c sdl2 keyboard)
(foreign c))
(export spite-init
spite-start