Author: sasugaanija
Date: Sun Jun  1 11:35:59 2008
New Revision: 5502

Modified:
  trunk/emacs/uim-key.el
  trunk/emacs/uim-keymap.el
  trunk/emacs/uim.el

Log:
Fix serious bug:
uim.el sometimes breaks minor-mode-map-alist.

* emacs/uim-keymap.el
 - (uim-disable-other-minor-mode-map): New function
 - (uim-enable-other-minor-mode-map): New function
 - (uim-disable-mode-keymap): Removed
 - (uim-get-keymap): New function
 - (uim-set-keymap): New function
 - (uim-enable-mode-keymap): Call uim-set-keymap
 - (uim-disable-keymap): New function
 - (uim-enable-preedit-keymap):
    * Call uim-set-keymap
    * Remove codes which are treating minor-mode-map-alist
 - (uim-disable-preedit-keymap):
    * Remove codes which are treating minor-mode-map-alist
* emacs/uim-key.el
 - (uim-command-execute):
    * Remove codes which are treating minor-mode-map-alist
* emacs/uim.el
 - (uim-init-minor-mode): Change initial keymap of uim-mode to nil
 - (uim-focused): Update minor-mode-map-alist or keymap of uim-mode
 - (uim-unfocused): Update minor-mode-map-alist
 - (uim-enter-preedit-mode): Update minor-mode-map-alist
 - (uim-init): Call uim-enable-mode-keymap to initialize the keymap of
               uim-mode



Modified: trunk/emacs/uim-key.el
==============================================================================
--- trunk/emacs/uim-key.el      (original)
+++ trunk/emacs/uim-key.el      Sun Jun  1 11:35:59 2008
@@ -212,8 +212,8 @@
          (setq last-command-char
                (aref (uim-get-vector-from-tail uim-key-vector 1) 0))
        
