[mcclim-cvs] CVS mcclim/ESA

thenriksen thenriksen at common-lisp.net
Tue Apr 29 20:52:05 UTC 2008


Update of /project/mcclim/cvsroot/mcclim/ESA
In directory clnet:/tmp/cvs-serv30176/ESA

Modified Files:
	dead-keys.lisp esa.lisp packages.lisp 
Log Message:
Actually fix dead keys.

Turns out I got confused in my own maze of command processors.

Still needs a proper design decision about what to do wrt. abort
gestures (C-g).


--- /project/mcclim/cvsroot/mcclim/ESA/dead-keys.lisp	2008/04/29 16:27:42	1.1
+++ /project/mcclim/cvsroot/mcclim/ESA/dead-keys.lisp	2008/04/29 20:52:04	1.2
@@ -113,18 +113,26 @@
 (define-dead-key-combination (code-char 251) (:dead-circumflex #\u))
 (define-dead-key-combination (code-char 94) (:dead-circumflex #\space))
 
-(defmacro handling-dead-keys ((gesture) &body body)
+(defmacro handling-dead-keys ((gesture &optional restart) &body body)
   "Accumulate dead keys and subsequent characters. `Gesture'
 should be a symbol bound to either a gesture or an input
 event. When it has been determined that a sequence of `gesture's
 either does or doesn't result in a full gesture, `body' will be
-evaluated with `gesture' bound to that gesture."
+evaluated with `gesture' bound to that gesture. If `restart' is
+true, start over with a new accumulation. If an `abort-gesture'
+condition is signalled in `body', the accumulation will be
+cleared."
   (with-gensyms (state-sym)
     `(retaining-value (,state-sym *dead-key-table*)
+       (when ,restart
+         (setf ,state-sym *dead-key-table*))
        (flet ((invoke-body (,gesture)
                 (setf ,state-sym *dead-key-table*)
-                , at body))
-         (if (typep gesture '(or keyboard-event character))
+                (handler-case (progn , at body)
+                  (abort-gesture (c)
+                    (setf ,state-sym *dead-key-table*)
+                    (signal c)))))
+         (if (typep ,gesture '(or keyboard-event character))
              (let ((value (gethash (if (characterp ,gesture)
                                        ,gesture
                                        (keyboard-event-key-name ,gesture))
--- /project/mcclim/cvsroot/mcclim/ESA/esa.lisp	2008/04/29 16:27:42	1.20
+++ /project/mcclim/cvsroot/mcclim/ESA/esa.lisp	2008/04/29 20:52:05	1.21
@@ -550,7 +550,7 @@
     (end-command-loop (overriding-handler command-processor)))
   (setf (overriding-handler (super-command-processor command-processor)) nil))
 
-(defmethod process-gesture ((command-processor command-loop-command-processor) gesture)
+(defmethod process-gesture :around ((command-processor command-loop-command-processor) gesture)
   (handling-dead-keys (gesture)
     (cond ((find gesture *abort-gestures*
             :test #'gesture-matches-gesture-name-p)
@@ -562,10 +562,7 @@
                (end-command-loop command-processor)
                (signal c))))
           (t
-           (setf (accumulated-gestures command-processor)
-                 (nconc (accumulated-gestures command-processor)
-                        (list gesture)))
-           (process-gestures command-processor)
+           (call-next-method)
            (when (funcall (end-condition command-processor))
              (funcall (end-function command-processor))
              (end-command-loop command-processor))))))
@@ -777,11 +774,12 @@
   ;; well, something that either requires this kind of repeated
   ;; rescanning of accumulated input data or some yet-unimplemented
   ;; complex state retaining mechanism (such as continuations).
-  (loop
-     (setf *current-gesture*
-           (esa-read-gesture :command-processor command-processor))
-     (unless (process-gesture command-processor *current-gesture*)
-       (return))))
+  (loop for gesture = (esa-read-gesture :command-processor command-processor)
+        for first = t then nil
+        do (handling-dead-keys (gesture first)
+             (let ((*current-gesture* gesture))
+               (unless (process-gesture command-processor *current-gesture*)
+                 (return))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; 
--- /project/mcclim/cvsroot/mcclim/ESA/packages.lisp	2008/04/29 16:27:42	1.18
+++ /project/mcclim/cvsroot/mcclim/ESA/packages.lisp	2008/04/29 20:52:05	1.19
@@ -89,6 +89,7 @@
            #:find-applicable-command-table
            #:esa-command-parser
            #:esa-partial-command-parser
+           #:handling-dead-keys
 
            #:gesture-matches-gesture-name-p #:meta-digit
            #:proper-gesture-p




More information about the Mcclim-cvs mailing list