Something weird about type GTK:TREE-PATH

Chisheng Huang <[email protected]> Fri, 26 Dec 2008 12:09:10 -0800
Newsgroups gmane.lisp.clg.devel
Message-ID <[email protected]>
Hi Espen,

There is something weird about type GTK:TREE-PATH.  To see it, please
insert the following into (DEFINE-SIMPLE-DIALOG CREATE-LIST ...) in
examples/testgtk.lisp right above (MAKE-INSTANCE 'V-BOX ...) :

    (glib:signal-connect tree
                         :cursor-changed
                         #'(lambda ()
                             (let ((path (gtk:tree-view-get-cursor tree)))
                               (print (list path
                                            (type-of path)
                                            (typep path 'tree-path)
                                            (multiple-value-list
                                             (tree-model-get-iter store path))))
                               (finish-output)
                               (print (ensure-tree-iter store path))
                               (finish-output))))

After you left click a row in the "List" dialog, the first PRINT will
print out a line like the following:

 (#(6) (SIMPLE-ARRAY (SIGNED-BYTE 32) (1)) T (T #<GTK:TREE-ITER at 0x8231920>)) 

But ENSURE-TREE-ITER in the second PRINT will throw CMUCL into the debugger:

  #(6) fell through ETYPECASE expression.
  Wanted one of (GTK:TREE-ROW-REFERENCE GTK:TREE-PATH
                 GTK:TREE-ITER).
     [Condition of type CONDITIONS::CASE-FAILURE]

  Restarts:
   0: [CONTINUE] Return from callback function
   1: [RE-INVOKE] Re-invoke callback function
   2: [DISCONNECT] Disconnect and exit signal handler
   3: [ABORT] Return to Top-Level.

  Backtrace:
    0: (GTK:ENSURE-TREE-ITER #<GTK:LIST-STORE at 0x81D0480> #(6))
    1: ("DEFINE-SIMPLE-DIALOG CREATE-LIST")
    2: ("DEFMETHOD COMPUTE-SIGNAL-FUNCTION (WIDGET T T T T)" #<GTK:TREE-VIEW at 0x813B260>)
    3: ("DEFMETHOD SIGNAL-CONNECT (GOBJECT T T)" #<GTK:TREE-VIEW at 0x813B260>)
    4: (GLIB:INVOKE-CALLBACK 70 NIL #<GTK:TREE-VIEW at 0x813B260>)
    5: (GLIB::INVOKE-SIGNAL-HANDLER 70 #<unused-arg> #<GTK:TREE-VIEW at 0x813B260>)
    6: (GLIB::CALLBACK-TRAMPOLINE #<Function GLIB::INVOKE-SIGNAL-HANDLER {58B819E9}> 70 1 #.(SYSTEM:INT-SAP #x08225A38) ...)
    7: (GLIB::SIGNAL-HANDLER-MARSHAL 268431493 268431489)
    8: ("call_into_lisp+#x8C [#x80548A0] /usr/local/cmucl/bin/lisp")
    9: ("funcall3+#x26 [#x80546D2] /usr/local/cmucl/bin/lisp")
   10: ("Foreign function call land")

The thing weird about it is PATH is confirmed to be of type TREE-PATH in
the first PRINT but (SIMPLE-ARRAY (SIGNED-BYTE 32) (1)) is not a subtype
of (VECTOR INTEGER), the defintion of TREE-PATH.

Because PATH is a vector generated by a call to MAP-C-VECTOR with INT as
the element type, the CMUCL-belly-up problem in ENSURE-TREE-ITER will go
away if TREE-PATH is defined by:

  (deftype tree-path () '(vector int))

With this new DEFTYPE for TREE-PATH, I can get my program to work again but
I'm not sure this is the right fix for the problem.  Would you please look
into it?

I'm using
  * CMUCL snapshot 2008-11 (19E)
  * glib-2.18.3 and gtk+-2.14.5
  * The latest clg from CVS
  * Gentoo Linux (x86)

Best wishes,

-cph

------------------------------------------------------------------------------