[cl-gtk2-devel] gtk_widget_add_events
Valeriy Fedotov
valeriy.fedotov at gmail.com
Thu Jul 14 07:45:53 UTC 2011
In gtk.demo.lisp (the most reliable source of documentation now),
there is such code:
(connect-signal area "realize"
(lambda (widget)
(declare (ignore widget))
(pushnew :pointer-motion-mask
(gdk-window-events (widget-window area)))))
I did the same in my application and it worked fine.
> However, your code seems to be getting
> the window the widget is a part of and then adjusting the masks for
> that instead.
I think gtk_widget_add_events() is a kind of shortcut for low level
GDK event handling details. Anyway, the above code works.
2011/7/14 Peter Keller <psilord at cs.wisc.edu>:
> On Thu, Jul 14, 2011 at 10:34:00AM +0400, Valeriy Fedotov wrote:
>> Hello, Peter,
>>
>> you can add events like this:
>>
>> (pushnew :button-press-mask (gdk-window-events (widget-window widget)))
>>
>> CONNECT-SIGNAL is indeed GOBJECT:CONNECT-SIGNAL.
>>
>> Also, indeed I get the same warnings, but everything seems to work
>> fine, including ARRAY-LIST-STORE mentioned in the warnings.
>
> Thank you for your response, but I have some questions:
>
> The C code I wish to emulate is:
>
> gtk_widget_add_events(drawing_area,
> GDK_POINTER_MOTION_MASK |
> GDK_BUTTON_PRESS_MASK |
> GDK_BUTTON_RELEASE_MASK |
> GDK_KEY_PRESS_MASK |
> GDK_KEY_RELEASE_MASK |
> GDK_SCROLL_MASK);
>
> I want to initially associate a signal "key-press-event" with the drawing
> area to handle that events. However, your code seems to be getting
> the window the widget is a part of and then adjusting the masks for
> that instead. To me this would seem that the wrong widget is getting
> the events.
>
> Here is my lisp code. I'm sorry that this is a bit strange. I'm still learning
> the cl-gtk2 API... When I run this code, (gtk:widget-window da) returns (NIL)
> and gdk-window-events doesn't know what to do with that.
>
> (defun doit ()
> (let (top-level)
> (gtk:within-main-loop
> (let ((builder (make-instance 'gtk:builder))
> (opengl-context (create-opengl-context)))
>
> (gtk:builder-add-from-file builder "./test-1.glade")
>
> (setf top-level (gtk:builder-get-object builder "top_level"))
> (format t "Created toplevel ~A~%" top-level)
>
> (let ((da (make-instance 'gtkglext:gl-drawing-area
> :on-expose #'draw
> ;; XXX Figure out how to do this!
> :xxx-width-request 320
> :xxx-height-request 240)))
>
> (gtkglext:gtk-widget-set-gl-capability da opengl-context
> nil t :rgba-type)
>
> (gtk:box-pack-end (gtk:builder-get-object builder "hbox1") da)
>
> ;; XXX How do I set the event mask for the drawing area?
>
> (pushnew :key-press-mask
> (gdk:gdk-window-events (gtk:widget-window da)))
>
> (gobject:connect-signal da "key-press-event" #'da-key-press-event)
>
> ;; 60 fps
> (setf *timeout*
> (gtk:gtk-main-add-timeout
> 16
> #'(lambda ()
> (idle-func da))))
>
> (gtk:builder-connect-signals-simple
> builder `(("quit_button_clicked" ,#'quit-button-clicked)
> ("white_button_clicked" ,#'white-button-clicked)
> ("red_button_clicked" ,#'red-button-clicked)
> ("green_button_clicked" ,#'green-button-clicked)
> ("blue_button_clicked" ,#'blue-button-clicked)))
>
> (gtk:widget-show top-level :all t))))
>
> (gtk:join-gtk-main)
>
> (gtk:within-main-loop
> (gtk:object-destroy top-level))))
>
> Thank you for your help.
>
> -pete
>
> _______________________________________________
> cl-gtk2-devel mailing list
> cl-gtk2-devel at common-lisp.net
> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/cl-gtk2-devel
>
--
With best regards, Valeriy Fedotov.
More information about the cl-gtk2-devel
mailing list