emacs-pretest-bug
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

with-selected-window (was: Problems with compile-mode)


From: Stefan Monnier
Subject: with-selected-window (was: Problems with compile-mode)
Date: 01 Jun 2004 00:34:34 -0400
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3.50

> I added a comment already.  The scenario is that you do
> with-selected-window specifying a window on some other frame.
> On exit from with-selected-window, the frame-selected-window of that frame
> is now the window you selected, which could (for all we know)
> be different from what it was before.

So would it be OK to only save&restore the other frame's
frame-selected-window rather than the one of every single frame?
I.e. like the patch below,


        Stefan


* auto-adding address@hidden/emacs--monnier--0--patch-48 to greedy revision 
library /part/00/Tmp/monnier/archlib
* found immediate ancestor revision in library 
(address@hidden/emacs--monnier--0--patch-47)
* patching for this revision (address@hidden/emacs--monnier--0--patch-48)
--- orig/lisp/subr.el
+++ mod/lisp/subr.el
@@ -1854,19 +1854,21 @@
   (declare (indent 1) (debug t))
   ;; Most of this code is a copy of save-selected-window.
   `(let ((save-selected-window-window (selected-window))
-        ;; It is necessary to save all of these, because calling
-        ;; select-window changes frame-selected-window for whatever
-        ;; frame that window is in.
-        (save-selected-window-alist
-         (mapcar (lambda (frame) (list frame (frame-selected-window frame)))
-                 (frame-list))))
+        ;; Selecting a window on another frame changes not only the
+        ;; selected-window but also the frame-selected-window of the
+        ;; destination frame.  So we need to save&restore it.
+        (save-selected-window-other-frame
+         (unless (eq (selected-frame) (window-frame window))
+           (frame-selected-window (window-frame window)))))
      (unwind-protect
         (progn (select-window ,window 'norecord)
                ,@body)
-       (dolist (elt save-selected-window-alist)
-        (and (frame-live-p (car elt))
-             (window-live-p (cadr elt))
-             (set-frame-selected-window (car elt) (cadr elt))))
+       ;; First reset frame-selected-window.
+       (if (window-live-p save-selected-window-other-frame)
+          ;; We don't use set-frame-selected-window because it does not
+          ;; pass the `norecord' argument.
+          (select-window save-selected-window-other-frame 'norecord))
+       ;; Then reset the actual selected-window.
        (if (window-live-p save-selected-window-window)
           (select-window save-selected-window-window 'norecord)))))
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]