From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dima Kogan Newsgroups: gmane.emacs.bugs Subject: bug#19117: 25.0.50; emacs on x11 chooses different fonts for the same face sometimes Date: Sat, 07 Feb 2015 00:28:00 -0800 Message-ID: <87lhkaf7l0.fsf@secretsauce.net> 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> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1423297816 25388 80.91.229.3 (7 Feb 2015 08:30:16 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 7 Feb 2015 08:30:16 +0000 (UTC) Cc: 19117@debbugs.gnu.org To: "Jan D." Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Feb 07 09:30:15 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 1YK0mN-0002g3-4e for geb-bug-gnu-emacs@m.gmane.org; Sat, 07 Feb 2015 09:30:15 +0100 Original-Received: from localhost ([::1]:51712 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YK0mM-0002WO-Ck for geb-bug-gnu-emacs@m.gmane.org; Sat, 07 Feb 2015 03:30:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46124) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YK0mH-0002RX-QA for bug-gnu-emacs@gnu.org; Sat, 07 Feb 2015 03:30:11 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YK0mD-0005D3-1N for bug-gnu-emacs@gnu.org; Sat, 07 Feb 2015 03:30:09 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:44829) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YK0mC-0005CQ-MO for bug-gnu-emacs@gnu.org; Sat, 07 Feb 2015 03:30:04 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YK0mC-0001cK-70 for bug-gnu-emacs@gnu.org; Sat, 07 Feb 2015 03:30:04 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Dima Kogan Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 07 Feb 2015 08:30:03 +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.14232977646119 (code B ref 19117); Sat, 07 Feb 2015 08:30:03 +0000 Original-Received: (at 19117) by debbugs.gnu.org; 7 Feb 2015 08:29:24 +0000 Original-Received: from localhost ([127.0.0.1]:36069 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YK0lX-0001aZ-BL for submit@debbugs.gnu.org; Sat, 07 Feb 2015 03:29:24 -0500 Original-Received: from out1-smtp.messagingengine.com ([66.111.4.25]:57878) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YK0lU-0001aC-GV for 19117@debbugs.gnu.org; Sat, 07 Feb 2015 03:29:21 -0500 Original-Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id E6C2E2062E for <19117@debbugs.gnu.org>; Sat, 7 Feb 2015 03:29:19 -0500 (EST) Original-Received: from frontend1 ([10.202.2.160]) by compute1.internal (MEProxy); Sat, 07 Feb 2015 03:29:19 -0500 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=secretsauce.net; h=x-sasl-enc:references:from:to:cc:subject:date:in-reply-to :message-id:mime-version:content-type; s=mesmtp; bh=YYNhTaivXe72 bqvSYA2eY6iukGM=; b=a8sLa+i3UfSttNTJuatf4pvlRzZJA498IgqnKeEaHmcV tfR7WaWGjKwmNVryKJNojbX6M581PXeB7WevbHzFp4fMDFbC6gDDFO6Q1mfijzJ8 T1QrSFTo52r68P4OXLPKAQPPHabpDLNUkjj0UM3lX3xZ8dzAqudoxtZWSkp6kIA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=x-sasl-enc:references:from:to:cc:subject :date:in-reply-to:message-id:mime-version:content-type; s= smtpout; bh=YYNhTaivXe72bqvSYA2eY6iukGM=; b=qbf0FY2WXgg1TtJKmnhK UWdO7LSeRl05+q0OxIvFK8fXoVPvCBylhTpjj3BPV7e4VPZbVXXTb9IetuwXkX6N qFqrQ8SExJQVCtAvDwrMH5yaXlLFJ79OtBAFi0cjWKryzo8EGSXDnKnUpgCCDe4p y/l8JRt2xs4GTC7k4S2fO/M= X-Sasl-enc: 5xUTnZ7/HgYbKSxKsBZP2WWAZbPz7l1azv0BHYCHQGwJ 1423297759 Original-Received: from shorty.local (unknown [76.91.145.213]) by mail.messagingengine.com (Postfix) with ESMTPA id 75BD5C0028D; Sat, 7 Feb 2015 03:29:19 -0500 (EST) Original-Received: from localhost ([::1] helo=shorty) by shorty.local with esmtp (Exim 4.84) (envelope-from ) id 1YK0lP-00040H-Jo; Sat, 07 Feb 2015 00:29:15 -0800 In-reply-to: <4CA3BB51-28CE-49F2-98A5-089AB981E7AB@swipnet.se> 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:99122 Archived-At: --=-=-= Content-Type: text/plain Jan D. writes: > Can you add ChangeLog entries for this so we can install it? Attached. Let me know if there are issues with the changelog style. Also, I'm including everything in one patch. It was mostly like that already. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-scalable-font-logic-now-matches-the-docs-and-is-more.patch >From 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 A nil value of scalable-fonts-allowed allows scalable fonts if no others were found. This is the previously-documented behavior. 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(-) 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 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) } /* Score the size. Maximum difference is 127. */ - i = 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 = false; - ptrdiff_t count = SPECPDL_INDEX (); /* 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); if (realize_default_face (f)) { @@ -5180,7 +5178,6 @@ realize_basic_faces (struct frame *f) success_p = true; } - 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 = XVECTOR (xfont_scratch_props)->contents; Lisp_Object scripts = Qnil, entity = Qnil; + /* 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 = false; + for (i = 0; i < ASIZE (xfont_scratch_props); i++) ASET (xfont_scratch_props, i, Qnil); for (i = 0; i < num_fonts; i++) indices[i] = names[i]; qsort (indices, num_fonts, sizeof (char *), compare_font_names); - for (i = 0; i < num_fonts; i++) - { - ptrdiff_t len; + for (i_pass = 0; i_pass < 2; i_pass++) + { + for (i = 0; i < num_fonts; i++) + { + ptrdiff_t len; - if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) == 0) - continue; - if (NILP (entity)) - entity = font_make_entity (); - len = 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)) != 0 - && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0) - continue; - /* Avoid not-allowed scalable fonts. */ - if (NILP (Vscalable_fonts_allowed)) - { - int size = 0; + if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) == 0) + continue; + if (NILP (entity)) + entity = font_make_entity (); + len = 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)) != 0 + && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0) + continue; + /* Avoid not-allowed scalable fonts. */ + if (NILP (Vscalable_fonts_allowed)) + { + int size = 0; - if (INTEGERP (AREF (entity, FONT_SIZE_INDEX))) - size = XINT (AREF (entity, FONT_SIZE_INDEX)); - else if (FLOATP (AREF (entity, FONT_SIZE_INDEX))) - size = XFLOAT_DATA (AREF (entity, FONT_SIZE_INDEX)); - if (size == 0) - continue; - } - else if (CONSP (Vscalable_fonts_allowed)) - { - Lisp_Object tail, elt; + if (INTEGERP (AREF (entity, FONT_SIZE_INDEX))) + size = XINT (AREF (entity, FONT_SIZE_INDEX)); + else if (FLOATP (AREF (entity, FONT_SIZE_INDEX))) + size = XFLOAT_DATA (AREF (entity, FONT_SIZE_INDEX)); + if (size == 0 && i_pass == 0) + { + skipped_some_scalable_fonts = true; + continue; + } + } + else if (CONSP (Vscalable_fonts_allowed)) + { + Lisp_Object tail, elt; - for (tail = Vscalable_fonts_allowed; CONSP (tail); - tail = XCDR (tail)) - { - elt = XCAR (tail); - if (STRINGP (elt) - && fast_c_string_match_ignore_case (elt, indices[i], - len) >= 0) - break; - } - if (! CONSP (tail)) - continue; - } + for (tail = Vscalable_fonts_allowed; CONSP (tail); + tail = XCDR (tail)) + { + elt = XCAR (tail); + if (STRINGP (elt) + && fast_c_string_match_ignore_case (elt, indices[i], + len) >= 0) + break; + } + if (! CONSP (tail)) + continue; + } - /* 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; - /* Update encoding and repertory if necessary. */ - if (! EQ (registry, AREF (entity, FONT_REGISTRY_INDEX))) - { - registry = AREF (entity, FONT_REGISTRY_INDEX); - if (font_registry_charsets (registry, &encoding, &repertory) < 0) - encoding = NULL; - } - if (! encoding) - /* Unknown REGISTRY, not supported. */ - continue; - if (repertory) - { - if (NILP (script) - || xfont_chars_supported (chars, NULL, encoding, repertory)) - list = Fcons (entity, list), entity = 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 = xfont_supported_scripts (display, indices[i], - xfont_scratch_props, encoding); - } - if (NILP (script) - || ! NILP (Fmemq (script, scripts))) - list = Fcons (entity, list), entity = Qnil; - } + /* Update encoding and repertory if necessary. */ + if (! EQ (registry, AREF (entity, FONT_REGISTRY_INDEX))) + { + registry = AREF (entity, FONT_REGISTRY_INDEX); + if (font_registry_charsets (registry, &encoding, &repertory) < 0) + encoding = NULL; + } + if (! encoding) + /* Unknown REGISTRY, not supported. */ + continue; + if (repertory) + { + if (NILP (script) + || xfont_chars_supported (chars, NULL, encoding, repertory)) + list = Fcons (entity, list), entity = 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 = xfont_supported_scripts (display, indices[i], + xfont_scratch_props, encoding); + } + if (NILP (script) + || ! NILP (Fmemq (script, scripts))) + list = Fcons (entity, list), entity = 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); } -- 2.1.4 --=-=-=--