Update of /project/mcclim/cvsroot/mcclim/Drei In directory clnet:/tmp/cvs-serv16608/Drei
Modified Files: drei-clim.lisp Log Message: New click-to-focus policy for text-editor gadgets and panes, implemented for the CLX, Null and gtkairo backends (but gtk_window_get_focus() hand-inserted into gtkairo/ffi.lisp).
PORT-KEYBOARD-INPUT-FOCUS is now a trampoline to PORT-FRAME-KEYBOARD-INPUT-FOCUS, a per-port function to set the keyboard focus for a particular frame. Not implemented for Beagle or OpenGL backends.
Now Drei / Goatee gadgets don't have to do their own keyboard focus handling on arm/disarm any more. Various kludges sprinkled all over the place to make this so.
--- /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp 2007/01/17 11:43:51 1.16 +++ /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp 2007/02/07 12:44:20 1.17 @@ -206,8 +206,6 @@ ;;; updating is done after a command has been executed, and only then ;;; (or by commands at their own discretion). (defclass drei-gadget-pane (drei-pane value-gadget action-gadget - #+(or mcclim building-mcclim) ; No idea how it works in classic CLIM. - climi::enter/exit-arms/disarms-mixin asynchronous-command-processor) ((%currently-processing :initform nil :accessor currently-processing-p) @@ -251,21 +249,13 @@ (gadget-id gadget) new-value)))
-;; It's really silly that we have to manage keyboard input focus -;; ourself. (defmethod armed-callback :after ((gadget drei-gadget-pane) client id) (declare (ignore client id)) - (let ((port (port gadget))) - (setf (previous-focus gadget) (port-keyboard-input-focus port)) - (setf (port-keyboard-input-focus port) gadget)) (setf (active gadget) t) (display-drei gadget))
(defmethod disarmed-callback :after ((gadget drei-gadget-pane) client id) (declare (ignore client id)) - (let ((port (port gadget))) - (setf (port-keyboard-input-focus port) (previous-focus gadget)) - (setf (previous-focus gadget) nil)) (setf (active gadget) nil) (display-drei gadget))
@@ -320,6 +310,13 @@ (let ((*standard-input* (or *minibuffer* *standard-input*))) (handle-gesture gadget gesture))))))))
+(defmethod handle-event :before + ((gadget drei-gadget-pane) (event pointer-button-press-event)) + (let ((previous (stream-set-input-focus gadget))) + (when (and previous (typep previous 'gadget)) + (disarmed-callback previous (gadget-client previous) (gadget-id previous))) + (armed-callback gadget (gadget-client gadget) (gadget-id gadget)))) + (defmethod invoke-accepting-from-user ((drei drei-gadget-pane) (continuation function)) ;; When an `accept' is called during the execution of a command for ;; the Drei gadget, we must deactivate the gadget in order to not