Skip to content

Support xkb v2 format#11482

Merged
vaxerski merged 7 commits intohyprwm:mainfrom
usering-around:support-XKB-V2-format
Sep 11, 2025
Merged

Support xkb v2 format#11482
vaxerski merged 7 commits intohyprwm:mainfrom
usering-around:support-XKB-V2-format

Conversation

@usering-around
Copy link
Copy Markdown
Contributor

Describe your PR, what does it fix/add?

  • Updated all xkb_keymap_new_from_names calls to xkb_keymap_new_from_names2
  • Added support to the xkb V2 format, with fallback to V1 for clients (currently there is no xkb V2 format in the wayland protocol)
  • Added input:kb_file_v1 to change the fallback keymap

Is there anything you want to mention? (unchecked code, possible bugs, found problems, breaking compatibility, etc.)

I haven't seen any input tests (and I'm not sure how to do one), so there is no test

Is it ready for merging, or does it need work?

Ready

Comment thread src/config/ConfigDescriptions.hpp Outdated
Copy link
Copy Markdown
Member

@vaxerski vaxerski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

generally lgtm, probably needs a wiki update to mention v2

Comment thread src/config/ConfigManager.cpp Outdated
@usering-around
Copy link
Copy Markdown
Contributor Author

generally lgtm, probably needs a wiki update to mention v2

added a mention of the V2 format hyprwm/hyprland-wiki#1205

vaxerski
vaxerski previously approved these changes Aug 21, 2025
@vaxerski
Copy link
Copy Markdown
Member

@fufexan nix bump for xkb needed

@fufexan
Copy link
Copy Markdown
Member

fufexan commented Aug 21, 2025

Gonna rebuild the world for a while.

@vaxerski
Copy link
Copy Markdown
Member

@fufexan is it supposed to fail after 2.5h?

@fufexan
Copy link
Copy Markdown
Member

fufexan commented Aug 22, 2025

Runner is out of storage so no

@vaxerski
Copy link
Copy Markdown
Member

well guess we waiting for untable nixpkgs

@fufexan fufexan force-pushed the support-XKB-V2-format branch from 418ac42 to ac7d760 Compare September 11, 2025 15:55
@fufexan
Copy link
Copy Markdown
Member

fufexan commented Sep 11, 2025

CI should build now.

@vaxerski vaxerski merged commit 38169c8 into hyprwm:main Sep 11, 2025
13 checks passed
@RichAyotte
Copy link
Copy Markdown
Contributor

RichAyotte commented Sep 12, 2025

I needed to patch my Debian Sid system with libxkbcommon0 (= 1.7.0-2.1) in order to build. I'm not a cpp dev so there's probably a better way to do this.

