From e9558d441dfafa37efd85c5341b519adc6985319 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Mon, 16 Jun 2014 12:49:09 +0400 Subject: [PATCH] Do not ask for XRender extension each time XFT font is opened. * xftfont.c (xftfont_open): Move call to XRenderQueryExtension ... * xterm.c (x_term_init) [HAVE_XFT]: ... to here. Adjust comment. --- src/ChangeLog | 6 ++++++ src/xftfont.c | 10 ---------- src/xterm.c | 32 +++++++++++++++++++++++++------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 66ccae26c5c..a97cc3a2567 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2014-06-16 Dmitry Antipov + + Do not ask for XRender extension each time XFT font is opened. + * xftfont.c (xftfont_open): Move call to XRenderQueryExtension ... + * xterm.c (x_term_init) [HAVE_XFT]: ... to here. Adjust comment. + 2014-06-15 Glenn Morris * Makefile.in: Use `make -C' rather than `cd && make' throughout. diff --git a/src/xftfont.c b/src/xftfont.c index 421eb713a15..2b4ec065734 100644 --- a/src/xftfont.c +++ b/src/xftfont.c @@ -322,16 +322,6 @@ xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size) block_input (); - /* Make sure that the Xrender extension is added before the Xft one. - Otherwise, the close-display hook set by Xft is called after the - one for Xrender, and the former tries to re-add the latter. This - results in inconsistency of internal states and leads to X - protocol error when one reconnects to the same X server. - (Bug#1696) */ - { - int event_base, error_base; - XRenderQueryExtension (display, &event_base, &error_base); - } /* Substitute in values from X resources and XftDefaultSet. */ XftDefaultSubstitute (display, FRAME_X_SCREEN_NUMBER (f), pat); diff --git a/src/xterm.c b/src/xterm.c index b6728880f5d..a5f6ae7d0ab 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -37,6 +37,11 @@ along with GNU Emacs. If not, see . */ #include #endif +/* Using Xft implies that XRender is available. */ +#ifdef HAVE_XFT +#include +#endif + /* Load sys/types.h if not already loaded. In some systems loading it twice is suicidal. */ #ifndef makedev @@ -10086,14 +10091,27 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) #ifdef HAVE_XFT { - /* If we are using Xft, check dpi value in X resources. - It is better we use it as well, since Xft will use it, as will all - Gnome applications. If our real DPI is smaller or larger than the - one Xft uses, our font will look smaller or larger than other - for other applications, even if it is the same font name (monospace-10 - for example). */ - char *v = XGetDefault (dpyinfo->display, "Xft", "dpi"); + /* If we are using Xft, the following precautions should be made: + + 1. Make sure that the Xrender extension is added before the Xft one. + Otherwise, the close-display hook set by Xft is called after the one + for Xrender, and the former tries to re-add the latter. This results + in inconsistency of internal states and leads to X protocol error when + one reconnects to the same X server (Bug#1696). + + 2. Check dpi value in X resources. It is better we use it as well, + since Xft will use it, as will all Gnome applications. If our real DPI + is smaller or larger than the one Xft uses, our font will look smaller + or larger than other for other applications, even if it is the same + font name (monospace-10 for example). */ + + int event_base, error_base; + char *v; double d; + + XRenderQueryExtension (dpyinfo->display, &event_base, &error_base); + + v = XGetDefault (dpyinfo->display, "Xft", "dpi"); if (v != NULL && sscanf (v, "%lf", &d) == 1) dpyinfo->resy = dpyinfo->resx = d; } -- 2.39.5