Hello Matija, > I'm facing the problem mentioned in [1]. Problematic are all examples > with virtual methods.
Ok, so you are facing the same problem as Guix and HomeBrew, all other distro (that tried g-golf) work fine, i use Debian. > I have tried simpler example (attached) with same result. There is no > problem, when try same thing with guile-gi library. Somehow, callbacks > are not callable back from C code. Any clue? afaict, guile-gi does not support the definition of virtual functions - you can try this example using guile-gi (which afaict is unmaintained) because you are calling a 'regular' method, set-draw-func no problem, just saying that a mechanism to define vfunc in the GI lang binding of your choice is absolutely crucial for any 'real serious' gnome stack (type)libs use one big diffference in between guile-gi and g-golf is that in g-golf, the callback closure marshal code is written in scheme, the one in guile-gi is written in C - it could be that the pointer of the vfunc 'is fine' in guix/nix as well, but that for some reason, the %g-golf-callback-closure-marshal pointer would be the one that is damaged, i don't know Great, never used that function. You incidentally found a small bug in GI itself [1], and a tiny bug in G-Golf as well, though not the one that would solve the Guix/Nix/Homebrew problem yet [2], but thanks: can you install from the source checkout the devel branch run the make danse and install the latest [ to double check, you need this commit [ 134b57f52bc23cea8e3e02b974c7b909bb7cf56e So, here, after i patched g-golf to deal with this GI destroy notify callback tiny problem, so i can pass #f as its argument, then it works fine, as expected: https://imgur.com/a/tX8bn16 I slightly patched your example so it allows you to call it passing a -d [--debug] argument on the command line, which triggers the display of useful information while debugging ... > I'm using Nix. It would be interesting to try to understand the difference in between Debian (and most other distro) and Guix/Nix: when a vfunc is defined, it sets the upstream class structure field to a pointer, the result of calling g-callable-info-make-closure (defined in (g-golf hl-api callback). For some reason, that pointer is 'damaged' in Guix/Nix/Homebrew, and not in Debian (and most other distro), and as the gdb backtrace shows, in the msg link you are referring to, when Gtk tries to make a snapshot, it needs to access and 'call that pointer', which segfault ... I hope you'll be able to help, feel free to come and join us in #guile or #guix and try to get some help from a guix expert ... Thanks, David [1] all destroy notify callback argument ('linked' to a user-data argument) should always allow to be NULL, which g-golf checks by calling (>= (!destroy clb/arg) 0) but the signature of the destroy notify callback argument for gtk_drawing_area_set_draw_func wrongly report -1 [2] i did report the incident upstream, and meanwhile, patched g-golf so it treats callback argument named "destroy" as a maybe-null-exception, which checks itself had a tiny bug, fixed, thanks!
#! /bin/sh # -*- mode: scheme; coding: utf-8 -*- exec guile -e main -s "$0" "$@" !# (eval-when (expand load eval) (use-modules (oop goops)) (default-duplicate-binding-handler '(merge-generics replace warn-override-core warn last)) (use-modules (g-golf)) (g-irepository-require "Gtk" #:version "4.0") (for-each (lambda (name) (gi-import-by-name "Gtk" name)) '("ApplicationWindow" "Application" "DrawingArea"))) (define (activate app) (let* ((window (make <gtk-application-window> #:application app #:default-width 960 #:default-height 540 #:title "Title")) (drawing-area (make <gtk-drawing-area>))) (set-child window drawing-area) (set-draw-func drawing-area (lambda (area cr w h d) (display "I'm in!") (force-output)) #f #f) (show window))) (define (main args) (letrec ((debug? (or (member "-d" args) (member "--debug" args))) (animate (lambda () (let ((app (make <gtk-application> #:application-id "org.gnu.g-golf.set-draw-func"))) (connect app 'activate activate) (let ((status (g-application-run app '()))) #;(exit status) (dimfi 'status status)))))) (if debug? (parameterize ((%debug #t)) (animate)) (animate))))
pgpkz_WxGwOVi.pgp
Description: OpenPGP digital signature