From: Tim Meehan <btmeehan@gmail.com>
To: guile-user@gnu.org
Subject: getting to know the FFI ...
Date: Thu, 19 Nov 2020 21:02:51 -0600 [thread overview]
Message-ID: <CACgrOxJZKxE4eL9keY5HBmqnT9yA22VOrq3Hn2RLd=BsE2PJgQ@mail.gmail.com> (raw)
I figured that I would try and do something simple-ish to see how well I
understood the FFI. I found this GTK tutorial, written in Chez Scheme:
https://github.com/jhidding/lyonesse/blob/master/gtk-tutorial/window.scm
I just tried to replace the Chez FFI calls with Guile FFI calls.
I'm not sure how to tell GTK about a callback that is written in Guile.
I'm not sure how to pass a string to GTK ...
Cheers,
My bug-ridden source follows:
; The original code was in Chez Scheme, link below:
; https://github.com/jhidding/lyonesse/blob/master/gtk-tutorial/window.scm
; I gather that it just pops up a window?
; He didn't connect the "X" to the destroy action,
; so the window might be hard to get rid of.
(use-modules (system foreign))
(define libgtk (dynamic-link "libgtk-3"))
(define libgdk (dynamic-link "libgdk-3"))
(define libgio (dynamic-link "libgio-2.0"))
(define libgobject (dynamic-link "libgobject-2.0"))
;; GtkApplication* -> GtkWidget*
(define gtk-application-window-new
(pointer->procedure
'*
(dynamic-func "gtk_application_window_new" libgtk)
(list '*)))
;; GtkWindow*, gchar* -> void
(define gtk-window-set-title
(pointer->procedure
void
(dynamic-func "gtk_window_set_title" libgtk)
(list '* '*)))
(define gtk-window-set-default-size
(pointer->procedure
void
(dynamic-func "gtk_window_set_default_size" libgtk)
(list '*)))
;; GtkWidget* -> void
(define gtk-widget-show-all
(pointer->procedure
void
(dynamic-func "gtk_widget_show_all" libgtk)
(list '*)))
;; gchar*, GApplicationFlags -> GtkApplication*
(define gtk-application-new
(pointer->procedure
'*
(dynamic-func "gtk_application_new" libgtk)
(list '* int))) ; FIXME guess
;; GApplication*, int, char ** -> int
(define g-application-run
(pointer->procedure
int
(dynamic-func "g_application_run" libgio)
(list '* int '*)))
;; gpointer, gchar*, GCallback, gpointer, GConnectFlags -> gulong
(define g-signal-connect-object
(pointer->procedure
unsigned-long
(dynamic-func "g_signal_connect_object" libgobject)
(list '* '* '* '* int)))
;; gpointer -> void
(define g-object-unref
(pointer->procedure
void
(dynamic-func "g_object_unref" libgobject)
(list '*)))
(define (activate gtk-app user-data)
(let ([window (gtk-application-window-new gtk-app)])
(gtk-window-set-title window "Example Window")
(gtk-window-set-default-size window 200 200)
(gtk-widget-show-all window)))
;; HELP: This obviously won't work.
;; How would I give GTK a Guile callback?
(define (callback p)
(let ([code (foreign-callable p (iptr iptr) void)])
(lock-object code)
(foreign-callable-entry-point code)))
;; HELP: how do you pass a string from Guile to a C function?
(define (main)
(let ([argc (length (command-line))]
[argv (command-line)]
[app (gtk-application-new (scm->pointer "what needs this
anyway?") 0)])
(g-signal-connect-object app "activate" (callback activate) 0 0)
(g-application-run app 0 0)
(g-object-unref app)))
(main)
next reply other threads:[~2020-11-20 3:02 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-20 3:02 Tim Meehan [this message]
2020-11-21 10:19 ` getting to know the FFI randomlooser
2020-11-22 14:55 ` Matt Wette
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CACgrOxJZKxE4eL9keY5HBmqnT9yA22VOrq3Hn2RLd=BsE2PJgQ@mail.gmail.com' \
--to=btmeehan@gmail.com \
--cc=guile-user@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).