From 8719abe4ca5d4b6ccc0e405dc0313730c6ec7d72 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 29 Dec 2021 17:49:42 +0800 Subject: [PATCH] Test for Xkb support when opening a display * src/xfns.c (Fx_backspace_delete_keys_p): Use dpyinfo->supports_xkb instead of testing for its presence manually. * src/xterm.c (x_term_init): Test for Xkb presence and set supports_xkb appropriately. * src/xterm.h (struct x_display_info): New field `supports_xkb'. --- src/xfns.c | 20 ++------------------ src/xterm.c | 16 +++++++++++++--- src/xterm.h | 1 + 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/xfns.c b/src/xfns.c index 8dc383ddfa8..ae01bb04053 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -7748,27 +7748,11 @@ present and mapped to the usual X keysyms. */) struct frame *f = decode_window_system_frame (frame); Display *dpy = FRAME_X_DISPLAY (f); Lisp_Object have_keys; - int major, minor, op, event, error_code; block_input (); - /* Check library version in case we're dynamically linked. */ - major = XkbMajorVersion; - minor = XkbMinorVersion; - if (!XkbLibraryVersion (&major, &minor)) - { - unblock_input (); - return Qlambda; - } - - /* Check that the server supports XKB. */ - major = XkbMajorVersion; - minor = XkbMinorVersion; - if (!XkbQueryExtension (dpy, &op, &event, &error_code, &major, &minor)) - { - unblock_input (); - return Qlambda; - } + if (!FRAME_DISPLAY_INFO (f)->supports_xkb) + return Qlambda; /* In this code we check that the keyboard has physical keys with names that start with BKSP (Backspace) and DELE (Delete), and that they diff --git a/src/xterm.c b/src/xterm.c index e3079727d5d..61dff7aaab6 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -14887,9 +14887,19 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) #endif #ifdef HAVE_XKB - dpyinfo->xkb_desc = XkbGetMap (dpyinfo->display, - XkbAllComponentsMask, - XkbUseCoreKbd); + int xkb_major, xkb_minor, xkb_op, xkb_event, xkb_error_code; + xkb_major = XkbMajorVersion; + xkb_minor = XkbMinorVersion; + + if (XkbLibraryVersion (&xkb_major, &xkb_minor) + && XkbQueryExtension (dpyinfo->display, &xkb_op, &xkb_event, + &xkb_error_code, &xkb_major, &xkb_minor)) + { + dpyinfo->supports_xkb = true; + dpyinfo->xkb_desc = XkbGetMap (dpyinfo->display, + XkbAllComponentsMask, + XkbUseCoreKbd); + } #endif #if defined USE_CAIRO || defined HAVE_XFT diff --git a/src/xterm.h b/src/xterm.h index 5615a55d6b9..a233e28dbeb 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -522,6 +522,7 @@ struct x_display_info #endif #ifdef HAVE_XKB + bool supports_xkb; XkbDescPtr xkb_desc; #endif }; -- 2.39.5