-         (setq map (cdr (assq 'uim-mode minor-mode-map-alist)))
-         (setcdr (assq 'uim-mode minor-mode-map-alist) uim-dummy-map)
+         ;; backup current keymap of uim-mode
+         (setq map (uim-disable-keymap))

          (if (or (and bind
                       (eq bind 'digit-argument))       
@@ -236,7 +236,8 @@
               (buffer-live-p buffer))
          (progn
            (set-buffer buffer)
-           (setcdr (assq 'uim-mode minor-mode-map-alist) map)
+           ;; restore keymap of uim-mode
+           (uim-set-keymap map)
            ))
      )))


Modified: trunk/emacs/uim-keymap.el
==============================================================================
--- trunk/emacs/uim-keymap.el   (original)
+++ trunk/emacs/uim-keymap.el   Sun Jun  1 11:35:59 2008
@@ -179,34 +179,68 @@

  )

+;;
+;; Disable other minor-mode keymaps while preedit strings or candidates
+;; are displayed.
+;;
+(defun uim-disable-other-minor-mode-map ()
+  (when (not uim-minor-mode-map-alist)
+    (setq uim-minor-mode-map-alist minor-mode-map-alist)
+    (setq minor-mode-map-alist (list (assq 'uim-mode minor-mode-map-alist)))
+
+    (when (and uim-emacs (>= emacs-major-version 22))
+      (setq uim-emulation-mode-map-alists emulation-mode-map-alists)
+      (setq emulation-mode-map-alists nil)))
+  )
+
+(defun uim-enable-other-minor-mode-map ()
+  (when uim-minor-mode-map-alist
+    (setq minor-mode-map-alist uim-minor-mode-map-alist)
+    (setq uim-minor-mode-map-alist nil)
+
+    (when (and uim-emacs (>= emacs-major-version 22))
+      (setq emulation-mode-map-alists uim-emulation-mode-map-alists)
+      (setq uim-emulation-mode-map-alists nil)))
+  )
+

;;
-;; Switch keymap
+;; Change keymap of uim-mode
;;
-(defun uim-enable-mode-keymap ()
+(defun uim-set-keymap (map)
  (setcdr (assq 'uim-mode minor-mode-map-alist)
-         uim-mode-map))
+         map))

-(defun uim-disable-mode-keymap ()
-  (setcdr (assq 'uim-mode minor-mode-map-alist)
-         nil))
+;;
+;; Return current keymap of uim-mode
+;;
+(defun uim-get-keymap ()
+  (cdr (assq 'uim-mode minor-mode-map-alist)))

-(defun uim-enable-preedit-keymap ()
-  (when (not uim-preedit-keymap-enabled)
+;;
+;; Set normal keymap
+;;
+(defun uim-enable-mode-keymap ()
+  (uim-set-keymap uim-mode-map))

-    (setq uim-preedit-keymap-enabled t)
+;;
+;; Disable and return current keymap
+;;
+(defun uim-disable-keymap ()
+  (let (map)
+    (setq map (uim-get-keymap))
+    (uim-set-keymap uim-dummy-map)
+    map)
+  )

-    (setcdr (assq 'uim-mode minor-mode-map-alist)
-           uim-preedit-map)
+;;
+;; Set preedit keymap
+;;
+(defun uim-enable-preedit-keymap ()
+  (when (not uim-preedit-keymap-enabled)
+    (setq uim-preedit-keymap-enabled t))

-    ;; disable other keymaps
-    (when (not uim-minor-mode-map-alist)
-      (setq uim-minor-mode-map-alist minor-mode-map-alist)
-      (setq minor-mode-map-alist (list (assq 'uim-mode minor-mode-map-alist)))
-
-      (when (and uim-emacs (>= emacs-major-version 22))
-       (setq uim-emulation-mode-map-alists emulation-mode-map-alists)
-       (setq emulation-mode-map-alists nil)))
+  (uim-set-keymap uim-preedit-map)

    (when uim-xemacs
      ;; disable toolbar and menubar
@@ -214,29 +248,22 @@
      (setq toolbar-map uim-toolbar-map)
      (uim-xemacs-save-menubar))
    )
-  )

+;;
+;; Unset preedit keymap
+;;
(defun uim-disable-preedit-keymap ()
-  (when uim-preedit-keymap-enabled
-    (setq uim-preedit-keymap-enabled nil)

-    ;; enable other keymaps
-    (when uim-minor-mode-map-alist
-      (setq minor-mode-map-alist uim-minor-mode-map-alist)
-      (setq uim-minor-mode-map-alist nil)
-
-      (when (and uim-emacs (>= emacs-major-version 22))
-       (setq emulation-mode-map-alists uim-emulation-mode-map-alists)
-       (setq uim-emulation-mode-map-alists nil)))
+  (when uim-preedit-keymap-enabled
+    (setq uim-preedit-keymap-enabled nil))

+  (uim-enable-other-minor-mode-map)
    (uim-enable-mode-keymap)

    (when uim-xemacs
      ;;enable toolbar and menubar
      (kill-local-variable 'toolbar-map)
      (uim-xemacs-restore-menubar))
-
-    )
  )



Modified: trunk/emacs/uim.el
==============================================================================
--- trunk/emacs/uim.el  (original)
+++ trunk/emacs/uim.el  Sun Jun  1 11:35:59 2008
@@ -64,7 +64,7 @@
  (if (not (assq 'uim-mode minor-mode-map-alist))
      (setq minor-mode-map-alist
            (cons
-            (cons 'uim-mode uim-mode-map)
+            (cons 'uim-mode nil)
             minor-mode-map-alist))))


@@ -183,6 +183,20 @@
;; Focused
;;
(defun uim-focused ()
+  (if uim-preedit-keymap-enabled
+      (progn
+       ;; If preedit strings and/or candidates are displayed,
+       ;; other keymaps of minor-mode-map-alist should be disabled.
+       ;; Since minor-mode-map-alist is not a buffer local variable,
+       ;; we must re-enable the other keymaps of minor-mode-map-alist
+       ;; when the focus has moved to other buffer.
+       ;; So, we also need to re-disable other keymaps of minor-mode-map-alist
+       ;; when the focus has move to a buffer which have
+       ;; preedit strings and/or candidates.
+       (uim-disable-other-minor-mode-map)
+       (uim-enable-preedit-keymap))
+    (uim-enable-mode-keymap))
+
  (uim-change-process-encoding uim-decoding-code)
  (setq uim-focused-buffer (current-buffer))
  (uim-do-send-recv-cmd (format "%d FOCUSED" uim-context-id))
@@ -196,6 +210,9 @@
  ;; don't send a message to uim-el-agent if it has been dead
  (if uim-el-agent-process
      (uim-do-send-recv-cmd (format "%d UNFOCUSED" uim-context-id)))
+  ;; Enable other keymaps of minor-mode-map-alist.  See uim-focused.
+  (if uim-preedit-keymap-enabled
+      (uim-enable-other-minor-mode-map))
  )


@@ -1116,6 +1133,7 @@
(defun uim-enter-preedit-mode ()
  ;; change keymap and freeze faces at first time
  (uim-enable-preedit-keymap)
+  (uim-disable-other-minor-mode-map)
  (when (= (minibuffer-depth) 0)
    (uim-freeze-buffer)
    (setq uim-buffer-read-only buffer-read-only)
@@ -1431,6 +1449,7 @@

  ;; initialize minor-mode
  (uim-init-minor-mode)
+  (uim-enable-mode-keymap)

  ;; initialize keymap
  (uim-init-keymap)

Reply via email to