diff options
| author | Stefan Monnier | 2007-10-18 18:53:28 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2007-10-18 18:53:28 +0000 |
| commit | 1bb5ab899b4014b4dc309f1b3cd41258de63e6cd (patch) | |
| tree | 4cfbd1885559f5c78e714267aeba494b6afcbb7f | |
| parent | de3cc8168d9f9840c2b65265611c6541a2232d5c (diff) | |
| download | emacs-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/ChangeLog | 7 | ||||
| -rw-r--r-- | lisp/international/encoded-kb.el | 89 |
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 @@ | |||
| 1 | 2007-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 | |||
| 1 | 2007-10-18 Thien-Thi Nguyen <ttn@gnuvola.org> | 8 | 2007-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 | ||