diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-10-04 20:07:21 +0100 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-10-04 20:07:21 +0100 |
| commit | 0d702b556d0a52f1df53ac1e52fac11b8302783b (patch) | |
| tree | 39e5f11ad37ec82248b7bbdb1ca09587dc511813 /src | |
| parent | 9bbae5b8e2e593b04f6505c9f35c7e9affa9ab6f (diff) | |
Add switch device handling and binds
Diffstat (limited to 'src')
| -rw-r--r-- | src/debug/HyprCtl.cpp | 24 | ||||
| -rw-r--r-- | src/events/Devices.cpp | 4 | ||||
| -rw-r--r-- | src/helpers/WLClasses.hpp | 11 | ||||
| -rw-r--r-- | src/includes.hpp | 1 | ||||
| -rw-r--r-- | src/managers/KeybindManager.cpp | 20 | ||||
| -rw-r--r-- | src/managers/KeybindManager.hpp | 1 | ||||
| -rw-r--r-- | src/managers/input/InputManager.cpp | 26 | ||||
| -rw-r--r-- | src/managers/input/InputManager.hpp | 5 |
8 files changed, 84 insertions, 8 deletions
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index 0795beaa..3d4b2879 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -405,6 +405,24 @@ R"#( { // remove trailing comma if (result[result.size() - 1] == ',') result.pop_back(); + result += "\n],\n"; + + result += "\"switches\": [\n"; + + for (auto& d : g_pInputManager->m_lSwitches) { + result += getFormat( +R"#( { + "address": "0x%x", + "name": "%s" + },)#", + &d, + d.pWlrDevice ? d.pWlrDevice->name : "" + ); + } + + // remove trailing comma + if (result[result.size() - 1] == ',') + result.pop_back(); result += "\n]\n"; result += "}\n"; @@ -442,6 +460,12 @@ R"#( { for (auto& d : g_pInputManager->m_lTouchDevices) { result += getFormat("\tTouch Device at %x:\n\t\t%s\n", &d, d.pWlrDevice ? d.pWlrDevice->name : ""); } + + result += "\n\nSwitches:\n"; + + for (auto& d : g_pInputManager->m_lSwitches) { + result += getFormat("\tSwitch Device at %x:\n\t\t%s\n", &d, d.pWlrDevice ? d.pWlrDevice->name : ""); + } } return result; diff --git a/src/events/Devices.cpp b/src/events/Devices.cpp index 8dea879f..eecba44f 100644 --- a/src/events/Devices.cpp +++ b/src/events/Devices.cpp @@ -82,6 +82,10 @@ void Events::listener_newInput(wl_listener* listener, void* data) { Debug::log(LOG, "Attached a tablet pad with name %s", DEVICE->name); g_pInputManager->newTabletPad(DEVICE); break; + case WLR_INPUT_DEVICE_SWITCH: + Debug::log(LOG, "Attached a switch device with name %s", DEVICE->name); + g_pInputManager->newSwitch(DEVICE); + break; default: Debug::log(WARN, "Unrecognized input device plugged in: %s", DEVICE->name); break; diff --git a/src/helpers/WLClasses.hpp b/src/helpers/WLClasses.hpp index 241899a1..e66f1b52 100644 --- a/src/helpers/WLClasses.hpp +++ b/src/helpers/WLClasses.hpp @@ -332,3 +332,14 @@ struct STouchDevice { return pWlrDevice == other.pWlrDevice; } }; + +struct SSwitchDevice { + wlr_input_device* pWlrDevice = nullptr; + + DYNLISTENER(destroy); + DYNLISTENER(toggle); + + bool operator==(const SSwitchDevice& other) { + return pWlrDevice == other.pWlrDevice; + } +}; diff --git a/src/includes.hpp b/src/includes.hpp index 6f5c91b3..55e8282b 100644 --- a/src/includes.hpp +++ b/src/includes.hpp @@ -101,6 +101,7 @@ extern "C" { #include <wlr/types/wlr_input_method_v2.h> #include <wlr/types/wlr_text_input_v3.h> #include <wlr/types/wlr_touch.h> +#include <wlr/types/wlr_switch.h> } #undef delete diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index fce3f2ec..2d1e6304 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -202,9 +202,9 @@ bool CKeybindManager::onKeyEvent(wlr_keyboard_key_event* e, SKeyboard* pKeyboard m_dPressedKeycodes.push_back(KEYCODE); m_dPressedKeysyms.push_back(keysym); - found = g_pKeybindManager->handleKeybinds(MODS, "", keysym, 0, true, e->time_msec) || found; + found = handleKeybinds(MODS, "", keysym, 0, true, e->time_msec) || found; - found = g_pKeybindManager->handleKeybinds(MODS, "", 0, KEYCODE, true, e->time_msec) || found; + found = handleKeybinds(MODS, "", 0, KEYCODE, true, e->time_msec) || found; if (found) shadowKeybinds(keysym, KEYCODE); @@ -219,9 +219,9 @@ bool CKeybindManager::onKeyEvent(wlr_keyboard_key_event* e, SKeyboard* pKeyboard m_dPressedKeycodes.erase(std::remove(m_dPressedKeycodes.begin(), m_dPressedKeycodes.end(), KEYCODE), m_dPressedKeycodes.end()); m_dPressedKeysyms.erase(std::remove(m_dPressedKeysyms.begin(), m_dPressedKeysyms.end(), keysym), m_dPressedKeysyms.end()); - found = g_pKeybindManager->handleKeybinds(MODS, "", keysym, 0, false, e->time_msec) || found; + found = handleKeybinds(MODS, "", keysym, 0, false, e->time_msec) || found; - found = g_pKeybindManager->handleKeybinds(MODS, "", 0, KEYCODE, false, e->time_msec) || found; + found = handleKeybinds(MODS, "", 0, KEYCODE, false, e->time_msec) || found; shadowKeybinds(); } @@ -244,9 +244,9 @@ bool CKeybindManager::onAxisEvent(wlr_pointer_axis_event* e) { bool found = false; if (e->source == WLR_AXIS_SOURCE_WHEEL && e->orientation == WLR_AXIS_ORIENTATION_VERTICAL) { if (e->delta < 0) { - found = g_pKeybindManager->handleKeybinds(MODS, "mouse_down", 0, 0, true, 0); + found = handleKeybinds(MODS, "mouse_down", 0, 0, true, 0); } else { - found = g_pKeybindManager->handleKeybinds(MODS, "mouse_up", 0, 0, true, 0); + found = handleKeybinds(MODS, "mouse_up", 0, 0, true, 0); } if (found) @@ -268,12 +268,12 @@ bool CKeybindManager::onMouseEvent(wlr_pointer_button_event* e) { bool mouseBindWasActive = ensureMouseBindState(); if (e->state == WLR_BUTTON_PRESSED) { - found = g_pKeybindManager->handleKeybinds(MODS, "mouse:" + std::to_string(e->button), 0, 0, true, 0); + found = handleKeybinds(MODS, "mouse:" + std::to_string(e->button), 0, 0, true, 0); if (found) shadowKeybinds(); } else { - found = g_pKeybindManager->handleKeybinds(MODS, "mouse:" + std::to_string(e->button), 0, 0, false, 0); + found = handleKeybinds(MODS, "mouse:" + std::to_string(e->button), 0, 0, false, 0); shadowKeybinds(); } @@ -281,6 +281,10 @@ bool CKeybindManager::onMouseEvent(wlr_pointer_button_event* e) { return !found && !mouseBindWasActive; } +void CKeybindManager::onSwitchEvent(const std::string& switchName) { + handleKeybinds(0, "switch:" + switchName, 0, 0, true, 0); +} + int repeatKeyHandler(void* data) { SKeybind** ppActiveKeybind = (SKeybind**)data; diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index 561d90a0..d67ea53c 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -38,6 +38,7 @@ public: bool onKeyEvent(wlr_keyboard_key_event*, SKeyboard*); bool onAxisEvent(wlr_pointer_axis_event*); bool onMouseEvent(wlr_pointer_button_event*); + void onSwitchEvent(const std::string&); void addKeybind(SKeybind); void removeKeybind(uint32_t, const std::string&); diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index a5ba9c65..6b717ed2 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -1006,3 +1006,29 @@ void CInputManager::destroyTouchDevice(STouchDevice* pDevice) { m_lTouchDevices.remove(*pDevice); } + +void CInputManager::newSwitch(wlr_input_device* pDevice) { + const auto PNEWDEV = &m_lSwitches.emplace_back(); + PNEWDEV->pWlrDevice = pDevice; + + Debug::log(LOG, "New switch with name \"%s\" added", pDevice->name); + + PNEWDEV->hyprListener_destroy.initCallback(&pDevice->events.destroy, [&](void* owner, void* data) { + destroySwitch((SSwitchDevice*)owner); + }, PNEWDEV, "SwitchDevice"); + + const auto PSWITCH = wlr_switch_from_input_device(pDevice); + + PNEWDEV->hyprListener_toggle.initCallback(&PSWITCH->events.toggle, [&](void* owner, void* data) { + const auto PDEVICE = (SSwitchDevice*)owner; + const auto NAME = std::string(PDEVICE->pWlrDevice->name); + + Debug::log(LOG, "Switch %s fired, triggering binds.", NAME.c_str()); + + g_pKeybindManager->onSwitchEvent(NAME); + }, PNEWDEV, "SwitchDevice"); +} + +void CInputManager::destroySwitch(SSwitchDevice* pDevice) { + m_lSwitches.remove(*pDevice); +}
\ No newline at end of file diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp index 85af33fc..365b4a6f 100644 --- a/src/managers/input/InputManager.hpp +++ b/src/managers/input/InputManager.hpp @@ -37,9 +37,11 @@ public: void newVirtualKeyboard(wlr_input_device*); void newMouse(wlr_input_device*, bool virt = false); void newTouchDevice(wlr_input_device*); + void newSwitch(wlr_input_device*); void destroyTouchDevice(STouchDevice*); void destroyKeyboard(SKeyboard*); void destroyMouse(wlr_input_device*); + void destroySwitch(SSwitchDevice*); void constrainMouse(SMouse*, wlr_pointer_constraint_v1*); void recheckConstraint(SMouse*); @@ -89,6 +91,9 @@ public: // Touch devices std::list<STouchDevice> m_lTouchDevices; + // Switches + std::list<SSwitchDevice> m_lSwitches; + void newTabletTool(wlr_input_device*); void newTabletPad(wlr_input_device*); void focusTablet(STablet*, wlr_tablet_tool*, bool motion = false); |
