Author: sasugaanija
Date: Mon Aug 27 07:56:31 2007
New Revision: 4900

Modified:
   trunk/emacs/uim-key.el
   trunk/emacs/uim-util.el
   trunk/emacs/uim-var.el
   trunk/emacs/uim.el

Log:
* emacs/uim-key.el
  - (uim-this-command-keys): Rename to uim-translate-key.
  - (uim-translate-key)
    - Renamed from uim-this-command-keys and simplified.
    - Move call of this-command-keys(-vector) to uim-process-input.
    - Remove with-arg argument.
    - Remove vector separation function.
    - Remove complicated vector processing routine.
    - Display a prompt when the function-key-map returnes a 
     translation function (ex. C-x @ c)
    - Remove [escape escape] translation.
  - (uim-separate-prefix-vector)
    - New function extracted from uim-translate-key.
    - Separate prefix vector and other from input vector.
  - (uim-translate-escape-meta)
    - New function extracted from uim-translate-key.
    - Replace [escape escape] to [M-escape] for XEmacs
  - (uim-process-keyvec)
    - Return continue flag to wait latter inputs if the vector is 
     bound to a key map.

* emacs/uim.el
  - (uim-process-input)
    - Replace uim-this-command-keys to uim-translate-key
    - Call uim-this-commnad-keys-vector to get key vector.
    - Separate prefix vector from input vector.
    - Change uim-el-agent bypass rule.
      - Special prefix keys (such as Escape and C-x) are 
      passed to uim-el-agent anyway.
  - (uim-process-agent-output)
    - Set uim-wait-next-key when uim-process-keyvec returned 
      continue flag.

* emacs/uim-var.el
  - (uim-stacked-key-vector): Remove
  - (uim-translated-key-vector)
    - New variable to manage key vector which has already been translated 
      through function-key-map.
  - (uim-untranslated-key-vector)
    - New variable to manage key vector which is not translated yet.
  - (uim-wait-next-key)
    - New variable
  - (uim-prefix-ignore-next)
    - Remove
  - (uim-show-keystrokes)
    - Renamed to uim-keystroke-displaying
  - (uim-keystroke-displaying)
    - Renamed from uim-show-keystrokes

* emacs/uim-util.el
  - (uim-get-vector-from-head): New function to manage vector easily.
  - (uim-get-vector-from-tail): Ditto
  - (uim-cut-vector-from-head): Ditto
  - (uim-vector-cdr): Ditto
  - (uim-vector-car): Ditto



