Коли я уж экспериментирую с glib-объектами, то решил заодно и родные таймауты попробовать. Значит у объекта GtkWindow к сигналу realize приделываю запуск таймаута с перерисовкой. Пока что код такой:
(gir:connect window :realize
(lambda (window)
;;(declare (ignore window))
(gir:invoke (*glib* "timeout_add")
0
200
(gir::make-closure
(lambda ()
(gir:invoke (window
:queue-draw))
1 ; true
))
(cffi:null-pointer)
(cffi:null-pointer))))
Пока что проблема - GLib.timeout_add 3-м аргументом нужен почему-то int а не замыкание:
CAIROLAB> (gir:nget-desc *glib* "timeout_add")
#F<timeout_add(#V<priority: INTEGER> #V<interval: INTEGER>
#V<function: INTEGER> #V<data: POINTER> #V<notify: INTEGER>): (#V<RETURN-VALUE: INTEGER>)>
CAIROLAB>
У меня в GLib вместо timeout_add интроспектируется timeout_add_full:
<function name="timeout_add"
c:identifier="g_timeout_add"
shadowed-by="timeout_add_full"
introspectable="0">
У него же:
<parameter name="function"
transfer-ownership="none"
scope="notified"
closure="3"
destroy="4">
<doc xml:space="preserve">function to call</doc>
<type name="SourceFunc" c:type="GSourceFunc"/>
</parameter>
Если подобное решение возможно, то как оно по сравнению с созданием нечто своего на sb-thread?
Cast monk