From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "Feng Shu" Newsgroups: gmane.emacs.bugs Subject: bug#51821: 29.0.50; Suggest add variable or frame parameter: line-height Date: Fri, 19 Nov 2021 22:48:48 +0800 Message-ID: <87tug8b3qn.fsf@163.com> References: <87bl2nhbyp.fsf@163.com> <83bl2nugao.fsf@gnu.org> <878rxq62qt.fsf@gnus.org> <83k0hatxjl.fsf@gnu.org> <875ysu2d18.fsf@gnus.org> <83y25pshaa.fsf@gnu.org> <874k8c8sg0.fsf@gnus.org> <83ilws16hj.fsf@gnu.org> <87wnl8qg8b.fsf@gnus.org> <83czn0123n.fsf@gnu.org> <83v90pwcab.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="22175"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) Cc: luangruo@yahoo.com, larsi@gnus.org, 51821@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Nov 19 15:54:09 2021 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 1mo5HE-0005a6-LX for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 19 Nov 2021 15:54:09 +0100 Original-Received: from localhost ([::1]:38832 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mo5HC-0006xK-Om for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 19 Nov 2021 09:54:06 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:49024) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mo5DH-0001gA-1d for bug-gnu-emacs@gnu.org; Fri, 19 Nov 2021 09:50:03 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:55202) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mo5DG-0004aU-NJ for bug-gnu-emacs@gnu.org; Fri, 19 Nov 2021 09:50:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mo5DG-00022E-Cg for bug-gnu-emacs@gnu.org; Fri, 19 Nov 2021 09:50:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: "Feng Shu" Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 19 Nov 2021 14:50:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51821 X-GNU-PR-Package: emacs Original-Received: via spool by 51821-submit@debbugs.gnu.org id=B51821.16373333537626 (code B ref 51821); Fri, 19 Nov 2021 14:50:02 +0000 Original-Received: (at 51821) by debbugs.gnu.org; 19 Nov 2021 14:49:13 +0000 Original-Received: from localhost ([127.0.0.1]:38515 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mo5CL-0001yd-6Q for submit@debbugs.gnu.org; Fri, 19 Nov 2021 09:49:13 -0500 Original-Received: from m12-15.163.com ([220.181.12.15]:55263) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mo5CF-0001xh-7p for 51821@debbugs.gnu.org; Fri, 19 Nov 2021 09:49:03 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-ID:MIME-Version; bh=9jJGW nJln5CRL3dEyS2yYd3fXHP4I18j4h69Bca+N7w=; b=a1hP7KdjziCcnoUgczGQN wIkT3V6btt7m5ep/NRYNonhwgvog5A3A1W7vDqIkvR7djsEJvS/BqSqPCOXORXJ/ wC2AhQx136d0LXK0FSqyz38SydFo2i8+CSBli+MG0uF82/HZif4Eid1m/FfjGzAl SBsgQnOdzELs+5dVzyVsoQ= Original-Received: from tumashu (unknown [49.88.37.140]) by smtp11 (Coremail) with SMTP id D8CowADnx5hQuZdh1ySZCw--.61155S2; Fri, 19 Nov 2021 22:48:49 +0800 (CST) In-Reply-To: <83v90pwcab.fsf@gnu.org> (Eli Zaretskii's message of "Thu, 18 Nov 2021 20:26:20 +0200") X-CM-TRANSID: D8CowADnx5hQuZdh1ySZCw--.61155S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxKr1DGrWUXry5XF4fWF4kWFg_yoWxtr13pa yDWa1DJrWktr48Xw1Ut3WY9F1Y9ry5Jw42qFW0kr1fCF18X3s2vF17tFZ0yFn7Zan8Ar10 qF4Dt3sFkFyfX3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07UA3kNUUUUU= X-Originating-IP: [49.88.37.140] X-CM-SenderInfo: 5wxpt2lkx6il2tof0z/1tbiLxFQ1FUMavJMNwAAsA 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:220426 Archived-At: Eli Zaretskii writes: >> Date: Tue, 16 Nov 2021 18:45:16 +0200 >> From: Eli Zaretskii >> Cc: tumashu@163.com, 51821@debbugs.gnu.org >> >> > From: Lars Ingebrigtsen >> > Cc: tumashu@163.com, 51821@debbugs.gnu.org >> > Date: Tue, 16 Nov 2021 16:20:52 +0100 >> > >> > > That shouldn't happen, normally. Emacs selects fonts of the same size >> > > for a face. >> > >> > No, not really. Here's a trivial example: >> > >> > >> > Note how the lines with jidanni are taller than the rest. >> >> OK, let me see what can be done about that. > > Please try the patch below. I have a very limited number of cases > with which I can test it, so I think users of CJK scripts should say > what they think. Basically, set the new variable line-height-factor > to something like 1.2 (more if you enlarge the non-ASCII font to make > double-width characters take close to 2 columns), and see if you get > the desired effect. > > If this is what people want, I will install it and document it. I have tested with a hacked version of below patch, I think we need two factors: ascent-factor and descent-factor. ascent = ascent * ascent-factor descent = descent * descent-factor When I set ascent = 1.1 and descent = 1.3, minibuffer's height do not change when I M-x and paste Chinese. maybe line-height-factor should be a cons, for example: (1.1 . 1.3) > > diff --git a/src/window.c b/src/window.c > index e801ff8..a368b6d 100644 > --- a/src/window.c > +++ b/src/window.c > @@ -5246,7 +5246,10 @@ grow_mini_window (struct window *w, int delta) > { > struct frame *f = XFRAME (w->frame); > int old_height = window_body_height (w, true); > - int min_height = FRAME_LINE_HEIGHT (f); > + int min_height = > + FLOATP (Vline_height_factor) > + ? FRAME_LINE_HEIGHT (f) * XFLOAT_DATA (Vline_height_factor) > + : FRAME_LINE_HEIGHT (f); > > eassert (MINI_WINDOW_P (w)); > > @@ -5279,7 +5282,11 @@ grow_mini_window (struct window *w, int delta) > shrink_mini_window (struct window *w) > { > struct frame *f = XFRAME (w->frame); > - int delta = window_body_height (w, true) - FRAME_LINE_HEIGHT (f); > + int min_line_height = > + FLOATP (Vline_height_factor) > + ? FRAME_LINE_HEIGHT (f) * XFLOAT_DATA (Vline_height_factor) > + : FRAME_LINE_HEIGHT (f); > + int delta = window_body_height (w, true) - min_line_height; > > eassert (MINI_WINDOW_P (w)); > > diff --git a/src/xdisp.c b/src/xdisp.c > index ef49297..d1f4043 100644 > --- a/src/xdisp.c > +++ b/src/xdisp.c > @@ -22073,6 +22073,18 @@ append_space_for_newline (struct it *it, bool default_face_p) > it->descent = it->override_descent; > boff = it->override_boff; > } > + else > + { > + /* Enlarge the ascent to make the row higher by > + line-height-factor if needed. */ > + if (face == face->ascii_face && it->voffset == 0 > + && FLOATP (Vline_height_factor)) > + { > + int enlarged_height = ((it->ascent + it->descent) > + * XFLOAT_DATA (Vline_height_factor)); > + it->ascent = enlarged_height - it->descent; > + } > + } > if (EQ (height, Qt)) > extra_line_spacing = 0; > else > @@ -30587,9 +30599,9 @@ gui_produce_glyphs (struct it *it) > /* When no suitable font is found, display this character by > the method specified in the first extra slot of > Vglyphless_char_display. */ > - Lisp_Object acronym = lookup_glyphless_char_display (-1, it); > + Lisp_Object acronym = lookup_glyphless_char_display (-1, it); > > - eassert (it->what == IT_GLYPHLESS); > + eassert (it->what == IT_GLYPHLESS); > produce_glyphless_glyph (it, true, > STRINGP (acronym) ? acronym : Qnil); > goto done; > @@ -30613,6 +30625,15 @@ gui_produce_glyphs (struct it *it) > { > it->ascent = FONT_BASE (font) + boff; > it->descent = FONT_DESCENT (font) - boff; > + /* If this glyph uses the ASCII face, enlarge the ascent > + to make the row higher by line-height-factor. */ > + if (face == face->ascii_face && it->voffset == 0 > + && FLOATP (Vline_height_factor)) > + { > + int enlarged_height = ((it->ascent + it->descent) > + * XFLOAT_DATA (Vline_height_factor)); > + it->ascent = enlarged_height - it->descent; > + } > } > > if (get_char_glyph_code (it->char_to_display, font, &char2b)) > @@ -30763,6 +30784,13 @@ gui_produce_glyphs (struct it *it) > { > it->ascent = FONT_BASE (font) + boff; > it->descent = FONT_DESCENT (font) - boff; > + if (face == face->ascii_face && it->voffset == 0 > + && FLOATP (Vline_height_factor)) > + { > + int enlarged_height = ((it->ascent + it->descent) > + * XFLOAT_DATA (Vline_height_factor)); > + it->ascent = enlarged_height - it->descent; > + } > } > } > > @@ -30886,6 +30914,13 @@ gui_produce_glyphs (struct it *it) > { > it->ascent = FONT_BASE (font) + boff; > it->descent = FONT_DESCENT (font) - boff; > + if (face == face->ascii_face && it->voffset == 0 > + && FLOATP (Vline_height_factor)) > + { > + int enlarged_height = ((it->ascent + it->descent) > + * XFLOAT_DATA (Vline_height_factor)); > + it->ascent = enlarged_height - it->descent; > + } > } > it->phys_ascent = it->ascent; > it->phys_descent = it->descent; > @@ -31243,6 +31278,24 @@ gui_produce_glyphs (struct it *it) > if (it->glyph_row > && (metrics.lbearing < 0 || metrics.rbearing > metrics.width)) > it->glyph_row->contains_overlapping_glyphs_p = true; > + if (it->voffset == 0 && FLOATP (Vline_height_factor)) > + { > + Lisp_Object font_object = LGSTRING_FONT (gstring); > + struct font *gstring_font = XFONT_OBJECT (font_object); > + > + /* This is for when the grapheme cluster displays some > + ligature using ASCII font: if the height is smaller > + than line-height-factor says, enlarge the ascent. */ > + if (face == face->ascii_face > + && face->ascii_face->font == gstring_font) > + { > + int enlarged_height = > + ((FONT_BASE (gstring_font) + FONT_DESCENT (gstring_font)) > + * XFLOAT_DATA (Vline_height_factor)); > + if (metrics.ascent + metrics.descent < enlarged_height) > + metrics.ascent = enlarged_height - metrics.descent; > + } > + } > it->ascent = it->phys_ascent = metrics.ascent; > it->descent = it->phys_descent = metrics.descent; > } > @@ -35581,6 +35634,16 @@ syms_of_xdisp (void) > mini-window frame's default font's height. */); > Vmax_mini_window_height = make_float (0.25); > > + DEFVAR_LISP ("line-height-factor", Vline_height_factor, > + doc: /* Factor for enlarging the height of lines that use the default font. > +The value should be a float number greater than 1. It determines how > +much will Emacs enlarge the height of a screen line that shows only > +characters displayed with the default face's font for ASCII characters. > +This is to avoid differences in height between lines that use the > +ASCII font and those which use non-ASCII (for example, Chinese) > +font, which is typically higher than the ASCII one. */); > + Vline_height_factor = Qnil; > + > DEFVAR_LISP ("resize-mini-windows", Vresize_mini_windows, > doc: /* How to resize mini-windows (the minibuffer and the echo area). > A value of nil means don't automatically resize mini-windows. --