From 8c184bb166048e9ae65245cab75a4d49642a69fe Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 20 Jan 2022 10:48:25 +0800 Subject: [PATCH] Get rid of calls to XRenderQueryExtension after terminal initialization * src/image.c (x_create_xrender_picture): (Fimage_transforms_p): Use `xrender_supported_p'. * src/xterm.c (x_term_init): Query for XRender support and extension versions. * src/xterm.h (struct x_display_info): New fields `xrender_supported_p', `xrender_major' and `xrender_minor'. --- src/image.c | 6 ++---- src/xterm.c | 18 +++++++++++++----- src/xterm.h | 6 ++++++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/image.c b/src/image.c index a4976caba86..ce9af2dd677 100644 --- a/src/image.c +++ b/src/image.c @@ -2906,9 +2906,8 @@ x_create_xrender_picture (struct frame *f, Emacs_Pixmap pixmap, int depth) { Picture p; Display *display = FRAME_X_DISPLAY (f); - int event_basep, error_basep; - if (XRenderQueryExtension (display, &event_basep, &error_basep)) + if (FRAME_DISPLAY_INFO (f)->xrender_supported_p) { if (depth <= 0) depth = DefaultDepthOfScreen (FRAME_X_SCREEN (f)); @@ -11198,8 +11197,7 @@ The list of capabilities can include one or more of the following: # elif defined (HAVE_X_WINDOWS) && defined (HAVE_XRENDER) int event_basep, error_basep; - if (XRenderQueryExtension (FRAME_X_DISPLAY (f), - &event_basep, &error_basep)) + if (FRAME_DISPLAY_INFO (f)->xrender_supported_p) return list2 (Qscale, Qrotate90); # elif defined (HAVE_NTGUI) return (w32_image_rotations_p () diff --git a/src/xterm.c b/src/xterm.c index d3619f5b5e6..7a63d9353a0 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -15393,6 +15393,19 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) } #endif +#ifdef HAVE_XRENDER + int event_base, error_base; + dpyinfo->xrender_supported_p + = XRenderQueryExtension (dpyinfo->display, &event_base, &error_base); + + if (dpyinfo->xrender_supported_p) + { + if (!XRenderQueryVersion (dpyinfo->display, &dpyinfo->xrender_major, + &dpyinfo->xrender_minor)) + dpyinfo->xrender_supported_p = false; + } +#endif + #if defined USE_CAIRO || defined HAVE_XFT { /* If we are using Xft, the following precautions should be made: @@ -15409,11 +15422,6 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) or larger than other for other applications, even if it is the same font name (monospace-10 for example). */ -# ifdef HAVE_XRENDER - int event_base, error_base; - XRenderQueryExtension (dpyinfo->display, &event_base, &error_base); -# endif - char *v = XGetDefault (dpyinfo->display, "Xft", "dpi"); double d; if (v != NULL && sscanf (v, "%lf", &d) == 1) diff --git a/src/xterm.h b/src/xterm.h index a8eb6ee547a..26b2851590d 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -540,6 +540,12 @@ struct x_display_info #ifdef USE_GTK bool prefer_native_input; #endif + +#ifdef HAVE_XRENDER + bool xrender_supported_p; + int xrender_major; + int xrender_minor; +#endif }; #ifdef HAVE_X_I18N -- 2.39.5