summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2021-01-04 00:59:56 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2021-01-04 00:59:56 -0500
commitb2f8c9f96fbda53387b9f910d3b97aefefab6cab (patch)
tree91542a66e8b88ea56a80bc6347f11963eb1a3f4c
parent0c599ee2e2c3fcebcab023cc9d52c9a6464b391c (diff)
downloademacs-b2f8c9f96fbda53387b9f910d3b97aefefab6cab.tar.gz
emacs-b2f8c9f96fbda53387b9f910d3b97aefefab6cab.tar.bz2
emacs-b2f8c9f96fbda53387b9f910d3b97aefefab6cab.zip
* 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.
-rw-r--r--etc/NEWS6
-rw-r--r--src/keyboard.c2
-rw-r--r--src/keyboard.h2
-rw-r--r--src/xdisp.c14
4 files changed, 22 insertions, 2 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 8003175a83a..d8f25ab362e 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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
diff --git a/src/keyboard.c b/src/keyboard.c
index d2f0cb405f0..cf15cd73572 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -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. */
diff --git a/src/keyboard.h b/src/keyboard.h
index 91c6f4604f9..8bdffaa2bff 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -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 *);
diff --git a/src/xdisp.c b/src/xdisp.c
index 749893baad6..43447e2bf7e 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -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.