0

I compiled Emacs 27.1 with --with-x-toolkit=lucid, now the menus are blank. I tried setting the colors in ~/.Xresources:

Emacs.pane.menubar.background: black
Emacs.pane.menubar.foreground: white
Emacs.pane.menubar.buttonForeground: white

But that only turned the menus black, I still see no text.

I started Emacs with xrdb ~/.Xresources && emacs -Q. GTK and Motif menus work fine.

Screenshot of a blank menu.

4
  • which version of Cairo are you using? The splash screen will tell you. – rpluim Dec 1 '20 at 9:22
  • @rpluim cairo version 1.16.0. – tastytea Dec 1 '20 at 10:50
  • 1
    Well that shoots down my theory. There's an Emacs bug open for this debbugs.gnu.org/cgi/bugreport.cgi?bug=43148 , but no idea what's causing it. – rpluim Dec 1 '20 at 11:44
  • It is indeed the same issue, compiling without cairo works around the issue. Thanks for pointing me to it. – tastytea Dec 1 '20 at 13:11
0

It is a bug in Emacs 27.1. The problem was that I have “Noto Color Emoji” as my second preferred font in my fontconfig configuration file (~/.config/fontconfig/fonts.conf):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <!-- […] -->
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Source Sans Pro</family>
      <family>Noto Color Emoji</family>
    </prefer>
  </alias>
</fontconfig>

fc-match -s sans | head -n2 looks like this:

SourceSansPro-Regular.otf: "Source Sans Pro" "Regular"
NotoColorEmoji.ttf: "Noto Color Emoji" "Regular"

Workaround

Remove “Noto Color Emoji” from your preferred fonts list. You will lose color emojis in a lot of programs.

Solution

Wait for Emacs 27.2 or apply this patch from the emacs-27 branch:

diff --git a/lwlib/lwlib-utils.c b/lwlib/lwlib-utils.c
index f15cb603a8..2b3aa55c3e 100644
--- a/lwlib/lwlib-utils.c
+++ b/lwlib/lwlib-utils.c
@@ -148,6 +148,7 @@ XftFont *
 crxft_font_open_name (Display *dpy, int screen, const char *name)
 {
   XftFont *pub = NULL;
+  FcPattern *match = NULL;
   FcPattern *pattern = FcNameParse ((FcChar8 *) name);
   if (pattern)
     {
@@ -162,12 +163,18 @@ crxft_font_open_name (Display *dpy, int screen, const char *name)
      FcPatternAddDouble (pattern, FC_DPI, dpi);
    }
       FcDefaultSubstitute (pattern);
+      FcResult result;
+      match = FcFontMatch (NULL, pattern, &result);
+      FcPatternDestroy (pattern);
+    }
+  if (match)
+    {
       cairo_font_face_t *font_face
-   = cairo_ft_font_face_create_for_pattern (pattern);
+   = cairo_ft_font_face_create_for_pattern (match);
       if (font_face)
    {
      double pixel_size;
-     if ((FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &pixel_size)
+     if ((FcPatternGetDouble (match, FC_PIXEL_SIZE, 0, &pixel_size)
           != FcResultMatch)
          || pixel_size < 1)
        pixel_size = 10;
@@ -177,7 +184,7 @@ crxft_font_open_name (Display *dpy, int screen, const char *name)
      cairo_matrix_init_scale (&font_matrix, pixel_size, pixel_size);
      cairo_matrix_init_identity (&ctm);
      cairo_font_options_t *options = cairo_font_options_create ();
-     cairo_ft_font_options_substitute (options, pattern);
+     cairo_ft_font_options_substitute (options, match);
      pub->scaled_font = cairo_scaled_font_create (font_face, &font_matrix,
                               &ctm, options);
      cairo_font_face_destroy (font_face);
@@ -190,7 +197,7 @@ crxft_font_open_name (Display *dpy, int screen, const char *name)
      pub->height = lround (extents.height);
      pub->max_advance_width = lround (extents.max_x_advance);
    }
-      FcPatternDestroy (pattern);
+      FcPatternDestroy (match);
     }
   if (pub && pub->height <= 0)
     {

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.