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)