# HG changeset patch # User Stefan Monnier # Date 1190361586 0 # Node ID 1ad5dfad0058cb3bbda0764f2546c403450bc54b # Parent 0ad86b4682fba4c1d392d09397760c7509ad8868 (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). diff -r 0ad86b4682fb -r 1ad5dfad0058 src/ChangeLog --- 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 + * 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. diff -r 0ad86b4682fb -r 1ad5dfad0058 src/window.c --- 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);