aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2007-10-18 18:53:28 +0000
committerStefan Monnier2007-10-18 18:53:28 +0000
commit1bb5ab899b4014b4dc309f1b3cd41258de63e6cd (patch)
tree4cfbd1885559f5c78e714267aeba494b6afcbb7f
parentde3cc8168d9f9840c2b65265611c6541a2232d5c (diff)
downloademacs-1bb5ab899b4014b4dc309f1b3cd41258de63e6cd.tar.gz
emacs-1bb5ab899b4014b4dc309f1b3cd41258de63e6cd.zip
(encoded-kbd-setup-display): Be careful not to remove keymaps that just
happen to inherit from one of ours. When setting up our keymap, make sure it won't be accidentally modified by someone else.
-rw-r--r--lisp/ChangeLog7
-rw-r--r--lisp/international/encoded-kb.el89
2 files changed, 64 insertions, 32 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 39daa6aef77..b92d3b1b654 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,10 @@
12007-10-18 Stefan Monnier <monnier@iro.umontreal.ca>
2
3 * international/encoded-kb.el (encoded-kbd-setup-display): Be careful
4 not to remove keymaps that just happen to inherit from one of ours.
5 When setting up our keymap, make sure it won't be accidentally
6 modified by someone else.
7
12007-10-18 Thien-Thi Nguyen <ttn@gnuvola.org> 82007-10-18 Thien-Thi Nguyen <ttn@gnuvola.org>
2 9
3 * textmodes/artist.el (artist-previous-line, artist-next-line): 10 * textmodes/artist.el (artist-previous-line, artist-next-line):
diff --git a/lisp/international/encoded-kb.el b/lisp/international/encoded-kb.el
index 14c61560a41..5e690048aeb 100644
--- a/lisp/international/encoded-kb.el
+++ b/lisp/international/encoded-kb.el
@@ -262,38 +262,63 @@ DISPLAY may be a display id, a frame, or nil for the selected frame's display."
262 (when frame 262 (when frame
263 (with-selected-frame frame 263 (with-selected-frame frame
264 ;; Remove any previous encoded-kb keymap from input-decode-map. 264 ;; Remove any previous encoded-kb keymap from input-decode-map.
265 (let ((m input-decode-map)) 265 (let ((m input-decode-map)
266 (if (equal (keymap-prompt m) "encoded-kb") 266 (child nil))
267 (setq input-decode-map (keymap-parent m)) 267 (while (keymapp m)
268 (while (keymap-parent m) 268 (if (not (equal (keymap-prompt m) "encoded-kb"))
269 (if (equal (keymap-prompt (keymap-parent m)) "encoded-kb") 269 (progn
270 (set-keymap-parent m (keymap-parent (keymap-parent m)))) 270 (setq child m)
271 (setq m (keymap-parent m))))) 271 (setq m (keymap-parent m)))
272 272 ;; We've found an encoded-kb map, but maybe the prompt we get
273 (if (keyboard-coding-system) 273 ;; is really inherited from the encoded-kb map.
274 ;; We are turning on Encoded-kbd mode. 274 (let (mp)
275 (let ((coding (keyboard-coding-system)) 275 (while (and (keymapp (setq mp (keymap-parent m)))
276 (keymap (make-sparse-keymap "encoded-kb")) 276 (equal (keymap-prompt mp) "encoded-kb"))
277 (cim (current-input-mode)) 277 (setq child m)
278 result) 278 (setq m mp))
279 (set-keymap-parent keymap input-decode-map) 279 ;; (assert (equal (keymap-prompt m) "encoded-kb"))
280 (setq input-decode-map keymap) 280 ;; (assert (eq mp (keymap-parent m)))
281 (unless (terminal-parameter nil 'encoded-kbd-saved-input-meta-mode) 281 ;; (assert (not (and (keymapp mp)
282 (set-terminal-parameter nil 'encoded-kbd-saved-input-mode (nth 2 cim))) 282 ;; (equal (keymap-prompt mp) "encoded-kb"))))
283 (setq result (and coding (encoded-kbd-setup-keymap keymap coding))) 283 ;; (assert (eq m (if child
284 (if result 284 ;; (keymap-parent child) input-decode-map)))
285 (when (and (eq result 8) 285 ;; We can finally do the actual removal.
286 (memq (nth 2 cim) '(t nil))) 286 (if child
287 (set-input-meta-mode 'use-8th-bit)) 287 (set-keymap-parent child mp)
288 (set-terminal-parameter nil 'encoded-kbd-saved-input-meta-mode nil) 288 (setq input-decode-map mp))
289 (error "Unsupported coding system in Encoded-kbd mode: %S" 289 (setq m mp))))))
290 coding))) 290
291 ;; We are turning off Encoded-kbd mode. 291 (if (keyboard-coding-system)
292 (when (and (terminal-parameter nil 'encoded-kbd-saved-input-meta-mode) 292 ;; We are turning on Encoded-kbd mode.
293 (not (equal (nth 2 (current-input-mode)) 293 (let ((coding (keyboard-coding-system))
294 (terminal-parameter nil 'encoded-kbd-saved-input-meta-mode)))) 294 (keymap (make-sparse-keymap "encoded-kb"))
295 (set-input-meta-mode (terminal-parameter nil 'encoded-kbd-saved-input-meta-mode))) 295 (cim (current-input-mode))
296 (set-terminal-parameter nil 'saved-input-meta-mode nil)))))) 296 result)
297 ;; Place `keymap' as the immediate parent of input-decode-map
298 ;; rather than on top, so that later `define-key' on
299 ;; input-decode-map don't end up accidentally changing our
300 ;; part of the keymap, which would lead to bugs when/if we later
301 ;; on remove that part.
302 (set-keymap-parent keymap (keymap-parent input-decode-map))
303 (set-keymap-parent input-decode-map keymap)
304 (unless (terminal-parameter nil 'encoded-kbd-saved-input-meta-mode)
305 (set-terminal-parameter nil 'encoded-kbd-saved-input-mode
306 (nth 2 cim)))
307 (setq result (and coding (encoded-kbd-setup-keymap keymap coding)))
308 (if result
309 (when (and (eq result 8)
310 (memq (nth 2 cim) '(t nil)))
311 (set-input-meta-mode 'use-8th-bit))
312 (set-terminal-parameter
313 nil 'encoded-kbd-saved-input-meta-mode nil)
314 (error "Unsupported coding system in Encoded-kbd mode: %S"
315 coding)))
316 ;; We are turning off Encoded-kbd mode.
317 (let ((old (terminal-parameter nil 'encoded-kbd-saved-input-meta-mode)))
318 (when (and old (not (equal (nth 2 (current-input-mode)) old)))
319 (set-input-meta-mode old))
320 (set-terminal-parameter
321 nil 'encoded-kbd-saved-input-meta-mode nil))))))
297 322
298(provide 'encoded-kb) 323(provide 'encoded-kb)
299 324