aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorChong Yidong2012-06-19 14:49:50 +0800
committerChong Yidong2012-06-19 14:49:50 +0800
commitc6bf30222430f41fbb696e296f0f63f465eefc35 (patch)
tree257eb724e088a7e5e321170ce078cc0e3efc5f6e /lisp
parent4e2cc2f31f8e516901bc3cacf98def678cd45dc9 (diff)
downloademacs-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/ChangeLog7
-rw-r--r--lisp/subr.el27
-rw-r--r--lisp/window.el22
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 @@
12012-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
12012-06-18 Stefan Monnier <monnier@iro.umontreal.ca> 82012-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
47are not altered by this macro (unless they are altered in BODY)." 47are 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)