--- Begin Message ---
Subject: |
25.0.50; emacs on x11 chooses different fonts for the same face sometimes |
Date: |
Wed, 19 Nov 2014 22:13:47 -0800 |
Hi. I'm observing an issue when running the latest GNU Emacs built from
source using the lucid X toolkit; this is on a Debian machine running
X11 (build details at the end).
Starting a few months ago (this is a regression) I'm seeing that
sometimes Emacs renders some faces with an unrequested (and ugly) font.
I can usually make it do the right thing by moving Emacs windows around
or resizing them, or maybe opening a new Emacs frame. It's not
consistent, and I don't know exactly what triggers it breaking or how I
can reliably fix it.
I'm attaching two screenshots of 'M-x describe-face italic' when it's
broken and right after I moved the windows around a bit, and re-invoked
describe-face. Note the very different font. Using what-cursor-position
I can see that in the wrong case the font is
-urw-nimbus mono l-regular-o-normal--11-79-100-100-p-70-iso8859-1 (#x70)
and in the right case the font is
-adobe-courier-medium-o-normal--11-80-100-100-m-60-iso8859-1 (#x6D)
The latter is correct since I customized my default-frame-alist to contain
(font . "-adobe-courier-medium-r-*-*-*-80-*-*-m-*-iso8859-1")
Can somebody give me some pointers on how to debug this to make this bug
report useful? I see the breakage many times a day every day.
Thanks.
good.png
Description: PNG image
bad.png
Description: PNG image
In GNU Emacs 25.0.50.1 (x86_64-pc-linux-gnu, X toolkit, Xaw scroll bars)
of 2014-11-02 on lilbastard, modified by Debian
(emacs-snapshot package, version 2:20141102+emacs-24.4-1596-gb8f900f-1)
Windowing system distributor `The X.Org Foundation', version 11.0.11600000
System Description: Debian GNU/Linux unstable (sid)
Configured using:
`configure --build x86_64-linux-gnu --host x86_64-linux-gnu
--prefix=/usr --sharedstatedir=/var/lib --libexecdir=/usr/lib
--localstatedir=/var --infodir=/usr/share/info/emacs-snapshot
--mandir=/usr/share/man --with-pop=yes
--enable-locallisppath=/etc/emacs-snapshot:/etc/emacs:/usr/local/share/emacs/25.0.50/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/25.0.50/site-lisp:/usr/share/emacs/site-lisp
--with-crt-dir=/usr/lib/x86_64-linux-gnu/ --with-x=yes
--with-x-toolkit=lucid 'CFLAGS=-DDEBIAN -DSITELOAD_PURESIZE_EXTRA=5000
-g -O2' CPPFLAGS=-D_FORTIFY_SOURCE=2 'LDFLAGS=-g -Wl,--as-needed
-znocombreloc''
Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS NOTIFY
LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
Important settings:
value of $LC_ALL: C
value of $LANG: C
locale-coding-system: nil
--- End Message ---
--- Begin Message ---
Subject: |
Re: 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 |
Commited.
> 7 feb 2015 kl. 09:28 skrev Dima Kogan <address@hidden>:
>
> Jan D. <address@hidden> 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 <address@hidden>
> 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 <address@hidden>
> +
> + * 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 <address@hidden>
>
> 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
>
--- End Message ---