Diff
diff --git a/src/devices/IKeyboard.cpp b/src/devices/IKeyboard.cpp
index 0fc30ca9..13c57e0f 100644
--- a/src/devices/IKeyboard.cpp
+++ b/src/devices/IKeyboard.cpp
@@ -91,13 +91,22 @@ void IKeyboard::setKeymap(const SStringRuleNames& rules) {
         if (FILE* const KEYMAPFILE = fopen(path.c_str(), "r"); !KEYMAPFILE)
             Debug::log(ERR, "Cannot open input:kb_file= file for reading");
         else {
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
             m_xkbKeymap = xkb_keymap_new_from_file(CONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+            m_xkbKeymap = xkb_keymap_new_from_file(CONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
             fclose(KEYMAPFILE);
         }
     }
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
     if (!m_xkbKeymap)
         m_xkbKeymap = xkb_keymap_new_from_names2(CONTEXT, &XKBRULES, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+    if (!m_xkbKeymap)
+        m_xkbKeymap = xkb_keymap_new_from_names(CONTEXT, &XKBRULES, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
 
     if (!m_xkbKeymap) {
         g_pConfigManager->addParseError("Invalid keyboard layout passed. ( rules: " + rules.rules + ", model: " + rules.model + ", variant: " + rules.variant +
@@ -113,13 +122,21 @@ void IKeyboard::setKeymap(const SStringRuleNames& rules) {
         m_currentRules.options = "";
         m_currentRules.layout  = "us";
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
         m_xkbKeymap = xkb_keymap_new_from_names2(CONTEXT, &XKBRULES, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+        m_xkbKeymap = xkb_keymap_new_from_names(CONTEXT, &XKBRULES, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
     }
 
     auto cKeymapStr = xkb_keymap_get_as_string(m_xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V1);
     if (!cKeymapStr) {
         Debug::log(ERR, "Couldn't convert keymap to V1 format");
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
         m_xkbKeymapV1 = xkb_keymap_new_from_names2(CONTEXT, &XKBRULES, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+        m_xkbKeymapV1 = xkb_keymap_new_from_names(CONTEXT, &XKBRULES, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
     } else {
         m_xkbKeymapV1 = xkb_keymap_new_from_string(CONTEXT, cKeymapStr, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
         free(cKeymapStr);
@@ -166,7 +183,11 @@ void IKeyboard::updateKeymapFD() {
     if (m_xkbKeymapV1FD.isValid())
         m_xkbKeymapV1FD.reset();
 
-    auto cKeymapStr   = xkb_keymap_get_as_string(m_xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V2);
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
+    auto cKeymapStr = xkb_keymap_get_as_string(m_xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V2);
+#else
+    auto cKeymapStr = xkb_keymap_get_as_string(m_xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V1);
+#endif
     m_xkbKeymapString = cKeymapStr;
     free(cKeymapStr);
     auto cKeymapV1Str   = xkb_keymap_get_as_string(m_xkbKeymapV1, XKB_KEYMAP_FORMAT_TEXT_V1);
@@ -251,19 +272,31 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
             rules.model   = model.c_str();
             rules.variant = variant.c_str();
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
             auto KEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+            auto KEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
 
             if (!KEYMAP) {
                 Debug::log(ERR, "updateXKBTranslationState: keymap failed 1, fallback without model/variant");
                 rules.model   = "";
                 rules.variant = "";
-                KEYMAP        = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
+                KEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+                KEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
             }
 
             if (!KEYMAP) {
                 Debug::log(ERR, "updateXKBTranslationState: keymap failed 2, fallback to us");
                 rules.layout = "us";
-                KEYMAP       = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
+                KEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_text_v2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+                KEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
             }
 
             m_xkbState       = xkb_state_new(KEYMAP);
@@ -287,7 +320,11 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
         .options = m_currentRules.options.c_str(),
     };
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
     const auto NEWKEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+    const auto NEWKEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
 
     m_xkbState       = xkb_state_new(NEWKEYMAP);
     m_xkbStaticState = xkb_state_new(NEWKEYMAP);
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index cd69289e..b7f8e753 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -291,8 +291,13 @@ void CKeybindManager::updateXKBTranslationState() {
     const auto        PCONTEXT   = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
     FILE* const       KEYMAPFILE = FILEPATH.empty() ? nullptr : fopen(absolutePath(FILEPATH, g_pConfigManager->m_configCurrentPath).c_str(), "r");
 
-    auto              PKEYMAP = KEYMAPFILE ? xkb_keymap_new_from_file(PCONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS) :
-                                             xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
+    auto PKEYMAP = KEYMAPFILE ? xkb_keymap_new_from_file(PCONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS) :
+                                xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+    auto PKEYMAP = KEYMAPFILE ? xkb_keymap_new_from_file(PCONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS) :
+                                xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
     if (KEYMAPFILE)
         fclose(KEYMAPFILE);
 
@@ -305,7 +310,11 @@ void CKeybindManager::updateXKBTranslationState() {
                    rules.rules, rules.model, rules.options);
         memset(&rules, 0, sizeof(rules));
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
         PKEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+        PKEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
     }
 
     xkb_context_unref(PCONTEXT);
diff --git a/src/protocols/VirtualKeyboard.cpp b/src/protocols/VirtualKeyboard.cpp
index 2acc2298..50fa2244 100644
--- a/src/protocols/VirtualKeyboard.cpp
+++ b/src/protocols/VirtualKeyboard.cpp
@@ -88,7 +88,11 @@ CVirtualKeyboardV1Resource::CVirtualKeyboardV1Resource(SP<CZwpVirtualKeyboardV1>
             return;
         }
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
         auto xkbKeymap = xkb_keymap_new_from_string(xkbContext, sc<const char*>(keymapData), XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+        auto xkbKeymap = xkb_keymap_new_from_string(xkbContext, sc<const char*>(keymapData), XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
         munmap(keymapData, len);
 
         if UNLIKELY (!xkbKeymap) {

@vaxerski
Copy link
Copy Markdown
Member

update xkbcommon? :P

@RichAyotte
Copy link
Copy Markdown
Contributor

littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 13, 2025
littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 13, 2025
littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 13, 2025
@vaxerski
Copy link
Copy Markdown
Member

good luck

@RichAyotte
Copy link
Copy Markdown
Contributor

good luck

In the meantime, would you accept a PR with this patch #11482 (comment)?

lxe pushed a commit to lxe/Hyprland that referenced this pull request Sep 14, 2025
littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 15, 2025
littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 15, 2025
littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 15, 2025
littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 15, 2025
littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 15, 2025
@amplexus
Copy link
Copy Markdown

I needed to patch my Debian Sid system with libxkbcommon0 (= 1.7.0-2.1) in order to build. I'm not a cpp dev so there's probably a better way to do this.

Diff

diff --git a/src/devices/IKeyboard.cpp b/src/devices/IKeyboard.cpp
index 0fc30ca9..13c57e0f 100644
--- a/src/devices/IKeyboard.cpp
+++ b/src/devices/IKeyboard.cpp
@@ -91,13 +91,22 @@ void IKeyboard::setKeymap(const SStringRuleNames& rules) {
         if (FILE* const KEYMAPFILE = fopen(path.c_str(), "r"); !KEYMAPFILE)
             Debug::log(ERR, "Cannot open input:kb_file= file for reading");
         else {
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
             m_xkbKeymap = xkb_keymap_new_from_file(CONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+            m_xkbKeymap = xkb_keymap_new_from_file(CONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
             fclose(KEYMAPFILE);
         }
     }
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
     if (!m_xkbKeymap)
         m_xkbKeymap = xkb_keymap_new_from_names2(CONTEXT, &XKBRULES, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+    if (!m_xkbKeymap)
+        m_xkbKeymap = xkb_keymap_new_from_names(CONTEXT, &XKBRULES, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
 
     if (!m_xkbKeymap) {
         g_pConfigManager->addParseError("Invalid keyboard layout passed. ( rules: " + rules.rules + ", model: " + rules.model + ", variant: " + rules.variant +
@@ -113,13 +122,21 @@ void IKeyboard::setKeymap(const SStringRuleNames& rules) {
         m_currentRules.options = "";
         m_currentRules.layout  = "us";
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
         m_xkbKeymap = xkb_keymap_new_from_names2(CONTEXT, &XKBRULES, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+        m_xkbKeymap = xkb_keymap_new_from_names(CONTEXT, &XKBRULES, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
     }
 
     auto cKeymapStr = xkb_keymap_get_as_string(m_xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V1);
     if (!cKeymapStr) {
         Debug::log(ERR, "Couldn't convert keymap to V1 format");
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
         m_xkbKeymapV1 = xkb_keymap_new_from_names2(CONTEXT, &XKBRULES, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+        m_xkbKeymapV1 = xkb_keymap_new_from_names(CONTEXT, &XKBRULES, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
     } else {
         m_xkbKeymapV1 = xkb_keymap_new_from_string(CONTEXT, cKeymapStr, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
         free(cKeymapStr);
@@ -166,7 +183,11 @@ void IKeyboard::updateKeymapFD() {
     if (m_xkbKeymapV1FD.isValid())
         m_xkbKeymapV1FD.reset();
 
-    auto cKeymapStr   = xkb_keymap_get_as_string(m_xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V2);
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
+    auto cKeymapStr = xkb_keymap_get_as_string(m_xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V2);
+#else
+    auto cKeymapStr = xkb_keymap_get_as_string(m_xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V1);
+#endif
     m_xkbKeymapString = cKeymapStr;
     free(cKeymapStr);
     auto cKeymapV1Str   = xkb_keymap_get_as_string(m_xkbKeymapV1, XKB_KEYMAP_FORMAT_TEXT_V1);
@@ -251,19 +272,31 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
             rules.model   = model.c_str();
             rules.variant = variant.c_str();
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
             auto KEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+            auto KEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
 
             if (!KEYMAP) {
                 Debug::log(ERR, "updateXKBTranslationState: keymap failed 1, fallback without model/variant");
                 rules.model   = "";
                 rules.variant = "";
-                KEYMAP        = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
+                KEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+                KEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
             }
 
             if (!KEYMAP) {
                 Debug::log(ERR, "updateXKBTranslationState: keymap failed 2, fallback to us");
                 rules.layout = "us";
-                KEYMAP       = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
+                KEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_text_v2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+                KEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
             }
 
             m_xkbState       = xkb_state_new(KEYMAP);
@@ -287,7 +320,11 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
         .options = m_currentRules.options.c_str(),
     };
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
     const auto NEWKEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+    const auto NEWKEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
 
     m_xkbState       = xkb_state_new(NEWKEYMAP);
     m_xkbStaticState = xkb_state_new(NEWKEYMAP);
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index cd69289e..b7f8e753 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -291,8 +291,13 @@ void CKeybindManager::updateXKBTranslationState() {
     const auto        PCONTEXT   = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
     FILE* const       KEYMAPFILE = FILEPATH.empty() ? nullptr : fopen(absolutePath(FILEPATH, g_pConfigManager->m_configCurrentPath).c_str(), "r");
 
-    auto              PKEYMAP = KEYMAPFILE ? xkb_keymap_new_from_file(PCONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS) :
-                                             xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
+    auto PKEYMAP = KEYMAPFILE ? xkb_keymap_new_from_file(PCONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS) :
+                                xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+    auto PKEYMAP = KEYMAPFILE ? xkb_keymap_new_from_file(PCONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS) :
+                                xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
     if (KEYMAPFILE)
         fclose(KEYMAPFILE);
 
@@ -305,7 +310,11 @@ void CKeybindManager::updateXKBTranslationState() {
                    rules.rules, rules.model, rules.options);
         memset(&rules, 0, sizeof(rules));
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
         PKEYMAP = xkb_keymap_new_from_names2(PCONTEXT, &rules, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+        PKEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
     }
 
     xkb_context_unref(PCONTEXT);
diff --git a/src/protocols/VirtualKeyboard.cpp b/src/protocols/VirtualKeyboard.cpp
index 2acc2298..50fa2244 100644
--- a/src/protocols/VirtualKeyboard.cpp
+++ b/src/protocols/VirtualKeyboard.cpp
@@ -88,7 +88,11 @@ CVirtualKeyboardV1Resource::CVirtualKeyboardV1Resource(SP<CZwpVirtualKeyboardV1>
             return;
         }
 
+#ifdef XKB_KEYMAP_FORMAT_TEXT_V2
         auto xkbKeymap = xkb_keymap_new_from_string(xkbContext, sc<const char*>(keymapData), XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#else
+        auto xkbKeymap = xkb_keymap_new_from_string(xkbContext, sc<const char*>(keymapData), XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
+#endif
         munmap(keymapData, len);
 
         if UNLIKELY (!xkbKeymap) {

I see the 4th ifdef check for V2 is referencing the V1 var. when I presume it should be referencing the V1 var.

littleblack111 pushed a commit to littleblack111/Hyprland that referenced this pull request Sep 23, 2025
Mozzarella32 pushed a commit to Mozzarella32/Hyprland that referenced this pull request Oct 8, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants