From 662a9d0e1ca5f7e2de9aa2d4d59a038aa93ab146 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 7 Oct 2012 11:54:30 -0400 Subject: [PATCH] * 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. --- lisp/ChangeLog | 8 +++++++ lisp/textmodes/tex-mode.el | 3 +-- 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 @@ 2012-10-07 Stefan Monnier + * 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. + + * textmodes/tex-mode.el (tex-recenter-output-buffer): + Use with-selected-window. + * emacs-lisp/autoload.el (make-autoload): Add `cl-defmacro' to the forms that define macros (bug#12593). 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." (if (null tex-shell) (message "No TeX output buffer") (setq window (display-buffer tex-shell)) - (save-selected-window - (select-window window) + (with-selected-window window (bury-buffer tex-shell) (goto-char (point-max)) (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 @@ ;;; Code: +(defun internal--before-save-selected-window () + (cons (selected-window) + ;; We save and restore all frames' selected windows, because + ;; `select-window' can change the frame-selected-window of + ;; whatever frame that window is in. Each text terminal's + ;; top-frame is preserved by putting it last in the list. + (apply #'append + (mapcar (lambda (terminal) + (let ((frames (frames-on-display-list terminal)) + (top-frame (tty-top-frame terminal)) + alist) + (if top-frame + (setq frames + (cons top-frame + (delq top-frame frames)))) + (dolist (f frames) + (push (cons f (frame-selected-window f)) + alist)) + alist)) + (terminal-list))))) + +(defun internal--after-save-selected-window (state) + (dolist (elt (cdr state)) + (and (frame-live-p (car elt)) + (window-live-p (cdr elt)) + (set-frame-selected-window (car elt) (cdr elt) 'norecord))) + (when (window-live-p (car state)) + (select-window (car state) 'norecord))) + (defmacro save-selected-window (&rest body) "Execute BODY, then select the previously selected window. 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 order of recently selected windows and the buffer list ordering are not altered by this macro (unless they are altered in BODY)." (declare (indent 0) (debug t)) - `(let ((save-selected-window-window (selected-window)) - ;; We save and restore all frames' selected windows, because - ;; `select-window' can change the frame-selected-window of - ;; whatever frame that window is in. Each text terminal's - ;; top-frame is preserved by putting it last in the list. - (save-selected-window-alist - (apply 'append - (mapcar (lambda (terminal) - (let ((frames (frames-on-display-list terminal)) - (top-frame (tty-top-frame terminal)) - alist) - (if top-frame - (setq frames - (cons top-frame - (delq top-frame frames)))) - (dolist (f frames) - (push (cons f (frame-selected-window f)) - alist)))) - (terminal-list))))) + `(let ((save-selected-window--state (internal--before-save-selected-window))) (save-current-buffer (unwind-protect (progn ,@body) - (dolist (elt save-selected-window-alist) - (and (frame-live-p (car elt)) - (window-live-p (cdr elt)) - (set-frame-selected-window (car elt) (cdr elt) 'norecord))) - (when (window-live-p save-selected-window-window) - (select-window save-selected-window-window 'norecord)))))) + (internal--after-save-selected-window save-selected-window--state))))) (defvar temp-buffer-window-setup-hook nil "Normal hook run by `with-temp-buffer-window' before buffer display. -- 2.11.4.GIT