I am having a problem being able to use both the button "clicked"
event and the "button-press-event" at the same time.
The difference between the two is:
- with button "clicked" the user must press and release mouse button
one over the button. If the mouse moves out of the boundary of the
button before the user releases the button, no "click" signal is
emitted.
- with the "button-press-event" the signal is emitted as soon as the
mouse button is pressed over the button. You also get an 'event,'
which you can use to determine which mouse button was pressed.
I have a small application posted below. The function button-test
should cause a window to appear with a single button, mis-labeled
"quit" in it.
Clicking the button should cause the text button-clicked to
print. Pressing any mouse button over the button should cause the
"button press" event messages to print. Unfortunatly the "click"
events never occur.
You can comment the button press event signal connection and see that
in the case where this signal is not connected, the button clicks do
register.
The gtk+ documentation says that if the "button-press-event" handler
returns false processing of the event will continue, which is
why I am returning gtk:+false+.
Can anyone point out how to make this work?
thanks,
Todd.
(gtk:define-signal-handler bye1 :void (widget data)
widget data ; stop unused var compiler nagging
(format t "bye! ~%")
(gtk:main-quit))
(gtk:define-signal-handler delete-event-handler :int (widget event data)
widget event data ; stop unused var compiler nagging
(format t "delete-event occured~%")
gtk:+false+)
(gtk:define-signal-handler button-clicked :void (widget data)
(format t "button-clicked~%") (force-output t))
(gtk:define-signal-handler button-pressed :void (widget event data)
(format t "button press ~a~%" data) (force-output t)
(when (eq (gdk:EventButton.type event) gdk:button-press)
(format t "button press, event ~a~%" (gdk:EventButton.button event))
(when (eq (gdk:EventButton.type event) gdk:button-press)
(format t "button event "
(gdk:EventButton.button event))
(force-output t)))
(format t "returning ~a~%" gtk:+false+)
(force-output t)
gtk:+false+)
(defun button-test ()
(gtk:init-ensure)
(let ((window (gtk:window-new gtk:window-toplevel))
(hbox (gtk:hbox-new t 1))
(button-quit (gtk:button-new-with-label "quit")))
(gtk:window-set-policy window 0 0 1)
(gtk:window-set-title window "button test")
(gtk:container-add window hbox)
(gtk:box-pack-start hbox button-quit nil nil 0)
(g:signal-connect button-quit "clicked" (g:callback button-clicked) window)
(g:signal-connect button-quit "button-press-event" (g:callback button-pressed) window)
(g:signal-connect window "delete-event" (g:callback delete-event-handler)
(g:nullptr))
(g:signal-connect window "destroy" (g:callback bye1) (g:nullptr))
(mapcar (lambda (x)
(gtk:widget-show x)) (list button-quit hbox window))
(gtk:main)))