diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 661a2db6..e6de59d5 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 7ad3b7f8..187c7159 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 9d1fdb53..ceade1cc 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 66ba532a..add63140 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 33278053..d9374158 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 2455171d..0c8df64d 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 00000000..3efb40c6 --- /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 e28e084b..3c6fb33d 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;