From 6e87fae7f72416e1108b00c7abdfd438dc713706 Mon Sep 17 00:00:00 2001 From: Weng Xuetian Date: Fri, 6 Jan 2023 16:53:55 -0800 Subject: [PATCH] Support XKB_CONTEXT_NO_SECURE_GETENV flag Since kwin play with CAP_SYS_NICE, secure_getenv will fail for xkbcommon to load user level xkbmap. This allows kwin to load config under ~/.config/xkb BUG: 447206 --- CMakeLists.txt | 5 +++++ src/config-kwin.h.cmake | 1 + src/xkb.cpp | 8 +++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d66f919b4..21a8639f82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -223,6 +223,11 @@ set_package_properties(XKB PROPERTIES TYPE REQUIRED PURPOSE "Required for building KWin with Wayland support" ) +if (XKB_VERSION VERSION_GREATER_EQUAL 1.5.0) + set(HAVE_XKBCOMMON_NO_SECURE_GETENV 1) +else() + set(HAVE_XKBCOMMON_NO_SECURE_GETENV 0) +endif() pkg_check_modules(XKBX11 IMPORTED_TARGET xkbcommon-x11 REQUIRED) add_feature_info(XKBX11 XKBX11_FOUND "Required for handling keyboard events in X11 backend") diff --git a/src/config-kwin.h.cmake b/src/config-kwin.h.cmake index da947c85dd..b5209c0e2a 100644 --- a/src/config-kwin.h.cmake +++ b/src/config-kwin.h.cmake @@ -19,6 +19,7 @@ #cmakedefine01 HAVE_BREEZE_DECO #cmakedefine01 HAVE_SCHED_RESET_ON_FORK #cmakedefine01 HAVE_ACCESSIBILITY +#cmakedefine01 HAVE_XKBCOMMON_NO_SECURE_GETENV #if HAVE_BREEZE_DECO #define BREEZE_KDECORATION_PLUGIN_ID "${BREEZE_KDECORATION_PLUGIN_ID}" #endif diff --git a/src/xkb.cpp b/src/xkb.cpp index ef6fd0f1b8..0dc89082ac 100644 --- a/src/xkb.cpp +++ b/src/xkb.cpp @@ -70,8 +70,14 @@ static void xkbLogHandler(xkb_context *context, xkb_log_level priority, const ch } } +#if HAVE_XKBCOMMON_NO_SECURE_GETENV +constexpr xkb_context_flags KWIN_XKB_CONTEXT_FLAGS = XKB_CONTEXT_NO_SECURE_GETENV; +#else +constexpr xkb_context_flags KWIN_XKB_CONTEXT_FLAGS = XKB_CONTEXT_NO_FLAGS; +#endif + Xkb::Xkb(bool followLocale1) - : m_context(xkb_context_new(XKB_CONTEXT_NO_FLAGS)) + : m_context(xkb_context_new(KWIN_XKB_CONTEXT_FLAGS)) , m_keymap(nullptr) , m_state(nullptr) , m_shiftModifier(0)