GNU bug report logs - #34476
fluffy whitespace in the mode-line, despite it running off the screen

Previous Next

Packages: emacs, gnus;

Reported by: 積丹尼 Dan Jacobson <jidanni <at> jidanni.org>

Date: Thu, 14 Feb 2019 13:53:01 UTC

Severity: wishlist

Tags: fixed

Found in version 5.13

Fixed in version 28.1

Done: Lars Ingebrigtsen <larsi <at> gnus.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Eli Zaretskii <eliz <at> gnu.org>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: contovob <at> tcd.ie, 34476 <at> debbugs.gnu.org, jidanni <at> jidanni.org
Subject: bug#34476: fluffy whitespace in the mode-line, despite it running off the screen
Date: Fri, 07 Aug 2020 14:32:39 +0300
> From: Lars Ingebrigtsen <larsi <at> gnus.org>
> Date: Fri, 07 Aug 2020 10:31:22 +0200
> Cc: 34476 <at> debbugs.gnu.org,
>  積丹尼 Dan Jacobson <jidanni <at> jidanni.org>
> 
> -  display_mode_element (&it, 0, 0, 0, format, Qnil, false);
> +
> +  if (NILP (Vmode_line_compact))
> +    {
> +      mode_line_target = MODE_LINE_DISPLAY;
> +      display_mode_element (&it, 0, 0, 0, format, Qnil, false);
> +    }
> +  else
> +    {
> +      Lisp_Object mode_string = Fformat_mode_line (format, Qnil, Qnil, Qnil);
> +      char *string = xmalloc (SBYTES (mode_string) + 1),
> +	*ostring = SSDATA (mode_string);
> +      char *s = string, 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++)
> +	{
> +	  char c = ostring[i];
> +	  if (!(c == ' ' && prev == ' '))
> +	    {
> +	      *s++ = c;
> +	      prev = c;
> +	    }
> +	}
> +      *s = 0;
> +      
> +      display_string (string, Qnil, Qnil, 0, 0, &it, 0, 0, 0,
> +		      STRING_MULTIBYTE (mode_string));
> +      xfree (string);
> +    }

Ouch!  This is Lisp converted into C, yes?  And it formats the
mode-line twice: once in format-mode-line, then again in
display_string, right?

You don't need all this inelegance.  After display_mode_element
returns, you have all the glyphs it produced in it.glyph_row, so you
can simply remove the unneeded space glyphs from the glyph row (and
adjust the metrics accordingly).  Let me know if you need more
detailed help in how to do that.




This bug report was last modified 4 years and 140 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.