diff options
| author | Chong Yidong | 2012-06-19 14:49:50 +0800 |
|---|---|---|
| committer | Chong Yidong | 2012-06-19 14:49:50 +0800 |
| commit | c6bf30222430f41fbb696e296f0f63f465eefc35 (patch) | |
| tree | 257eb724e088a7e5e321170ce078cc0e3efc5f6e /lisp | |
| parent | 4e2cc2f31f8e516901bc3cacf98def678cd45dc9 (diff) | |
| download | emacs-c6bf30222430f41fbb696e296f0f63f465eefc35.tar.gz emacs-c6bf30222430f41fbb696e296f0f63f465eefc35.zip | |
Preserve tty top-frames under various window-changing operations.
* subr.el (with-selected-window): Preserve the selected window's
terminal's top-frame.
* window.el (save-selected-window): Likewise.
* frame.c (delete_frame): When selecting a frame on a different
text terminal, do not alter the terminal's top-frame.
* term.c (Ftty_top_frame): New function.
* xdisp.c (format_mode_line_unwind_data): Record the target
frame's selected window and its terminal's top-frame.
(unwind_format_mode_line): Restore them.
(x_consider_frame_title, display_mode_line, Fformat_mode_line):
Callers changed.
(x_consider_frame_title): Do not condition on HAVE_WINDOW_SYSTEM,
since tty frames can be explicitly named.
(prepare_menu_bars): Likewise.
Fixes: debbugs:4702
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/ChangeLog | 7 | ||||
| -rw-r--r-- | lisp/subr.el | 27 | ||||
| -rw-r--r-- | lisp/window.el | 22 |
3 files changed, 40 insertions, 16 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ab66eaf58fb..71326e10748 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,10 @@ | |||
| 1 | 2012-06-19 Chong Yidong <cyd@gnu.org> | ||
| 2 | |||
| 3 | * subr.el (with-selected-window): Preserve the selected window's | ||
| 4 | terminal's top-frame (Bug#4702). | ||
| 5 | |||
| 6 | * window.el (save-selected-window): Likewise. | ||
| 7 | |||
| 1 | 2012-06-18 Stefan Monnier <monnier@iro.umontreal.ca> | 8 | 2012-06-18 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 9 | ||
| 3 | * progmodes/python.el (python-rx-constituents): Move backquote. | 10 | * progmodes/python.el (python-rx-constituents): Move backquote. |
diff --git a/lisp/subr.el b/lisp/subr.el index 473cc3efddd..ba9b06d495b 100644 --- a/lisp/subr.el +++ b/lisp/subr.el | |||
| @@ -3011,24 +3011,29 @@ the buffer list ordering." | |||
| 3011 | (declare (indent 1) (debug t)) | 3011 | (declare (indent 1) (debug t)) |
| 3012 | ;; Most of this code is a copy of save-selected-window. | 3012 | ;; Most of this code is a copy of save-selected-window. |
| 3013 | `(let* ((save-selected-window-destination ,window) | 3013 | `(let* ((save-selected-window-destination ,window) |
| 3014 | (save-selected-window-frame | ||
| 3015 | (window-frame save-selected-window-destination)) | ||
| 3014 | (save-selected-window-window (selected-window)) | 3016 | (save-selected-window-window (selected-window)) |
| 3015 | ;; Selecting a window on another frame changes not only the | 3017 | ;; Selecting a window on another frame also changes that |
| 3016 | ;; selected-window but also the frame-selected-window of the | 3018 | ;; frame's frame-selected-window. We must save&restore it. |
| 3017 | ;; destination frame. So we need to save&restore it. | ||
| 3018 | (save-selected-window-other-frame | 3019 | (save-selected-window-other-frame |
| 3019 | (unless (eq (selected-frame) | 3020 | (unless (eq (selected-frame) save-selected-window-frame) |
| 3020 | (window-frame save-selected-window-destination)) | 3021 | (frame-selected-window save-selected-window-frame))) |
| 3021 | (frame-selected-window | 3022 | (save-selected-window-top-frame |
| 3022 | (window-frame save-selected-window-destination))))) | 3023 | (unless (eq (selected-frame) save-selected-window-frame) |
| 3024 | (tty-top-frame save-selected-window-frame)))) | ||
| 3023 | (save-current-buffer | 3025 | (save-current-buffer |
| 3024 | (unwind-protect | 3026 | (unwind-protect |
| 3025 | (progn (select-window save-selected-window-destination 'norecord) | 3027 | (progn (select-window save-selected-window-destination 'norecord) |
| 3026 | ,@body) | 3028 | ,@body) |
| 3027 | ;; First reset frame-selected-window. | 3029 | ;; First reset frame-selected-window. |
| 3028 | (if (window-live-p save-selected-window-other-frame) | 3030 | (when (window-live-p save-selected-window-other-frame) |
| 3029 | ;; We don't use set-frame-selected-window because it does not | 3031 | ;; We don't use set-frame-selected-window because it does not |
| 3030 | ;; pass the `norecord' argument to Fselect_window. | 3032 | ;; pass the `norecord' argument to Fselect_window. |
| 3031 | (select-window save-selected-window-other-frame 'norecord)) | 3033 | (select-window save-selected-window-other-frame 'norecord) |
| 3034 | (and (frame-live-p save-selected-window-top-frame) | ||
| 3035 | (not (eq (tty-top-frame) save-selected-window-top-frame)) | ||
| 3036 | (select-frame save-selected-window-top-frame 'norecord))) | ||
| 3032 | ;; Then reset the actual selected-window. | 3037 | ;; Then reset the actual selected-window. |
| 3033 | (when (window-live-p save-selected-window-window) | 3038 | (when (window-live-p save-selected-window-window) |
| 3034 | (select-window save-selected-window-window 'norecord)))))) | 3039 | (select-window save-selected-window-window 'norecord)))))) |
diff --git a/lisp/window.el b/lisp/window.el index 6ea882d1ea2..7c3fe1a082f 100644 --- a/lisp/window.el +++ b/lisp/window.el | |||
| @@ -47,12 +47,24 @@ order of recently selected windows and the buffer list ordering | |||
| 47 | are not altered by this macro (unless they are altered in BODY)." | 47 | are not altered by this macro (unless they are altered in BODY)." |
| 48 | (declare (indent 0) (debug t)) | 48 | (declare (indent 0) (debug t)) |
| 49 | `(let ((save-selected-window-window (selected-window)) | 49 | `(let ((save-selected-window-window (selected-window)) |
| 50 | ;; It is necessary to save all of these, because calling | 50 | ;; We save and restore all frames' selected windows, because |
| 51 | ;; select-window changes frame-selected-window for whatever | 51 | ;; `select-window' can change the frame-selected-window of |
| 52 | ;; frame that window is in. | 52 | ;; whatever frame that window is in. Each text terminal's |
| 53 | ;; top-frame is preserved by putting it last in the list. | ||
| 53 | (save-selected-window-alist | 54 | (save-selected-window-alist |
| 54 | (mapcar (lambda (frame) (cons frame (frame-selected-window frame))) | 55 | (apply 'append |
| 55 | (frame-list)))) | 56 | (mapcar (lambda (terminal) |
| 57 | (let ((frames (frames-on-display-list terminal)) | ||
| 58 | (top-frame (tty-top-frame terminal)) | ||
| 59 | alist) | ||
| 60 | (if top-frame | ||
| 61 | (setq frames | ||
| 62 | (cons top-frame | ||
| 63 | (delq top-frame frames)))) | ||
| 64 | (dolist (f frames) | ||
| 65 | (push (cons f (frame-selected-window f)) | ||
| 66 | alist)))) | ||
| 67 | (terminal-list))))) | ||
| 56 | (save-current-buffer | 68 | (save-current-buffer |
| 57 | (unwind-protect | 69 | (unwind-protect |
| 58 | (progn ,@body) | 70 | (progn ,@body) |