* src/xdisp.c (syms_of_xdisp): New vars redisplay--all-windows-cause and
redisplay--mode-lines-cause. (redisplay_internal): Keep them uptodate. Remove redundant check of buffer_shared_and_changed. * *.[chm]: Number every assignment to update_mode_lines so we can track why it is set.
This commit is contained in:
parent
6b4ac03ebe
commit
2ec9db5d1e
14 changed files with 87 additions and 48 deletions
|
@ -1,3 +1,12 @@
|
|||
2013-11-06 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* xdisp.c (syms_of_xdisp): New vars redisplay--all-windows-cause and
|
||||
redisplay--mode-lines-cause.
|
||||
(redisplay_internal): Keep them uptodate. Remove redundant check of
|
||||
buffer_shared_and_changed.
|
||||
* *.[chm]: Number every assignment to update_mode_lines so we
|
||||
can track why it is set.
|
||||
|
||||
2013-11-06 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* editfns.c (Fformat_time_string): Doc fix. (Bug#15816)
|
||||
|
|
|
@ -1393,7 +1393,7 @@ A non-nil FLAG means mark the buffer modified. */)
|
|||
smarter about updating the `*' in mode lines. --gerd */
|
||||
if (buffer_window_count (current_buffer))
|
||||
{
|
||||
++update_mode_lines;
|
||||
update_mode_lines = 10;
|
||||
current_buffer->prevent_redisplay_optimizations_p = 1;
|
||||
}
|
||||
|
||||
|
@ -1513,7 +1513,7 @@ This does not change the name of the visited file (if any). */)
|
|||
|
||||
/* Catch redisplay's attention. Unless we do this, the mode lines for
|
||||
any windows displaying current_buffer will stay unchanged. */
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 11;
|
||||
|
||||
XSETBUFFER (buf, current_buffer);
|
||||
Fsetcar (Frassq (buf, Vbuffer_alist), newname);
|
||||
|
@ -2765,7 +2765,7 @@ the normal hook `change-major-mode-hook'. */)
|
|||
|
||||
/* Force mode-line redisplay. Useful here because all major mode
|
||||
commands call this function. */
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 12;
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
|
|
@ -36,10 +36,10 @@ extern Lisp_Object control_x_map;
|
|||
events until a non-ASCII event is acceptable as input. */
|
||||
extern Lisp_Object unread_switch_frame;
|
||||
|
||||
/* Nonzero if input is coming from the keyboard */
|
||||
/* Nonzero if input is coming from the keyboard. */
|
||||
|
||||
#define INTERACTIVE (NILP (Vexecuting_kbd_macro) && !noninteractive)
|
||||
|
||||
/* Set this nonzero to force reconsideration of mode line. */
|
||||
/* Set this nonzero to force reconsideration of mode line. */
|
||||
|
||||
extern int update_mode_lines;
|
||||
|
|
|
@ -472,7 +472,7 @@ x_set_title (struct frame *f, Lisp_Object name)
|
|||
if (EQ (name, f->title))
|
||||
return;
|
||||
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 13;
|
||||
|
||||
fset_title (f, name);
|
||||
|
||||
|
|
|
@ -4997,7 +4997,7 @@ write_region (Lisp_Object start, Lisp_Object end, Lisp_Object filename,
|
|||
SAVE_MODIFF = MODIFF;
|
||||
XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
|
||||
bset_filename (current_buffer, visit_file);
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 14;
|
||||
}
|
||||
else if (quietly)
|
||||
{
|
||||
|
|
|
@ -1489,7 +1489,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
|
|||
|
||||
/* Cause frame titles to update--necessary if we now have just one frame. */
|
||||
if (!is_tooltip_frame)
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 15;
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
@ -2025,7 +2025,7 @@ set_term_frame_name (struct frame *f, Lisp_Object name)
|
|||
}
|
||||
|
||||
fset_name (f, name);
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 16;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -821,7 +821,7 @@ This function is called by the editor initialization to begin editing. */)
|
|||
return Qnil;
|
||||
|
||||
command_loop_level++;
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 17;
|
||||
|
||||
if (command_loop_level
|
||||
&& current_buffer != XBUFFER (XWINDOW (selected_window)->contents))
|
||||
|
@ -848,7 +848,7 @@ recursive_edit_unwind (Lisp_Object buffer)
|
|||
Fset_buffer (buffer);
|
||||
|
||||
command_loop_level--;
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 18;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ Use \\[name-last-kbd-macro] to give it a permanent name.
|
|||
Non-nil arg (prefix arg) means append to last macro defined;
|
||||
this begins by re-executing that macro as if you typed it again.
|
||||
If optional second arg, NO-EXEC, is non-nil, do not re-execute last
|
||||
macro before appending to it. */)
|
||||
macro before appending to it. */)
|
||||
(Lisp_Object append, Lisp_Object no_exec)
|
||||
{
|
||||
if (!NILP (KVAR (current_kboard, defining_kbd_macro)))
|
||||
|
@ -66,7 +66,7 @@ macro before appending to it. */)
|
|||
current_kboard->kbd_macro_buffer = xmalloc (30 * word_size);
|
||||
current_kboard->kbd_macro_bufsize = 30;
|
||||
}
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 19;
|
||||
if (NILP (append))
|
||||
{
|
||||
if (current_kboard->kbd_macro_bufsize > 200)
|
||||
|
@ -138,7 +138,7 @@ void
|
|||
end_kbd_macro (void)
|
||||
{
|
||||
kset_defining_kbd_macro (current_kboard, Qnil);
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 20;
|
||||
kset_last_kbd_macro
|
||||
(current_kboard,
|
||||
make_event_array ((current_kboard->kbd_macro_end
|
||||
|
|
12
src/nsfns.m
12
src/nsfns.m
|
@ -451,8 +451,8 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
|
||||
str = [NSString stringWithUTF8String: SSDATA (encoded_icon_name)];
|
||||
|
||||
if ([[view window] miniwindowTitle] &&
|
||||
! [[[view window] miniwindowTitle] isEqualToString: str])
|
||||
if ([[view window] miniwindowTitle]
|
||||
&& ! [[[view window] miniwindowTitle] isEqualToString: str])
|
||||
[[view window] setMiniwindowTitle: str];
|
||||
|
||||
}
|
||||
|
@ -469,7 +469,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
/* If we're switching from explicit to implicit, we had better
|
||||
update the mode lines and thereby update the title. */
|
||||
if (f->explicit_name && NILP (name))
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 21;
|
||||
|
||||
f->explicit_name = ! NILP (name);
|
||||
}
|
||||
|
@ -477,7 +477,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
return;
|
||||
|
||||
if (NILP (name))
|
||||
name = build_string([ns_app_name UTF8String]);
|
||||
name = build_string ([ns_app_name UTF8String]);
|
||||
else
|
||||
CHECK_STRING (name);
|
||||
|
||||
|
@ -487,7 +487,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
|
||||
fset_name (f, name);
|
||||
|
||||
/* title overrides explicit name */
|
||||
/* Title overrides explicit name. */
|
||||
if (! NILP (f->title))
|
||||
name = f->title;
|
||||
|
||||
|
@ -534,7 +534,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
if (EQ (name, f->title))
|
||||
return;
|
||||
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 22;
|
||||
|
||||
fset_title (f, name);
|
||||
|
||||
|
|
|
@ -5246,7 +5246,7 @@ DEFUN ("internal-default-process-filter", Finternal_default_process_filter,
|
|||
else
|
||||
set_marker_both (p->mark, p->buffer, PT, PT_BYTE);
|
||||
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 23;
|
||||
|
||||
/* Make sure opoint and the old restrictions
|
||||
float ahead of any new text just as point would. */
|
||||
|
@ -6390,7 +6390,7 @@ status_notify (struct Lisp_Process *deleting_process)
|
|||
}
|
||||
} /* end for */
|
||||
|
||||
update_mode_lines++; /* In case buffers use %s in mode-line-format. */
|
||||
update_mode_lines = 24; /* In case buffers use %s in mode-line-format. */
|
||||
UNGCPRO;
|
||||
}
|
||||
|
||||
|
|
|
@ -1740,7 +1740,7 @@ x_set_name (struct frame *f, Lisp_Object name, int explicit)
|
|||
/* If we're switching from explicit to implicit, we had better
|
||||
update the mode lines and thereby update the title. */
|
||||
if (f->explicit_name && NILP (name))
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 25;
|
||||
|
||||
f->explicit_name = ! NILP (name);
|
||||
}
|
||||
|
@ -1808,7 +1808,7 @@ x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
|
|||
if (EQ (name, f->title))
|
||||
return;
|
||||
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 26;
|
||||
|
||||
fset_title (f, name);
|
||||
|
||||
|
|
|
@ -2639,7 +2639,7 @@ window_loop (enum window_loop type, Lisp_Object obj, int mini, Lisp_Object frame
|
|||
mark_window_display_accurate (window, 0);
|
||||
w->update_mode_line = 1;
|
||||
XBUFFER (obj)->prevent_redisplay_optimizations_p = 1;
|
||||
++update_mode_lines;
|
||||
update_mode_lines = 27;
|
||||
best_window = window;
|
||||
}
|
||||
break;
|
||||
|
@ -3279,7 +3279,7 @@ displaying that buffer. */)
|
|||
if (NILP (object))
|
||||
{
|
||||
windows_or_buffers_changed = 29;
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 28;
|
||||
return Qt;
|
||||
}
|
||||
|
||||
|
@ -3290,7 +3290,7 @@ displaying that buffer. */)
|
|||
w->update_mode_line = 1;
|
||||
if (BUFFERP (w->contents))
|
||||
XBUFFER (w->contents)->prevent_redisplay_optimizations_p = 1;
|
||||
++update_mode_lines;
|
||||
update_mode_lines = 29;
|
||||
return Qt;
|
||||
}
|
||||
|
||||
|
|
68
src/xdisp.c
68
src/xdisp.c
|
@ -10337,7 +10337,7 @@ resize_echo_area_exactly (void)
|
|||
if (resized_p)
|
||||
{
|
||||
windows_or_buffers_changed = 42;
|
||||
++update_mode_lines;
|
||||
update_mode_lines = 30;
|
||||
redisplay_internal ();
|
||||
}
|
||||
}
|
||||
|
@ -12886,12 +12886,12 @@ redisplay_internal (void)
|
|||
int polling_stopped_here = 0;
|
||||
Lisp_Object tail, frame;
|
||||
|
||||
/* Non-zero means redisplay has to consider all windows on all
|
||||
frames. Zero means, only selected_window is considered. */
|
||||
int consider_all_windows_p;
|
||||
/* True means redisplay has to consider all windows on all
|
||||
frames. False, only selected_window is considered. */
|
||||
bool consider_all_windows_p;
|
||||
|
||||
/* Non-zero means redisplay has to redisplay the miniwindow. */
|
||||
int update_miniwindow_p = 0;
|
||||
/* True means redisplay has to redisplay the miniwindow. */
|
||||
bool update_miniwindow_p = false;
|
||||
|
||||
TRACE ((stderr, "redisplay_internal %d\n", redisplaying_p));
|
||||
|
||||
|
@ -12984,7 +12984,7 @@ redisplay_internal (void)
|
|||
/* If cursor type has been changed on the frame
|
||||
other than selected, consider all frames. */
|
||||
if (f != sf && f->cursor_type_changed)
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 31;
|
||||
}
|
||||
clear_desired_matrices (f);
|
||||
}
|
||||
|
@ -13004,8 +13004,8 @@ redisplay_internal (void)
|
|||
if (NILP (Vmemory_full))
|
||||
prepare_menu_bars ();
|
||||
|
||||
if (windows_or_buffers_changed)
|
||||
update_mode_lines++;
|
||||
if (windows_or_buffers_changed & !update_mode_lines)
|
||||
update_mode_lines = 32;
|
||||
|
||||
reconsider_clip_changes (w);
|
||||
|
||||
|
@ -13018,7 +13018,7 @@ redisplay_internal (void)
|
|||
{
|
||||
w->update_mode_line = 1;
|
||||
if (buffer_shared_and_changed ())
|
||||
update_mode_lines++;
|
||||
update_mode_lines = 33;
|
||||
}
|
||||
|
||||
if (mode_line_update_needed (w))
|
||||
|
@ -13031,7 +13031,10 @@ redisplay_internal (void)
|
|||
/* If specs for an arrow have changed, do thorough redisplay
|
||||
to ensure we remove any arrow that should no longer exist. */
|
||||
if (overlay_arrows_changed_p ())
|
||||
consider_all_windows_p = windows_or_buffers_changed = 49;
|
||||
{
|
||||
consider_all_windows_p = true;
|
||||
windows_or_buffers_changed = 49;
|
||||
}
|
||||
|
||||
/* Normally the message* functions will have already displayed and
|
||||
updated the echo area, but the frame may have been trashed, or
|
||||
|
@ -13049,7 +13052,7 @@ redisplay_internal (void)
|
|||
int window_height_changed_p = echo_area_display (0);
|
||||
|
||||
if (message_cleared_p)
|
||||
update_miniwindow_p = 1;
|
||||
update_miniwindow_p = true;
|
||||
|
||||
must_finish = 1;
|
||||
|
||||
|
@ -13062,8 +13065,8 @@ redisplay_internal (void)
|
|||
|
||||
if (window_height_changed_p)
|
||||
{
|
||||
consider_all_windows_p = 1;
|
||||
++update_mode_lines;
|
||||
consider_all_windows_p = true;
|
||||
update_mode_lines = 34;
|
||||
windows_or_buffers_changed = 50;
|
||||
|
||||
/* If window configuration was changed, frames may have been
|
||||
|
@ -13083,9 +13086,9 @@ redisplay_internal (void)
|
|||
since only the current frame needs to be considered. This function
|
||||
needs to be rewritten with two variables, consider_all_windows and
|
||||
consider_all_frames. */
|
||||
consider_all_windows_p = 1;
|
||||
consider_all_windows_p = true;
|
||||
windows_or_buffers_changed = 51;
|
||||
++update_mode_lines;
|
||||
update_mode_lines = 35;
|
||||
|
||||
/* If window configuration was changed, frames may have been
|
||||
marked garbaged. Clear them or we will experience
|
||||
|
@ -13093,6 +13096,24 @@ redisplay_internal (void)
|
|||
clear_garbaged_frames ();
|
||||
}
|
||||
|
||||
if (VECTORP (Vredisplay__all_windows_cause)
|
||||
&& windows_or_buffers_changed >= 0
|
||||
&& windows_or_buffers_changed < ASIZE (Vredisplay__all_windows_cause)
|
||||
&& INTEGERP (AREF (Vredisplay__all_windows_cause,
|
||||
windows_or_buffers_changed)))
|
||||
ASET (Vredisplay__all_windows_cause, windows_or_buffers_changed,
|
||||
make_number (1 + XINT (AREF (Vredisplay__all_windows_cause,
|
||||
windows_or_buffers_changed))));
|
||||
|
||||
if (VECTORP (Vredisplay__mode_lines_cause)
|
||||
&& update_mode_lines >= 0
|
||||
&& update_mode_lines < ASIZE (Vredisplay__mode_lines_cause)
|
||||
&& INTEGERP (AREF (Vredisplay__mode_lines_cause,
|
||||
update_mode_lines)))
|
||||
ASET (Vredisplay__mode_lines_cause, update_mode_lines,
|
||||
make_number (1 + XINT (AREF (Vredisplay__mode_lines_cause,
|
||||
update_mode_lines))));
|
||||
|
||||
/* Optimize the case that only the line containing the cursor in the
|
||||
selected window has changed. Variables starting with this_ are
|
||||
set in display_line and record information about the line
|
||||
|
@ -13294,7 +13315,6 @@ redisplay_internal (void)
|
|||
}
|
||||
|
||||
CHARPOS (this_line_start_pos) = 0;
|
||||
consider_all_windows_p |= buffer_shared_and_changed ();
|
||||
++clear_face_cache_count;
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
++clear_image_cache_count;
|
||||
|
@ -13473,7 +13493,7 @@ redisplay_internal (void)
|
|||
matrices of some windows are not valid. */
|
||||
if (!WINDOW_FULL_WIDTH_P (w)
|
||||
&& !FRAME_WINDOW_P (XFRAME (w->frame)))
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 36;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -15337,7 +15357,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p)
|
|||
}
|
||||
else if ((w != XWINDOW (minibuf_window)
|
||||
|| minibuf_level == 0)
|
||||
/* When buffer is nonempty, redisplay window normally. */
|
||||
/* When buffer is nonempty, redisplay window normally. */
|
||||
&& BUF_Z (XBUFFER (w->contents)) == BUF_BEG (XBUFFER (w->contents))
|
||||
/* Quail displays non-mini buffers in minibuffer window.
|
||||
In that case, redisplay the window normally. */
|
||||
|
@ -29735,6 +29755,16 @@ display table takes effect; in this case, Emacs does not consult
|
|||
DEFVAR_LISP ("debug-on-message", Vdebug_on_message,
|
||||
doc: /* If non-nil, debug if a message matching this regexp is displayed. */);
|
||||
Vdebug_on_message = Qnil;
|
||||
|
||||
DEFVAR_LISP ("redisplay--all-windows-cause", Vredisplay__all_windows_cause,
|
||||
doc: /* */);
|
||||
Vredisplay__all_windows_cause
|
||||
= Fmake_vector (make_number (100), make_number (0));
|
||||
|
||||
DEFVAR_LISP ("redisplay--mode-lines-cause", Vredisplay__mode_lines_cause,
|
||||
doc: /* */);
|
||||
Vredisplay__mode_lines_cause
|
||||
= Fmake_vector (make_number (100), make_number (0));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1383,7 +1383,7 @@ x_set_name (struct frame *f, Lisp_Object name, int explicit)
|
|||
/* If we're switching from explicit to implicit, we had better
|
||||
update the mode lines and thereby update the title. */
|
||||
if (f->explicit_name && NILP (name))
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 37;
|
||||
|
||||
f->explicit_name = ! NILP (name);
|
||||
}
|
||||
|
@ -1445,7 +1445,7 @@ x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
|
|||
if (EQ (name, f->title))
|
||||
return;
|
||||
|
||||
update_mode_lines = 1;
|
||||
update_mode_lines = 38;
|
||||
|
||||
fset_title (f, name);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue