]> git.eshelyaron.com Git - emacs.git/commitdiff
Further improvements to long lines handling.
authorGregory Heytings <gregory@heytings.org>
Mon, 18 Jul 2022 10:08:33 +0000 (10:08 +0000)
committerGregory Heytings <gregory@heytings.org>
Mon, 18 Jul 2022 10:11:08 +0000 (12:11 +0200)
* src/xdisp.c (get_visually_first_element): Fix segfault.
(get_narrowed_begv): Specific improvement for character-only terminals.

src/xdisp.c

index 98bf15a85943d5116ea3ee0af59bae9821a604f0..d69d7440bc0c2538a33a0e4e7cc9f9cc6f7fd6af 100644 (file)
@@ -3501,9 +3501,12 @@ init_iterator (struct it *it, struct window *w,
 ptrdiff_t
 get_narrowed_begv (struct window *w)
 {
-  int len; ptrdiff_t begv;
-  len = 3 * (window_body_width (w, WINDOW_BODY_IN_CANONICAL_CHARS) *
-            window_body_height (w, WINDOW_BODY_IN_CANONICAL_CHARS));
+  int len, fact; ptrdiff_t begv;
+  /* In a character-only terminal, only one font size is used, so we
+     can use a smaller factor.  */
+  fact = EQ (Fterminal_live_p (Qnil), Qt) ? 2 : 3;
+  len = fact * (window_body_width (w, WINDOW_BODY_IN_CANONICAL_CHARS) *
+               window_body_height (w, WINDOW_BODY_IN_CANONICAL_CHARS));
   begv = max ((window_point (w) / len - 1) * len, BEGV);
   return begv == BEGV ? 0 : begv;
 }
@@ -8668,6 +8671,16 @@ get_visually_first_element (struct it *it)
 
   SET_WITH_NARROWED_BEGV (it, bob, string_p ? 0 : BEGV);
 
+  /* Reseat again when, as a consequence of the SET_WITH_NARROWED_BEGV
+     above, the iterator is before bob.  */
+  if (!string_p && IT_CHARPOS (*it) < bob)
+    {
+      struct text_pos pos;
+      pos.charpos = bob;
+      pos.bytepos = CHAR_TO_BYTE (bob);
+      reseat (it, pos, true);
+    }
+
   if (STRINGP (it->string))
     {
       it->bidi_it.charpos = IT_STRING_CHARPOS (*it);