diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index 62437dcf..5bcd392c 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -381,6 +381,23 @@ R"#( { ); } + // remove trailing comma + result.pop_back(); + result += "\n],\n"; + + result += "\"touch\": [\n"; + + for (auto& d : g_pInputManager->m_lTouchDevices) { + 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(); @@ -415,6 +432,12 @@ R"#( { for (auto& d : g_pInputManager->m_lTabletTools) { result += getFormat("\tTablet Tool at %x (belongs to %x)\n", &d, d.wlrTabletTool ? d.wlrTabletTool->data : 0); } + + result += "\n\nTouch:\n"; + + for (auto& d : g_pInputManager->m_lTouchDevices) { + result += getFormat("\tTouch 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 7ec94435..b8aeae39 100644 --- a/src/events/Devices.cpp +++ b/src/events/Devices.cpp @@ -72,7 +72,7 @@ void Events::listener_newInput(wl_listener* listener, void* data) { break; case WLR_INPUT_DEVICE_TOUCH: Debug::log(LOG, "Attached a touch device with name %s", DEVICE->name); - wlr_cursor_attach_input_device(g_pCompositor->m_sWLRCursor, DEVICE); + g_pInputManager->newTouchDevice(DEVICE); break; case WLR_INPUT_DEVICE_TABLET_TOOL: Debug::log(LOG, "Attached a tablet tool with name %s", DEVICE->name); diff --git a/src/helpers/WLClasses.hpp b/src/helpers/WLClasses.hpp index 96295b39..3af8ac25 100644 --- a/src/helpers/WLClasses.hpp +++ b/src/helpers/WLClasses.hpp @@ -322,3 +322,13 @@ struct SIMEPopup { return pSurface == other.pSurface; } }; + +struct STouchDevice { + wlr_input_device* pWlrDevice = nullptr; + + DYNLISTENER(destroy); + + bool operator==(const STouchDevice& other) { + return pWlrDevice == other.pWlrDevice; + } +}; diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 2b099ac3..ccb9bda5 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -987,3 +987,22 @@ void CInputManager::disableAllKeyboards(bool virt) { k.active = false; } } + +void CInputManager::newTouchDevice(wlr_input_device* pDevice) { + const auto PNEWDEV = &m_lTouchDevices.emplace_back(); + PNEWDEV->pWlrDevice = pDevice; + + wlr_cursor_attach_input_device(g_pCompositor->m_sWLRCursor, pDevice); + + Debug::log(LOG, "New touch device added at %x", PNEWDEV); + + PNEWDEV->hyprListener_destroy.initCallback(&pDevice->events.destroy, [&](void* owner, void* data) { + destroyTouchDevice((STouchDevice*)data); + }, PNEWDEV, "TouchDevice"); +} + +void CInputManager::destroyTouchDevice(STouchDevice* pDevice) { + Debug::log(LOG, "Touch device at %x removed", pDevice); + + m_lTouchDevices.remove(*pDevice); +} diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp index 9069e131..f212e610 100644 --- a/src/managers/input/InputManager.hpp +++ b/src/managers/input/InputManager.hpp @@ -36,6 +36,8 @@ public: void newKeyboard(wlr_input_device*); void newVirtualKeyboard(wlr_input_device*); void newMouse(wlr_input_device*, bool virt = false); + void newTouchDevice(wlr_input_device*); + void destroyTouchDevice(STouchDevice*); void destroyKeyboard(SKeyboard*); void destroyMouse(wlr_input_device*); @@ -81,6 +83,9 @@ public: // idle inhibitors std::list m_lIdleInhibitors; + // Touch devices + std::list m_lTouchDevices; + void newTabletTool(wlr_input_device*); void newTabletPad(wlr_input_device*); void focusTablet(STablet*, wlr_tablet_tool*, bool motion = false);