emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 5f4e8e2: Don't link libXft when using cairo


From: YAMAMOTO Mitsuharu
Subject: [Emacs-diffs] master 5f4e8e2: Don't link libXft when using cairo
Date: Tue, 23 Apr 2019 23:35:02 -0400 (EDT)

branch: master
commit 5f4e8e2e088de9fb76cb631077c6eddd3219f594
Author: YAMAMOTO Mitsuharu <address@hidden>
Commit: YAMAMOTO Mitsuharu <address@hidden>

    Don't link libXft when using cairo
    
    * configure.ac: Check cairo early.  Don't try Xft if cairo is used.
    * lwlib/lwlib-utils.h [USE_CAIRO]: Include cairo.h and fontconfig.h.
    (XftFont, XftDraw, XftColor, XGlyphInfo) [USE_CAIRO]: New typedefs.
    (XftFontOpenName, XftFontClose, XftDrawCreate, XftDrawDestroy)
    (XftDrawRect, XftDrawStringUtf8, XftTextExtentsUtf8) [USE_CAIRO]: New 
macros.
    (crxft_font_open_name, crxft_font_close, crxft_draw_create)
    (crxft_draw_rect, crxft_draw_string, crxft_text_extents) [USE_CAIRO]: New
    externs.
    * lwlib/lwlib-utils.c [USE_CAIRO]: Include math.h, cairo-ft.h, and
    cairo-xlib.h.
    (crxft_font_open_name, crxft_font_close, crxft_draw_create)
    (crxft_set_source_color, crxft_draw_rect, crxft_draw_string)
    (crxft_text_extents) [USE_CAIRO]: New Xft compatibility functions.
    * lwlib/xlwmenuP.h [USE_CAIRO]: Include lwlib-utils.h.
    * lwlib/xlwmenu.c (display_menu_item) [USE_CAIRO]: Call
    cairo_surface_mark_dirty and cairo_surface_flush.
    * lwlib/lwlib-Xaw.c [USE_CAIRO]: Include stdlib.h and lwlib-utils.h.
    (draw_text) [USE_CAIRO]: Call cairo_surface_flush.
    * src/xsettings.c [USE_CAIRO]: Include fontconfig.h
    (apply_xft_settings) [!HAVE_XFT]: Don't call XftDefaultSubstitute or
    XftDefaultSet.
    * lwlib/lwlib-Xaw.c:
    * lwlib/lwlib-int.h:
    * lwlib/xlwmenu.c:
    * lwlib/xlwmenuP.h:
    * src/xrdb.c:
    * src/xsettings.c:
    * src/xterm.c: Replace all #ifdef HAVE_XFT with #if defined USE_CAIRO ||
    defined HAVE_XFT.
    * src/xfns.c (x_default_font_parameter): Replace #ifdef HAVE_XFT with #if
    defined     USE_CAIRO || defined HAVE_XFT.
---
 configure.ac        |  52 ++++++++++++-------
 lwlib/lwlib-Xaw.c   |  28 +++++++----
 lwlib/lwlib-int.h   |   2 +-
 lwlib/lwlib-utils.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 lwlib/lwlib-utils.h |  45 +++++++++++++++++
 lwlib/xlwmenu.c     |  43 +++++++++-------
 lwlib/xlwmenuP.h    |  10 ++--
 src/menu.c          |   2 +-
 src/xfns.c          |   2 +-
 src/xrdb.c          |   4 +-
 src/xsettings.c     |  58 ++++++++++++----------
 src/xterm.c         |   2 +-
 12 files changed, 307 insertions(+), 81 deletions(-)

diff --git a/configure.ac b/configure.ac
index 8b363c7..810c321 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3312,12 +3312,44 @@ if test "${HAVE_X11}" = "yes"; then
   fi
 fi
 
+HAVE_CAIRO=no
+if test "${HAVE_X11}" = "yes"; then
+  if test "${with_cairo}" != "no"; then
+    CAIRO_REQUIRED=1.12.0
+    CAIRO_MODULE="cairo >= $CAIRO_REQUIRED"
+    EMACS_CHECK_MODULES(CAIRO, $CAIRO_MODULE)
+    if test $HAVE_CAIRO = yes; then
+      AC_DEFINE(USE_CAIRO, 1, [Define to 1 if using cairo.])
+    else
+      AC_MSG_ERROR([cairo requested but not found.])
+    fi
+
+    CFLAGS="$CFLAGS $CAIRO_CFLAGS"
+    LIBS="$LIBS $CAIRO_LIBS"
+    AC_SUBST(CAIRO_CFLAGS)
+    AC_SUBST(CAIRO_LIBS)
+  fi
+fi
+
 ### Start of font-backend (under any platform) section.
 # (nothing here yet -- this is a placeholder)
 ### End of font-backend (under any platform) section.
 
 ### Start of font-backend (under X11) section.
 if test "${HAVE_X11}" = "yes"; then
