[mcclim-cvs] CVS mcclim/Drei

thenriksen thenriksen at common-lisp.net
Wed Nov 22 18:52:57 UTC 2006


Update of /project/mcclim/cvsroot/mcclim/Drei
In directory clnet:/tmp/cvs-serv4500/Drei

Modified Files:
	drei-clim.lisp 
Log Message:
The Drei gadget should now work under uncivilised (non-ratpoison)
window managers, but having to call {armed|disarmed}-callback manually
is ugly. This is basically how Goatee does it as well.


--- /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp	2006/11/18 20:59:28	1.8
+++ /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp	2006/11/22 18:52:57	1.9
@@ -210,7 +210,10 @@
                                       climi::enter/exit-arms/disarms-mixin
                                       asynchronous-command-processor)
   ((%currently-processing :initform nil
-                          :accessor currently-processing-p))
+                          :accessor currently-processing-p)
+   (%previous-focus :accessor previous-focus :initform nil
+                    :documentation "The pane that previously had
+keyboard focus"))
   (:default-initargs :command-executor 'execute-drei-command)
   (:documentation "An actual, instantiable Drei gadget with
  event-based command processing."))
@@ -241,13 +244,21 @@
                             (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))
 
@@ -292,10 +303,10 @@
   ;; When an `accept' is called during the execution of a command for
   ;; the Drei gadget, we must deactivate the gadget in order to not
   ;; eat keyboard events.
-  (unwind-protect (progn (deactivate-gadget drei)
+  (unwind-protect (progn (disarmed-callback drei t t)
                          (funcall continuation))
     (activate-gadget drei)
-    (setf (active drei) t)))
+    (armed-callback drei t t)))
 
 (defmethod additional-command-tables append ((drei drei-gadget-pane)
                                              (table drei-command-table))




More information about the Mcclim-cvs mailing list