LINUX.ORG.RU

Lisp & структуры в lambda-gtk


0

0

Как объявить структуру в lambda-gtk (например GdkColor) ?

Значение ей присваиваю - (setf gdk:Color.red 100 и т.д.), но это не правильно как-то, хотя в примерах так делают. Потом я её не могу использовать в ф-циях. Например, 
(gtk:widget-modify-bg window gtk:state-normal gdk:Color)
Ошибка...
Symbol "COLOR" not found in the GDK package.
Причем ругается именно на ф-цию, а это (setf gdk:Color.red 100) проходит.

наверно нужно создать сначала эту структуру, предполагаю, что это можно
сделать так:

(setf my-color (gdk:color-new))

насчет gdk:color-new не уверен, но точно должна быть функция, которая
создает структуру

(gdk:color.red my-color 100) ;; установка нужного поля


наверняка там можно сразу задавать цвета при создании:

(setf my-color (gdk:color-new 100 0 0))

а может быть так

(setf my-color (gdk:color-new :red 100 :green 0 :blue 0))

anonymous
()

>а это (setf gdk:Color.red 100) проходит.

фактически создает новую переменную с именем Color.red и значением 100 в пакете gdk

anonymous
()
Ответ на: комментарий от anonymous

> (setf my-color (gdk:color-new)) 

Symbol "COLOR-NEW" not found in the GDK package
gdk:color-make (по правилам вроде так структура создается) тож не проходит.

