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: Mon, 9 Feb 2015 15:58:30 +0100 Message-ID: <18ED3191-1F6E-4933-8C3C-74FE9E649167@swipnet.se> 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> <4CA3BB51-28CE-49F2-98A5-089AB981E7AB@swipnet.se> <87lhkaf7l0.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 1423493958 29549 80.91.229.3 (9 Feb 2015 14:59:18 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 9 Feb 2015 14:59:18 +0000 (UTC) Cc: 19117-done@debbugs.gnu.org To: Dima Kogan Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Feb 09 15:59:17 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 1YKpnv-000575-HE for geb-bug-gnu-emacs@m.gmane.org; Mon, 09 Feb 2015 15:59:15 +0100 Original-Received: from localhost ([::1]:33345 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YKpnu-00052v-VS for geb-bug-gnu-emacs@m.gmane.org; Mon, 09 Feb 2015 09:59:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:56232) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YKpnm-0004zP-OE for bug-gnu-emacs@gnu.org; Mon, 09 Feb 2015 09:59:11 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YKpni-0007gD-Jv for bug-gnu-emacs@gnu.org; Mon, 09 Feb 2015 09:59:06 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:47143) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YKpni-0007g6-Gw for bug-gnu-emacs@gnu.org; Mon, 09 Feb 2015 09:59:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YKpni-0003Qk-6g for bug-gnu-emacs@gnu.org; Mon, 09 Feb 2015 09:59:02 -0500 Resent-From: "Jan D." Original-Sender: "Debbugs-submit" Resent-To: bug-gnu-emacs@gnu.org Resent-Date: Mon, 09 Feb 2015 14:59:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: cc-closed 19117 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Mail-Followup-To: 19117@debbugs.gnu.org, jan.h.d@swipnet.se, dima@secretsauce.net Original-Received: via spool by 19117-done@debbugs.gnu.org id=D19117.142349392413155 (code D ref 19117); Mon, 09 Feb 2015 14:59:01 +0000 Original-Received: (at 19117-done) by debbugs.gnu.org; 9 Feb 2015 14:58:44 +0000 Original-Received: from localhost ([127.0.0.1]:38381 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YKpnO-0003Q6-VN for submit@debbugs.gnu.org; Mon, 09 Feb 2015 09:58:44 -0500 Original-Received: from mailfe04.swip.net ([212.247.154.97]:50827 helo=swip.net) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YKpnK-0003Pq-Sh for 19117-done@debbugs.gnu.org; Mon, 09 Feb 2015 09:58:40 -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 mailfe04.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 569922221; Mon, 09 Feb 2015 15:58:30 +0100 In-Reply-To: <87lhkaf7l0.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:99206 Archived-At: Commited. > 7 feb 2015 kl. 09:28 skrev Dima Kogan : >=20 > Jan D. writes: >=20 >> Can you add ChangeLog entries for this so we can install it? >=20 > Attached. Let me know if there are issues with the changelog style. Many, I rewrote them. Jan D. > Also, I'm including everything in one patch. It was mostly like that > already. >=20 >> =46rom 2380816e2160236b35f06eed63839f5e71280686 Mon Sep 17 00:00:00 = 2001 > From: Dima Kogan > Date: Tue, 30 Dec 2014 20:05:11 -0800 > Subject: [PATCH] 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/ChangeLog | 8 +++ > src/font.c | 1 - > src/xfaces.c | 3 - > src/xfont.c | 173 = ++++++++++++++++++++++++++++++++-------------------------- > 4 files changed, 104 insertions(+), 81 deletions(-) >=20 > diff --git a/src/ChangeLog b/src/ChangeLog > index cd72f98..d189b7e 100644 > --- a/src/ChangeLog > +++ b/src/ChangeLog > @@ -1,3 +1,11 @@ > +2015-02-07 Dima Kogan > + > + * xfont.c (xfont_list_pattern): > + * xfaces.c (realize_basic_faces): > + * font.c (font_score): scalable font logic now matches the docs > + and is more consistent > + Fixes: bug#19117 > + > 2015-02-07 Paul Eggert >=20 > Remove no-longer-used cursor_in_echo_area code > 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) > { > 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