From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Tim Meehan Newsgroups: gmane.lisp.guile.user Subject: getting to know the FFI ... Date: Thu, 19 Nov 2020 21:02:51 -0600 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="1496"; mail-complaints-to="usenet@ciao.gmane.io" To: guile-user@gnu.org Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Fri Nov 20 04:03:30 2020 Return-path: Envelope-to: guile-user@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kfwhu-0000IB-FX for guile-user@m.gmane-mx.org; Fri, 20 Nov 2020 04:03:30 +0100 Original-Received: from localhost ([::1]:58802 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kfwht-000202-9A for guile-user@m.gmane-mx.org; Thu, 19 Nov 2020 22:03:29 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:33288) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kfwhX-0001ze-0J for guile-user@gnu.org; Thu, 19 Nov 2020 22:03:07 -0500 Original-Received: from mail-qk1-x72d.google.com ([2607:f8b0:4864:20::72d]:45104) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kfwhU-0002ZE-BW for guile-user@gnu.org; Thu, 19 Nov 2020 22:03:06 -0500 Original-Received: by mail-qk1-x72d.google.com with SMTP id q5so7688484qkc.12 for ; Thu, 19 Nov 2020 19:03:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=g63ark3FBTKfaSV3GTZFKywStQfSduOG46kiPQqZkAA=; b=R6Uk0GJctsuYl7XDLhV7K9vniLcpeos3blvsps7a7shvLpOPQedrCY2LSbxX+1c+yW R3phAi7CitZMhk9BZO/EZrGbve8wy5pkVuDuIDkoUSvBxFc5XOcbmnP/vdGLULQdWQuS fow7QMXqCsipiVTwo5cqcvNPw3YSNawoA7BB5vULE1vA3WG1Cni+eH9nN/g7LOy5Hno2 ntu5WfQ93ATmyios9Wwt8wzcM9DMnCMWgi8VA++AAHIkaJrcpPsjnXXyFGBlZygjCOeZ pcdoFDwU2L7ZWSlj6yuoDGhfhNnhOJUUUbbD38xki4ZfGtJn9CqQ514J3zVwe9S9feMt ZX5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=g63ark3FBTKfaSV3GTZFKywStQfSduOG46kiPQqZkAA=; b=fFgBMrwpkIpj4BgG9jPaE2FdaFl9TBqWMPQitRvx47YOh/GiZ+mPkX4OnrskuJQY47 TQXikWIRj6A3muwOjOTTiRErIvuFEJvxNvhUrUVQZhAYkcp2x8ZLUopkyA4Bnyh+QO4v c2gMlhuz8X3MiRKWk/gs8bO9xEkTmXCOwU64280XVRRk8KkjGqYjFQyXRKOaFuaPEuTX JABY6pvnBLMKSBaVBvcI/KeEjmU3lr8ukUALjVS8yUJJ8UhtWPEvcpZ08BVLr7EU7/oL MVQJbE9I3ncR6ngvrIBRvBZ50EgVte0IgoKbSWjtoroYCGItFvAolQQ38kVk+dlMVZ8k 7H5g== X-Gm-Message-State: AOAM531sXF8nCfgz+pTkdoN/eE1WUrjpVeKNigcgew9ljbQA4Gk+jRFa rZ9F0FHor0AKpjwW5UTBshUWT/GIjXUxb9dhJg4dY4LcxhQ= X-Google-Smtp-Source: ABdhPJzwAFuoUcxA8+Nauv0sg7CvXhwbwWW6fTz2R1UZCrr30wnUGY3OME8eNAxgfOABRgHhKetDHIqwWzj3m23Abio= X-Received: by 2002:a37:4e0a:: with SMTP id c10mr14338599qkb.492.1605841382573; Thu, 19 Nov 2020 19:03:02 -0800 (PST) Received-SPF: pass client-ip=2607:f8b0:4864:20::72d; envelope-from=btmeehan@gmail.com; helo=mail-qk1-x72d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Content-Filtered-By: Mailman/MimeDel 2.1.23 X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Original-Sender: "guile-user" Xref: news.gmane.io gmane.lisp.guile.user:17029 Archived-At: 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)