diff options
| author | Stefan Monnier | 2012-10-07 11:54:30 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2012-10-07 11:54:30 -0400 |
| commit | 662a9d0e1ca5f7e2de9aa2d4d59a038aa93ab146 (patch) | |
| tree | 412e909910b398eb2dc87b9d6795ec0b44a70360 | |
| parent | 13af0d109fc8d2595c0f9f103993e27690f616a3 (diff) | |
| download | emacs-662a9d0e1ca5f7e2de9aa2d4d59a038aa93ab146.tar.gz emacs-662a9d0e1ca5f7e2de9aa2d4d59a038aa93ab146.zip | |
* lisp/window.el (internal--before-save-selected-window)
(internal--after-save-selected-window): New functions extracted from
save-selected-window. Make sure we return the `alist' we construct.
(save-selected-window): Use them.
* lisp/textmodes/tex-mode.el (tex-recenter-output-buffer):
Use with-selected-window.
| -rw-r--r-- | lisp/ChangeLog | 8 | ||||
| -rw-r--r-- | lisp/textmodes/tex-mode.el | 3 | ||||
| -rw-r--r-- | lisp/window.el | 56 |
3 files changed, 40 insertions, 27 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 132cea20bdc..fe225a9ddd2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,5 +1,13 @@ | |||
| 1 | 2012-10-07 Stefan Monnier <monnier@iro.umontreal.ca> | 1 | 2012-10-07 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 2 | ||
| 3 | * window.el (internal--before-save-selected-window) | ||
| 4 | (internal--after-save-selected-window): New functions extracted from | ||
| 5 | save-selected-window. Make sure we return the `alist' we construct. | ||
| 6 | (save-selected-window): Use them. | ||
| 7 | |||
| 8 | * textmodes/tex-mode.el (tex-recenter-output-buffer): | ||
| 9 | Use with-selected-window. | ||
| 10 | |||
| 3 | * emacs-lisp/autoload.el (make-autoload): Add `cl-defmacro' to the | 11 | * emacs-lisp/autoload.el (make-autoload): Add `cl-defmacro' to the |
| 4 | forms that define macros (bug#12593). | 12 | forms that define macros (bug#12593). |
| 5 | 13 | ||
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index a324daa9283..062f43be57b 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el | |||
| @@ -2565,8 +2565,7 @@ line LINE of the window, or centered if LINE is nil." | |||
| 2565 | (if (null tex-shell) | 2565 | (if (null tex-shell) |
| 2566 | (message "No TeX output buffer") | 2566 | (message "No TeX output buffer") |
| 2567 | (setq window (display-buffer tex-shell)) | 2567 | (setq window (display-buffer tex-shell)) |
| 2568 | (save-selected-window | 2568 | (with-selected-window window |
| 2569 | (select-window window) | ||
| 2570 | (bury-buffer tex-shell) | 2569 | (bury-buffer tex-shell) |
| 2571 | (goto-char (point-max)) | 2570 | (goto-char (point-max)) |
| 2572 | (recenter (if linenum | 2571 | (recenter (if linenum |
diff --git a/lisp/window.el b/lisp/window.el index 41af7f9f44b..f9761366b62 100644 --- a/lisp/window.el +++ b/lisp/window.el | |||
| @@ -28,6 +28,35 @@ | |||
| 28 | 28 | ||
| 29 | ;;; Code: | 29 | ;;; Code: |
| 30 | 30 | ||
| 31 | (defun internal--before-save-selected-window () | ||
| 32 | (cons (selected-window) | ||
| 33 | ;; We save and restore all frames' selected windows, because | ||
| 34 | ;; `select-window' can change the frame-selected-window of | ||
| 35 | ;; whatever frame that window is in. Each text terminal's | ||
| 36 | ;; top-frame is preserved by putting it last in the list. | ||
| 37 | (apply #'append | ||
| 38 | (mapcar (lambda (terminal) | ||
| 39 | (let ((frames (frames-on-display-list terminal)) | ||
| 40 | (top-frame (tty-top-frame terminal)) | ||
| 41 | alist) | ||
| 42 | (if top-frame | ||
| 43 | (setq frames | ||
| 44 | (cons top-frame | ||
| 45 | (delq top-frame frames)))) | ||
| 46 | (dolist (f frames) | ||
| 47 | (push (cons f (frame-selected-window f)) | ||
| 48 | alist)) | ||
| 49 | alist)) | ||
| 50 | (terminal-list))))) | ||
| 51 | |||
| 52 | (defun internal--after-save-selected-window (state) | ||
| 53 | (dolist (elt (cdr state)) | ||
| 54 | (and (frame-live-p (car elt)) | ||
| 55 | (window-live-p (cdr elt)) | ||
| 56 | (set-frame-selected-window (car elt) (cdr elt) 'norecord))) | ||
| 57 | (when (window-live-p (car state)) | ||
| 58 | (select-window (car state) 'norecord))) | ||
| 59 | |||
| 31 | (defmacro save-selected-window (&rest body) | 60 | (defmacro save-selected-window (&rest body) |
| 32 | "Execute BODY, then select the previously selected window. | 61 | "Execute BODY, then select the previously selected window. |
| 33 | The value returned is the value of the last form in BODY. | 62 | The value returned is the value of the last form in BODY. |
| @@ -44,34 +73,11 @@ its normal operation could make a different buffer current. The | |||
| 44 | order of recently selected windows and the buffer list ordering | 73 | order of recently selected windows and the buffer list ordering |
| 45 | are not altered by this macro (unless they are altered in BODY)." | 74 | are not altered by this macro (unless they are altered in BODY)." |
| 46 | (declare (indent 0) (debug t)) | 75 | (declare (indent 0) (debug t)) |
| 47 | `(let ((save-selected-window-window (selected-window)) | 76 | `(let ((save-selected-window--state (internal--before-save-selected-window))) |
| 48 | ;; We save and restore all frames' selected windows, because | ||
| 49 | ;; `select-window' can change the frame-selected-window of | ||
| 50 | ;; whatever frame that window is in. Each text terminal's | ||
| 51 | ;; top-frame is preserved by putting it last in the list. | ||
| 52 | (save-selected-window-alist | ||
| 53 | (apply 'append | ||
| 54 | (mapcar (lambda (terminal) | ||
| 55 | (let ((frames (frames-on-display-list terminal)) | ||
| 56 | (top-frame (tty-top-frame terminal)) | ||
| 57 | alist) | ||
| 58 | (if top-frame | ||
| 59 | (setq frames | ||
| 60 | (cons top-frame | ||
| 61 | (delq top-frame frames)))) | ||
| 62 | (dolist (f frames) | ||
| 63 | (push (cons f (frame-selected-window f)) | ||
| 64 | alist)))) | ||
| 65 | (terminal-list))))) | ||
| 66 | (save-current-buffer | 77 | (save-current-buffer |
| 67 | (unwind-protect | 78 | (unwind-protect |
| 68 | (progn ,@body) | 79 | (progn ,@body) |
| 69 | (dolist (elt save-selected-window-alist) | 80 | (internal--after-save-selected-window save-selected-window--state))))) |
| 70 | (and (frame-live-p (car elt)) | ||
| 71 | (window-live-p (cdr elt)) | ||
| 72 | (set-frame-selected-window (car elt) (cdr elt) 'norecord))) | ||
| 73 | (when (window-live-p save-selected-window-window) | ||
| 74 | (select-window save-selected-window-window 'norecord)))))) | ||
| 75 | 81 | ||
| 76 | (defvar temp-buffer-window-setup-hook nil | 82 | (defvar temp-buffer-window-setup-hook nil |
| 77 | "Normal hook run by `with-temp-buffer-window' before buffer display. | 83 | "Normal hook run by `with-temp-buffer-window' before buffer display. |