From: "Jan D." <jan.h.d@swipnet.se>
To: Dima Kogan <dima@secretsauce.net>
Cc: 19117-done@debbugs.gnu.org
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 [thread overview]
Message-ID: <18ED3191-1F6E-4933-8C3C-74FE9E649167@swipnet.se> (raw)
In-Reply-To: <87lhkaf7l0.fsf@secretsauce.net>
Commited.
> 7 feb 2015 kl. 09:28 skrev Dima Kogan <dima@secretsauce.net>:
>
> Jan D. <jan.h.d@swipnet.se> 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.
Many, I rewrote them.
Jan D.
> Also, I'm including everything in one patch. It was mostly like that
> already.
>
>> From 2380816e2160236b35f06eed63839f5e71280686 Mon Sep 17 00:00:00 2001
> From: Dima Kogan <dima@secretsauce.net>
> 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 <dima@secretsauce.net>
> +
> + * 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 <eggert@cs.ucla.edu>
>
> 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
>
prev parent reply other threads:[~2015-02-09 14:58 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-20 6:13 bug#19117: 25.0.50; emacs on x11 chooses different fonts for the same face sometimes Dima Kogan
2014-11-20 16:10 ` Eli Zaretskii
2014-12-07 7:28 ` Dima Kogan
2014-12-07 16:12 ` Eli Zaretskii
2014-12-17 5:36 ` Dima Kogan
2014-12-17 6:57 ` Dima Kogan
2014-12-18 16:24 ` Eli Zaretskii
2014-12-20 8:08 ` Jan Djärv
2014-12-19 15:28 ` Dmitry Antipov
2014-12-19 22:46 ` Dima Kogan
2014-12-22 8:01 ` Dmitry Antipov
2014-12-22 8:28 ` Jan Djärv
2014-12-26 19:43 ` Dima Kogan
2014-12-27 2:17 ` Stefan Monnier
2014-12-27 9:17 ` Dima Kogan
2014-12-30 9:44 ` Dima Kogan
2014-12-30 16:57 ` Stefan Monnier
2014-12-30 18:33 ` Dima Kogan
2014-12-30 20:05 ` Eli Zaretskii
2014-12-31 4:06 ` Dima Kogan
2015-01-02 9:43 ` Eli Zaretskii
2015-01-02 21:07 ` Dima Kogan
2015-02-02 8:10 ` Dima Kogan
2015-02-03 17:53 ` Stefan Monnier
2015-02-05 2:41 ` handa
2015-02-15 13:47 ` K. Handa
2015-02-05 15:08 ` Jan D.
2015-02-05 20:41 ` Dima Kogan
2015-02-07 7:24 ` Jan D.
2015-02-07 7:59 ` Jan D.
2015-02-07 8:28 ` Dima Kogan
2015-02-09 14:58 ` Jan D. [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=18ED3191-1F6E-4933-8C3C-74FE9E649167@swipnet.se \
--to=jan.h.d@swipnet.se \
--cc=19117-done@debbugs.gnu.org \
--cc=dima@secretsauce.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.