mit-scheme-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[MIT-Scheme-devel] Callbacks in GLFW bindings via FFI; multiple C-inclu


From: Matt Birkholz
Subject: [MIT-Scheme-devel] Callbacks in GLFW bindings via FFI; multiple C-includes
Date: Mon, 4 Nov 2013 11:01:34 -0700

> From: <address@hidden>
> Date: Sat, 02 Nov 2013 20:27:45 +0100
> 
> Hello fellow Schemers!
> 
> I'm playing around with OpenGL bindings in MIT/GNU Scheme.

There's a beginning libGL,libGLU wrapper in the Gtk branch in

        git://birchwood-abbey.net/~matt/mit-scheme.git

At the moment it is just sufficient to run a glxgears demo.  The demo
and other GLX-related (Gtk-related) parts could be moved to a separate
GLX subsystem.  Then you wouldn't need Gtk to build and install it.
You could use it with GLFW instead.

> I'm using GLFW as the toolkit to access window-related functions. It
> includes a function glfwSetKeyCallback, which [...] does not support
> passing user-defined data.  Is there any way to make this work
> nonetheless?

Sure.  I haven't actually tried this, but you should be able to call
glfwSetKeyCallback like this.

        (C-call "glfw_set_key_callback"
                window
                (C-callback "key_callback")
                (C-callback (lambda args (display ";key_callback\n"))))

You will need declarations like this:

        (extern void glfw_set_key_callback
                     (window (* GLFWwindow))
                     (CALLBACK (* GLFWkeyfun))
                     (ID int))

        (callback void key_callback
                  (window (* GLFWwindow))
                  (key int) ...
                  (ID int))

And adapter code like this:

        static int key_callback_id;
        static void key_helper (GLFWwindow*, int, ...);

        void
        glfw_set_key_callback (GLFWwindow* window,
                               GLFWkeyfun *callback, int user_data)
        {
          key_callback_id = user_data;
          glfwSetKeyCallback (window, &key_helper);
        }

        static void
        key_helper (GLFWwindow* window, int key, ...)
        {
          Scm_key_callback (window, key, ..., key_callback_id);
        }

> Another thing that I found is that it seems impossible to load
> multiple FFI-bindings in the same image. [...]  Is there a way to
> make this work?

You will need to use the package system.  You cannot (easily)
C-include more than once per syntax-time environment.

There are working blowfish, md5, mhash, and gdbm wrappers in master,
with "check" Makefile targets for exercise.  To see the seemingly
impossible, get to your master clone's src/ directory and paste:

        cd blowfish/; autoconf; ./configure; make all check install
        cd ../md5;    autoconf; ./configure; make all check install
        cd ../mhash;  autoconf; ./configure; make all check install
        cd ../gdbm;                          make all check install
        cd ../; mit-scheme
        (let ((subsystems '("blowfish" "md5" "mhash")))
          (load-option 'GDBM2)
          (for-each (lambda (s) (load-option (intern s))) subsystems)
          (load "gdbm/gdbm-check")
          (for-each (lambda (s) (load (string-append s"/"s"-check")))
                    subsystems))

You should see 4 different shims load and operate side-by-side in one
"image" (world, band).  If you see this

        ;Unbound variable: generate-shim

you need to enter this first

        PATH=<bin-directory-containing-recent-master-binary>:$PATH

`mit-scheme --version' should say "Release 9.1.99".



reply via email to

[Prev in Thread] Current Thread [Next in Thread]