From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Eli Zaretskii Newsgroups: gmane.emacs.bugs Subject: bug#34476: fluffy whitespace in the mode-line, despite it running off the screen Date: Sat, 15 Aug 2020 11:47:49 +0300 Message-ID: <83wo20jnwq.fsf@gnu.org> References: <87lg2icx3u.fsf@jidanni.org> <87ftnfrwef.fsf@mouse.gnus.org> <87r26z0wdy.fsf@tcd.ie> <87eeoi7un0.fsf@gnus.org> <87a6z67t7p.fsf@gnus.org> <83364y8ze0.fsf@gnu.org> <878seq8yzo.fsf@gnus.org> <83y2mq7jk7.fsf@gnu.org> <87mu367iue.fsf@gnus.org> <83sgcy7ebz.fsf@gnu.org> <87wo295wob.fsf@gnus.org> <83364x79jl.fsf@gnu.org> <83zh755udw.fsf@gnu.org> <87k0y94c8p.fsf@gnus.org> <83sgcx5mbm.fsf@gnu.org> <87tuxdxly3.fsf@gnus.org> <83r1sh5gjc.fsf@gnu.org> <87d040w3av.fsf@gnus.org> <83ft8v6hh7.fsf@gnu.org> <83sgcu4kz2.fsf@gnu.org> <83lfihld38.fsf@gnu.org> Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="20474"; mail-complaints-to="usenet@ciao.gmane.io" Cc: contovob@tcd.ie, 34476@debbugs.gnu.org To: larsi@gnus.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Aug 15 10:49:10 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1k6rsE-0005DM-8d for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 15 Aug 2020 10:49:10 +0200 Original-Received: from localhost ([::1]:59402 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k6rsC-0004SK-Op for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 15 Aug 2020 04:49:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:46554) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k6rs6-0004S4-Bq for bug-gnu-emacs@gnu.org; Sat, 15 Aug 2020 04:49:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:42707) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1k6rs6-0005Ve-1z for bug-gnu-emacs@gnu.org; Sat, 15 Aug 2020 04:49:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1k6rs5-0008TE-Ts; Sat, 15 Aug 2020 04:49:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org, bugs@gnus.org Resent-Date: Sat, 15 Aug 2020 08:49:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 34476 X-GNU-PR-Package: emacs,gnus Original-Received: via spool by 34476-submit@debbugs.gnu.org id=B34476.159748128432484 (code B ref 34476); Sat, 15 Aug 2020 08:49:01 +0000 Original-Received: (at 34476) by debbugs.gnu.org; 15 Aug 2020 08:48:04 +0000 Original-Received: from localhost ([127.0.0.1]:54252 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k6rr9-0008Rs-Tu for submit@debbugs.gnu.org; Sat, 15 Aug 2020 04:48:04 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:36402) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k6rr8-0008RM-BY for 34476@debbugs.gnu.org; Sat, 15 Aug 2020 04:48:02 -0400 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]:46909) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k6rr1-0005S6-Op; Sat, 15 Aug 2020 04:47:55 -0400 Original-Received: from [176.228.60.248] (port=3057 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1k6rr1-0002bI-9m; Sat, 15 Aug 2020 04:47:55 -0400 In-Reply-To: <83lfihld38.fsf@gnu.org> (message from Eli Zaretskii on Fri, 14 Aug 2020 13:46:19 +0300) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:185202 Archived-At: > Date: Fri, 14 Aug 2020 13:46:19 +0300 > From: Eli Zaretskii > Cc: contovob@tcd.ie, 34476@debbugs.gnu.org > > The alternative which I would like to try implementing is to modify > the code of display_string so that it doesn't produce multiple space > glyphs, replacing them with a single glyph, when this option is > non-nil. Since display_mode_element always calls display_string to > produce the glyphs, this should allow us to solve the problem cleanly. > Stay tuned. Here's the result. Note that this is slightly sub-optimal, because if 2 Lisp strings are displayed one after another, and the first one ends with a space, while the second one begins with a space, this will not be squeezed, because we consider each string separately. If this is not acceptable, then we will have to go back to your original proposal of using Fformat_mode_line (although I'm still unhappy with doing that, as we had over the years quite a few complaints that the result is not exactly identical to the displayed mode line). If the patch below is deemed "good enough", we will probably need to implement something similar for Fformat_mode_line, because users might expect the latter to produce a similarly squeezed whitespace. diff --git a/src/xdisp.c b/src/xdisp.c index 4fe1c42..d9f6bea 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -26883,6 +26883,25 @@ display_string (const char *string, Lisp_Object lisp_string, Lisp_Object face_st row->phys_height = it->max_phys_ascent + it->max_phys_descent; row->extra_line_spacing = it->max_extra_line_spacing; + bool space_seen = false; + bool squeeze_spaces_p = false; + if (!NILP (Vmode_line_compact)) + { + int remapped_modeline_face_id = MODE_LINE_FACE_ID; + int remapped_inactive_modeline_face_id = MODE_LINE_INACTIVE_FACE_ID; + if (!NILP (Vface_remapping_alist)) + { + remapped_modeline_face_id + = lookup_basic_face (it->w, it->f, MODE_LINE_FACE_ID); + remapped_inactive_modeline_face_id + = lookup_basic_face (it->w, it->f, MODE_LINE_INACTIVE_FACE_ID); + } + /* We only squeeze multiple spaces when displaying mode lines. */ + squeeze_spaces_p + = (it->base_face_id == remapped_modeline_face_id + || it->base_face_id == remapped_inactive_modeline_face_id); + } + if (STRINGP (it->string)) it_charpos = IT_STRING_CHARPOS (*it); else @@ -26898,6 +26917,19 @@ display_string (const char *string, Lisp_Object lisp_string, Lisp_Object face_st if (!get_next_display_element (it)) break; + if (squeeze_spaces_p) + { + if (it->char_to_display == ' ' && it->face_id == it->base_face_id) + { + if (space_seen) + goto next_char; + else + space_seen = true; + } + else + space_seen = false; + } + /* Produce glyphs. */ x_before = it->current_x; n_glyphs_before = row->used[TEXT_AREA]; @@ -26962,6 +26994,7 @@ display_string (const char *string, Lisp_Object lisp_string, Lisp_Object face_st if (i < nglyphs) break; + next_char: /* Stop at line ends. */ if (ITERATOR_AT_END_OF_LINE_P (it)) {