То, что ты говоришь по логике всё прально, но не проходит... :(

eraser
() автор топика
Ответ на: комментарий от anonymous

> фактически создает новую переменную с именем Color.red и значением 100 в пакете gdk

Но вот в примерах они так присваивали значения полям структуры, но
тока потом их в ф-ции не передовали.
При попытке же передать ф-ции Color.red вместо целой структуры - 
The value 100 is not of type SYSTEM-AREA-POINTER.

eraser
() автор топика
Ответ на: комментарий от eraser

> (setf gdk:Color.red 100 и т.д.)
посмотрел примеры, нигде такого не увидел

на сайте написано:
Lisp accessor functions to read/write slot values in GTK structs.
Accessors are named struct.slot but may include more than one slot
name, e.g. gtk:Widget.allocation.width. The first argument to all
accessors is a pointer to a struct; if the referenced slot is an array
then a second required argument provides the index. The last argument
to all accessors is an optional value, that, if specified, replaces the
current value in the slot. For example:

(gdk:Rectangle.x rect) ; return rect's x value
(gdk:Rectangle.x rect 100) ; set rect's x value

если поковырятся в исходниках, то видно, что в этих функциях просто
идет обращение к alien типу, с таким образом можно сделать вывод,
что нужно создавать alien-структуру нужного тебе типа (т.е. мое
начальное предположение (color-new ...) оказалось неверно).
Подробности работы с alien-структурами читай в мануале по твоему
лиспу, для sbcl - http://www.sbcl.org/manual/Foreign-Function-Interface.html#Foreign-Function-I...

если нужно, посмотрю и приведу пример, но ближе к ночи

anonymous
()
Ответ на: комментарий от anonymous

Ну вот по подобию делаю:
(gdk:Color.red my_color 100)

The variable MY_COLOR is unbound.

> если нужно, посмотрю и приведу пример, но ближе к ночи 

Нужно, если не затруднит...

eraser
() автор топика
Ответ на: комментарий от eraser

появилось свободное время, попробуй так:

(defvar *my-color*)

(setf *my-color* (gtk:struct-alloc GdkColor))

;; установить цвета (gdk:color.red *my-color* 100) (gdk:color.green *my-color* 0) (gdk:color.blue *my-color* 0)

;; получить значение конкретного цвета (gdk:color.red *my-color*) ;; должно вернуть 100

можно задавать цвета при инициализации структуры: ... . (setf *my-color* (gtk:struct-alloc GdkColor :red 100 :green 0 :blue 0) ... .

;; больше *my-color* не нужна, освобождаем выделенную память (gtk:struct-free *my-color*) ;; то-же самое можно сделать (gdk:color-free *my-color*)

если структура "GdkColor" нужна локально, лучше и создавать ее локально:

(let ((color (gtk:struct-alloc GdkColor :red 100 :green 0 :blue))) ;; здесь вызов функций которым нужна "GdkColor" ... . ;; не забыть освободить память, во избежание ее утечек (gtk:struct-free color))

ps: какой лисп? чем пользуешься для редактирования прог, работы в REPL?

anonymous
()
Ответ на: комментарий от eraser

черт :(

появилось свободное время, попробуй так:

(defvar *my-color*)

(setf *my-color* (gtk:struct-alloc GdkColor))

;; установить цвета
(gdk:color.red *my-color* 100)
(gdk:color.green *my-color* 0)
(gdk:color.blue *my-color* 0)

;; получить значение конкретного цвета
(gdk:color.red *my-color*) ;; должно вернуть 100


можно задавать цвета при инициализации структуры:
...
.
(setf *my-color* (gtk:struct-alloc GdkColor :red 100 :green 0 :blue 0)
...
.

;; больше *my-color* не нужна, освобождаем выделенную память
(gtk:struct-free *my-color*) ;; то-же самое можно сделать (gdk:color-free *my-color*)


если структура "GdkColor" нужна локально, лучше и создавать
ее локально:

(let ((color (gtk:struct-alloc GdkColor :red 100 :green 0 :blue)))
;; здесь вызов функций которым нужна "GdkColor"
...
.
;; не забыть освободить память, во избежание ее утечек
(gtk:struct-free color))

ps: какой лисп? чем пользуешься для редактирования прог, работы в REPL?

anonymous
()
Ответ на: комментарий от anonymous

На (setf *my-color* (gtk:struct-alloc GdkColor)) - 
The variable GTK::GDKCOLOR is unbound.
Причем ошибка выводится при исполнении, компилится - нормально.

> ps: какой лисп? чем пользуешься для редактирования прог, работы в REPL?

Emacs+slime+sbcl-0.9.17

Вообще само gtk работает: окна, кнопки, события - работает.

eraser
() автор топика
Ответ на: комментарий от anonymous

P.S. 

(setf *my-color* (gtk:struct-alloc GdkColor)) 
В принципе, это мне кажется правильно. Тока GdkColor, саму эту структуру в lisp'e над по-другому обзывать... Пробовал gdk:Color - тож самое, но над как-то так, а не прямо...

eraser
() автор топика
Ответ на: комментарий от eraser

>На (setf *my-color* (gtk:struct-alloc GdkColor)) - >The variable GTK::GDKCOLOR is unbound. >Причем ошибка выводится при исполнении, компилится - нормально.

хм.. странно

CL-USER> (load "gtkffi-cmusbcl") T CL-USER> (defvar *my-color*) *MY-COLOR* CL-USER> (setf *my-color* (gtk:struct-alloc GdkColor)) #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #X003F52D8 :TYPE (* (STRUCT GTK::_GDKCOLOR (GTK::PIXEL (UNSIGNED 32)) (GTK::RED (UNSIGNED 16)) (GTK::GREEN (UNSIGNED 16)) (GTK::BLUE (UNSIGNED 16))))> CL-USER> (lisp-implementation-version) "1.0" CL-USER> (lisp-implementation-type) "SBCL" CL-USER>

anonymous
()
Ответ на: комментарий от eraser

>На (setf *my-color* (gtk:struct-alloc GdkColor)) - >The variable GTK::GDKCOLOR is unbound. >Причем ошибка выводится при исполнении, компилится - нормально.

хм.. странно

CL-USER> (load "gtkffi-cmusbcl") T CL-USER> (defvar *my-color*) *MY-COLOR* CL-USER> (setf *my-color* (gtk:struct-alloc GdkColor)) #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #X003F52D8 :TYPE (* (STRUCT GTK::_GDKCOLOR (GTK::PIXEL (UNSIGNED 32)) (GTK::RED (UNSIGNED 16)) (GTK::GREEN (UNSIGNED 16)) (GTK::BLUE (UNSIGNED 16))))> CL-USER> (lisp-implementation-version) "1.0" CL-USER> (lisp-implementation-type) "SBCL" CL-USER>

anonymous
()
Ответ на: комментарий от eraser

>На (setf *my-color* (gtk:struct-alloc GdkColor)) -
>The variable GTK::GDKCOLOR is unbound.
>Причем ошибка выводится при исполнении, компилится - нормально.

хм.. странно

CL-USER> (load "gtkffi-cmusbcl")
T
CL-USER> (defvar *my-color*)
*MY-COLOR*
CL-USER> (setf *my-color* (gtk:struct-alloc GdkColor))
#<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #X003F52D8 :TYPE (*
(STRUCT GTK::_GDKCOLOR
(GTK::PIXEL
(UNSIGNED 32))
(GTK::RED
(UNSIGNED 16))
(GTK::GREEN
(UNSIGNED 16))
(GTK::BLUE
(UNSIGNED 16))))>
CL-USER> (lisp-implementation-version)
"1.0"
CL-USER> (lisp-implementation-type)
"SBCL"
CL-USER>

anonymous
()
Ответ на: комментарий от anonymous

а если так:

(setf *my-color* (gtk:struct-alloc (struct gtk::_gdkcolor)))

anonymous
()
Ответ на: комментарий от eraser

по видимому, используешь последнюю версию из cvs
я ее закачал, вот модифицированный хелло-ворд:

(asdf:oos 'asdf:load-op :lambda-gtk)

(defun hello-world ()
  (gtk:init-ensure) ; make sure gtk is initialized before calling api
  (let ((window (gtk:window-new gtk:window-toplevel))
        (button (gtk:button-new-with-label "Hello World!")))
    (gtk:container-add window button)
    (gtk:container-set-border-width window 10)
    (let ((color (gtk:struct-alloc 'gdkcolor)))
      (gdk:color.red color 65000)
      (gdk:color.green color 0)
      (gdk:color.blue color 0)
      (gtk:widget-modify-bg window gtk:state-normal color)
      (gtk:free-struct color))
    (gtk:widget-show button)
    (gtk:widget-show window)
    (g:signal-connect button "clicked" (g:callback hellomsg)
                      (g:nullptr))
    (g:signal-connect window "delete-event" (g:callback delev1)
                      (g:nullptr))
    (g:signal-connect window "destroy" (g:callback bye1)
                      (g:nullptr))
    (gtk:main)))

у меня работает - окно красного цвета
однако, все равно глюки имеются (версия-то cvs)
не получилось задать цвета сразу:
(gtk:struct-alloc 'gdkcolor :red 50000 :green 0 :blue 0)
не работает

anonymous
()
Ответ на: комментарий от anonymous

Большое спасибо! Получилось. ТОлько на (gtk:free-struct color) ругается.

eraser
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.