From: Stefan Monnier <monnier@iro.umontreal.ca>
Date: Mon, 4 Jan 2021 05:59:56 +0000 (-0500)
Subject: * src/xdisp.c (syms_of_xdisp): New var redisplay-skip-fontification-on-input
X-Git-Tag: emacs-28.0.90~4401
X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b2f8c9f96fbda53387b9f910d3b97aefefab6cab;p=emacs.git

* 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.
---

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.