changeset 84758:1ad5dfad0058

(candidate_window_p): Consider frames that are being placed by the user as somewhere between visible and iconified. (window_loop): Prefer windows on the current frame. (Fselect_window): Move the use of select-frame to the beginning so we can just delegate all the work (it'll call us back anyway).
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 21 Sep 2007 07:59:46 +0000
parents 0ad86b4682fb
children 6fe89abed353
files src/ChangeLog src/window.c
diffstat 2 files changed, 38 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Fri Sep 21 07:56:33 2007 +0000
+++ b/src/ChangeLog	Fri Sep 21 07:59:46 2007 +0000
@@ -1,5 +1,11 @@
 2007-09-21  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* window.c (candidate_window_p): Consider frames that are being placed
+	by the user as somewhere between visible and iconified.
+	(window_loop): Prefer windows on the current frame.
+	(Fselect_window): Move the use of select-frame to the beginning so we
+	can just delegate all the work (it'll call us back anyway).
+
 	* frame.c (Qdisplay_environment_variable):
 	* frame.h (Qdisplay_environment_variable): Delete.
 
--- a/src/window.c	Fri Sep 21 07:56:33 2007 +0000
+++ b/src/window.c	Fri Sep 21 07:59:46 2007 +0000
@@ -1799,7 +1799,18 @@
   else if (INTEGERP (all_frames) && XINT (all_frames) == 0)
     {
       FRAME_SAMPLE_VISIBILITY (f);
-      candidate_p = FRAME_VISIBLE_P (f) || FRAME_ICONIFIED_P (f);
+      candidate_p = (FRAME_VISIBLE_P (f) || FRAME_ICONIFIED_P (f)
+#ifdef HAVE_X_WINDOWS
+		     /* Yuck!!  If we've just created the frame and the
+			window-manager requested the user to place it
+			manually, the window may still not be considered
+			`visible'.  I'd argue it should be at least
+			something like `iconified', but don't know how to do
+			that yet.  --Stef  */
+		     || (FRAME_X_P (f) && f->output_data.x->asked_for_visible
+			 && !f->output_data.x->has_been_visible)
+#endif
+		     );
     }
   else if (WINDOWP (all_frames))
     candidate_p = (EQ (FRAME_MINIBUF_WINDOW (f), all_frames)
@@ -2168,8 +2179,10 @@
 		if (NILP (best_window))
 		  best_window = window;
 		else if (EQ (window, selected_window))
-		  /* For compatibility with 20.x, prefer to return
-		     selected-window.  */
+		  /* Prefer to return selected-window.  */
+		  RETURN_UNGCPRO (window);
+		else if (EQ (Fwindow_frame (window), selected_frame))
+		  /* Prefer windows on the current frame.  */
 		  best_window = window;
 	      }
 	    break;
@@ -3451,6 +3464,22 @@
   if (EQ (window, selected_window))
     return window;
 
+  sf = SELECTED_FRAME ();
+  if (XFRAME (WINDOW_FRAME (w)) != sf)
+    {
+      XFRAME (WINDOW_FRAME (w))->selected_window = window;
+      /* Use this rather than Fhandle_switch_frame
+	 so that FRAME_FOCUS_FRAME is moved appropriately as we
+	 move around in the state where a minibuffer in a separate
+	 frame is active.  */
+      Fselect_frame (WINDOW_FRAME (w));
+      /* Fselect_frame called us back so we've done all the work already.  */
+      eassert (EQ (window, selected_window));
+      return window;
+    }
+  else
+    sf->selected_window = window;
+
   /* Store the current buffer's actual point into the
      old selected window.  It belongs to that window,
      and when the window is not selected, must be in the window.  */
@@ -3464,18 +3493,6 @@
     }
 
   selected_window = window;
-  sf = SELECTED_FRAME ();
-  if (XFRAME (WINDOW_FRAME (w)) != sf)
-    {
-      XFRAME (WINDOW_FRAME (w))->selected_window = window;
-      /* Use this rather than Fhandle_switch_frame
-	 so that FRAME_FOCUS_FRAME is moved appropriately as we
-	 move around in the state where a minibuffer in a separate
-	 frame is active.  */
-      Fselect_frame (WINDOW_FRAME (w));
-    }
-  else
-    sf->selected_window = window;
 
   if (NILP (norecord))
     record_buffer (w->buffer);