[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 88c9696: Fix compact mode line text properties
From: |
Lars Ingebrigtsen |
Subject: |
master 88c9696: Fix compact mode line text properties |
Date: |
Mon, 28 Dec 2020 23:59:52 -0500 (EST) |
branch: master
commit 88c96962cfd56f213ef88b506b510a42d21a2fe6
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Fix compact mode line text properties
* src/xdisp.c (display_mode_line): Display the compact mode
correctly (with text properties) (bug#45520).
---
src/xdisp.c | 41 +++++++++++++++++++++++++++--------------
1 file changed, 27 insertions(+), 14 deletions(-)
diff --git a/src/xdisp.c b/src/xdisp.c
index f7b87dc..4c4d349 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -25473,30 +25473,43 @@ display_mode_line (struct window *w, enum face_id
face_id, Lisp_Object format)
&& window_body_width (XWINDOW (selected_window), FALSE) >=
SCHARS (mode_string))
{
+ /* The window is wide enough; just display the mode line we
+ just computed. */
display_string (SSDATA (mode_string), mode_string, Qnil,
0, 0, &it, 0, 0, 0,
STRING_MULTIBYTE (mode_string), FALSE);
}
else
{
- char *string = xmalloc (SBYTES (mode_string) + 1),
- *ostring = SSDATA (mode_string);
- char *s = string, prev = 0;
+ /* Compress the mode line. */
+ ptrdiff_t i = 0, i_byte = 0, start = 0;
+ int prev = 0;
- /* Copy over the data from the mode line string, but ignore
- repeating spaces. This should be safe even for multibyte
- strings, since this is UTF-8. */
- for (int i = 0; i < SBYTES (mode_string); i++)
+ while (i < SCHARS (mode_string))
{
- char c = ostring[i];
- if (!(c == ' ' && prev == ' '))
- prev = *s++ = c;
+ int c = fetch_string_char_advance (mode_string, &i, &i_byte);
+ if (c == ' ' && prev == ' ')
+ {
+ display_string (NULL,
+ Fsubstring (mode_string, make_fixnum (start),
+ make_fixnum (i - 1)),
+ Qnil, 0, 0, &it, 0, 0, 0,
+ STRING_MULTIBYTE (mode_string), FALSE);
+ /* Skip past the rest of the space characters. */
+ while (c == ' ' && i < SCHARS (mode_string))
+ c = fetch_string_char_advance (mode_string, &i, &i_byte);
+ start = i - 1;
+ }
+ prev = c;
}
- *s = 0;
- display_string (string, Qnil, Qnil, 0, 0, &it, 0, 0, 0,
- STRING_MULTIBYTE (mode_string), TRUE);
- xfree (string);
+ /* Display the final bit. */
+ if (start < i)
+ display_string (NULL,
+ Fsubstring (mode_string, make_fixnum (start),
+ make_fixnum (i - 1)),
+ Qnil, 0, 0, &it, 0, 0, 0,
+ STRING_MULTIBYTE (mode_string), FALSE);
}
}
pop_kboard ();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 88c9696: Fix compact mode line text properties,
Lars Ingebrigtsen <=