* src/xdisp.c (syms_of_xdisp): New var redisplay-skip-fontification-on-input

(handle_fontified_prop): Use it.

* src/keyboard.h (input_was_pending): Declare.
* src/keyboard.c (input_was_pending): Make non-static.
This commit is contained in:
Stefan Monnier 2021-01-04 00:59:56 -05:00
parent 0c599ee2e2
commit b2f8c9f96f
4 changed files with 22 additions and 2 deletions

View file

@ -212,6 +212,12 @@ This makes debugging Emacs Lisp scripts run in batch mode easier. To
get back the old behavior, set the new variable
'backtrace-on-error-noninteractive' to a nil value.
** 'redisplay-skip-fontification-on-input' helps Emacs keep up with fast input.
This is another attempt to solve the problem of handling high key repeat rate
and other "slow scrolling" situations. It is hoped it behaves better
than 'fast-but-imprecise-scrolling' and 'jit-lock-defer-time'.
It is not enabled by default.
* Editing Changes in Emacs 28.1

View file

@ -285,7 +285,7 @@ bool input_pending;
with the input rate, but if it can keep up just enough that there's no
input_pending when we begin the command, then redisplay is not skipped
which results in better feedback to the user. */
static bool input_was_pending;
bool input_was_pending;
/* Circular buffer for pre-read keyboard input. */

View file

@ -432,7 +432,7 @@ extern int parse_solitary_modifier (Lisp_Object symbol);
extern Lisp_Object real_this_command;
extern int quit_char;
extern bool input_was_pending;
extern unsigned int timers_run;
extern bool menu_separator_name_p (const char *);

View file

@ -4262,6 +4262,7 @@ handle_fontified_prop (struct it *it)
if (!STRINGP (it->string)
&& it->s == NULL
&& !NILP (Vfontification_functions)
&& !(input_was_pending && redisplay_skip_fontification_on_input)
&& !NILP (Vrun_hooks)
&& (pos = make_fixnum (IT_CHARPOS (*it)),
prop = Fget_char_property (pos, Qfontified, Qnil),
@ -35598,6 +35599,19 @@ best except in special circumstances such as running redisplay tests
in batch mode. */);
redisplay_skip_initial_frame = true;
DEFVAR_BOOL ("redisplay-skip-fontification-on-input",
redisplay_skip_fontification_on_input,
doc: /* Skip `fontification_functions` when there is input pending.
If non-nil and there was input pending at the beginning of the command,
the `fontification_functions` hook is not run. This usually does not
affect the display because redisplay is completely skipped anyway if input
was pending, but it can make scrolling smoother by avoiding
unnecessary fontification.
It is similar to `fast-but-imprecise-scrolling' with similar tradeoffs,
but with the advantage that it should only affect the behavior when Emacs
has trouble keeping up with the incoming input rate. */);
redisplay_skip_fontification_on_input = false;
DEFVAR_BOOL ("redisplay-adhoc-scroll-in-resize-mini-windows",
redisplay_adhoc_scroll_in_resize_mini_windows,
doc: /* If nil always use normal scrolling in minibuffer windows.