summaryrefslogtreecommitdiff
path: root/src/debug
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-12-03 15:56:07 +0000
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-12-03 16:22:02 +0000
commit6aa26582f63c13e32dd0191015550a2d1eade7e6 (patch)
tree7733216f18318ffb840c5d681df6b2a9cd80626e /src/debug
parent056a45d035781a74ae80d5a5f0247f3338dca05d (diff)
added hyprctl switchxkblayout
Diffstat (limited to 'src/debug')
-rw-r--r--src/debug/HyprCtl.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp
index 64ffd779..1f0466a2 100644
--- a/src/debug/HyprCtl.cpp
+++ b/src/debug/HyprCtl.cpp
@@ -686,6 +686,51 @@ std::string dispatchSetCursor(std::string request) {
return "ok";
}
+std::string switchXKBLayoutRequest(std::string request) {
+ CVarList vars(request, 0, ' ');
+
+ const auto KB = vars[1];
+ const auto CMD = vars[2];
+
+ // get kb
+ const auto PKEYBOARD = std::find_if(g_pInputManager->m_lKeyboards.begin(), g_pInputManager->m_lKeyboards.end(), [&] (const SKeyboard& other) { return other.name == g_pInputManager->deviceNameToInternalString(KB); });
+
+ if (PKEYBOARD == g_pInputManager->m_lKeyboards.end())
+ return "device not found";
+
+ const auto PWLRKEYBOARD = wlr_keyboard_from_input_device(PKEYBOARD->keyboard);
+ const auto LAYOUTS = xkb_keymap_num_layouts(PWLRKEYBOARD->keymap);
+ xkb_layout_index_t activeLayout = 0;
+ while (activeLayout < LAYOUTS) {
+ if (xkb_state_layout_index_is_active(PWLRKEYBOARD->xkb_state, activeLayout, XKB_STATE_LAYOUT_EFFECTIVE))
+ break;
+
+ activeLayout++;
+ }
+
+ if (CMD == "next") {
+ wlr_keyboard_notify_modifiers(PWLRKEYBOARD, PWLRKEYBOARD->modifiers.depressed, PWLRKEYBOARD->modifiers.latched, PWLRKEYBOARD->modifiers.locked, activeLayout > LAYOUTS ? 0 : activeLayout + 1);
+ } else if (CMD == "prev") {
+ wlr_keyboard_notify_modifiers(PWLRKEYBOARD, PWLRKEYBOARD->modifiers.depressed, PWLRKEYBOARD->modifiers.latched, PWLRKEYBOARD->modifiers.locked, activeLayout == 0 ? LAYOUTS - 1 : activeLayout - 1);
+ } else {
+
+ int requestedLayout = 0;
+ try {
+ requestedLayout = std::stoi(CMD);
+ } catch (std::exception& e) {
+ return "invalid arg 2";
+ }
+
+ if (requestedLayout < 0 || (uint64_t)requestedLayout > LAYOUTS - 1) {
+ return "layout idx out of range of " + std::to_string(LAYOUTS);
+ }
+
+ wlr_keyboard_notify_modifiers(PWLRKEYBOARD, PWLRKEYBOARD->modifiers.depressed, PWLRKEYBOARD->modifiers.latched, PWLRKEYBOARD->modifiers.locked, requestedLayout);
+ }
+
+ return "ok";
+}
+
std::string dispatchGetOption(std::string request, HyprCtl::eHyprCtlOutputFormat format) {
std::string curitem = "";
@@ -851,6 +896,8 @@ std::string getReply(std::string request) {
return splashRequest();
else if (request == "cursorpos")
return cursorPosRequest(format);
+ else if (request.find("switchxkblayout") == 0)
+ return switchXKBLayoutRequest(request);
else if (request.find("output") == 0)
return dispatchOutput(request);
else if (request.find("dispatch") == 0)