From: Dmitry Antipov <dmantipov@yandex.ru>
To: Emacs development discussions <emacs-devel@gnu.org>
Subject: [RFC] Getting rid of selected_window
Date: Fri, 29 Nov 2013 15:53:46 +0400 [thread overview]
Message-ID: <5298804A.5040405@yandex.ru> (raw)
[-- Attachment #1: Type: text/plain, Size: 247 bytes --]
I'm trying to get rid of selected_window, with an intent to completely cleanup corner
cases where FRAME_SELECTED_WINDOW (selected_frame) is not the same as selected_window
and avoid redundant synchronization of them. Comments are welcome.
Dmitry
[-- Attachment #2: drop_selected_window.patch --]
[-- Type: text/x-patch, Size: 41149 bytes --]
=== 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;
next reply other threads:[~2013-11-29 11:53 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-29 11:53 Dmitry Antipov [this message]
2013-11-29 14:38 ` [RFC] Getting rid of selected_window Stefan Monnier
2013-11-29 15:19 ` Eli Zaretskii
2013-11-29 16:54 ` Stefan Monnier
2013-11-29 19:42 ` Eli Zaretskii
2013-12-02 14:37 ` Dmitry Antipov
2013-12-02 15:06 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5298804A.5040405@yandex.ru \
--to=dmantipov@yandex.ru \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.