+  if test $HAVE_CAIRO = yes; then
+    dnl Strict linkers fail with
+    dnl ftfont.o: undefined reference to symbol 'FT_New_Face'
+    dnl if -lfreetype is not specified.
+    dnl The following is needed to set FREETYPE_LIBS.
+    EMACS_CHECK_MODULES([FREETYPE], [freetype2])
+
+    test "$HAVE_FREETYPE" = "no" && AC_MSG_ERROR(cairo requires libfreetype)
+
+    EMACS_CHECK_MODULES([FONTCONFIG], [fontconfig >= 2.2.0])
+
+    test "$HAVE_FONTCONFIG" = "no" && AC_MSG_ERROR(cairo requires 
libfontconfig)
+  else
     ## Use -lXft if available, unless '--with-xft=no'.
     HAVE_XFT=maybe
     if test "x${with_x}" = "xno"; then
@@ -3374,6 +3406,7 @@ if test "${HAVE_X11}" = "yes"; then
 
        test "$HAVE_FREETYPE" = "no" && AC_MSG_ERROR(libxft requires 
libfreetype)
     fi
+  fi                             # $HAVE_CAIRO != yes
 
     HAVE_LIBOTF=no
     if test "${HAVE_FREETYPE}" = "yes"; then
@@ -3427,25 +3460,6 @@ AC_SUBST(LIBOTF_LIBS)
 AC_SUBST(M17N_FLT_CFLAGS)
 AC_SUBST(M17N_FLT_LIBS)
 
-HAVE_CAIRO=no
-if test "${HAVE_X11}" = "yes"; then
-  if test "${with_cairo}" != "no"; then
-    CAIRO_REQUIRED=1.12.0
-    CAIRO_MODULE="cairo >= $CAIRO_REQUIRED"
-    EMACS_CHECK_MODULES(CAIRO, $CAIRO_MODULE)
-    if test $HAVE_CAIRO = yes; then
-      AC_DEFINE(USE_CAIRO, 1, [Define to 1 if using cairo.])
-    else
-      AC_MSG_ERROR([cairo requested but not found.])
-    fi
-
-    CFLAGS="$CFLAGS $CAIRO_CFLAGS"
-    LIBS="$LIBS $CAIRO_LIBS"
-    AC_SUBST(CAIRO_CFLAGS)
-    AC_SUBST(CAIRO_LIBS)
-  fi
-fi
-
 if test "${HAVE_X11}" = "yes"; then
   AC_CHECK_HEADER(X11/Xlib-xcb.h,
     AC_CHECK_LIB(xcb, xcb_translate_coordinates, HAVE_XCB=yes))
diff --git a/lwlib/lwlib-Xaw.c b/lwlib/lwlib-Xaw.c
index a00f8aa..0801c94 100644
--- a/lwlib/lwlib-Xaw.c
+++ b/lwlib/lwlib-Xaw.c
@@ -50,8 +50,13 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
 #include <X11/Xatom.h>
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
+#ifdef USE_CAIRO
+#include <stdlib.h>
+#include "lwlib-utils.h"
+#else  /* HAVE_XFT */
 #include <X11/Xft/Xft.h>
+#endif
 
 struct widget_xft_data
 {
@@ -79,7 +84,7 @@ lw_xaw_widget_p (Widget widget)
 }
 
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 static void
 fill_xft_data (struct widget_xft_data *data, Widget widget, XftFont *font)
 {
@@ -210,6 +215,9 @@ draw_text (struct widget_xft_data *data, char *lbl, int 
inverse)
       /* 1.2 gives reasonable line spacing.  */
       y += data->xft_font->height * 1.2;
     }
+#ifdef USE_CAIRO
+  cairo_surface_flush (cairo_get_target (data->xft_draw));
+#endif
 
 }
 
