Dmitri Hrapof wrote:
Ingo Bormuth wrote:
The following might be better.

Code is: (mk-button :label (sb-ext:string-to-octets "foo äöüß bar" 
:external-format :utf-8))


The value of STRING is #(102 111 111 32 195 164 195 182 195 188 ...), which is not of type STRING. [Condition of type SIMPLE-TYPE-ERROR]
Yes, now it's clear.
MK-BUTTON expects a Lisp string, being decent Lisp function, not some
FFI abomination ;)
So the solution is to place (sb-ext:string-to-octets "foo äöüß bar"
:external-format :utf-8) deeper, between MK-BUTTON and GTK-BUTTON-SET-LABEL.

Nope. I think the problem is somewhere in cffi (maybe we're using different versions?). I'm doing:

(gtk-button-set-label (id *b*) (sto "s"))

and getting a backtrace similar to Ingo's

some search shows:

cffi/src/strings.lisp

(defun foreign-string-alloc (string)
  "Allocate a foreign string containing Lisp string STRING.
The string must be freed with FOREIGN-STRING-FREE."
  (check-type string string)
  (let* ((length (1+ (length string)))
         (ptr (foreign-alloc :char :count length)))
    (lisp-string-to-foreign string ptr length)
    ptr))

(check-type string string) is what causes the error.

commenting this out pushes the error further down towards

(defun lisp-string-to-foreign (string ptr size)
  "Copy at most SIZE-1 characters from a Lisp STRING to PTR.
The foreign string will be null-terminated."
  (decf size)
  (loop with i = 0 for char across string
        while (< i size)
        do (%mem-set (char-code char) ptr :unsigned-char (post-incf i))
        finally (%mem-set 0 ptr :unsigned-char i)))

where the problem is in

(%mem-set (char-code char) ptr :unsigned-char (post-incf i))

i.e. we don't need char-code if string is already an array. Therefore replace the line with:

do (%mem-set (if (characterp char) (char-code char) char) ptr :unsigned-char (post-incf i))

and voila,

(gtk-button-set-label (id *b*) (sto "üüüüüßßßß"))

works.

And so does:

(mk-button :label (sto "üüüüüßßßß")))

I'm working to puyt the conversion deeper into cffi.

Peter



As I used extensively only FFI part of cells-gtk, I didn't have to do it.

Good luck,
Dmitri
_______________________________________________
cells-gtk-devel site list
[email protected]
http://common-lisp.net/mailman/listinfo/cells-gtk-devel

_______________________________________________
cells-gtk-devel site list
[email protected]
http://common-lisp.net/mailman/listinfo/cells-gtk-devel

Reply via email to