From 15ae4416f542279c515b380289e5fd6884230974 Mon Sep 17 00:00:00 2001 From: Joel Beckmeyer Date: Mon, 31 Aug 2026 08:42:33 -0400 Subject: [PATCH] add Undo/Cut/Copy/Paste keycodes for Linux --- src/platform/linux/uhid_backend.cpp | 13 +++++++++++-- tests/unit/test_linux_backend.cpp | 9 +++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/platform/linux/uhid_backend.cpp b/src/platform/linux/uhid_backend.cpp index eaffb3e..b32df9f 100644 --- a/src/platform/linux/uhid_backend.cpp +++ b/src/platform/linux/uhid_backend.cpp @@ -53,6 +53,7 @@ #if defined(LIBVIRTUALHID_HAVE_XTEST) #include #include + #include #include #include #endif @@ -536,7 +537,7 @@ namespace lvh::detail { } int key_code_to_linux(KeyboardKeyCode key_code) { - static constexpr std::array, 47> special_keys {{ + static constexpr std::array, 51> special_keys {{ {0x08, KEY_BACKSPACE}, {0x09, KEY_TAB}, {0x0D, KEY_ENTER}, @@ -584,6 +585,10 @@ namespace lvh::detail { {0xDD, KEY_RIGHTBRACE}, {0xDE, KEY_APOSTROPHE}, {0xE2, KEY_102ND}, + {0x0100, KEY_UNDO}, + {0x0101, KEY_CUT}, + {0x0102, KEY_COPY}, + {0x0103, KEY_PASTE}, }}; if (const auto linux_key = mapped_keyboard_code(key_code, special_keys); linux_key.has_value()) { @@ -2035,7 +2040,7 @@ namespace lvh::detail { #if defined(LIBVIRTUALHID_HAVE_XTEST) KeySym key_code_to_keysym(KeyboardKeyCode key_code) { - static constexpr std::array, 45> special_keysyms {{ + static constexpr std::array, 49> special_keysyms {{ {0x08, XK_BackSpace}, {0x09, XK_Tab}, {0x0D, XK_Return}, @@ -2081,6 +2086,10 @@ namespace lvh::detail { {0xDC, XK_backslash}, {0xDD, XK_bracketright}, {0xDE, XK_apostrophe}, + {0x0100, XK_Undo}, + {0x0101, XF86XK_Cut}, + {0x0102, XF86XK_Copy}, + {0x0103, XF86XK_Paste}, }}; if (const auto keysym = mapped_keyboard_code(key_code, special_keysyms); keysym.has_value()) { diff --git a/tests/unit/test_linux_backend.cpp b/tests/unit/test_linux_backend.cpp index 70214eb..a2fa70a 100644 --- a/tests/unit/test_linux_backend.cpp +++ b/tests/unit/test_linux_backend.cpp @@ -19,6 +19,7 @@ #include #if defined(LIBVIRTUALHID_HAVE_XTEST) #include + #include #endif // lib includes @@ -107,6 +108,10 @@ TEST_F(LinuxBackendTest, TranslatesKeyboardKeys) { EXPECT_EQ(lvh::detail::test::linux_key_code(0x70), KEY_F1); EXPECT_EQ(lvh::detail::test::linux_key_code(0x7B), KEY_F12); EXPECT_EQ(lvh::detail::test::linux_key_code(0x87), KEY_F24); + EXPECT_EQ(lvh::detail::test::linux_key_code(0x0100), KEY_UNDO); + EXPECT_EQ(lvh::detail::test::linux_key_code(0x0101), KEY_CUT); + EXPECT_EQ(lvh::detail::test::linux_key_code(0x0102), KEY_COPY); + EXPECT_EQ(lvh::detail::test::linux_key_code(0x0103), KEY_PASTE); EXPECT_EQ(lvh::detail::test::linux_key_code(0), -1); EXPECT_EQ(lvh::detail::test::linux_key_code(0x88), -1); } @@ -1268,6 +1273,10 @@ TEST_F(LinuxBackendTest, XTestFallbackCoversKeyboardAndMousePaths) { EXPECT_EQ(lvh::detail::test::linux_xtest_keysym(0x6F), XK_KP_Divide); EXPECT_EQ(lvh::detail::test::linux_xtest_keysym(0x70), XK_F1); EXPECT_EQ(lvh::detail::test::linux_xtest_keysym(0x87), XK_F24); + EXPECT_EQ(lvh::detail::test::linux_xtest_keysym(0x0100), XK_Undo); + EXPECT_EQ(lvh::detail::test::linux_xtest_keysym(0x0101), XF86XK_Cut); + EXPECT_EQ(lvh::detail::test::linux_xtest_keysym(0x0102), XF86XK_Copy); + EXPECT_EQ(lvh::detail::test::linux_xtest_keysym(0x0103), XF86XK_Paste); EXPECT_EQ(lvh::detail::test::linux_xtest_keysym(0x88), 0UL); EXPECT_EQ(lvh::detail::test::linux_xtest_mouse_button(lvh::MouseButton::left), 1);