bohonghuang / cl-gtk4

GTK4/Libadwaita/WebKit2 bindings for Common Lisp.
GNU Lesser General Public License v3.0
213 stars 9 forks source link

Cant create wigets to store it in variable #53

Open Filipp-Druan opened 10 months ago

Filipp-Druan commented 10 months ago

I tried to compile this code:

(ql:quickload '(cl-gtk4))

(defpackage gui.example
  (:use :cl :gtk4))

(in-package gui.example)

(defvar *setting-box*
  (let ((box          (make-box :orientation +orientation-vertical+
                                :spacing 2))
        (hello-button (make-button :label "Hello!"))
        (reset-button (make-button :label "Reset")))

    (declare (ignore hello-button reset-button box))
    (print "Hello!")))

And I got this error:

Unhandled memory fault at #x0.
   [Condition of type SB-SYS:MEMORY-FAULT-ERROR]

Restarts:
 0: [ABORT] Abort compilation.
 1: [*ABORT] Return to SLY's top level.
 2: [ABORT] abort thread (#<THREAD tid=32076 "slynk-worker" RUNNING {1003D4E6A3}>)

Backtrace:
 0: (SB-SYS:MEMORY-FAULT-ERROR #<unused argument> #.(SB-SYS:INT-SAP #X00000000))
 1: ("foreign function: call_into_lisp_")
 2: ("foreign function: handle_memory_fault_emulation_trap")
 3: ("foreign function: #x555680C99CD7")
 4: ((LAMBDA (&REST GIR::ARGS-IN) :IN GIR::BUILD-FUNCTION) 1 2)
 5: ((SB-C::TOP-LEVEL-FORM (SB-IMPL::%DEFVAR #1=(QUOTE *SETTING-BOX*) (SB-C:SOURCE-LOCATION) (UNLESS (SB-INT:%BOUNDP #1#) (LET (#2=# #2# . #3=(#2#)) (DECLARE . #3#) (PRINT "Hello!")))))) [toplevel]
 6: (SB-FASL::LOAD-FASL-GROUP #S(SB-FASL::FASL-INPUT :STREAM #<SB-SYS:FD-STREAM for "file /tmp/slimeiKWK87.fasl" {1003FE78D3}> :TABLE #(63 #1="/home/iam/quicklisp/local-projects/share-files/gui.lisp" :EMA..
 7: ((LAMBDA NIL :IN SB-FASL::LOAD-AS-FASL))
 8: (SB-IMPL::CALL-WITH-LOADER-PACKAGE-NAMES #<FUNCTION (LAMBDA NIL :IN SB-FASL::LOAD-AS-FASL) {1003FF23CB}>)
 9: (SB-FASL::LOAD-AS-FASL #<SB-SYS:FD-STREAM for "file /tmp/slimeiKWK87.fasl" {1003FE78D3}> NIL NIL)
10: ((LABELS SB-FASL::LOAD-STREAM-1 :IN LOAD) #<SB-SYS:FD-STREAM for "file /tmp/slimeiKWK87.fasl" {1003FE78D3}> T)
11: (SB-FASL::CALL-WITH-LOAD-BINDINGS #<FUNCTION (LABELS SB-FASL::LOAD-STREAM-1 :IN LOAD) {7FF0AD99DD6B}> #<SB-SYS:FD-STREAM for "file /tmp/slimeiKWK87.fasl" {1003FE78D3}> T #<SB-SYS:FD-STREAM for "file /..
12: (LOAD #P"/tmp/slimeiKWK87.fasl" :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST :ERROR :EXTERNAL-FORMAT :DEFAULT)
13: ((FLET SLYNK-BACKEND:CALL-WITH-COMPILATION-HOOKS :IN "/home/iam/.emacs.d/elpa/sly-20230924.811/slynk/backend/sbcl.lisp") #<FUNCTION (LAMBDA NIL :IN SLYNK-BACKEND:SLYNK-COMPILE-STRING) {1003FE77BB}>)
14: ((FLET SLYNK-BACKEND:SLYNK-COMPILE-STRING :IN "/home/iam/.emacs.d/elpa/sly-20230924.811/slynk/backend/sbcl.lisp") "(defvar *setting-box* ..)
15: ((LAMBDA NIL :IN SLYNK:COMPILE-STRING-FOR-EMACS))
16: ((LAMBDA NIL :IN SLYNK::COLLECT-NOTES))
 --more--
bohonghuang commented 10 months ago

You must create the widget within the GTK event loop and assign it to this global variable, as most of GTK's functionality relies on the application context.