From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Jan D." Newsgroups: gmane.emacs.bugs Subject: bug#19117: 25.0.50; emacs on x11 chooses different fonts for the same face sometimes Date: Sat, 7 Feb 2015 08:24:26 +0100 Message-ID: References: <878uj674zh.fsf@secretsauce.net> <831tox7t03.fsf@gnu.org> <87a92zrj4b.fsf@secretsauce.net> <83egsbzbfu.fsf@gnu.org> <87r3vykdse.fsf@secretsauce.net> <87ppbikb6g.fsf@secretsauce.net> <54944426.6090900@yandex.ru> <878ui3jkx0.fsf@secretsauce.net> <5497D623.7040406@swipnet.se> <87bnmqi1ps.fsf@secretsauce.net> <87mw65momt.fsf@secretsauce.net> <87lhlonc7c.fsf@secretsauce.net> <83sifwaooq.fsf@gnu.org> <87h9wcmpaf.fsf@secretsauce.net> <838uhlbjqd.fsf@gnu.org> <87y4pklw65.fsf@secretsauce.net> <87a90w68co.fsf@secretsauce.net> <54D38784.3050008@swipnet.se> <87r3u4gked.fsf@secretsauce.net> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2070.6\)) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Trace: ger.gmane.org 1423293924 3489 80.91.229.3 (7 Feb 2015 07:25:24 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 7 Feb 2015 07:25:24 +0000 (UTC) Cc: 19117@debbugs.gnu.org To: Dima Kogan Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Feb 07 08:25:19 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1YJzlV-0001at-Qj for geb-bug-gnu-emacs@m.gmane.org; Sat, 07 Feb 2015 08:25:18 +0100 Original-Received: from localhost ([::1]:51623 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJzlV-0005cB-5u for geb-bug-gnu-emacs@m.gmane.org; Sat, 07 Feb 2015 02:25:17 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:38227) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJzlQ-0005Zg-Lm for bug-gnu-emacs@gnu.org; Sat, 07 Feb 2015 02:25:14 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YJzlG-0001XV-MW for bug-gnu-emacs@gnu.org; Sat, 07 Feb 2015 02:25:12 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:44794) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJzlG-0001XJ-Jk for bug-gnu-emacs@gnu.org; Sat, 07 Feb 2015 02:25:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YJzlG-0008VT-Db for bug-gnu-emacs@gnu.org; Sat, 07 Feb 2015 02:25:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: "Jan D." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 07 Feb 2015 07:25:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 19117 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 19117-submit@debbugs.gnu.org id=B19117.142329387932666 (code B ref 19117); Sat, 07 Feb 2015 07:25:02 +0000 Original-Received: (at 19117) by debbugs.gnu.org; 7 Feb 2015 07:24:39 +0000 Original-Received: from localhost ([127.0.0.1]:36033 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YJzkr-0008Un-RZ for submit@debbugs.gnu.org; Sat, 07 Feb 2015 02:24:38 -0500 Original-Received: from mailfe08.swip.net ([212.247.154.225]:45160 helo=swip.net) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YJzko-0008UV-B0 for 19117@debbugs.gnu.org; Sat, 07 Feb 2015 02:24:36 -0500 X-T2-Spam-Status: No, hits=-1.9 required=5.0 tests=BAYES_00 Original-Received: from hosdjarv.se (account mj138573@tele2.se [46.59.42.57] verified) by mailfe08.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 572096752; Sat, 07 Feb 2015 08:24:27 +0100 In-Reply-To: <87r3u4gked.fsf@secretsauce.net> X-Mailer: Apple Mail (2.2070.6) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 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.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:99117 Archived-At: Hi. There is a Dmitriy Kogan in the copyright list. Is that you? Jan D. > 5 feb 2015 kl. 21:41 skrev Dima Kogan : >=20 > Jan D. writes: >=20 >>=20 >> But the comment here: >>=20 >> + /* We skip the second pass unless we really need it. */ >> + if (!(NILP (list) /* No fonts found = on=20 >> the first pass */ >> + && skipped_some_scalable_fonts)) /* and we skipped = some=20 >> scalable ones. */ >> + break; >>=20 >>=20 >> looks like it really should be /* Fonts found on the first pass */ >=20 > There was an ! there, so it made it unclear what the comment is > referring to. Attaching new patches that apply against the current > master, and have a clarified comment in that place >=20 >> =46rom 4e895fb38c84342021b602dd4a9830b55fe56a58 Mon Sep 17 00:00:00 = 2001 > From: Dima Kogan > Date: Tue, 30 Dec 2014 20:05:11 -0800 > Subject: [PATCH 1/2] scalable font logic now matches the docs and is = more > consistent >=20 > A nil value of scalable-fonts-allowed allows scalable fonts if no = others > were found. This is the previously-documented behavior. >=20 > realize_basic_faces() no longer forces scalable-fonts-allowed to t. = If > nil, some fonts will always be found even if only scalable fonts are > available, as set by the other part of this patch. > --- > src/xfaces.c | 3 -- > src/xfont.c | 173 = +++++++++++++++++++++++++++++++++-------------------------- > 2 files changed, 96 insertions(+), 80 deletions(-) >=20 > diff --git a/src/xfaces.c b/src/xfaces.c > index 6e01ab0..d0fe872 100644 > --- a/src/xfaces.c > +++ b/src/xfaces.c > @@ -5141,12 +5141,10 @@ static bool > realize_basic_faces (struct frame *f) > { > bool success_p =3D false; > - ptrdiff_t count =3D SPECPDL_INDEX (); >=20 > /* Block input here so that we won't be surprised by an X expose > event, for instance, without having the faces set up. */ > block_input (); > - specbind (Qscalable_fonts_allowed, Qt); >=20 > if (realize_default_face (f)) > { > @@ -5180,7 +5178,6 @@ realize_basic_faces (struct frame *f) > success_p =3D true; > } >=20 > - unbind_to (count, Qnil); > unblock_input (); > return success_p; > } > diff --git a/src/xfont.c b/src/xfont.c > index 3a0f5e3..5f1c61c 100644 > --- a/src/xfont.c > +++ b/src/xfont.c > @@ -388,94 +388,113 @@ xfont_list_pattern (Display *display, const = char *pattern, > Lisp_Object *props =3D XVECTOR (xfont_scratch_props)->contents; > Lisp_Object scripts =3D Qnil, entity =3D Qnil; >=20 > + /* We take two passes over the font list. The second pass is > + taken only if scalable-fonts-allowed is nil, and only > + scalable fonts were found. > + */ > + int i_pass; > + bool skipped_some_scalable_fonts =3D false; > + > for (i =3D 0; i < ASIZE (xfont_scratch_props); i++) > ASET (xfont_scratch_props, i, Qnil); > for (i =3D 0; i < num_fonts; i++) > indices[i] =3D names[i]; > qsort (indices, num_fonts, sizeof (char *), compare_font_names); >=20 > - for (i =3D 0; i < num_fonts; i++) > - { > - ptrdiff_t len; > + for (i_pass =3D 0; i_pass < 2; i_pass++) > + { > + for (i =3D 0; i < num_fonts; i++) > + { > + ptrdiff_t len; >=20 > - if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) =3D=3D = 0) > - continue; > - if (NILP (entity)) > - entity =3D font_make_entity (); > - len =3D xfont_decode_coding_xlfd (indices[i], -1, buf); > - if (font_parse_xlfd (buf, len, entity) < 0) > - continue; > - ASET (entity, FONT_TYPE_INDEX, Qx); > - /* Avoid auto-scaled fonts. */ > - if (INTEGERP (AREF (entity, FONT_DPI_INDEX)) > - && INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX)) > - && XINT (AREF (entity, FONT_DPI_INDEX)) !=3D 0 > - && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) =3D=3D 0) > - continue; > - /* Avoid not-allowed scalable fonts. */ > - if (NILP (Vscalable_fonts_allowed)) > - { > - int size =3D 0; > + if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) = =3D=3D 0) > + continue; > + if (NILP (entity)) > + entity =3D font_make_entity (); > + len =3D xfont_decode_coding_xlfd (indices[i], -1, buf); > + if (font_parse_xlfd (buf, len, entity) < 0) > + continue; > + ASET (entity, FONT_TYPE_INDEX, Qx); > + /* Avoid auto-scaled fonts. */ > + if (INTEGERP (AREF (entity, FONT_DPI_INDEX)) > + && INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX)) > + && XINT (AREF (entity, FONT_DPI_INDEX)) !=3D 0 > + && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) =3D=3D = 0) > + continue; > + /* Avoid not-allowed scalable fonts. */ > + if (NILP (Vscalable_fonts_allowed)) > + { > + int size =3D 0; >=20 > - if (INTEGERP (AREF (entity, FONT_SIZE_INDEX))) > - size =3D XINT (AREF (entity, FONT_SIZE_INDEX)); > - else if (FLOATP (AREF (entity, FONT_SIZE_INDEX))) > - size =3D XFLOAT_DATA (AREF (entity, FONT_SIZE_INDEX)); > - if (size =3D=3D 0) > - continue; > - } > - else if (CONSP (Vscalable_fonts_allowed)) > - { > - Lisp_Object tail, elt; > + if (INTEGERP (AREF (entity, FONT_SIZE_INDEX))) > + size =3D XINT (AREF (entity, FONT_SIZE_INDEX)); > + else if (FLOATP (AREF (entity, FONT_SIZE_INDEX))) > + size =3D XFLOAT_DATA (AREF (entity, = FONT_SIZE_INDEX)); > + if (size =3D=3D 0 && i_pass =3D=3D 0) > + { > + skipped_some_scalable_fonts =3D true; > + continue; > + } > + } > + else if (CONSP (Vscalable_fonts_allowed)) > + { > + Lisp_Object tail, elt; >=20 > - for (tail =3D Vscalable_fonts_allowed; CONSP (tail); > - tail =3D XCDR (tail)) > - { > - elt =3D XCAR (tail); > - if (STRINGP (elt) > - && fast_c_string_match_ignore_case (elt, = indices[i], > - len) >=3D 0) > - break; > - } > - if (! CONSP (tail)) > - continue; > - } > + for (tail =3D Vscalable_fonts_allowed; CONSP = (tail); > + tail =3D XCDR (tail)) > + { > + elt =3D XCAR (tail); > + if (STRINGP (elt) > + && fast_c_string_match_ignore_case (elt, = indices[i], > + len) >=3D= 0) > + break; > + } > + if (! CONSP (tail)) > + continue; > + } >=20 > - /* Avoid fonts of invalid registry. */ > - if (NILP (AREF (entity, FONT_REGISTRY_INDEX))) > - continue; > + /* Avoid fonts of invalid registry. */ > + if (NILP (AREF (entity, FONT_REGISTRY_INDEX))) > + continue; >=20 > - /* Update encoding and repertory if necessary. */ > - if (! EQ (registry, AREF (entity, FONT_REGISTRY_INDEX))) > - { > - registry =3D AREF (entity, FONT_REGISTRY_INDEX); > - if (font_registry_charsets (registry, &encoding, = &repertory) < 0) > - encoding =3D NULL; > - } > - if (! encoding) > - /* Unknown REGISTRY, not supported. */ > - continue; > - if (repertory) > - { > - if (NILP (script) > - || xfont_chars_supported (chars, NULL, encoding, = repertory)) > - list =3D Fcons (entity, list), entity =3D Qnil; > - continue; > - } > - if (memcmp (props, aref_addr (entity, FONT_FOUNDRY_INDEX), > - word_size * 7) > - || ! EQ (AREF (entity, FONT_SPACING_INDEX), props[7])) > - { > - vcopy (xfont_scratch_props, 0, > - aref_addr (entity, FONT_FOUNDRY_INDEX), 7); > - ASET (xfont_scratch_props, 7, AREF (entity, = FONT_SPACING_INDEX)); > - scripts =3D xfont_supported_scripts (display, indices[i], > - xfont_scratch_props, = encoding); > - } > - if (NILP (script) > - || ! NILP (Fmemq (script, scripts))) > - list =3D Fcons (entity, list), entity =3D Qnil; > - } > + /* Update encoding and repertory if necessary. */ > + if (! EQ (registry, AREF (entity, = FONT_REGISTRY_INDEX))) > + { > + registry =3D AREF (entity, FONT_REGISTRY_INDEX); > + if (font_registry_charsets (registry, &encoding, = &repertory) < 0) > + encoding =3D NULL; > + } > + if (! encoding) > + /* Unknown REGISTRY, not supported. */ > + continue; > + if (repertory) > + { > + if (NILP (script) > + || xfont_chars_supported (chars, NULL, = encoding, repertory)) > + list =3D Fcons (entity, list), entity =3D Qnil; > + continue; > + } > + if (memcmp (props, aref_addr (entity, = FONT_FOUNDRY_INDEX), > + word_size * 7) > + || ! EQ (AREF (entity, FONT_SPACING_INDEX), = props[7])) > + { > + vcopy (xfont_scratch_props, 0, > + aref_addr (entity, FONT_FOUNDRY_INDEX), 7); > + ASET (xfont_scratch_props, 7, AREF (entity, = FONT_SPACING_INDEX)); > + scripts =3D xfont_supported_scripts (display, = indices[i], > + = xfont_scratch_props, encoding); > + } > + if (NILP (script) > + || ! NILP (Fmemq (script, scripts))) > + list =3D Fcons (entity, list), entity =3D Qnil; > + } > + > + /* We skip the second pass unless we really need it. */ > + if (! /* Loop again if... = */ > + (NILP (list) /* No fonts found = on the first pass */ > + && skipped_some_scalable_fonts)) /* and we skipped = some scalable ones. */ > + break; > + } > XFreeFontNames (names); > } >=20 > --=20 > 2.1.4 >=20 >> =46rom 80bdfb936f9dd24fd8bb0ce0aecc10f796dd4f6f Mon Sep 17 00:00:00 = 2001 > From: Dima Kogan > Date: Tue, 30 Dec 2014 20:05:58 -0800 > Subject: [PATCH 2/2] removed unused variable assignment >=20 > --- > src/font.c | 1 - > 1 file changed, 1 deletion(-) >=20 > diff --git a/src/font.c b/src/font.c > index 9ea43cd..b2b43c7 100644 > --- a/src/font.c > +++ b/src/font.c > @@ -2136,7 +2136,6 @@ font_score (Lisp_Object entity, Lisp_Object = *spec_prop) > } >=20 > /* Score the size. Maximum difference is 127. */ > - i =3D FONT_SIZE_INDEX; > if (! NILP (spec_prop[FONT_SIZE_INDEX]) > && XINT (AREF (entity, FONT_SIZE_INDEX)) > 0) > { > --=20 > 2.1.4 >=20