LINUX.ORG.RU

cl-gtk2, gtk_widget_set_events


0

0

где биндинг для этой ф-ции в cl-gtk2? widget-event? тогда не пойму, почему не работает такой код -

(within-main-loop 
       (let ((w (make-instance 'gtk-window))
	     (ev (make-instance 'event-box))
	     (l (make-instance 'label :label "usudfs")))
	 (g-signal-connect w "destroy" #'gtk-main-quit)
	 
	 (container-add w ev)
	 (widget-show ev)
	 
	 (container-add ev l)
	 (widget-show l)
	 
	 (widget-event ev :button-press-mask)
	 (g-signal-connect ev "button-press-event" #'(lambda (w e)
						       (declare (ignore e))
						       (quit-callback w)))			   	 
	 (widget-realize ev)
	 (widget-show w)))
хотел найти вручную в файлах библиотеки, но т.к. не очень разбираюсь в cl-cffi, то скорее всего не правильно искал -
lindie@laptop ~/.sbcl/site $ grep -r 'gtk_widget_set_event' ./
lindie@laptop ~/.sbcl/site $ grep -r 'gtk-event' ./
./cl-gtk2-gtk-0.1.1/gtk.main-loop-events.lisp:(defcfun gtk-events-pending :boolean)
./cl-gtk2-gtk-0.1.1/gtk.main-loop-events.lisp:(export 'gtk-events-pending)
./cl-gtk2/gtk/gtk.main-loop-events.lisp:(defcfun gtk-events-pending :boolean)
./cl-gtk2/gtk/gtk.main-loop-events.lisp:(export 'gtk-events-pending)
./cl-gtk2/doc/gtk.main_loop.texi:Runs a single iteration of the mainloop. If no events are waiting to be processed Gtk+ will block until the next event is noticed. If you don't want to block look at @ref{gtk-main-iteration-do} or check if any events are pending with @ref{gtk-events-pending} first.
./cl-gtk2/doc/gtk.main_loop.texi:@RFunction gtk-events-pending
./cl-gtk2/doc/gtk.main_loop.texi:(gtk-events-pending) @result{} boolean

Да и вообще, если что-то доступно в виде свойства у объекта, то соответствующие get/set-функции не реализованы, а свойство доступно непосредственно.

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

а как получит реальный размер окна?

задаю начальные значения height/width_request, потом беру их в expose_event, т.е. каждый раз после, в том числе resizе, виджета, но ресайз их не изменяет.

и не понятно - координатная сетка не соответствует размеру окна? отрисовав точку по начальным размерам виджета получаю её не в нижнем правом углу, а повыше и полевее.

pseudo-cat ★★★ ()
Ответ на: комментарий от motofan
(draw-area (make-instance 'drawing-area :height-request 300 :width-request 300))
...


(defun draw-grid (widget step)
  (let* ((h (widget-height-request widget))  
	 (w (widget-width-request widget))
	 (gdk-win (widget-window widget))
	 (gc (graphics-context-new gdk-win)))
    (loop for x from 0 to w by step
       do (loop for y from 0 to h by step
	     do (draw-point gdk-win gc x y)))))

(g-signal-connect draw-area "expose_event"
			    #'(lambda (w e)
				(declare (ignore e))
				(format *std-out* "~&size: h= ~a ; w= ~a~%"
					(widget-height-request event-box)
					(widget-width-request event-box))
				(draw-grid w 10)))

что бы не переписывать на С просто поясню код - создаём drawing_area с шириной и высотой 300, ф-ция draw-grid берёд ширину и высоту из height_request и width_request и через шаг step строит точки по вертикали и горизонтале от 0 до полученных ширины и высоты.

pseudo-cat ★★★ ()
Ответ на: комментарий от pseudo-cat

Боюсь соврать, но есть предположение, что gdk.window немного меньше самого виджета, а размеры берутся у виджета - потому, то, что похоже на последнюю точку - предпоследняя, а последнюю не видно.Попробуйте взять размер gdk.window через get_geometry

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