Modified: trunk/emacs/uim-key.el
==============================================================================
--- trunk/emacs/uim-key.el      (original)
+++ trunk/emacs/uim-key.el      Mon Aug 27 07:56:31 2007
@@ -195,7 +195,9 @@
 ;; 
 (defun uim-process-keyvec (uim-key-vector &optional count)
   (let ((bind (uim-key-binding uim-key-vector t))
-       keyvectmp)
+       keyvectmp
+       continue
+       )
     (uim-debug (format "uim-process-keyvec"))
     
     (if uim-emacs
@@ -203,7 +205,12 @@
        (setq deactivate-mark nil))
     
     (unwind-protect    
-       (cond (count
+       (cond ((keymapp bind)
+              (uim-debug "bind is keymap")
+              (setq continue t)
+              )
+
+             (count
               (setq prefix-arg count)
               (uim-command-execute
                (uim-key-binding uim-key-vector t))
@@ -269,6 +276,7 @@
       (if uim-emacs
          (setq uim-deactivate-mark deactivate-mark))
       )
+    continue
     )
   )
   
@@ -511,205 +519,172 @@
   )
 
 
+(defun uim-separate-prefix-vector (key-vector)
+  (let (key-vector-prefix key-vector-main)
+    (setq key-vector-main (uim-last-onestroke-key key-vector))
+    (setq key-vector-prefix 
+         (uim-get-vector-from-head key-vector
+                                   (- (length key-vector)
+                                      (length key-vector-main))))
+    ;;(setq key-vector key-vector-main)
+    ;;(setq uim-prefix-arg-vector key-vector-prefix)
+    (list key-vector-main key-vector-prefix))
+  )
+
+
 ;;
 ;; get this-command-keys with symbol lists vector
 ;; 
-(defun uim-this-command-keys (with-arg)
-  (let (keyvec replace-continue fmap-continue bind)
-
-    (if uim-xemacs
-       (setq keyvec (this-command-keys)))
-
-    (if uim-emacs
-       (setq keyvec (this-command-keys-vector)))
-
-    (if uim-prefix-ignore-next
-       ;; avoid mysterious key event on Emacs-21 on terminal
-       ;;  ex. C-u 1 0 escape f 
-       (progn
-         (uim-debug "ignore this key vector")
-         (setq keyvec nil)
-         (setq uim-prefix-ignore-next nil)
-         )
-      (if with-arg
-         ;; key with prefix arg
-         (let* ((rkeylist (reverse (append keyvec nil))))
-           (setq keyvec (uim-last-onestroke-key keyvec))
-           (if (= (length keyvec) 2)
-               ;; Only Emacs-21 returns two stroke keys at 1st time
-               (setq uim-prefix-arg-vector 
-                     (vconcat (reverse (cdr (cdr rkeylist)))))
-             (setq uim-prefix-arg-vector 
-                   (vconcat (reverse (cdr rkeylist)))))
-           ;; work around
-           (if (= (length keyvec) 2)
-               (setq uim-prefix-ignore-next t))
-           )))
-
-    (uim-debug (format "keyvec %s" keyvec))
-
-    ;; translate key vector with function-key-map
-
-    (let (fmap key replaced)
-      (let* ((merged-vector (vconcat uim-stacked-key-vector keyvec))
-            (merged-list (append merged-vector nil))
-            (stacked-list nil)
-            merged-list-backup
-            done)
-       (uim-debug (format "merged-list: %s" merged-list))
+(defun uim-translate-key (input-vector)
+  (let (translated-vector map (non-error t)
+       (input-vector-main input-vector)
+       (input-vector-prefix nil)
+       input-vector-main-backup
+       translated bind)
 
-       (catch 'fmap-loop
-         (while merged-list
+    (uim-debug (format "input-vector: %s" input-vector))
 
-           (setq merged-list-backup merged-list)
+    (catch 'fmap-loop
+      (while input-vector-main
 
+       (setq input-vector-main-backup input-vector-main)
 
-           (setq bind (uim-key-binding (vconcat merged-list)))
+       (setq bind (uim-key-binding input-vector-main))
          
-           (if (and bind
-                    (not (integerp bind)))
-               (progn
-                 (uim-debug "skip function-key-map lookup")
-                 (setq uim-stacked-key-vector 
-                       (vconcat stacked-list merged-list))
-                 (throw 'fmap-loop t))
-
-             (setq fmap (lookup-key function-key-map (vconcat merged-list)))
+       (if (and bind
+                (not (integerp bind)))
+           (progn
+             (uim-debug "skip function-key-map lookup")
+             ;;(setq translated-vector input-vector)
+             (setq translated-vector nil)
+             (throw 'fmap-loop t))
+         
+         (setq translated (lookup-key function-key-map input-vector-main))
              
-             (if (and (or (not fmap)
-                          (integerp fmap))
-                      (boundp 'local-function-key-map))
-                 (setq fmap (lookup-key local-function-key-map 
-                                        (vconcat merged-list))))
-
-
-             (if  (or (not fmap) 
-                      (integerp fmap))
-                 (progn
-                   (setq merged-list
-                         (append (uim-remove-shift (vconcat merged-list)) nil))
-
-                   (setq bind (uim-key-binding (vconcat merged-list)))
-
-                   (if (and bind
-                            (not (integerp bind)))
-                       
-                       (progn
-                         (uim-debug "skip function-key-map lookup (remove 
shift)")
-                         (setq uim-stacked-key-vector
-                               (vconcat stacked-list merged-list))
-                         (throw 'fmap-loop t))
-
-                     ;;          ä   function-key-map      
-                     (setq fmap (lookup-key function-key-map
-                                            (vconcat merged-list)))
-
-                     (if (and (or (not fmap)
-                                  (integerp fmap))
-                              (boundp 'local-function-key-map))
-                         (setq fmap (lookup-key local-function-key-map 
-                                                (vconcat merged-list))))
+         (if (and (or (not translated)
+                      (integerp translated))
+                  (boundp 'local-function-key-map))
+             (setq translated (lookup-key local-function-key-map 
+                                          input-vector-main)))
+         
+         (if (or (not translated)
+                 (integerp translated))
+             (progn
+               (setq input-vector-main (uim-remove-shift input-vector-main))
+
+               (setq bind (uim-key-binding input-vector-main))
+
+               (if (and bind 
+                        (not (integerp bind)))
+
+                   (progn
+                     (uim-debug "skip function-key-map lookup (remove shift)")
+                     ;;(setq translated-vector input-vector)
+                     (setq translated-vector 
+                           (vconcat input-vector-prefix input-vector-main))
+                     (throw 'fmap-loop t))
+
+                 ;;          ä   function-key-map      
+                 (setq translated (lookup-key function-key-map 
+                                              input-vector-main))
+
+                 (if (and (or (not translated)
+                              (integerp translated))
+                          (boundp 'local-function-key-map))
+                     (setq translated (lookup-key local-function-key-map 
+                                                  input-vector-main)))
 
+                 (uim-debug "*** cannot remove shift")
 
-                     (if (not fmap)
-                         (setq merged-list merged-list-backup)))))
+                 (if (not translated)
+                     (setq input-vector-main input-vector-main-backup)))))
 
-             
-             (cond ((vectorp fmap)
-                    ;; vector: replace
-                    (uim-debug (format "vector: %s" (vconcat merged-list)))
-                    (setq uim-stacked-key-vector 
-                          (vconcat stacked-list fmap))
-                    (throw 'fmap-loop t)
-                    )
-                   ((keymapp fmap)
-                    ;; keymap: wait next
-                    (uim-debug (format "keymap: %s" (vconcat merged-list)))
-                    (setq fmap-continue t)
-                    (setq uim-stacked-key-vector merged-vector)
-                    (throw 'fmap-loop t)
-                    )
-                   ((functionp fmap)
-                    (uim-debug (format "function: %s" (vconcat merged-list)))
-                    (setq fmap (funcall fmap nil))
-                    (if (vectorp fmap)
-                        (setq uim-stacked-key-vector (vconcat stacked-list 
fmap))
-                      )
-                    (throw 'fmap-loop t)
-                    )
-                   ))
-
-           (setq merged-list merged-list-backup)
-           
-           (setq stacked-list (append stacked-list (list (car merged-list))))
-           (setq merged-list (cdr merged-list))
-           )
+         (cond ((not translated)
+                )
 
-         (setq uim-stacked-key-vector merged-vector))))
-      
-    ;; Replate [escape escape] with [M-escape] on XEmacs
-    ;;   Some special keys cannot be used with escape key on terminal
-    (when (and uim-xemacs
-              (>= (length uim-stacked-key-vector) 2)
-              (equal (aref uim-stacked-key-vector 0) 
-                     (uim-xemacs-make-event [(escape)])))
-      ;; append meta
-      (setq uim-stacked-key-vector
-           (vector
-            (uim-xemacs-make-event
-             (vector 
-              (cons 'meta 
-                    (aref (uim-convert-char-to-symbolvector
-                           (key-description (vconcat
-                                             (cdr (append 
-                                                   uim-stacked-key-vector
-                                                   nil)))))
-                          0)))))))
+               ((vectorp translated)
+                ;; vector ... replace immediately
+                (uim-debug (format "translated is vector: %s" translated))
+                (setq translated-vector 
+                      (vconcat input-vector-prefix translated))
+                (throw 'fmap-loop t))
+
+               ((keymapp translated)
+                ;; keymap ... wait next input
+                (uim-debug (format "translated is keymap: %s" translated))
+                (setq map translated)
+                (throw 'fmap-loop t))
+
+
+               ((functionp translated)
+                ;; function ... call immediately and use returned value
+                (uim-debug (format "translated is function: %s" translated))
+                ;;(setq func translated)
+
+
+                (if (not uim-keystroke-displaying)
+                    (setq uim-keystroke-displaying (sit-for echo-keystrokes)))
+
+                (if uim-keystroke-displaying
+                    (let (message-log-max)
+                      (message (concat (key-description 
+                                        (vconcat uim-prefix-arg-vector
+                                                 input-vector))
+                                       "-")))
+                  )
 
+                (unwind-protect
+                    (setq translated-vector
+                          (vconcat input-vector-prefix (funcall translated 
nil)))
+                  (when (not translated-vector)
+                    (setq non-error nil)
+                    (throw 'fmap-loop nil)))
+
+                (throw 'fmap-loop t))
+               
+               ((stringp translated)
+                ;; string ... replace
+                (uim-debug (format "translated is string:%s"
+                                   translated))
+                (setq translated-vector
+                      (char-to-string (aref translated 
+                                            (- (length translated) 1))))
+                (throw 'fmap-loop t))
+               ))
 
+       (setq input-vector-main input-vector-main-backup)
 
-    (uim-debug (format "stacked-key-vector: %s" uim-stacked-key-vector))
-
-    (cond ((and uim-preedit-keymap-enabled
-               (uim-is-escape uim-stacked-key-vector))
-          (uim-debug "stacked-key is Escape")
-          ;; Return escape key
-          (if uim-emacs
-              (setq keyvec [27]))
-          (if uim-xemacs
-              (setq keyvec (vector (uim-xemacs-make-event [escape]))))
-          (setq uim-stacked-key-vector nil)
-          )
-         ((or (and uim-preedit-keymap-enabled
-                     (or 
-                      (and (or (eq (car-safe (aref uim-stacked-key-vector 0))
-                                   'menu-bar)
-                               (eq (car-safe (aref uim-stacked-key-vector 0))
-                                   'tool-bar))
-                           (keymapp (uim-key-binding uim-stacked-key-vector)))
-
-                   (and fmap-continue  ;; wait ESC- key vector
-                           (uim-is-start-with-escape uim-stacked-key-vector))
-                      ))
-              
-              (and (not uim-preedit-keymap-enabled)
-                   (or (and fmap-continue 
-                            (not (commandp (uim-key-binding 
uim-stacked-key-vector t))))
-                       (keymapp (uim-key-binding uim-stacked-key-vector t))))
-              uim-prefix-ignore-next ;; work around for Emacs-21 prefix arg
-              )
-          (uim-debug "wait next")
-          (setq keyvec nil))
-         (t
-          ;; No need to wait any more. Return current keys.
-          (setq keyvec uim-stacked-key-vector)
-          (setq uim-stacked-key-vector nil))
-         )
+       (setq input-vector-prefix
+             (vconcat input-vector-prefix (uim-vector-car input-vector-main)))
 
-    keyvec
-    )
+       (setq input-vector-main
+             (uim-vector-cdr input-vector-main))) ;; end of while
+      
+      (setq translated-vector nil)) ;; end of catch
+    
+    (uim-debug (format "output vector: %s" translated-vector))
+    (list translated-vector map non-error))
   )
 
+
+
+;; Replate [escape escape] with [M-escape] on XEmacs
+;;   Some special keys cannot be used with escape key on terminal
+(defun uim-translate-escape-meta (input-vector)
+  (if (and uim-xemacs
+          (>= (length input-vector) 2)
+          (equal (aref input-vector 0)
+                 (uim-xemacs-make-event [(escape)])))
+      ;; append meta
+      (vconcat 
+       (vector 
+       (uim-xemacs-make-event 
+        (vector (cons 'meta (aref (uim-convert-char-to-symbolvector
+                                  (key-description (uim-vector-cdr 
+                                                    input-vector))) 0)
+                     ))))
+       (uim-cut-vector-from-head input-vector 2))
+    input-vector))
 
 (provide 'uim-key)
 

Modified: trunk/emacs/uim-util.el
==============================================================================
--- trunk/emacs/uim-util.el     (original)
+++ trunk/emacs/uim-util.el     Mon Aug 27 07:56:31 2007
@@ -305,6 +305,34 @@
 (defun uim-point ()
   (window-point (get-buffer-window (current-buffer))))
 
+(defun uim-get-vector-from-head (vec n)
+  (if (and (<= n (length vec))
+          (> n 0))
+      (let ((vlist (append vec nil))
+           (ret '()))
+       (while (> n 0)
+         (setq ret (append ret (list (car vlist))))
+         (setq vlist (cdr vlist))
+         (setq n (- n 1)))
+       (vconcat ret))))
+
+(defun uim-get-vector-from-tail (vec n)
+  (if (and (<= n (length vec))
+          (> n 0))
+      (vconcat (nthcdr (- (length vec) n) (append vec nil)))))
+
+(defun uim-cut-vector-from-head (vec n)
+  (if (<= n (length vec))
+      (uim-get-vector-from-tail vec (- (length vec) n))))
+
+
+(defun uim-vector-cdr (vec)
+  (if (> (length vec) 1)
+      (uim-get-vector-from-tail vec (- (length vec) 1))))
+
+(defun uim-vector-car (vec)
+  (uim-get-vector-from-head vec 1))
+
 (defun uim-delete-atom (list)
   (if (and list 
           (not (atom list)))

Modified: trunk/emacs/uim-var.el
==============================================================================
--- trunk/emacs/uim-var.el      (original)
+++ trunk/emacs/uim-var.el      Mon Aug 27 07:56:31 2007
@@ -257,15 +257,16 @@
 (defvar uim-prefix-arg nil
   "Recent current-prefix-arg value.")
 
-;;(defvar uim-prefix-arg-vector-length 0)
-
 ;; unprocessed keys
-(defvar uim-stacked-key-vector nil)
+(defvar uim-wait-next-key nil)
+
+(defvar uim-translated-key-vector nil)
+(defvar uim-untranslated-key-vector nil)
+
 (defvar uim-prefix-arg-vector nil)
-(defvar uim-prefix-ignore-next nil)
 
 ;; if non-nil, pressed keys are displayed at echo region
-(defvar uim-show-keystrokes nil)
+(defvar uim-keystroke-displaying nil)
 
 
 ;; keep original last-input-event to process the event correctly after

Modified: trunk/emacs/uim.el
==============================================================================
--- trunk/emacs/uim.el  (original)
+++ trunk/emacs/uim.el  Mon Aug 27 07:56:31 2007
@@ -876,162 +876,308 @@
   (if uim-emacs
       (setq uim-deactivate-mark t))
 
-  (if (not uim-stacked-key-vector)
-      (setq uim-show-keystrokes nil))
+  (if (not (or uim-translated-key-vector uim-untranslated-key-vector))
+      (setq uim-keystroke-displaying nil))
 
-  ;; send an input key code to uim-el-agent
+  (let (new-key-vector
+       send-vector
+       send-vector-raw
+       issue-vector
+       send
+       issue
+       sendkey newvec count mouse  wait discard)
+    (setq new-key-vector (uim-this-command-keys-vector))
+
+    (if current-prefix-arg
+       (let (vector-list)
+         (setq uim-prefix-arg current-prefix-arg)
+         (setq vector-list (uim-separate-prefix-vector new-key-vector))
+         (setq new-key-vector (car vector-list))
+         (setq uim-prefix-arg-vector (nth 1 vector-list))
+         (uim-debug (format "uim-prefix-arg-vector %s" uim-prefix-arg-vector))
+         (uim-debug (format "set uim-prefix-arg: %s" current-prefix-arg))))
+
+    (if uim-xemacs
+       (setq uim-original-input-event (copy-event last-input-event)))
+
+    (setq uim-untranslated-key-vector
+         (vconcat uim-untranslated-key-vector new-key-vector))
+
+    (let* ((translated-list (uim-translate-key uim-untranslated-key-vector))
+          (translated (nth 0 translated-list))
+          (map (nth 1 translated-list))
+          (non-error (nth 2 translated-list)))
+
+      (unwind-protect
+         (progn
+           (uim-debug (format "translated: %s" translated))
+           (uim-debug (if map "map: YES" "map: NO"))
+           (uim-debug (if non-error "non-error: YES" "func: NO"))
+
+           (cond ((stringp translated)
+                  (setq uim-translated-key-vector translated)
+                  (setq uim-untranslated-key-vector nil))
+
+                 ((vectorp translated)
+                  (setq send t) ;;        t      
+                  (setq uim-translated-key-vector 
+                        (vconcat uim-translated-key-vector translated))
+                  (setq uim-untranslated-key-vector nil))
 
-  (if current-prefix-arg
-      (setq uim-prefix-arg current-prefix-arg))
+                 (map
+                  (setq wait t)
+                  )
 
-  
-  (if uim-prefix-arg
-      (uim-debug (format "uim-prefix-arg %s" uim-prefix-arg)))
-
-  (if uim-xemacs
-      (setq uim-original-input-event (copy-event last-input-event)))
-
-  (let ((keyvec (uim-this-command-keys current-prefix-arg))
-       sendkey newvec bypass count mouse)
-
-    (if uim-prefix-arg
-       (setq current-prefix-arg uim-prefix-arg))
-
-    (if keyvec
-       (progn
-         (if uim-show-keystrokes
-             (let (message-log-max)
-               (message (key-description keyvec))))
-
-         (setq uim-last-key-vector keyvec)
-
-         (cond (uim-xemacs 
-                ;; XEmacs ;;
-                (setq sendkey 
-                      (uim-convert-keystr-to-uimagent-vector (key-description 
keyvec)))
-
-                (cond ((string-match "button\\(1\\|2\\|3\\|4\\|5\\)" 
-                                     (key-description keyvec))
-                       ;; through mouse event
-                       (setq mouse t)
-                       (setq bypass t))
-                      
-                      (current-prefix-arg
-                       (setq bypass t)
-                       ;;(setq count (prefix-numeric-value arg))
-                       (setq count (prefix-numeric-value current-prefix-arg))
-                       (uim-debug (format "with prefix arg: count is %s" 
count))
-                       )
-                      
-                      ((and (not (or uim-preedit-displayed 
-                                     uim-candidate-displayed))
-                            (uim-buffer-not-editable))
-                       ;; through uim-el-agent when buffer is uneditable
-                       (setq bypass t)
-                       ))
-                
-                (if bypass
-                    (setq sendkey 
-                          (uim-convert-char-to-symbolvector 
-                           (key-description keyvec))))
-                )
+                 (t
+                  (setq send t)
+                  )
+                 ))
+       (when (not non-error)
+         (setq uim-translated-key-vector nil)
+         (setq uim-untranslated-key-vector nil)
+         (setq uim-prefix-arg nil)
+         (setq uim-prefix-arg-vector nil)
+         (signal 'quit nil)
+         )))
+
+    (when send
+
+      (uim-debug "pre-SEND")
+      
+      (setq send-vector-raw (vconcat uim-translated-key-vector
+                                    uim-untranslated-key-vector))
+
+      (setq send-vector 
+           (if uim-emacs 
+               send-vector-raw
+             (if uim-xemacs
+                 (uim-convert-keystr-to-uimagent-vector (key-description 
send-vector-raw))
+               nil)))
+
+      (uim-debug (format "send-vector: %s" send-vector))
+      (uim-debug (format "send-vector-raw: %s" send-vector-raw))
+
+
+      (cond ((or (and uim-emacs 
+                     (eventp event)
+                     (memq (event-basic-type event) 
+                           '(mouse-1 mouse-2 mouse-3 mouse-4 mouse-5)))
+                (and uim-xemacs 
+                     (string-match "button\\(1\\|2\\|3\\|4\\|5\\)" 
+                                   (key-description send-vector-raw))))
+            (uim-debug "mouse event")
+            (setq send nil)
+            (setq mouse t))
+
+           ((or (and uim-preedit-keymap-enabled
+                     (not window-system)
+                     (not uim-use-single-escape-on-terminal)
+                     (uim-is-single-escape send-vector-raw)))
+            (uim-debug "half escape found")
+            (setq send nil)
+            (setq wait t))
+
+           (current-prefix-arg
+            (setq send nil)
+            (setq issue t))
+
+           ((or (eq (car-safe (aref send-vector 0)) 'menu-bar)
+                (eq (car-safe (aref send-vector 0)) 'tool-bar))
+            (setq send nil)
+            (if (not uim-preedit-keymap-enabled)
+                (setq issue t)
+              (if (and uim-preedit-keymap-enabled
+                       (keymapp (uim-key-binding send-vector)))
+                  (setq wait t)
+                (setq discard t))))
+
+           ((and (or (>= (length send-vector) 3)
+                     (and (= (length send-vector) 2)
+                          (not (or (eq (aref send-vector 0) 27)
+                                   (eq (aref send-vector 0) 'escape))))))
+            (uim-debug "too long vector")
+            (setq send nil)
+            (if (not uim-preedit-keymap-enabled)
+                (setq issue t)))
+
+           ))
+
+
+
+    (when send
+      ;;      uim-el-agent            
+
+      (uim-debug "SEND")
+
+      ;;(setq uim-last-key-vector send-vector)
+      (setq uim-last-key-vector send-vector-raw)
+
+      (when uim-emacs
+       (cond ((equal send-vector [127])   (setq send-vector [backspace]))
+             ((equal send-vector [27 27]) (setq send-vector [27]))
+             ((equal send-vector [28])    (setq send-vector [C-\\]))
+             ((equal send-vector [29])    (setq send-vector [C-\]]))
+             ((equal send-vector [30])    (setq send-vector [C-~]))
+             ((equal send-vector [31])    (setq send-vector [C-_]))
+             ))
+
+      (when uim-xemacs 
+
+       (uim-debug (format "send-vector-raw1.5: %s" send-vector-raw))
+
+       (if (equal (make-vector 2 (uim-xemacs-make-event [(escape)]))
+                  send-vector-raw)
+           (setq send-vector-raw
+                 (vector (uim-xemacs-make-event [(escape)]))))
+
+       (setq send-vector-raw (uim-translate-escape-meta send-vector-raw))
+
+       (uim-debug (format "send-vector-raw2: %s" send-vector-raw))
+
+       (setq send-vector 
+             (uim-convert-keystr-to-uimagent-vector 
+              (key-description send-vector-raw))))
+
+      (uim-debug (format "send:%s issue:%s wait:%s mouse:%s" 
+                        send issue wait mouse))
+
+      (unwind-protect
+         (progn
+           (setq uim-wait-next-key nil)
+           (uim-do-send-recv-cmd (format "%d %s" 
+                                         uim-context-id send-vector))
+           (setq wait uim-wait-next-key)
                
-               (uim-emacs 
-                ;; Emacs ;;
-                (setq sendkey keyvec)
-                
-                (cond (current-prefix-arg
-                       (setq bypass t)
-                       (setq count (prefix-numeric-value arg))
-                       (setq count (prefix-numeric-value current-prefix-arg))
-                       (uim-debug (format "with prefix arg: count is %s"
-                                          count))
-                       )
-                      ((and (eventp event)
-                            (memq (event-basic-type event) 
-                                  '(mouse-1 mouse-2 mouse-3 mouse-4 mouse-5)))
-                       ;; detect mouse event
-                       ;;(uim-debug "mouse event")
-                       (setq bypass t)
-                       (setq mouse t)
-                       )
-                      ((and (not (or uim-preedit-displayed
-                                     uim-candidate-displayed))
-                            (uim-buffer-not-editable))
-                       (setq bypass t))
-                      (t 
-                       ;; overwrite special keyvector
-                       (cond ((equal sendkey [127])   (setq sendkey 
[backspace]))
-                             ((equal sendkey [27 27]) (setq sendkey [27]))
-                             ((equal sendkey [28])    (setq sendkey [C-\\]))
-                             ((equal sendkey [29])    (setq sendkey [C-\]]))
-                             ((equal sendkey [30])    (setq sendkey [C-~]))
-                             ((equal sendkey [31])    (setq sendkey [C-_]))
-                             ))
-                      )
-                ))
-         
-         ;; pass only Uim supported keys
-         (when (or (>= (length sendkey) 3)
-                   (and (= (length sendkey) 2)
-                        (not (or (eq (aref sendkey 0) 27)
-                                 (eq (aref sendkey 0) 'escape)))))
-           (uim-debug "bypass")
-           (setq bypass t))
-
-
-         (unwind-protect
-             (if (and uim-preedit-keymap-enabled
-                      (or (eq (car-safe (aref sendkey 0)) 'menu-bar)
-                          (eq (car-safe (aref sendkey 0)) 'tool-bar)))
-                 (uim-do-send-recv-cmd (format "%d NOP" uim-context-id))
-               (if (not bypass)
-                   (uim-do-send-recv-cmd (format "%d %s" uim-context-id 
sendkey))
-                 (if mouse
-                     (uim-process-mouse-event event)
-                   (uim-process-keyvec uim-last-key-vector count)
-
-                   ;; display "ESC ESC ESC" or something
-
-                   (if uim-show-keystrokes
-                       (let (message-log-max keymsg)
-                         (setq keymsg (if uim-prefix-arg-vector
-                                          (concat (key-description 
uim-prefix-arg-vector)
-                                                  " ")
-                                        nil))
-                         (mapcar '(lambda (x)
-                                    (setq keymsg (concat keymsg
-                                                         (key-description 
(vector x))
-                                                         " ")))
-                                 (append uim-last-key-vector nil))
-                         (message keymsg))
-                     )
-                   )))
-         
-           (progn
-             (uim-debug "reset prefix variables")
-             (setq uim-prefix-arg nil)
-             (setq uim-prefix-arg-vector nil)
-             (setq uim-prefix-ignore-next nil)
-             )
-           )
+           (uim-debug "send-recv done"))
 
-         )
+       (when (not uim-wait-next-key)
+         (uim-debug "* reset parameter after send")
+         (setq uim-translated-key-vector nil)
+         (setq uim-untranslated-key-vector nil)
+         (setq uim-prefix-arg nil)
+         (setq uim-prefix-arg-vector nil)
+         )))
+      
+    (when mouse
+      (unwind-protect
+         (uim-process-mouse-event event)
+       (uim-debug "* reset parameter after mouse")
+       (setq uim-translated-key-vector nil)
+       (setq uim-untranslated-key-vector nil)
+       (setq uim-prefix-arg nil)
+       (setq uim-prefix-arg-vector nil)
+       ))
+
+
+    (when issue
+
+      (let (issue-vector-raw)
+       (setq issue-vector-raw (vconcat uim-translated-key-vector
+                                       uim-untranslated-key-vector))
+
+       (setq issue-vector 
+             (if uim-emacs 
+                 issue-vector-raw
+               (if uim-xemacs
+                   (uim-convert-char-to-symbolvector 
+                    (key-description issue-vector-raw)))))
 
-      ;; if keyvec is nil
-      (setq uim-deactivate-mark nil)
+       (setq uim-last-key-vector issue-vector-raw)
+      
+       (uim-debug (format "issue-vector-raw: %s" issue-vector-raw))
 
-      (if (not uim-show-keystrokes)
-         (if (sit-for echo-keystrokes)
-             (setq uim-show-keystrokes t)))
+       (unwind-protect
+           (let (count)
+             (if uim-prefix-arg
+                 (setq count (prefix-numeric-value uim-prefix-arg)))
+           
+             (uim-debug (format "issue command %s %s" 
+                                issue-vector-raw count))
+           
+             (if (uim-process-keyvec issue-vector-raw count)
+                 (setq wait t)))
+         (when (not wait)
+           (uim-debug "* reset parameter after issue")
+           (setq uim-translated-key-vector nil)
+           (setq uim-untranslated-key-vector nil)
+           (setq uim-prefix-arg nil)
+           (setq uim-prefix-arg-vector nil)
+           ))))
+
+
+    (when wait
+      (uim-debug "wait next input")
+
+
+      (if (and (memq last-command (list 'universal-argument
+                                       'digit-argument
+                                       'negative-argument))
+              (current-message))
+         (setq uim-keystroke-displaying t))
+
+      (if (not uim-keystroke-displaying)
+         (setq uim-keystroke-displaying (sit-for echo-keystrokes)))
+
+      (uim-debug (format "*** uim-keystroke-displaying: %s"
+                        uim-keystroke-displaying))
+    
 
       ;; display "ESC-" or something
-      (if uim-show-keystrokes
+      ;;(uim-debug (format "uim-prefix-arg-vector2 %s" uim-prefix-arg-vector))
+      (if uim-keystroke-displaying
          (let (message-log-max)
-           (message (concat (key-description (vconcat uim-prefix-arg-vector
-                                                      uim-stacked-key-vector))
+           (uim-debug (format "uim-translated-key-vector %s" 
+                              uim-translated-key-vector))
+           (message (concat (key-description 
+                             (vconcat uim-prefix-arg-vector
+                                      (if uim-xemacs
+                                          (uim-translate-escape-meta 
uim-translated-key-vector)
+                                        uim-translated-key-vector)
+                                      (if uim-xemacs
+                                          (uim-translate-escape-meta 
uim-untranslated-key-vector)
+                                        uim-untranslated-key-vector)
+
+                                      )) 
+                            (if uim-xemacs " ")
                             "-"))))
-      ))
+
+      (if uim-emacs
+         (setq uim-deactivate-mark nil))
+
+      )
+
+    (when discard
+      (uim-debug "discard input")
+      (unwind-protect
+         nil
+       (setq uim-translated-key-vector nil)
+       (setq uim-untranslated-key-vector nil)
+       (setq uim-prefix-arg nil)
+       (setq uim-prefix-arg-vector nil)
+       ))
+
+;; display "ESC ESC ESC" or something
+    (when (and (or send issue)
+              (not wait)
+              uim-keystroke-displaying)
+
+      (uim-debug (format "update final message %s" uim-last-key-vector))
+      
+      (let (message-log-max msg)
+       (setq msg (if uim-prefix-arg-vector
+                     (concat " " (key-description uim-prefix-arg-vector) " ")
+                   ""))
+
+       (mapcar '(lambda (x)
+                  (setq msg (concat msg
+                                    (key-description (vector x)) " ")))
+                
+               (append (if uim-xemacs
+                           (uim-translate-escape-meta send-vector-raw)
+                         uim-last-key-vector) nil))
+       (message msg)))
+
+    )
 
   (if uim-emacs
       (setq deactivate-mark uim-deactivate-mark))
@@ -1060,7 +1206,7 @@
 ;; process return expression from uim-el-agent 
 (defun uim-process-agent-output (str)
   (catch 'process-agent-output
-    (let (;;(inhibit-quit t)
+    (let ((inhibit-quit t)
          preedit-existed
          candidate-existed
          key commit preedit candidate default im label imlist helpermsg
@@ -1172,6 +1318,7 @@
 
                  ;; disable buffer-undo temporarily
                  (when uim-buffer-undo-list-saved
+                   
                    (setq buffer-undo-list (uim-delete-atom buffer-undo-list))
 
                    (setq uim-buffer-undo-list
@@ -1201,8 +1348,16 @@
            ;;  C-o is also processed here ... orz
            (let ((inhibit-read-only t))
              (unwind-protect
-                 (progn
-                   (uim-process-keyvec key)
+                 (let (count)
+                   (uim-debug (format "uim-prefix-arg: %s" uim-prefix-arg))
+                   (if uim-prefix-arg
+                       (setq count (prefix-numeric-value uim-prefix-arg)))
+
+                   (when (uim-process-keyvec key count)
+                     ;;(setq uim-stacked-key-vector key)
+                     (setq uim-wait-next-key t)
+                     ;;(setq uim-prefix-arg count)
+                     )
                    (setq keyproc-done t))
                (when (not keyproc-done)
                  (uim-leave-preedit-mode)

Reply via email to