@@ -307,7 +315,7 @@ xaw_update_one_widget (widget_instance *instance,
   if (XtIsSubclass (widget, dialogWidgetClass))
     {
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       if (instance->xft_data && instance->xft_data[0].xft_font)
         {
           set_text (&instance->xft_data[0], instance->parent,
@@ -339,7 +347,7 @@ xaw_update_one_widget (widget_instance *instance,
       XtSetArg (al[ac], XtNlabel, val->value);ac++;
       /* Force centered button text.  Se above. */
       XtSetArg (al[ac], XtNjustify, XtJustifyCenter);ac++;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       if (instance->xft_data && instance->xft_data[0].xft_font)
         {
           int th;
@@ -473,7 +481,7 @@ static XtActionsRec xaw_actions [] = {
 };
 static Boolean actions_initted = False;
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 static XtActionsRec button_actions[] =
   {
     { "my_reset", command_reset },
@@ -506,7 +514,7 @@ make_dialog (char* name,
   Widget dialog;
   Widget button;
   XtTranslations override;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   XftFont *xft_font = 0;
   XtTranslations button_override;
 #endif
@@ -521,7 +529,7 @@ make_dialog (char* name,
       XtAppContext app = XtWidgetToApplicationContext (parent);
       XtAppAddActions (app, xaw_actions,
                       sizeof (xaw_actions) / sizeof (xaw_actions[0]));
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       XtAppAddActions (app, button_actions,
                       sizeof (button_actions) / sizeof (button_actions[0]));
 #endif
@@ -546,7 +554,7 @@ make_dialog (char* name,
   override = XtParseTranslationTable (dialogOverride);
   XtOverrideTranslations (dialog, override);
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   {
     int num;
     Widget *ch = NULL;
@@ -618,7 +626,7 @@ make_dialog (char* name,
       sprintf (button_name, "button%d", ++bc);
       button = XtCreateManagedWidget (button_name, commandWidgetClass,
                                      dialog, av, ac);
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       if (xft_font)
         {
           fill_xft_data (&instance->xft_data[bc], button, xft_font);
@@ -651,7 +659,7 @@ make_dialog (char* name,
       sprintf (button_name, "button%d", ++bc);
       button = XtCreateManagedWidget (button_name, commandWidgetClass,
                                      dialog, av, ac);
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       if (xft_font)
         {
           fill_xft_data (&instance->xft_data[bc], button, xft_font);
diff --git a/lwlib/lwlib-int.h b/lwlib/lwlib-int.h
index 28b1fb9..9f788e7 100644
--- a/lwlib/lwlib-int.h
+++ b/lwlib/lwlib-int.h
@@ -30,7 +30,7 @@ typedef struct _widget_instance
   Widget               widget;
   Widget               parent;
   Boolean              pop_up_p;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   struct widget_xft_data *xft_data;
 #endif
   struct _widget_info*         info;
diff --git a/lwlib/lwlib-utils.c b/lwlib/lwlib-utils.c
index 7c60bdb..2c0a931 100644
--- a/lwlib/lwlib-utils.c
+++ b/lwlib/lwlib-utils.c
@@ -137,3 +137,143 @@ XtWidgetBeingDestroyedP (Widget widget)
 {
   return widget->core.being_destroyed;
 }
+
+#ifdef USE_CAIRO
+/* Xft emulation on cairo.  */
+#include <math.h>
+#include <cairo-ft.h>
+#include <cairo-xlib.h>
+
+XftFont *
+crxft_font_open_name (Display *dpy, int screen, const char *name)
+{
+  XftFont *pub = NULL;
+  FcPattern *pattern = FcNameParse ((FcChar8 *) name);
+  if (pattern)
+    {
+      FcConfigSubstitute (NULL, pattern, FcMatchPattern);
+      double dpi;
+      if (FcPatternGetDouble (pattern, FC_DPI, 0, &dpi) == FcResultNoMatch)
+       {
+         char *v = XGetDefault (dpy, "Xft", FC_DPI);
+         if (v == NULL || sscanf (v, "%lf", &dpi) != 1)
+           dpi = ((DisplayHeight (dpy, screen) * 25.4)
+                  / DisplayHeightMM (dpy, screen));
+         FcPatternAddDouble (pattern, FC_DPI, dpi);
+       }
+      FcDefaultSubstitute (pattern);
+      cairo_font_face_t *font_face
+       = cairo_ft_font_face_create_for_pattern (pattern);
+      if (font_face)
+       {
+         double pixel_size;
+         if ((FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &pixel_size)
+              != FcResultMatch)
+             || pixel_size < 1)
+           pixel_size = 10;
+
+         pub = xmalloc (sizeof (*pub));
+         cairo_matrix_t font_matrix, ctm;
+         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);
+         pub->scaled_font = cairo_scaled_font_create (font_face, &font_matrix,
+                                                      &ctm, options);
+         cairo_font_face_destroy (font_face);
+         cairo_font_options_destroy (options);
+
+         cairo_font_extents_t extents;
+         cairo_scaled_font_extents (pub->scaled_font, &extents);
+         pub->ascent = lround (extents.ascent);
+         pub->descent = lround (extents.descent);
+         pub->height = lround (extents.height);
+         pub->max_advance_width = lround (extents.max_x_advance);
+       }
+      FcPatternDestroy (pattern);
+    }
+  return pub;
+}
+
+void
+crxft_font_close (XftFont *pub)
+{
+  cairo_scaled_font_destroy (pub->scaled_font);
+  xfree (pub);
+}
+
+cairo_t *
+crxft_draw_create (Display *dpy, Drawable drawable, Visual *visual)
+{
+  cairo_t *cr = NULL;
+  Window root;
+  int x, y;
+  unsigned int width, height, border_width, depth;
+
+  if (!XGetGeometry (dpy, drawable, &root, &x, &y, &width, &height,
+                    &border_width, &depth))
+    return NULL;
+
+  cairo_surface_t *surface = cairo_xlib_surface_create (dpy, drawable, visual,
+                                                       width, height);
+  if (surface)
+    {
+      cr = cairo_create (surface);
+      cairo_surface_destroy (surface);
+    }
+
+  return cr;
+}
+
+static void
+crxft_set_source_color (cairo_t *cr, const XftColor *color)
+{
+  cairo_set_source_rgba (cr, color->color.red / 65535.0,
+                        color->color.green / 65535.0,
+                        color->color.blue / 65535.0,
+                        color->color.alpha / 65535.0);
+}
+
+void
+crxft_draw_rect (cairo_t *cr, const XftColor *color, int x, int y,
+                unsigned int width, unsigned int height)
+{
+  crxft_set_source_color (cr, color);
+  cairo_rectangle (cr, x, y, width, height);
+  cairo_fill (cr);
+}
+
+void
+crxft_draw_string (cairo_t *cr, const XftColor *color, XftFont *pub,
+                  int x, int y, const FcChar8 *string, int len)
+{
+  char *buf = xmalloc (len + 1);
+  memcpy (buf, string, len);
+  buf[len] = '\0';
+  crxft_set_source_color (cr, color);
+  cairo_set_scaled_font (cr, pub->scaled_font);
+  cairo_move_to (cr, x, y);
+  cairo_show_text (cr, buf);
+  xfree (buf);
+}
+
+void
+crxft_text_extents (XftFont *pub, const FcChar8 *string, int len,
+                   XGlyphInfo *extents)
+{
+  char *buf = xmalloc (len + 1);
+  memcpy (buf, string, len);
+  buf[len] = '\0';
+  cairo_text_extents_t text_extents;
+  cairo_scaled_font_text_extents (pub->scaled_font, buf, &text_extents);
+  xfree (buf);
+  extents->x = ceil (- text_extents.x_bearing);
+  extents->y = ceil (- text_extents.y_bearing);
+  extents->width = (ceil (text_extents.x_bearing + text_extents.width)
+                   + extents->x);
+  extents->height = (ceil (text_extents.y_bearing + text_extents.height)
+                    + extents->y);
+  extents->xOff = lround (text_extents.x_advance);
+  extents->yOff = lround (text_extents.y_advance);
+}
+#endif /* USE_CAIRO */
diff --git a/lwlib/lwlib-utils.h b/lwlib/lwlib-utils.h
index ec3daab..64372f1 100644
--- a/lwlib/lwlib-utils.h
+++ b/lwlib/lwlib-utils.h
@@ -15,4 +15,49 @@ Widget *XtCompositeChildren (Widget, unsigned int *);
 Boolean
 XtWidgetBeingDestroyedP (Widget widget);
 
+#ifdef USE_CAIRO
+
+#include <cairo.h>
+#include <fontconfig/fontconfig.h>
+
+typedef struct {
+  cairo_scaled_font_t *scaled_font;
+  int ascent, descent, height, max_advance_width;
+} XftFont;
+
+typedef cairo_t XftDraw;
+
+typedef struct {
+  unsigned long pixel;
+  struct {unsigned short red, green, blue, alpha;} color;
+} XftColor;
+
+#ifdef HAVE_XRENDER
+#include <X11/extensions/Xrender.h>
+#else
+typedef struct {
+  unsigned short width, height;
+  short x, y, xOff, yOff;
+} XGlyphInfo;
+#endif
+
+#define XftFontOpenName crxft_font_open_name
+extern XftFont *crxft_font_open_name (Display *, int, const char *);
+#define XftFontClose(dpy, pub) crxft_font_close (pub)
+extern void crxft_font_close (XftFont *);
+#define XftDrawCreate(dpy, drawable, visual, colormap) \
+  crxft_draw_create (dpy, drawable, visual)
+extern cairo_t *crxft_draw_create (Display *, Drawable, Visual *);
+#define XftDrawDestroy cairo_destroy
+#define XftDrawRect crxft_draw_rect
+extern void crxft_draw_rect (cairo_t *, const XftColor *, int, int,
+                            unsigned int, unsigned int);
+#define XftDrawStringUtf8 crxft_draw_string
+extern void crxft_draw_string (cairo_t *, const XftColor *, XftFont *,
+                              int, int, const FcChar8 *, int);
+#define XftTextExtentsUtf8(dpy, pub, string, len, extents) \
+  crxft_text_extents (pub, string, len, extents)
+extern void crxft_text_extents (XftFont *, const FcChar8 *, int, XGlyphInfo *);
+
+#endif /* USE_CAIRO */
 #endif /* _LWLIB_UTILS_H_ */
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index a5704cb..6292c84 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -107,7 +107,7 @@ xlwMenuResources[] =
   {XtNfontSet,  XtCFontSet, XtRFontSet, sizeof(XFontSet),
      offset(menu.fontSet), XtRFontSet, NULL},
 #endif
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 #define DEFAULT_FONTNAME "Sans-10"
 #else
 #define DEFAULT_FONTNAME "XtDefaultFont"
@@ -325,7 +325,7 @@ string_width (XlwMenuWidget mw, char *s)
 {
   XCharStruct xcs;
   int drop;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   if (mw->menu.xft_font)
     {
       XGlyphInfo gi;
@@ -349,7 +349,7 @@ string_width (XlwMenuWidget mw, char *s)
 
 }
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 #define MENU_FONT_HEIGHT(mw)                                    \
   ((mw)->menu.xft_font != NULL                                  \
    ? (mw)->menu.xft_font->height                                \
@@ -965,7 +965,7 @@ display_menu_item (XlwMenuWidget mw,
   int width;
   enum menu_separator separator;
   int separator_p = lw_separator_p (val->name, &separator, 0);
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   XftColor *xftfg;
 #endif
 
@@ -1005,7 +1005,7 @@ display_menu_item (XlwMenuWidget mw,
       else
        text_gc = mw->menu.disabled_gc;
       deco_gc = mw->menu.foreground_gc;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       xftfg = val->enabled ? &mw->menu.xft_fg : &mw->menu.xft_disabled_fg;
 #endif
 
@@ -1032,10 +1032,13 @@ display_menu_item (XlwMenuWidget mw,
            x_offset += ws->button_width;
 
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
           if (ws->xft_draw)
             {
               int draw_y = y + v_spacing + shadow;
+#ifdef USE_CAIRO
+             cairo_surface_mark_dirty (cairo_get_target (ws->xft_draw));
+#endif
               XftDrawStringUtf8 (ws->xft_draw, xftfg,
                                  mw->menu.xft_font,
                                  x_offset, draw_y + font_ascent,
@@ -1078,7 +1081,7 @@ display_menu_item (XlwMenuWidget mw,
                }
              else if (val->key)
                {
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
                   if (ws->xft_draw)
                     {
                       int draw_x = ws->width - ws->max_rest_width
@@ -1119,6 +1122,10 @@ display_menu_item (XlwMenuWidget mw,
              draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height,
                                     True, False);
            }
+#ifdef USE_CAIRO
+         if (ws->xft_draw)
+           cairo_surface_flush (cairo_get_target (ws->xft_draw));
+#endif
 
          if (highlighted_p)
            draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, False,
@@ -1320,7 +1327,7 @@ make_windows_if_needed (XlwMenuWidget mw, int n)
      XtAddEventHandler (windows [i].w, ExposureMask, False, expose_cb, mw);
      windows [i].window = XtWindow (windows [i].w);
      windows [i].pixmap = None;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
      windows [i].xft_draw = 0;
 #endif
      set_window_type (windows [i].w, mw);
@@ -1411,7 +1418,7 @@ create_pixmap_for_menu (window_state* ws, XlwMenuWidget 
mw)
   ws->pixmap = XCreatePixmap (XtDisplay (ws->w), ws->window,
                               ws->width, ws->height,
                               DefaultDepthOfScreen (XtScreen (ws->w)));
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   if (ws->xft_draw)
     XftDrawDestroy (ws->xft_draw);
   if (mw->menu.xft_font)
@@ -1831,7 +1838,7 @@ release_shadow_gcs (XlwMenuWidget mw)
   XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc);
 }
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 static XftFont *
 getDefaultXftFont (XlwMenuWidget mw)
 {
@@ -1887,7 +1894,7 @@ XlwMenuInitialize (Widget request, Widget w, ArgList 
args, Cardinal *num_args)
                                   gray_width, gray_height,
                                   (unsigned long)1, (unsigned long)0, 1);
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   if (openXftFont (mw))
     ;
   else
@@ -1933,7 +1940,7 @@ XlwMenuInitialize (Widget request, Widget w, ArgList 
args, Cardinal *num_args)
   mw->menu.windows [0].height = 0;
   mw->menu.windows [0].max_rest_width = 0;
   mw->menu.windows [0].pixmap = None;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   mw->menu.windows [0].xft_draw = 0;
 #endif
   size_menu (mw, 0);
@@ -1981,7 +1988,7 @@ XlwMenuRealize (Widget w, Mask *valueMask, 
XSetWindowAttributes *attributes)
   set_window_type (mw->menu.windows [0].w, mw);
   create_pixmap_for_menu (&mw->menu.windows [0], mw);
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   if (mw->menu.xft_font)
     {
       XColor colors[3];
@@ -2078,7 +2085,7 @@ XlwMenuDestroy (Widget w)
   if (mw->menu.font)
     XFreeFont (XtDisplay (mw), mw->menu.font);
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   if (mw->menu.windows [0].xft_draw)
     XftDrawDestroy (mw->menu.windows [0].xft_draw);
   if (mw->menu.xft_font)
@@ -2092,7 +2099,7 @@ XlwMenuDestroy (Widget w)
     {
       if (mw->menu.windows [i].pixmap != None)
         XFreePixmap (XtDisplay (mw), mw->menu.windows [i].pixmap);
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       if (mw->menu.windows [i].xft_draw)
         XftDrawDestroy (mw->menu.windows [i].xft_draw);
 #endif
@@ -2102,7 +2109,7 @@ XlwMenuDestroy (Widget w)
     XtFree ((char *) mw->menu.windows);
 }
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 static int
 fontname_changed (XlwMenuWidget newmw,
                   XlwMenuWidget oldmw)
@@ -2134,7 +2141,7 @@ XlwMenuSetValues (Widget current, Widget request, Widget 
new,
 
   if (newmw->core.background_pixel != oldmw->core.background_pixel
       || newmw->menu.foreground != oldmw->menu.foreground
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       || fontname_changed (newmw, oldmw)
 #endif
 #ifdef HAVE_X_I18N
@@ -2170,7 +2177,7 @@ XlwMenuSetValues (Widget current, Widget request, Widget 
new,
          }
     }
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   if (fontname_changed (newmw, oldmw))
     {
       int i;
diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h
index 610f83a..2a05d99 100644
--- a/lwlib/xlwmenuP.h
+++ b/lwlib/xlwmenuP.h
@@ -23,9 +23,13 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
 #include "xlwmenu.h"
 #include <X11/CoreP.h>
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
+#ifdef USE_CAIRO
+#include "lwlib-utils.h"
+#else  /* HAVE_XFT */
 #include <X11/Xft/Xft.h>
 #endif
+#endif
 
 /* Elements in the stack arrays. */
 typedef struct _window_state
@@ -42,7 +46,7 @@ typedef struct _window_state
 
   /* Width of toggle buttons or radio buttons.  */
   Dimension     button_width;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   XftDraw*      xft_draw;
 #endif
 } window_state;
@@ -56,7 +60,7 @@ typedef struct _XlwMenu_part
   XFontSet     fontSet;
   XFontSetExtents *font_extents;
 #endif
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   int           default_face;
   XftFont*      xft_font;
   XftColor      xft_fg, xft_bg, xft_disabled_fg;
diff --git a/src/menu.c b/src/menu.c
index 7f46e68..e82c857 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -687,7 +687,7 @@ digest_single_submenu (int start, int end, bool 
top_level_items)
 
                  ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
                }
-#elif defined (USE_LUCID) && defined (HAVE_XFT)
+#elif defined (USE_LUCID) && (defined USE_CAIRO || defined HAVE_XFT)
              if (STRINGP (pane_name))
                {
                  pane_name = ENCODE_UTF_8 (pane_name);
diff --git a/src/xfns.c b/src/xfns.c
index dbc5e10..9075491 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -3487,7 +3487,7 @@ x_default_font_parameter (struct frame *f, Lisp_Object 
parms)
     {
       const char *names[]
        = {
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
            /* This will find the normal Xft font.  */
            "monospace-10",
 #endif
diff --git a/src/xrdb.c b/src/xrdb.c
index 35de446..0950b70 100644
--- a/src/xrdb.c
+++ b/src/xrdb.c
@@ -383,7 +383,7 @@ x_load_resources (Display *display, const char *xrm_string,
   XrmDatabase db;
   char line[256];
 
-#if defined USE_MOTIF || !defined HAVE_XFT || !defined USE_LUCID
+#if defined USE_MOTIF || !(defined USE_CAIRO || defined HAVE_XFT) || !defined 
USE_LUCID
   const char *helv = "-*-helvetica-medium-r-*--*-120-*-*-*-*-iso8859-1";
 #endif
 
@@ -456,7 +456,7 @@ x_load_resources (Display *display, const char *xrm_string,
 
   sprintf (line, "Emacs.dialog*.background: grey75");
   XrmPutLineResource (&rdb, line);
-#if !defined (HAVE_XFT) || !defined (USE_LUCID)
+#if !(defined USE_CAIRO || defined HAVE_XFT) || !defined (USE_LUCID)
   sprintf (line, "Emacs.dialog*.font: %s", helv);
   XrmPutLineResource (&rdb, line);
   sprintf (line, "*XlwMenu*font: %s", helv);
diff --git a/src/xsettings.c b/src/xsettings.c
index 947d5cf..3e9012e 100644
--- a/src/xsettings.c
+++ b/src/xsettings.c
@@ -45,9 +45,13 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include <gconf/gconf-client.h>
 #endif
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
+#ifdef USE_CAIRO
+#include <fontconfig/fontconfig.h>
+#else  /* HAVE_XFT */
 #include <X11/Xft/Xft.h>
 #endif
+#endif
 
 static char *current_mono_font;
 static char *current_font;
@@ -83,7 +87,7 @@ dpyinfo_valid (struct x_display_info *dpyinfo)
 
 /* Store a monospace font change event if the monospaced font changed.  */
 
-#if defined HAVE_XFT && (defined HAVE_GSETTINGS || defined HAVE_GCONF)
+#if (defined USE_CAIRO || defined HAVE_XFT) && (defined HAVE_GSETTINGS || 
defined HAVE_GCONF)
 static void
 store_monospaced_changed (const char *newfont)
 {
@@ -102,7 +106,7 @@ store_monospaced_changed (const char *newfont)
 
 /* Store a font name change event if the font name changed.  */
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 static void
 store_font_name_changed (const char *newfont)
 {
@@ -117,7 +121,7 @@ store_font_name_changed (const char *newfont)
                                   XCAR (first_dpyinfo->name_list_element));
     }
 }
-#endif /* HAVE_XFT */
+#endif /* USE_CAIRO || HAVE_XFT */
 
 /* Map TOOL_BAR_STYLE from a string to its corresponding Lisp value.
    Return Qnil if TOOL_BAR_STYLE is not known.  */
@@ -157,7 +161,7 @@ store_tool_bar_style_changed (const char *newstyle,
                                 XCAR (dpyinfo->name_list_element));
 }
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 #define XSETTINGS_FONT_NAME       "Gtk/FontName"
 #endif
 #define XSETTINGS_TOOL_BAR_STYLE  "Gtk/ToolbarStyle"
@@ -174,7 +178,7 @@ enum {
 };
 struct xsettings
 {
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   FcBool aa, hinting;
   int rgba, lcdfilter, hintstyle;
   double dpi;
@@ -191,7 +195,7 @@ struct xsettings
 #define GSETTINGS_SCHEMA         "org.gnome.desktop.interface"
 #define GSETTINGS_TOOL_BAR_STYLE "toolbar-style"
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 #define GSETTINGS_MONO_FONT  "monospace-font-name"
 #define GSETTINGS_FONT_NAME  "font-name"
 #endif
@@ -224,7 +228,7 @@ something_changed_gsettingsCB (GSettings *settings,
           g_variant_unref (val);
         }
     }
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   else if (strcmp (key, GSETTINGS_MONO_FONT) == 0)
     {
       val = g_settings_get_value (settings, GSETTINGS_MONO_FONT);
@@ -253,14 +257,14 @@ something_changed_gsettingsCB (GSettings *settings,
           g_variant_unref (val);
         }
     }
-#endif /* HAVE_XFT */
+#endif /* USE_CAIRO || HAVE_XFT */
 }
 
 #endif /* HAVE_GSETTINGS */
 
 #ifdef HAVE_GCONF
 #define GCONF_TOOL_BAR_STYLE "/desktop/gnome/interface/toolbar_style"
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 #define GCONF_MONO_FONT  "/desktop/gnome/interface/monospace_font_name"
 #define GCONF_FONT_NAME  "/desktop/gnome/interface/font_name"
 #endif
@@ -286,7 +290,7 @@ something_changed_gconfCB (GConfClient *client,
       const char *value = gconf_value_get_string (v);
       store_tool_bar_style_changed (value, first_dpyinfo);
     }
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   else if (strcmp (key, GCONF_MONO_FONT) == 0)
     {
       const char *value = gconf_value_get_string (v);
@@ -297,12 +301,12 @@ something_changed_gconfCB (GConfClient *client,
       const char *value = gconf_value_get_string (v);
       store_font_name_changed (value);
     }
-#endif /* HAVE_XFT */
+#endif /* USE_CAIRO || HAVE_XFT */
 }
 
 #endif /* HAVE_GCONF */
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
 
 /* Older fontconfig versions don't have FC_LCD_*.  */
 #ifndef FC_LCD_NONE
@@ -315,7 +319,7 @@ something_changed_gconfCB (GConfClient *client,
 #define FC_LCD_FILTER "lcdfilter"
 #endif
 
-#endif /* HAVE_XFT */
+#endif /* USE_CAIRO || HAVE_XFT */
 
 /* Find the window that contains the XSETTINGS property values.  */
 
@@ -440,7 +444,7 @@ parse_settings (unsigned char *prop,
       if (bytes_parsed > bytes) return settings_seen;
 
       want_this = strcmp (XSETTINGS_TOOL_BAR_STYLE, name) == 0;
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
       if ((nlen > 6 && memcmp (name, "Xft/", 4) == 0)
          || strcmp (XSETTINGS_FONT_NAME, name) == 0)
        want_this = true;
@@ -490,7 +494,7 @@ parse_settings (unsigned char *prop,
               dupstring (&settings->tb_style, sval);
               settings->seen |= SEEN_TB_STYLE;
             }
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
           else if (strcmp (name, XSETTINGS_FONT_NAME) == 0)
             {
               dupstring (&settings->font, sval);
@@ -553,7 +557,7 @@ parse_settings (unsigned char *prop,
               else
                 settings->seen &= ~SEEN_LCDFILTER;
             }
-#endif /* HAVE_XFT */
+#endif /* USE_CAIRO || HAVE_XFT */
          else
            want_this = false;
          settings_seen += want_this;
@@ -604,16 +608,18 @@ static void
 apply_xft_settings (struct x_display_info *dpyinfo,
                     struct xsettings *settings)
 {
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   FcPattern *pat;
   struct xsettings oldsettings;
   bool changed = false;
 
   memset (&oldsettings, 0, sizeof (oldsettings));
   pat = FcPatternCreate ();
+#ifdef HAVE_XFT
   XftDefaultSubstitute (dpyinfo->display,
                         XScreenNumberOfScreen (dpyinfo->screen),
                         pat);
+#endif
   FcPatternGetBool (pat, FC_ANTIALIAS, 0, &oldsettings.aa);
   FcPatternGetBool (pat, FC_HINTING, 0, &oldsettings.hinting);
 #ifdef FC_HINT_STYLE
@@ -713,7 +719,9 @@ apply_xft_settings (struct x_display_info *dpyinfo,
       };
       char buf[sizeof format + d_formats * d_growth + lf_formats * lf_growth];
 
+#ifdef HAVE_XFT
       XftDefaultSet (dpyinfo->display, pat);
+#endif
       store_config_changed_event (Qfont_render,
                                  XCAR (dpyinfo->name_list_element));
       Vxft_settings
@@ -725,7 +733,7 @@ apply_xft_settings (struct x_display_info *dpyinfo,
     }
   else
     FcPatternDestroy (pat);
-#endif /* HAVE_XFT */
+#endif /* USE_CAIRO || HAVE_XFT */
 }
 
 /* Read XSettings from the display for DPYINFO.
@@ -748,7 +756,7 @@ read_and_apply_settings (struct x_display_info *dpyinfo, 
bool send_event_p)
         current_tool_bar_style = map_tool_bar_style (settings.tb_style);
       xfree (settings.tb_style);
     }
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   if (settings.seen & SEEN_FONT)
     {
       if (send_event_p)
@@ -850,7 +858,7 @@ init_gsettings (void)
       g_variant_unref (val);
     }
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   val = g_settings_get_value (gsettings_client, GSETTINGS_MONO_FONT);
   if (val)
     {
@@ -868,7 +876,7 @@ init_gsettings (void)
         dupstring (&current_font, g_variant_get_string (val, NULL));
       g_variant_unref (val);
     }
-#endif /* HAVE_XFT */
+#endif /* USE_CAIRO || HAVE_XFT */
 
 #endif /* HAVE_GSETTINGS */
 }
@@ -903,7 +911,7 @@ init_gconf (void)
       g_free (s);
     }
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   s = gconf_client_get_string (gconf_client, GCONF_MONO_FONT, NULL);
   if (s)
     {
@@ -932,7 +940,7 @@ init_gconf (void)
                            GCONF_FONT_NAME,
                            something_changed_gconfCB,
                            NULL, NULL, NULL);
-#endif /* HAVE_XFT */
+#endif /* USE_CAIRO || HAVE_XFT */
 #endif /* HAVE_GCONF */
 }
 
@@ -1055,7 +1063,7 @@ If this variable is nil, Emacs ignores system font 
changes.  */);
                doc: /* Font settings applied to Xft.  */);
   Vxft_settings = empty_unibyte_string;
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   Fprovide (intern_c_string ("font-render-setting"), Qnil);
 #if defined (HAVE_GCONF) || defined (HAVE_GSETTINGS)
   Fprovide (intern_c_string ("system-font-setting"), Qnil);
diff --git a/src/xterm.c b/src/xterm.c
index 0b83263..e85e8e3 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -12733,7 +12733,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
     dpyinfo->supports_xdbe = true;
 #endif
 
-#ifdef HAVE_XFT
+#if defined USE_CAIRO || defined HAVE_XFT
   {
     /* If we are using Xft, the following precautions should be made:
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]