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: Thu, 05 Feb 2015 12:41:22 -0800 Message-ID: <87r3u4gked.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> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1423168995 8794 80.91.229.3 (5 Feb 2015 20:43:15 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 5 Feb 2015 20:43:15 +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 Thu Feb 05 21:43:13 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 1YJTGa-0001Hw-GZ for geb-bug-gnu-emacs@m.gmane.org; Thu, 05 Feb 2015 21:43:12 +0100 Original-Received: from localhost ([::1]:45529 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJTGZ-0004xc-Rx for geb-bug-gnu-emacs@m.gmane.org; Thu, 05 Feb 2015 15:43:11 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:48600) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJTGU-0004ui-LA for bug-gnu-emacs@gnu.org; Thu, 05 Feb 2015 15:43:08 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YJTGQ-0003pM-Mo for bug-gnu-emacs@gnu.org; Thu, 05 Feb 2015 15:43:06 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:43847) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJTGQ-0003pG-7z for bug-gnu-emacs@gnu.org; Thu, 05 Feb 2015 15:43:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YJTGP-0004FZ-NL for bug-gnu-emacs@gnu.org; Thu, 05 Feb 2015 15:43:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Dima Kogan Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 05 Feb 2015 20:43:01 +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.142316895916308 (code B ref 19117); Thu, 05 Feb 2015 20:43:01 +0000 Original-Received: (at 19117) by debbugs.gnu.org; 5 Feb 2015 20:42:39 +0000 Original-Received: from localhost ([127.0.0.1]:35087 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YJTG2-0004Ex-NR for submit@debbugs.gnu.org; Thu, 05 Feb 2015 15:42:39 -0500 Original-Received: from out1-smtp.messagingengine.com ([66.111.4.25]:56294) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YJTG0-0004En-Hh for 19117@debbugs.gnu.org; Thu, 05 Feb 2015 15:42:37 -0500 Original-Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id D6AB7205A9 for <19117@debbugs.gnu.org>; Thu, 5 Feb 2015 15:42:35 -0500 (EST) Original-Received: from frontend2 ([10.202.2.161]) by compute5.internal (MEProxy); Thu, 05 Feb 2015 15:42:35 -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=GNtBeEFxcDPG v8j7vUj0BiXH5tQ=; b=QFbKZFVMH+EVZRldlvzZB59+BNYUKc8WkV0w4n8V2Fnl h0SMAMD4SG992tu1p2MQcte/P12MffpW06QFc79YnYq8exo0uCpB7ffsYKi8vDU+ oSoPKMOYdfAJo+gWfNaFHiD8Hlv5ixc/oQzCmoK9l+y2FmCL8D3CHo7F/FP14G0= 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=GNtBeEFxcDPGv8j7vUj0BiXH5tQ=; b=G/1gLOMLUPeyAJO672xx 1XAGoLa4n2IYV2n7AzxOj8+LM57iy/3JWoBGH36Z9XYXcYNHwZXJ2RLVBi70CojX 7MKpQFM8xiHDD3dRe1fTKAqA2CZIrOaT75eA2Cn4F8fz8ZMg3R7aT8ovrb/X1JyC HCH+XbHijpOx85k4MUfQnKA= X-Sasl-enc: O9VB4o1nLM/OzoeTOrKJluRanqJv4oYXM7hik+koydOa 1423168955 Original-Received: from shorty.local (unknown [76.91.145.213]) by mail.messagingengine.com (Postfix) with ESMTPA id 77F3E680125; Thu, 5 Feb 2015 15:42:35 -0500 (EST) Original-Received: from ip6-localhost ([::1] helo=shorty) by shorty.local with esmtp (Exim 4.84) (envelope-from ) id 1YJTFy-0004yJ-6E; Thu, 05 Feb 2015 12:42:34 -0800 In-reply-to: <54D38784.3050008@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:99081 Archived-At: --=-=-= Content-Type: text/plain Jan D. writes: > > But the comment here: > > + /* We skip the second pass unless we really need it. */ > + if (!(NILP (list) /* No fonts found on > the first pass */ > + && skipped_some_scalable_fonts)) /* and we skipped some > scalable ones. */ > + break; > > > looks like it really should be /* Fonts found on the first pass */ 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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-scalable-font-logic-now-matches-the-docs-and-is-more.patch >From 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 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/xfaces.c | 3 -- src/xfont.c | 173 +++++++++++++++++++++++++++++++++-------------------------- 2 files changed, 96 insertions(+), 80 deletions(-) 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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0002-removed-unused-variable-assignment.patch >From 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 --- src/font.c | 1 - 1 file changed, 1 deletion(-) 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) { -- 2.1.4 --=-=-=--