=== modified file 'src/buffer.c' --- src/buffer.c 2013-11-28 22:43:09 +0000 +++ src/buffer.c 2013-11-29 11:02:47 +0000 @@ -2402,7 +2402,7 @@ live window points to that window's buffer. So since we just swapped the markers between the two buffers, we need to undo the effect of this swap for window markers. */ - Lisp_Object w = selected_window, ws = Qnil; + Lisp_Object w = Fselected_window (), ws = Qnil; Lisp_Object buf1, buf2; XSETBUFFER (buf1, current_buffer); XSETBUFFER (buf2, other_buffer); === modified file 'src/callint.c' --- src/callint.c 2013-09-04 20:22:37 +0000 +++ src/callint.c 2013-11-29 11:02:47 +0000 @@ -509,7 +509,7 @@ case 'b': /* Name of existing buffer. */ args[i] = Fcurrent_buffer (); - if (EQ (selected_window, minibuf_window)) + if (EQ (Fselected_window (), minibuf_window)) args[i] = Fother_buffer (args[i], Qnil, Qnil); args[i] = Fread_buffer (callint_message, args[i], Qt); break; === modified file 'src/cmds.c' --- src/cmds.c 2013-09-05 02:27:13 +0000 +++ src/cmds.c 2013-11-29 11:02:47 +0000 @@ -282,7 +282,7 @@ nonundocount = 0; if (NILP (Vexecuting_kbd_macro) - && !EQ (minibuf_window, selected_window)) + && !EQ (minibuf_window, Fselected_window ())) { if (nonundocount <= 0 || nonundocount >= 20) { === modified file 'src/dispextern.h' --- src/dispextern.h 2013-11-06 00:14:56 +0000 +++ src/dispextern.h 2013-11-29 11:02:47 +0000 @@ -1410,7 +1410,7 @@ #define CURRENT_MODE_LINE_FACE_ID_3(SELW, MBW, SCRW) \ ((!mode_line_in_non_selected_windows \ - || (SELW) == XWINDOW (selected_window) \ + || (SELW) == SELECTED_WINDOW () \ || (minibuf_level > 0 \ && !NILP (minibuf_selected_window) \ && (MBW) == XWINDOW (minibuf_window) \ @@ -1422,7 +1422,7 @@ /* Return the desired face id for the mode line of window W. */ #define CURRENT_MODE_LINE_FACE_ID(W) \ - (CURRENT_MODE_LINE_FACE_ID_3((W), XWINDOW (selected_window), (W))) + (CURRENT_MODE_LINE_FACE_ID_3((W), SELECTED_WINDOW (), (W))) /* Return the current height of the mode line of window W. If not known from W->mode_line_height, look at W's current glyph matrix, or return === modified file 'src/dispnew.c' --- src/dispnew.c 2013-11-06 04:11:04 +0000 +++ src/dispnew.c 2013-11-29 11:02:47 +0000 @@ -4483,7 +4483,7 @@ /* If we are showing a message instead of the mini-buffer, show the cursor for the message instead of for the (now hidden) mini-buffer contents. */ - || (EQ (minibuf_window, selected_window) + || (EQ (minibuf_window, Fselected_window ()) && EQ (minibuf_window, echo_area_window) && !NILP (echo_area_buffer[0]))) /* These cases apply only to the frame that contains === modified file 'src/editfns.c' --- src/editfns.c 2013-11-29 01:22:40 +0000 +++ src/editfns.c 2013-11-29 11:02:47 +0000 @@ -832,8 +832,8 @@ ? Fcopy_marker (BVAR (current_buffer, mark), Qnil) : Qnil), /* Selected window if current buffer is shown in it, nil otherwise. */ - (EQ (XWINDOW (selected_window)->contents, Fcurrent_buffer ()) - ? selected_window : Qnil), + (EQ (SELECTED_WINDOW ()->contents, Fcurrent_buffer ()) + ? Fselected_window () : Qnil), BVAR (current_buffer, mark_active)); } @@ -900,7 +900,7 @@ buffer, restore point in that window. */ tem = XSAVE_OBJECT (info, 2); if (WINDOWP (tem) - && !EQ (tem, selected_window) + && !EQ (tem, Fselected_window ()) && (tem1 = XWINDOW (tem)->contents, (/* Window is live... */ BUFFERP (tem1) === modified file 'src/fileio.c' --- src/fileio.c 2013-11-27 16:08:53 +0000 +++ src/fileio.c 2013-11-29 11:13:44 +0000 @@ -3868,8 +3868,8 @@ /* If display currently starts at beginning of line, keep it that way. */ - if (XBUFFER (XWINDOW (selected_window)->contents) == current_buffer) - XWINDOW (selected_window)->start_at_line_beg = !NILP (Fbolp ()); + if (SELECTED_BUFFER () == current_buffer) + SELECTED_WINDOW ()->start_at_line_beg = !NILP (Fbolp ()); replace_handled = 1; } @@ -4014,8 +4014,8 @@ /* If display currently starts at beginning of line, keep it that way. */ - if (XBUFFER (XWINDOW (selected_window)->contents) == current_buffer) - XWINDOW (selected_window)->start_at_line_beg = !NILP (Fbolp ()); + if (SELECTED_BUFFER () == current_buffer) + SELECTED_WINDOW ()->start_at_line_beg = !NILP (Fbolp ()); /* Replace the chars that we need to replace, and update INSERTED to equal the number of bytes === modified file 'src/frame.c' --- src/frame.c 2013-11-28 22:43:09 +0000 +++ src/frame.c 2013-11-29 11:02:47 +0000 @@ -1245,7 +1245,7 @@ /* At this point, we are committed to deleting the frame. There is no more chance for errors to prevent it. */ - minibuffer_selected = EQ (minibuf_window, selected_window); + minibuffer_selected = EQ (minibuf_window, Fselected_window ()); sf = SELECTED_FRAME (); /* Don't let the frame remain selected. */ if (f == sf) @@ -1727,7 +1727,7 @@ error ("Attempt to make invisible the sole visible or iconified frame"); /* Don't allow minibuf_window to remain on an invisible frame. */ - check_minibuf_window (frame, EQ (minibuf_window, selected_window)); + check_minibuf_window (frame, EQ (minibuf_window, Fselected_window ())); /* I think this should be done with a hook. */ #ifdef HAVE_WINDOW_SYSTEM @@ -1750,7 +1750,7 @@ struct frame *f = decode_live_frame (frame); /* Don't allow minibuf_window to remain on an iconified frame. */ - check_minibuf_window (frame, EQ (minibuf_window, selected_window)); + check_minibuf_window (frame, EQ (minibuf_window, Fselected_window ())); /* I think this should be done with a hook. */ #ifdef HAVE_WINDOW_SYSTEM === modified file 'src/fringe.c' --- src/fringe.c 2013-10-26 03:13:18 +0000 +++ src/fringe.c 2013-11-29 11:02:47 +0000 @@ -1745,7 +1745,7 @@ args_out_of_range (window, pos); textpos = XINT (pos); } - else if (w == XWINDOW (selected_window)) + else if (w == SELECTED_WINDOW ()) textpos = PT; else textpos = marker_position (w->pointm); === modified file 'src/keyboard.c' --- src/keyboard.c 2013-11-29 01:22:40 +0000 +++ src/keyboard.c 2013-11-29 11:14:33 +0000 @@ -823,8 +823,7 @@ command_loop_level++; update_mode_lines = 17; - if (command_loop_level - && current_buffer != XBUFFER (XWINDOW (selected_window)->contents)) + if (command_loop_level && current_buffer != SELECTED_BUFFER ()) buffer = Fcurrent_buffer (); else buffer = Qnil; @@ -1381,7 +1380,7 @@ Fkill_emacs (Qnil); /* Make sure the current window's buffer is selected. */ - set_buffer_internal (XBUFFER (XWINDOW (selected_window)->contents)); + set_buffer_internal (SELECTED_BUFFER ()); /* Display any malloc warning that just came out. Use while because displaying one warning can cause another. */ @@ -1447,7 +1446,7 @@ /* A filter may have run while we were reading the input. */ if (! FRAME_LIVE_P (XFRAME (selected_frame))) Fkill_emacs (Qnil); - set_buffer_internal (XBUFFER (XWINDOW (selected_window)->contents)); + set_buffer_internal (SELECTED_BUFFER ()); ++num_input_keys; @@ -1474,11 +1473,11 @@ from that position. But also throw away beg_unchanged and end_unchanged information in that case, so that redisplay will update the whole window properly. */ - if (XWINDOW (selected_window)->force_start) + if (SELECTED_WINDOW ()->force_start) { struct buffer *b; - XWINDOW (selected_window)->force_start = 0; - b = XBUFFER (XWINDOW (selected_window)->contents); + SELECTED_WINDOW ()->force_start = 0; + b = SELECTED_BUFFER (); BUF_BEG_UNCHANGED (b) = BUF_END_UNCHANGED (b) = 0; } @@ -2559,7 +2558,7 @@ /* Redisplay if no pending input. */ while (!input_pending) { - if (help_echo_showing_p && !EQ (selected_window, minibuf_window)) + if (help_echo_showing_p && !EQ (Fselected_window (), minibuf_window)) redisplay_preserve_echo_area (5); else redisplay (); @@ -2778,7 +2777,7 @@ /* Slow down auto saves logarithmically in size of current buffer, and garbage collect while we're at it. */ - if (! MINI_WINDOW_P (XWINDOW (selected_window))) + if (! MINI_WINDOW_P (SELECTED_WINDOW ())) last_non_minibuf_size = Z - BEG; buffer_size = (last_non_minibuf_size >> 8) + 1; delay_level = 0; @@ -5250,7 +5249,7 @@ &object, &dx, &dy, &width, &height); if (STRINGP (string)) string_info = Fcons (string, make_number (charpos)); - textpos = (w == XWINDOW (selected_window) + textpos = (w == SELECTED_WINDOW () && current_buffer == XBUFFER (w->contents)) ? PT : marker_position (w->pointm); @@ -9152,9 +9151,8 @@ { if (! FRAME_LIVE_P (XFRAME (selected_frame))) Fkill_emacs (Qnil); - if (XBUFFER (XWINDOW (selected_window)->contents) - != current_buffer) - Fset_buffer (XWINDOW (selected_window)->contents); + if (SELECTED_BUFFER () != current_buffer) + Fset_buffer (SELECTED_WINDOW ()->contents); } goto replay_sequence; @@ -9201,10 +9199,8 @@ read_key_sequence, and a timer (or process-filter or special-event-map, ...) might have switched the current buffer or the selected window from under us in the mean time. */ - if (fix_current_buffer - && (XBUFFER (XWINDOW (selected_window)->contents) - != current_buffer)) - Fset_buffer (XWINDOW (selected_window)->contents); + if (fix_current_buffer && (SELECTED_BUFFER () != current_buffer)) + Fset_buffer (SELECTED_WINDOW ()->contents); current_binding = active_maps (first_event); } @@ -10673,7 +10669,7 @@ CHECK_NATNUM (y); if (NILP (frame_or_window)) - frame_or_window = selected_window; + frame_or_window = Fselected_window (); if (WINDOWP (frame_or_window)) { @@ -10709,7 +10705,7 @@ Lisp_Object tem; if (NILP (window)) - window = selected_window; + window = Fselected_window (); tem = Fpos_visible_in_window_p (pos, window, Qt); if (!NILP (tem)) === modified file 'src/menu.c' --- src/menu.c 2013-11-29 05:25:25 +0000 +++ src/menu.c 2013-11-29 11:02:47 +0000 @@ -1271,7 +1271,7 @@ XSETFRAME (window, new_f); else { - window = selected_window; + window = Fselected_window (); XSETFASTINT (x, 0); XSETFASTINT (y, 0); } @@ -1511,7 +1511,7 @@ else window = selected_window; #endif - window = selected_window; + window = Fselected_window (); } else if (CONSP (position)) { === modified file 'src/minibuf.c' --- src/minibuf.c 2013-11-28 22:43:09 +0000 +++ src/minibuf.c 2013-11-29 11:02:47 +0000 @@ -441,7 +441,7 @@ if (!enable_recursive_minibuffers && minibuf_level > 0) { - if (EQ (selected_window, minibuf_window)) + if (EQ (Fselected_window (), minibuf_window)) error ("Command attempted to use minibuffer while in minibuffer"); else /* If we're in another window, cancel the minibuffer that's active. */ @@ -582,9 +582,9 @@ if (!EQ (mini_frame, selected_frame)) Fredirect_frame_focus (selected_frame, mini_frame); - Vminibuf_scroll_window = selected_window; - if (minibuf_level == 1 || !EQ (minibuf_window, selected_window)) - minibuf_selected_window = selected_window; + Vminibuf_scroll_window = Fselected_window (); + if (minibuf_level == 1 || !EQ (minibuf_window, Fselected_window ())) + minibuf_selected_window = Fselected_window (); /* Empty out the minibuffers of all frames other than the one where we are going to display one now. === modified file 'src/process.c' --- src/process.c 2013-11-23 02:58:28 +0000 +++ src/process.c 2013-11-29 11:02:47 +0000 @@ -4361,7 +4361,7 @@ { unsigned old_timers_run = timers_run; struct buffer *old_buffer = current_buffer; - Lisp_Object old_window = selected_window; + Lisp_Object old_window = Fselected_window (); timer_delay = timer_check (); @@ -4369,7 +4369,7 @@ an alike. Make read_key_sequence aware of that. */ if (timers_run != old_timers_run && (old_buffer != current_buffer - || !EQ (old_window, selected_window)) + || !EQ (old_window, Fselected_window ())) && waiting_for_user_input_p == -1) record_asynch_buffer_change (); @@ -4674,7 +4674,7 @@ { unsigned old_timers_run = timers_run; struct buffer *old_buffer = current_buffer; - Lisp_Object old_window = selected_window; + Lisp_Object old_window = Fselected_window (); bool leave = 0; if (detect_input_pending_run_timers (do_display)) @@ -4689,7 +4689,7 @@ if (timers_run != old_timers_run && waiting_for_user_input_p == -1 && (old_buffer != current_buffer - || !EQ (old_window, selected_window))) + || !EQ (old_window, Fselected_window ()))) record_asynch_buffer_change (); if (leave) === modified file 'src/term.c' --- src/term.c 2013-11-29 01:22:40 +0000 +++ src/term.c 2013-11-29 11:02:47 +0000 @@ -216,7 +216,7 @@ { struct tty_display_info *tty = FRAME_TTY (f); - if (!XWINDOW (selected_window)->cursor_off_p) + if (!SELECTED_WINDOW ()->cursor_off_p) tty_show_cursor (tty); tty_turn_off_insert (tty); tty_background_highlight (tty); === modified file 'src/window.c' --- src/window.c 2013-11-29 01:22:40 +0000 +++ src/window.c 2013-11-29 11:24:03 +0000 @@ -85,15 +85,6 @@ Lisp_Object, Lisp_Object); static void apply_window_adjustment (struct window *); -/* This is the window in which the terminal's cursor should - be left when nothing is being done with it. This must - always be a leaf window, and its buffer is selected by - the top level editing loop at the end of each command. - - This value is always the same as - FRAME_SELECTED_WINDOW (selected_frame). */ -Lisp_Object selected_window; - /* A list of all windows for use by next_window and Fwindow_list. Functions creating or deleting windows should invalidate this cache by setting it to nil. */ @@ -226,7 +217,7 @@ decode_live_window (register Lisp_Object window) { if (NILP (window)) - return XWINDOW (selected_window); + return SELECTED_WINDOW (); CHECK_LIVE_WINDOW (window); return XWINDOW (window); @@ -238,7 +229,7 @@ struct window *w; if (NILP (window)) - return XWINDOW (selected_window); + return SELECTED_WINDOW (); CHECK_WINDOW (window); w = XWINDOW (window); @@ -251,7 +242,7 @@ struct window *w; if (NILP (window)) - return XWINDOW (selected_window); + return SELECTED_WINDOW (); CHECK_VALID_WINDOW (window); w = XWINDOW (window); @@ -452,7 +443,8 @@ selected windows appears and to which many commands apply. */) (void) { - return selected_window; + /* This is expected to be called when selected_frame is initialized. */ + return FRAME_SELECTED_WINDOW (SELECTED_FRAME ()); } int window_select_count; @@ -475,7 +467,7 @@ /* Make the selected window's buffer current. */ Fset_buffer (w->contents); - if (EQ (window, selected_window) && !inhibit_point_swap) + if (EQ (window, Fselected_window ()) && !inhibit_point_swap) /* `switch-to-buffer' uses (select-window (selected-window)) as a "clever" way to call record_buffer from Elisp, so it's important that we call record_buffer before returning here. */ @@ -484,7 +476,7 @@ if (NILP (norecord)) /* Mark the window for redisplay since the selected-window has a different mode-line. */ - wset_redisplay (XWINDOW (selected_window)); + wset_redisplay (SELECTED_WINDOW ()); else redisplay_other_windows (); sf = SELECTED_FRAME (); @@ -497,7 +489,7 @@ frame is active. */ Fselect_frame (WINDOW_FRAME (w), norecord); /* Fselect_frame called us back so we've done all the work already. */ - eassert (EQ (window, selected_window)); + eassert (EQ (window, Fselected_window ())); return window; } else @@ -532,14 +524,14 @@ not selected, must be in the window. */ if (!inhibit_point_swap) { - struct window *ow = XWINDOW (selected_window); + struct window *ow = SELECTED_WINDOW (); if (BUFFERP (ow->contents)) set_marker_both (ow->pointm, ow->contents, BUF_PT (XBUFFER (ow->contents)), BUF_PT_BYTE (XBUFFER (ow->contents))); } - selected_window = window; + fset_selected_window (SELECTED_FRAME (), window); /* Go to the point recorded in the window. This is important when the buffer is in more @@ -1437,7 +1429,7 @@ { register struct window *w = decode_live_window (window); - if (w == XWINDOW (selected_window)) + if (w == SELECTED_WINDOW ()) return make_number (BUF_PT (XBUFFER (w->contents))); else return Fmarker_position (w->pointm); @@ -1539,7 +1531,7 @@ /* Type of POS is checked by Fgoto_char or set_marker_restricted ... */ - if (w == XWINDOW (selected_window)) + if (w == SELECTED_WINDOW ()) { if (XBUFFER (w->contents) == current_buffer) Fgoto_char (pos); @@ -1582,7 +1574,7 @@ w->update_mode_line = 1; /* Bug#15957. */ w->window_end_valid = 0; - if (w != XWINDOW (selected_window)) + if (w != SELECTED_WINDOW ()) wset_redisplay (w); return pos; @@ -1629,7 +1621,7 @@ CHECK_NUMBER_COERCE_MARKER (pos); posint = XINT (pos); } - else if (w == XWINDOW (selected_window)) + else if (w == SELECTED_WINDOW ()) posint = PT; else posint = marker_position (w->pointm); @@ -1965,7 +1957,7 @@ /* Point in the selected window's buffer is actually stored in that buffer, and the window's pointm isn't used. So don't clobber point in that buffer. */ - if (! EQ (buf, XWINDOW (selected_window)->contents) + if (! EQ (buf, SELECTED_WINDOW ()->contents) /* Don't clobber point in current buffer either (this could be useful in connection with bug#12208). && XBUFFER (buf) != current_buffer */ @@ -2473,7 +2465,8 @@ (Lisp_Object frame, Lisp_Object minibuf, Lisp_Object window) { if (NILP (window)) - window = FRAMEP (frame) ? XFRAME (frame)->selected_window : selected_window; + window = (FRAMEP (frame) ? XFRAME (frame)->selected_window + : Fselected_window ()); CHECK_WINDOW (window); if (NILP (frame)) frame = selected_frame; @@ -2604,7 +2597,7 @@ is currently in use. */ && (MINI_WINDOW_P (w) ? EQ (window, minibuf_window) : 1)) { - if (EQ (window, selected_window)) + if (EQ (window, Fselected_window ())) /* Preferably return the selected window. */ RETURN_UNGCPRO (window); else if (EQ (XWINDOW (window)->frame, selected_frame) @@ -2634,7 +2627,7 @@ /* If WINDOW is the selected window, make its buffer current. But do so only if the window shows the current buffer (Bug#6454). */ - if (EQ (window, selected_window) + if (EQ (window, Fselected_window ()) && XBUFFER (w->contents) == current_buffer) Fset_buffer (w->contents); } @@ -3103,7 +3096,7 @@ buffer))) { ptrdiff_t inner_count = SPECPDL_INDEX (); - record_unwind_protect (select_window_norecord, selected_window); + record_unwind_protect (select_window_norecord, Fselected_window ()); select_window_norecord (window); run_funs (Fbuffer_local_value (Qwindow_configuration_change_hook, buffer)); @@ -3143,7 +3136,7 @@ wset_buffer (w, buffer); - if (EQ (window, selected_window)) + if (w == SELECTED_WINDOW ()) bset_last_selected_window (b, window); /* Let redisplay errors through. */ @@ -3353,7 +3346,7 @@ { ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object prev_window, prev_buffer; - prev_window = selected_window; + prev_window = Fselected_window (); XSETBUFFER (prev_buffer, old); /* Select the window that was chosen, for running the hook. @@ -4070,7 +4063,7 @@ /* `get-mru-window' might fail for some reason so play it safe - promote the first window _without recording it_ first. */ - if (EQ (FRAME_SELECTED_WINDOW (f), selected_window)) + if (EQ (FRAME_SELECTED_WINDOW (f), Fselected_window ())) Fselect_window (new_selected_window, Qt); else fset_selected_window (f, new_selected_window); @@ -4084,7 +4077,7 @@ new_selected_window = mru_window; /* If all ended up well, we now promote the mru window. */ - if (EQ (FRAME_SELECTED_WINDOW (f), selected_window)) + if (EQ (FRAME_SELECTED_WINDOW (f), Fselected_window ())) Fselect_window (new_selected_window, Qnil); else fset_selected_window (f, new_selected_window); @@ -4838,23 +4831,23 @@ /* If selected window's buffer isn't current, make it current for the moment. But don't screw up if window_scroll gets an error. */ - if (XBUFFER (XWINDOW (selected_window)->contents) != current_buffer) + if (SELECTED_BUFFER () != current_buffer) { record_unwind_protect (save_excursion_restore, save_excursion_save ()); - Fset_buffer (XWINDOW (selected_window)->contents); + Fset_buffer (SELECTED_WINDOW ()->contents); /* Make redisplay consider other windows than just selected_window. */ windows_or_buffers_changed = 37; } if (NILP (n)) - window_scroll (selected_window, direction, 1, 0); + window_scroll (Fselected_window (), direction, 1, 0); else if (EQ (n, Qminus)) - window_scroll (selected_window, -direction, 1, 0); + window_scroll (Fselected_window (), -direction, 1, 0); else { n = Fprefix_numeric_value (n); - window_scroll (selected_window, XINT (n) * direction, 0, 0); + window_scroll (Fselected_window (), XINT (n) * direction, 0, 0); } unbind_to (count, Qnil); @@ -4897,7 +4890,7 @@ { Lisp_Object window; - if (MINI_WINDOW_P (XWINDOW (selected_window)) + if (MINI_WINDOW_P (SELECTED_WINDOW ()) && !NILP (Vminibuf_scroll_window)) window = Vminibuf_scroll_window; /* If buffer is specified, scroll that buffer. */ @@ -4911,20 +4904,20 @@ { /* Nothing specified; look for a neighboring window on the same frame. */ - window = Fnext_window (selected_window, Qnil, Qnil); + window = Fnext_window (Fselected_window (), Qnil, Qnil); - if (EQ (window, selected_window)) + if (EQ (window, Fselected_window ())) /* That didn't get us anywhere; look for a window on another visible frame. */ do window = Fnext_window (window, Qnil, Qt); while (! FRAME_VISIBLE_P (XFRAME (WINDOW_FRAME (XWINDOW (window)))) - && ! EQ (window, selected_window)); + && ! EQ (window, Fselected_window ())); } CHECK_LIVE_WINDOW (window); - if (EQ (window, selected_window)) + if (EQ (window, Fselected_window ())) error ("There is no other window"); return window; @@ -4988,7 +4981,7 @@ by this function. This happens in an interactive call. */) (register Lisp_Object arg, Lisp_Object set_minimum) { - struct window *w = XWINDOW (selected_window); + struct window *w = SELECTED_WINDOW (); EMACS_INT requested_arg = (NILP (arg) ? window_body_cols (w) - 2 : XINT (Fprefix_numeric_value (arg))); @@ -5011,7 +5004,7 @@ by this function. This happens in an interactive call. */) (register Lisp_Object arg, Lisp_Object set_minimum) { - struct window *w = XWINDOW (selected_window); + struct window *w = SELECTED_WINDOW (); EMACS_INT requested_arg = (NILP (arg) ? window_body_cols (w) - 2 : XINT (Fprefix_numeric_value (arg))); @@ -5029,7 +5022,7 @@ (void) { if (minibuf_level > 0 - && MINI_WINDOW_P (XWINDOW (selected_window)) + && MINI_WINDOW_P (SELECTED_WINDOW ()) && WINDOW_LIVE_P (minibuf_selected_window)) return minibuf_selected_window; @@ -5108,7 +5101,7 @@ and redisplay normally--don't erase and redraw the frame. */) (register Lisp_Object arg) { - struct window *w = XWINDOW (selected_window); + struct window *w = SELECTED_WINDOW (); struct buffer *buf = XBUFFER (w->contents); struct buffer *obuf = current_buffer; bool center_p = 0; @@ -5312,7 +5305,7 @@ zero means top of window, negative means relative to bottom of window. */) (Lisp_Object arg) { - struct window *w = XWINDOW (selected_window); + struct window *w = SELECTED_WINDOW (); int lines, start; Lisp_Object window; #if 0 @@ -5324,7 +5317,7 @@ when passed below to set_marker_both. */ error ("move-to-window-line called from unrelated buffer"); - window = selected_window; + window = Fselected_window (); start = marker_position (w->start); if (start < BEGV || start > ZV) { @@ -5481,9 +5474,8 @@ the current-selected-window. So we have to be careful which point of the current-buffer we copy into old_point. */ if (EQ (XWINDOW (data->current_window)->contents, new_current_buffer) - && WINDOWP (selected_window) - && EQ (XWINDOW (selected_window)->contents, new_current_buffer) - && !EQ (selected_window, data->current_window)) + && EQ (SELECTED_WINDOW ()->contents, new_current_buffer) + && !EQ (Fselected_window (), data->current_window)) old_point = marker_position (XWINDOW (data->current_window)->pointm); else old_point = PT; @@ -5498,7 +5490,7 @@ window's cursor from being copied from another window. */ if (EQ (XWINDOW (data->current_window)->contents, new_current_buffer) /* If current_window = selected_window, its point is in BUF_PT. */ - && !EQ (selected_window, data->current_window)) + && !EQ (Fselected_window (), data->current_window)) old_point = marker_position (XWINDOW (data->current_window)->pointm); else old_point = BUF_PT (XBUFFER (new_current_buffer)); @@ -5578,9 +5570,9 @@ window holds garbage.) We do this now, before restoring the window contents, and prevent it from being done later on when we select a new window. */ - if (! NILP (XWINDOW (selected_window)->contents)) + if (! NILP (SELECTED_WINDOW ()->contents)) { - w = XWINDOW (selected_window); + w = SELECTED_WINDOW (); set_marker_both (w->pointm, w->contents, BUF_PT (XBUFFER (w->contents)), @@ -5798,9 +5790,7 @@ in an inconsistent state (e.g. before frame-focus redirection is canceled). */ select_window (data->current_window, Qnil, 1); - BVAR (XBUFFER (XWINDOW (selected_window)->contents), - last_selected_window) - = selected_window; + BVAR (SELECTED_BUFFER (), last_selected_window) = Fselected_window (); /* Fselect_window will have made f the selected frame, so we reselect the proper frame here. Fhandle_switch_frame will change the @@ -6025,7 +6015,7 @@ /* Save w's value of point in the window configuration. If w is the selected window, then get the value of point from the buffer; pointm is garbage in the selected window. */ - if (EQ (window, selected_window)) + if (w == SELECTED_WINDOW ()) p->pointm = build_marker (XBUFFER (w->contents), BUF_PT (XBUFFER (w->contents)), BUF_PT_BYTE (XBUFFER (w->contents))); @@ -6541,7 +6531,6 @@ XSETFRAME (selected_frame, f); Vterminal_frame = selected_frame; minibuf_window = f->minibuffer_window; - selected_window = f->selected_window; window_initialized = 1; } === modified file 'src/window.h' --- src/window.h 2013-11-29 05:25:25 +0000 +++ src/window.h 2013-11-29 11:16:03 +0000 @@ -846,12 +846,19 @@ || WINDOW_RIGHT_MARGIN_COLS (w) == 0))) /* This is the window in which the terminal's cursor should be left when - nothing is being done with it. This must always be a leaf window, and its - buffer is selected by the top level editing loop at the end of each command. - - This value is always the same as FRAME_SELECTED_WINDOW (selected_frame). */ - -extern Lisp_Object selected_window; + nothing is being done with it. This must always be a leaf window, and + its buffer is selected by the top level editing loop at the end of each + command. At the very early initialization, this may be NULL. */ + +#define SELECTED_WINDOW() \ + ((FRAMEP (selected_frame) && FRAME_LIVE_P (XFRAME (selected_frame))) \ + ? XWINDOW (FRAME_SELECTED_WINDOW (XFRAME (selected_frame))) : NULL) + +/* This is the buffer displayed by the window above. + Note that this is not the same as current_buffer. */ + +#define SELECTED_BUFFER() \ + (eassert (SELECTED_WINDOW ()), XBUFFER (SELECTED_WINDOW ()->contents)) /* This is a time stamp for window selection, so we can find the least recently used window. Its only users are Fselect_window, === modified file 'src/xdisp.c' --- src/xdisp.c 2013-11-29 08:53:50 +0000 +++ src/xdisp.c 2013-11-29 11:20:47 +0000 @@ -638,7 +638,7 @@ if (count > 0) { /* ... it's visible in other window than selected, */ - if (count > 1 || b != XBUFFER (XWINDOW (selected_window)->contents)) + if (count > 1 || b != SELECTED_BUFFER ()) redisplay_other_windows (); /* Even if we don't set windows_or_buffers_changed, do set `redisplay' so that if we later set windows_or_buffers_changed, this buffer will @@ -1256,7 +1256,7 @@ { struct it it; struct text_pos pt; - struct window *w = XWINDOW (selected_window); + struct window *w = SELECTED_WINDOW (); SET_TEXT_POS (pt, PT, PT_BYTE); start_display (&it, w, pt); @@ -10869,7 +10869,7 @@ wset_redisplay (XWINDOW (mini_window)); } } - else if (!EQ (mini_window, selected_window)) + else if (!EQ (mini_window, Fselected_window ())) wset_redisplay (XWINDOW (mini_window)); /* Last displayed message is now the current message. */ @@ -10880,7 +10880,7 @@ /* Prevent redisplay optimization in redisplay_internal by resetting this_line_start_pos. This is done because the mini-buffer now displays the message instead of its buffer text. */ - if (EQ (mini_window, selected_window)) + if (EQ (mini_window, Fselected_window ())) CHARPOS (this_line_start_pos) = 0; return window_height_changed_p; @@ -10921,9 +10921,9 @@ XSETWINDOW (window, w); if (MINI_WINDOW_P (w)) return 0; - else if (EQ (window, selected_window)) + else if (EQ (window, Fselected_window ())) return 0; - else if (MINI_WINDOW_P (XWINDOW (selected_window)) + else if (MINI_WINDOW_P (SELECTED_WINDOW ()) && EQ (window, Vminibuf_scroll_window)) /* This special window can't be frozen too. */ return 0; @@ -11163,7 +11163,7 @@ mode_line_noprop_buf; then display the title. */ record_unwind_protect (unwind_format_mode_line, format_mode_line_unwind_data - (f, current_buffer, selected_window, 0)); + (f, current_buffer, Fselected_window (), 0)); Fselect_window (f->selected_window, Qt); set_buffer_internal_1 @@ -11481,10 +11481,7 @@ fast_set_selected_frame (Lisp_Object frame) { if (!EQ (selected_frame, frame)) - { - selected_frame = frame; - selected_window = XFRAME (frame)->selected_window; - } + selected_frame = frame; } /* Update the tool-bar item list for frame F. This has to be done @@ -11546,14 +11543,6 @@ GCPRO1 (new_tool_bar); - /* We must temporarily set the selected frame to this frame - before calling tool_bar_items, because the calculation of - the tool-bar keymap uses the selected frame (see - `tool-bar-make-keymap' in tool-bar.el). */ - eassert (EQ (selected_window, - /* Since we only explicitly preserve selected_frame, - check that selected_window would be redundant. */ - XFRAME (selected_frame)->selected_window)); record_unwind_protect (fast_set_selected_frame, selected_frame); XSETFRAME (frame, f); fast_set_selected_frame (frame); @@ -12483,7 +12472,7 @@ saved_current_buffer = current_buffer; current_buffer = XBUFFER (w->contents); - if (w == XWINDOW (selected_window)) + if (w == SELECTED_WINDOW ()) pt = PT; else pt = clip_to_bounds (BEGV, marker_position (w->pointm), ZV); @@ -12916,7 +12905,7 @@ check. */ if (!b->clip_changed && w->window_end_valid) { - ptrdiff_t pt = (w == XWINDOW (selected_window) + ptrdiff_t pt = (w == SELECTED_WINDOW () ? PT : marker_position (w->pointm)); if ((w->current_matrix->buffer != b || pt != w->last_point) @@ -12963,7 +12952,7 @@ static void redisplay_internal (void) { - struct window *w = XWINDOW (selected_window); + struct window *w = SELECTED_WINDOW (); struct window *sw; struct frame *fr; int pending; @@ -13082,7 +13071,7 @@ /* do_pending_window_change could change the selected_window due to frame resizing which makes the selected window too small. */ - if (WINDOWP (selected_window) && (w = XWINDOW (selected_window)) != sw) + if ((w = SELECTED_WINDOW ()) != sw) sw = w; /* Clear frames marked as garbaged. */ @@ -13117,7 +13106,7 @@ && minibuf_level == 0 /* If the mini-window is currently selected, this means the echo-area doesn't show through. */ - && !MINI_WINDOW_P (XWINDOW (selected_window)))) + && !MINI_WINDOW_P (SELECTED_WINDOW ()))) { int window_height_changed_p = echo_area_display (0); @@ -13143,7 +13132,7 @@ clear_garbaged_frames (); } } - else if (EQ (selected_window, minibuf_window) + else if (EQ (Fselected_window (), minibuf_window) && (current_buffer->clip_changed || window_outdated (w)) && resize_mini_window (w, 0)) { @@ -13327,8 +13316,7 @@ { do_pending_window_change (1); /* If selected_window changed, redisplay again. */ - if (WINDOWP (selected_window) - && (w = XWINDOW (selected_window)) != sw) + if ((w = SELECTED_WINDOW ()) != sw) goto retry; /* We used to always goto end_of_redisplay here, but this @@ -13472,8 +13460,6 @@ } } - eassert (EQ (XFRAME (selected_frame)->selected_window, selected_window)); - if (!pending) { /* Do the mark_window_display_accurate after all windows have @@ -13497,10 +13483,10 @@ Lisp_Object mini_window = FRAME_MINIBUF_WINDOW (sf); struct frame *mini_frame; - displayed_buffer = XBUFFER (XWINDOW (selected_window)->contents); + displayed_buffer = SELECTED_BUFFER (); /* Use list_of_error, not Qerror, so that we catch only errors and don't run the debugger. */ - internal_condition_case_1 (redisplay_window_1, selected_window, + internal_condition_case_1 (redisplay_window_1, Fselected_window (), list_of_error, redisplay_window_error); if (update_miniwindow_p) @@ -13524,10 +13510,10 @@ if (FRAME_VISIBLE_P (sf) && !FRAME_OBSCURED_P (sf)) { - if (hscroll_windows (selected_window)) + if (hscroll_windows (Fselected_window ())) goto retry; - XWINDOW (selected_window)->must_be_updated_p = 1; + SELECTED_WINDOW ()->must_be_updated_p = 1; pending = update_frame (sf, 0, 0); sf->cursor_type_changed = 0; } @@ -13626,7 +13612,7 @@ /* If we just did a pending size change, or have additional visible frames, or selected_window changed, redisplay again. */ if ((windows_or_buffers_changed && !pending) - || (WINDOWP (selected_window) && (w = XWINDOW (selected_window)) != sw)) + || ((w = SELECTED_WINDOW ()) != sw)) goto retry; /* Clear the face and image caches. @@ -13731,7 +13717,7 @@ w->last_cursor_vpos = w->cursor.vpos; w->last_cursor_off_p = w->cursor_off_p; - if (w == XWINDOW (selected_window)) + if (w == SELECTED_WINDOW ()) w->last_point = BUF_PT (b); else w->last_point = marker_position (w->pointm); @@ -14461,7 +14447,7 @@ w->cursor.vpos = MATRIX_ROW_VPOS (row, matrix) + dvpos; w->cursor.y = row->y + dy; - if (w == XWINDOW (selected_window)) + if (w == SELECTED_WINDOW ()) { if (!row->continued_p && !MATRIX_ROW_CONTINUATION_LINE_P (row) @@ -15530,7 +15516,7 @@ /* Point refers normally to the selected window. For any other window, set up appropriate value. */ - if (!EQ (window, selected_window)) + if (!EQ (window, Fselected_window ())) { ptrdiff_t new_pt = marker_position (w->pointm); ptrdiff_t new_pt_byte = marker_byte_position (w->pointm); @@ -15705,7 +15691,7 @@ TEMP_SET_PT_BOTH (MATRIX_ROW_START_CHARPOS (row), MATRIX_ROW_START_BYTEPOS (row)); - if (w != XWINDOW (selected_window)) + if (w != SELECTED_WINDOW ()) set_marker_both (w->pointm, Qnil, PT, PT_BYTE); else if (current_buffer == old) SET_TEXT_POS (lpoint, PT, PT_BYTE); @@ -18084,7 +18070,7 @@ glyphs in short form, otherwise show glyphs in long form. */) (Lisp_Object glyphs) { - struct window *w = XWINDOW (selected_window); + struct window *w = SELECTED_WINDOW (); struct buffer *buffer = XBUFFER (w->contents); fprintf (stderr, "PT = %"pI"d, BEGV = %"pI"d. ZV = %"pI"d\n", @@ -18115,11 +18101,10 @@ GLYPH > 1 or omitted means dump glyphs in long form. */) (Lisp_Object row, Lisp_Object glyphs) { - struct glyph_matrix *matrix; + struct glyph_matrix *matrix = SELECTED_WINDOW ()->current_matrix; EMACS_INT vpos; CHECK_NUMBER (row); - matrix = XWINDOW (selected_window)->current_matrix; vpos = XINT (row); if (vpos >= 0 && vpos < matrix->nrows) dump_glyph_row (MATRIX_ROW (matrix, vpos), @@ -20114,7 +20099,7 @@ Value is the new character position of point. */) (Lisp_Object direction) { - struct window *w = XWINDOW (selected_window); + struct window *w = SELECTED_WINDOW (); struct buffer *b = XBUFFER (w->contents); struct glyph_row *row; int dir; @@ -20763,7 +20748,7 @@ /* Point refers normally to the selected window. For any other window, set up appropriate value. */ - if (!EQ (window, selected_window)) + if (!EQ (window, Fselected_window ())) { struct text_pos pt; @@ -20797,7 +20782,7 @@ static int display_mode_lines (struct window *w) { - Lisp_Object old_selected_window = selected_window; + struct window *osw = SELECTED_WINDOW (); Lisp_Object old_selected_frame = selected_frame; Lisp_Object new_frame = w->frame; Lisp_Object old_frame_selected_window = XFRAME (new_frame)->selected_window; @@ -20806,8 +20791,7 @@ selected_frame = new_frame; /* FIXME: If we were to allow the mode-line's computation changing the buffer or window's point, then we'd need select_window_1 here as well. */ - XSETWINDOW (selected_window, w); - XFRAME (new_frame)->selected_window = selected_window; + fset_selected_window (XFRAME (new_frame), make_lisp_ptr (w, Lisp_Vectorlike)); /* These will be set while the mode line specs are processed. */ line_number_displayed = 0; @@ -20815,10 +20799,8 @@ if (WINDOW_WANTS_MODELINE_P (w)) { - struct window *sel_w = XWINDOW (old_selected_window); - /* Select mode line face based on the real selected window. */ - display_mode_line (w, CURRENT_MODE_LINE_FACE_ID_3 (sel_w, sel_w, w), + display_mode_line (w, CURRENT_MODE_LINE_FACE_ID_3 (osw, osw, w), BVAR (current_buffer, mode_line_format)); ++n; } @@ -20830,9 +20812,8 @@ ++n; } - XFRAME (new_frame)->selected_window = old_frame_selected_window; + fset_selected_window (XFRAME (new_frame), old_frame_selected_window); selected_frame = old_selected_frame; - selected_window = old_selected_window; return n; } @@ -21548,7 +21529,7 @@ face = Qnil; face_id = (NILP (face) || EQ (face, Qdefault)) ? DEFAULT_FACE_ID - : EQ (face, Qt) ? (EQ (window, selected_window) + : EQ (face, Qt) ? (EQ (window, Fselected_window ()) ? MODE_LINE_FACE_ID : MODE_LINE_INACTIVE_FACE_ID) : EQ (face, Qmode_line) ? MODE_LINE_FACE_ID : EQ (face, Qmode_line_inactive) ? MODE_LINE_INACTIVE_FACE_ID @@ -21563,7 +21544,7 @@ record_unwind_protect (unwind_format_mode_line, format_mode_line_unwind_data (XFRAME (WINDOW_FRAME (w)), - old_buffer, selected_window, 1)); + old_buffer, Fselected_window (), 1)); mode_line_proptrans_alist = Qnil; Fselect_window (window, Qt); === modified file 'src/xterm.c' --- src/xterm.c 2013-11-29 01:22:40 +0000 +++ src/xterm.c 2013-11-29 11:02:47 +0000 @@ -6665,13 +6665,13 @@ will be selected only when it is active. */ if (WINDOWP (window) && !EQ (window, last_mouse_window) - && !EQ (window, selected_window) + && !EQ (window, Fselected_window ()) /* For click-to-focus window managers create event iff we don't leave the selected frame. */ && (focus_follows_mouse || (EQ (XWINDOW (window)->frame, - XWINDOW (selected_window)->frame)))) + SELECTED_WINDOW ()->frame)))) { inev.ie.kind = SELECT_WINDOW_EVENT; inev.ie.frame_or_window = window;