emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/international/encoded-kb.el,v


From: Stefan Monnier
Subject: [Emacs-diffs] Changes to emacs/lisp/international/encoded-kb.el,v
Date: Thu, 18 Oct 2007 18:53:30 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Stefan Monnier <monnier>        07/10/18 18:53:29

Index: international/encoded-kb.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/international/encoded-kb.el,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- international/encoded-kb.el 9 Oct 2007 05:17:21 -0000       1.41
+++ international/encoded-kb.el 18 Oct 2007 18:53:28 -0000      1.42
@@ -262,13 +262,31 @@
     (when frame
       (with-selected-frame frame
        ;; Remove any previous encoded-kb keymap from input-decode-map.
-       (let ((m input-decode-map))
-         (if (equal (keymap-prompt m) "encoded-kb")
-             (setq input-decode-map (keymap-parent m))
-           (while (keymap-parent m)
-             (if (equal (keymap-prompt (keymap-parent m)) "encoded-kb")
-                 (set-keymap-parent m (keymap-parent (keymap-parent m))))
-             (setq m (keymap-parent m)))))
+       (let ((m input-decode-map)
+              (child nil))
+          (while (keymapp m)
+            (if (not (equal (keymap-prompt m) "encoded-kb"))
+                (progn
+                  (setq child m)
+                  (setq m (keymap-parent m)))
+              ;; We've found an encoded-kb map, but maybe the prompt we get
+              ;; is really inherited from the encoded-kb map.
+              (let (mp)
+                (while (and (keymapp (setq mp (keymap-parent m)))
+                            (equal (keymap-prompt mp) "encoded-kb"))
+                  (setq child m)
+                  (setq m mp))
+                ;; (assert (equal (keymap-prompt m) "encoded-kb"))
+                ;; (assert (eq mp (keymap-parent m)))
+                ;; (assert (not (and (keymapp mp)
+                ;;                   (equal (keymap-prompt mp) "encoded-kb"))))
+                ;; (assert (eq m (if child
+                ;;                   (keymap-parent child) input-decode-map)))
+                ;; We can finally do the actual removal.
+                (if child
+                    (set-keymap-parent child mp)
+                  (setq input-decode-map mp))
+                (setq m mp))))))
 
        (if (keyboard-coding-system)
            ;; We are turning on Encoded-kbd mode.
@@ -276,24 +294,31 @@
                  (keymap (make-sparse-keymap "encoded-kb"))
                  (cim (current-input-mode))
                  result)
-             (set-keymap-parent keymap input-decode-map)
-             (setq input-decode-map keymap)
+            ;; Place `keymap' as the immediate parent of input-decode-map
+            ;; rather than on top, so that later `define-key' on
+            ;; input-decode-map don't end up accidentally changing our
+            ;; part of the keymap, which would lead to bugs when/if we later
+            ;; on remove that part.
+            (set-keymap-parent keymap (keymap-parent input-decode-map))
+            (set-keymap-parent input-decode-map keymap)
              (unless (terminal-parameter nil 
'encoded-kbd-saved-input-meta-mode)
-               (set-terminal-parameter nil 'encoded-kbd-saved-input-mode (nth 
2 cim)))
+              (set-terminal-parameter nil 'encoded-kbd-saved-input-mode
+                                      (nth 2 cim)))
              (setq result (and coding (encoded-kbd-setup-keymap keymap 
coding)))
              (if result
                  (when (and (eq result 8)
                             (memq (nth 2 cim) '(t nil)))
                    (set-input-meta-mode 'use-8th-bit))
-               (set-terminal-parameter nil 'encoded-kbd-saved-input-meta-mode 
nil)
+              (set-terminal-parameter
+               nil 'encoded-kbd-saved-input-meta-mode nil)
                (error "Unsupported coding system in Encoded-kbd mode: %S"
                       coding)))
          ;; We are turning off Encoded-kbd mode.
-         (when (and (terminal-parameter nil 'encoded-kbd-saved-input-meta-mode)
-                    (not (equal (nth 2 (current-input-mode))
-                                (terminal-parameter nil 
'encoded-kbd-saved-input-meta-mode))))
-           (set-input-meta-mode (terminal-parameter nil 
'encoded-kbd-saved-input-meta-mode)))
-         (set-terminal-parameter nil 'saved-input-meta-mode nil))))))
+        (let ((old (terminal-parameter nil 
'encoded-kbd-saved-input-meta-mode)))
+          (when (and old (not (equal (nth 2 (current-input-mode)) old)))
+            (set-input-meta-mode old))
+          (set-terminal-parameter
+           nil 'encoded-kbd-saved-input-meta-mode nil))))))
 
 (provide 'encoded-kb)
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]