From 9655d0c13822bdaa5d86fd1153c27c184fd55253 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 6 Jul 2022 15:42:37 +0200 Subject: [PATCH] added support for wlr_idle_inhibitor_v1 --- src/Compositor.cpp | 3 ++ src/Compositor.hpp | 1 + src/events/Events.hpp | 2 ++ src/events/Windows.cpp | 6 ++++ src/helpers/WLClasses.hpp | 11 ++++++ src/includes.hpp | 1 + src/managers/input/IdleInhibitor.cpp | 54 ++++++++++++++++++++++++++++ src/managers/input/InputManager.hpp | 5 +++ 8 files changed, 83 insertions(+) create mode 100644 src/managers/input/IdleInhibitor.cpp diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 661a2db6e..e6de59d5b 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -124,6 +124,8 @@ CCompositor::CCompositor() { m_sWLRForeignRegistry = wlr_xdg_foreign_registry_create(m_sWLDisplay); + m_sWLRIdleInhibitMgr = wlr_idle_inhibit_v1_create(m_sWLDisplay); + wlr_xdg_foreign_v1_create(m_sWLDisplay, m_sWLRForeignRegistry); wlr_xdg_foreign_v2_create(m_sWLDisplay, m_sWLRForeignRegistry); } @@ -160,6 +162,7 @@ void CCompositor::initAllSignals() { addWLSignal(&m_sWLRXDGDecoMgr->events.new_toplevel_decoration, &Events::listen_NewXDGDeco, m_sWLRXDGDecoMgr, "XDGDecoMgr"); addWLSignal(&m_sWLRVirtPtrMgr->events.new_virtual_pointer, &Events::listen_newVirtPtr, m_sWLRVirtPtrMgr, "VirtPtrMgr"); addWLSignal(&m_sWLRRenderer->events.destroy, &Events::listen_RendererDestroy, m_sWLRRenderer, "WLRRenderer"); + addWLSignal(&m_sWLRIdleInhibitMgr->events.new_inhibitor, &Events::listen_newIdleInhibitor, m_sWLRIdleInhibitMgr, "WLRIdleInhibitMgr"); signal(SIGINT, handleCritSignal); signal(SIGTERM, handleCritSignal); diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 7ad3b7f83..187c71591 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -61,6 +61,7 @@ public: wlr_foreign_toplevel_manager_v1* m_sWLRToplevelMgr; wlr_tablet_manager_v2* m_sWLRTabletManager; wlr_xdg_foreign_registry* m_sWLRForeignRegistry; + wlr_idle_inhibit_manager_v1* m_sWLRIdleInhibitMgr; // ------------------------------------------------- // diff --git a/src/events/Events.hpp b/src/events/Events.hpp index 9d1fdb537..ceade1cc6 100644 --- a/src/events/Events.hpp +++ b/src/events/Events.hpp @@ -112,4 +112,6 @@ namespace Events { // Renderer destroy LISTENER(RendererDestroy); + + LISTENER(newIdleInhibitor); }; \ No newline at end of file diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 66ba532a9..add631405 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -284,6 +284,9 @@ void Events::listener_mapWindow(void* owner, void* data) { g_pCompositor->setWindowFullscreen(PWINDOW, true, FULLSCREEN_FULL); } + // recheck idle inhibitors + g_pInputManager->recheckIdleInhibitorStatus(); + PWINDOW->m_pSurfaceTree = SubsurfaceTree::createTreeRoot(g_pXWaylandManager->getWindowSurface(PWINDOW), addViewCoords, PWINDOW, PWINDOW); Debug::log(LOG, "Map request dispatched, monitor %s, xywh: %f %f %f %f", PMONITOR->szName.c_str(), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y, PWINDOW->m_vRealSize.goalv().x, PWINDOW->m_vRealSize.goalv().y); @@ -363,6 +366,9 @@ void Events::listener_unmapWindow(void* owner, void* data) { // Destroy Foreign Toplevel wlr_foreign_toplevel_handle_v1_destroy(PWINDOW->m_phForeignToplevel); PWINDOW->m_phForeignToplevel = nullptr; + + // recheck idle inhibitors + g_pInputManager->recheckIdleInhibitorStatus(); } void Events::listener_commitWindow(void* owner, void* data) { diff --git a/src/helpers/WLClasses.hpp b/src/helpers/WLClasses.hpp index 332780535..d93741585 100644 --- a/src/helpers/WLClasses.hpp +++ b/src/helpers/WLClasses.hpp @@ -221,3 +221,14 @@ struct STabletPad { return wlrTabletPadV2 == b.wlrTabletPadV2; } }; + +struct SIdleInhibitor { + wlr_idle_inhibitor_v1* pWlrInhibitor = nullptr; + CWindow* pWindow = nullptr; + + DYNLISTENER(Destroy); + + bool operator==(const SIdleInhibitor& b) { + return pWlrInhibitor == b.pWlrInhibitor; + } +}; diff --git a/src/includes.hpp b/src/includes.hpp index 2455171d7..0c8df64d4 100644 --- a/src/includes.hpp +++ b/src/includes.hpp @@ -74,6 +74,7 @@ extern "C" { #include #include #include +#include #include #include #include diff --git a/src/managers/input/IdleInhibitor.cpp b/src/managers/input/IdleInhibitor.cpp new file mode 100644 index 000000000..3efb40c68 --- /dev/null +++ b/src/managers/input/IdleInhibitor.cpp @@ -0,0 +1,54 @@ +#include "InputManager.hpp" +#include "../../Compositor.hpp" + +void Events::listener_newIdleInhibitor(wl_listener* listener, void* data) { + const auto WLRIDLEINHIBITOR = (wlr_idle_inhibitor_v1*)data; + + if (!WLRIDLEINHIBITOR) + return; + + g_pInputManager->newIdleInhibitor(WLRIDLEINHIBITOR); +} + +void CInputManager::newIdleInhibitor(wlr_idle_inhibitor_v1* pInhibitor) { + const auto PINHIBIT = &m_lIdleInhibitors.emplace_back(); + + Debug::log(LOG, "New idle inhibitor registered"); + + PINHIBIT->pWlrInhibitor = pInhibitor; + + PINHIBIT->hyprListener_Destroy.initCallback(&pInhibitor->events.destroy, [](void* owner, void* data){ + + const auto PINH = (SIdleInhibitor*)owner; + + g_pInputManager->m_lIdleInhibitors.remove(*PINH); + + Debug::log(LOG, "Destroyed an idleinhibitor"); + + g_pInputManager->recheckIdleInhibitorStatus(); + + }, PINHIBIT, "IdleInhibitor"); + + PINHIBIT->pWindow = g_pCompositor->getWindowFromSurface(pInhibitor->surface); + + if (PINHIBIT->pWindow) + Debug::log(LOG, "IdleInhibitor got window %x (%s)", PINHIBIT->pWindow, PINHIBIT->pWindow->m_szTitle.c_str()); + + recheckIdleInhibitorStatus(); +} + +void CInputManager::recheckIdleInhibitorStatus() { + + for (auto& ii : m_lIdleInhibitors) { + if (!ii.pWindow) { + wlr_idle_set_enabled(g_pCompositor->m_sWLRIdle, g_pCompositor->m_sSeat.seat, false); + return; + } else if (g_pHyprRenderer->shouldRenderWindow(ii.pWindow)) { + wlr_idle_set_enabled(g_pCompositor->m_sWLRIdle, g_pCompositor->m_sSeat.seat, false); + return; + } + } + + wlr_idle_set_enabled(g_pCompositor->m_sWLRIdle, g_pCompositor->m_sSeat.seat, true); + return; +} \ No newline at end of file diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp index e28e084b0..3c6fb33d5 100644 --- a/src/managers/input/InputManager.hpp +++ b/src/managers/input/InputManager.hpp @@ -56,9 +56,14 @@ public: std::list m_lTabletTools; std::list m_lTabletPads; + // idle inhibitors + std::list m_lIdleInhibitors; + void newTabletTool(wlr_input_device*); void newTabletPad(wlr_input_device*); void focusTablet(STablet*, wlr_tablet_tool*, bool motion = false); + void newIdleInhibitor(wlr_idle_inhibitor_v1*); + void recheckIdleInhibitorStatus(); SKeyboard* m_pActiveKeyboard = nullptr;