diff --git a/hyprctl/hyprctl.usage b/hyprctl/hyprctl.usage index 64cbbb80..298d253e 100644 --- a/hyprctl/hyprctl.usage +++ b/hyprctl/hyprctl.usage @@ -11,11 +11,11 @@ hyprctl []... | (-q | --quiet) "Disable output" ; - ::= {{{ hyprctl clients | grep class | awk '{print $2}' }}}; + ::= {{{ hyprctl clients | awk '/class/{print $2}' }}}; - ::= {{{ hyprpm list | grep "Plugin" | awk '{print $4}' }}}; + ::= {{{ hyprpm list | awk '/Plugin/{print $4}' }}}; - ::= {{{ hyprctl monitors | grep Monitor | awk '{ print $2 }' }}}; + ::= {{{ hyprctl monitors | awk '/Monitor/{ print $2 }' }}}; ::= {{{ hyprctl devices | sed -n '/Keyboard at/{n; s/^\s\+//; p}' }}}; diff --git a/hyprpm/hyprpm.bash b/hyprpm/hyprpm.bash index 6989f7c1..ffc33e19 100644 --- a/hyprpm/hyprpm.bash +++ b/hyprpm/hyprpm.bash @@ -1,5 +1,5 @@ _hyprpm_cmd_0 () { - hyprpm list | grep Plugin | awk '{print $4}' + hyprpm list | awk '/Plugin/{print $4}' } _hyprpm () { diff --git a/hyprpm/hyprpm.fish b/hyprpm/hyprpm.fish index 81a1c59e..7be4f224 100644 --- a/hyprpm/hyprpm.fish +++ b/hyprpm/hyprpm.fish @@ -1,6 +1,6 @@ function _hyprpm_1 set 1 $argv[1] - hyprpm list | grep Plugin | awk '{print $4}' + hyprpm list | awk '/Plugin/{print $4}' end function _hyprpm diff --git a/hyprpm/hyprpm.usage b/hyprpm/hyprpm.usage index f321faf6..369c9d2b 100644 --- a/hyprpm/hyprpm.usage +++ b/hyprpm/hyprpm.usage @@ -16,4 +16,4 @@ hyprpm []... | (reload) "Reload all plugins" ; - ::= {{{ hyprpm list | grep Plugin | awk '{print $4}' }}}; + ::= {{{ hyprpm list | awk '/Plugin/{print $4}' }}}; diff --git a/hyprpm/hyprpm.zsh b/hyprpm/hyprpm.zsh index e355a1fa..854e8426 100644 --- a/hyprpm/hyprpm.zsh +++ b/hyprpm/hyprpm.zsh @@ -1,7 +1,7 @@ #compdef hyprpm _hyprpm_cmd_0 () { - hyprpm list | grep Plugin | awk '{print $4}' + hyprpm list | awk '/Plugin/{print $4}' } _hyprpm () { diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 2ed1a951..f0a2887a 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -413,7 +413,7 @@ void CCompositor::initManagers(eManagersInitStage stage) { switch (stage) { case STAGE_PRIORITY: { Debug::log(LOG, "Creating the EventLoopManager!"); - g_pEventLoopManager = std::make_unique(); + g_pEventLoopManager = std::make_unique(m_sWLDisplay, m_sWLEventLoop); Debug::log(LOG, "Creating the HookSystem!"); g_pHookSystem = std::make_unique(); @@ -604,7 +604,7 @@ void CCompositor::startCompositor() { // This blocks until we are done. Debug::log(LOG, "Hyprland is ready, running the event loop!"); - g_pEventLoopManager->enterLoop(m_sWLDisplay, m_sWLEventLoop); + g_pEventLoopManager->enterLoop(); } CMonitor* CCompositor::getMonitorFromID(const int& id) { diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index f66b4457..cfc77c10 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -1374,20 +1374,21 @@ void CKeybindManager::moveActiveTo(std::string args) { return; if (PLASTWINDOW->m_bIsFloating) { - Vector2D vPos; - const auto PMONITOR = g_pCompositor->getMonitorFromID(PLASTWINDOW->m_iMonitorID); - const auto BORDERSIZE = PLASTWINDOW->getRealBorderSize(); + std::optional vPosx, vPosy; + const auto PMONITOR = g_pCompositor->getMonitorFromID(PLASTWINDOW->m_iMonitorID); + const auto BORDERSIZE = PLASTWINDOW->getRealBorderSize(); switch (arg) { - case 'l': vPos.x = PMONITOR->vecReservedTopLeft.x + BORDERSIZE + PMONITOR->vecPosition.x; break; - case 'r': vPos.x = PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x - PLASTWINDOW->m_vRealSize.goal().x - BORDERSIZE + PMONITOR->vecPosition.x; break; + case 'l': vPosx = PMONITOR->vecReservedTopLeft.x + BORDERSIZE + PMONITOR->vecPosition.x; break; + case 'r': vPosx = PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x - PLASTWINDOW->m_vRealSize.goal().x - BORDERSIZE + PMONITOR->vecPosition.x; break; case 't': - case 'u': vPos.y = PMONITOR->vecReservedTopLeft.y + BORDERSIZE + PMONITOR->vecPosition.y; break; + case 'u': vPosy = PMONITOR->vecReservedTopLeft.y + BORDERSIZE + PMONITOR->vecPosition.y; break; case 'b': - case 'd': vPos.y = PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PLASTWINDOW->m_vRealSize.goal().y - BORDERSIZE + PMONITOR->vecPosition.y; break; + case 'd': vPosy = PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PLASTWINDOW->m_vRealSize.goal().y - BORDERSIZE + PMONITOR->vecPosition.y; break; } - PLASTWINDOW->m_vRealPosition = Vector2D(vPos.x != 0 ? vPos.x : PLASTWINDOW->m_vRealPosition.goal().x, vPos.y != 0 ? vPos.y : PLASTWINDOW->m_vRealPosition.goal().y); + PLASTWINDOW->m_vRealPosition = Vector2D(vPosx.value_or(PLASTWINDOW->m_vRealPosition.goal().x), vPosy.value_or(PLASTWINDOW->m_vRealPosition.goal().y)); + return; } diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 8b4ba0ee..e34aa54b 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -4,6 +4,7 @@ #include "../protocols/PointerGestures.hpp" #include "../protocols/FractionalScale.hpp" #include "../protocols/core/Compositor.hpp" +#include "eventLoop/EventLoopManager.hpp" #include "SeatManager.hpp" #include #include @@ -139,8 +140,8 @@ CPointerManager::CPointerManager() { onMonitorLayoutChange(); - PMONITOR->events.modeChanged.registerStaticListener([this](void* owner, std::any data) { onMonitorLayoutChange(); }, nullptr); - PMONITOR->events.disconnect.registerStaticListener([this](void* owner, std::any data) { onMonitorLayoutChange(); }, nullptr); + PMONITOR->events.modeChanged.registerStaticListener([this](void* owner, std::any data) { g_pEventLoopManager->doLater([this]() { onMonitorLayoutChange(); }); }, nullptr); + PMONITOR->events.disconnect.registerStaticListener([this](void* owner, std::any data) { g_pEventLoopManager->doLater([this]() { onMonitorLayoutChange(); }); }, nullptr); PMONITOR->events.destroy.registerStaticListener( [this](void* owner, std::any data) { if (g_pCompositor && !g_pCompositor->m_bIsShuttingDown) diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp index 1193ffb8..0d1b0223 100644 --- a/src/managers/eventLoop/EventLoopManager.cpp +++ b/src/managers/eventLoop/EventLoopManager.cpp @@ -9,8 +9,10 @@ #define TIMESPEC_NSEC_PER_SEC 1000000000L -CEventLoopManager::CEventLoopManager() { - m_sTimers.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); +CEventLoopManager::CEventLoopManager(wl_display* display, wl_event_loop* wlEventLoop) { + m_sTimers.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); + m_sWayland.loop = wlEventLoop; + m_sWayland.display = display; } CEventLoopManager::~CEventLoopManager() { @@ -23,13 +25,10 @@ static int timerWrite(int fd, uint32_t mask, void* data) { return 1; } -void CEventLoopManager::enterLoop(wl_display* display, wl_event_loop* wlEventLoop) { - m_sWayland.loop = wlEventLoop; - m_sWayland.display = display; +void CEventLoopManager::enterLoop() { + m_sWayland.eventSource = wl_event_loop_add_fd(m_sWayland.loop, m_sTimers.timerfd, WL_EVENT_READABLE, timerWrite, nullptr); - m_sWayland.eventSource = wl_event_loop_add_fd(wlEventLoop, m_sTimers.timerfd, WL_EVENT_READABLE, timerWrite, nullptr); - - wl_display_run(display); + wl_display_run(m_sWayland.display); Debug::log(LOG, "Kicked off the event loop! :("); } @@ -86,4 +85,25 @@ void CEventLoopManager::nudgeTimers() { itimerspec ts = {.it_value = now}; timerfd_settime(m_sTimers.timerfd, TFD_TIMER_ABSTIME, &ts, nullptr); -} \ No newline at end of file +} + +void CEventLoopManager::doLater(const std::function& fn) { + m_sIdle.fns.emplace_back(fn); + + if (m_sIdle.eventSource) + return; + + m_sIdle.eventSource = wl_event_loop_add_idle( + m_sWayland.loop, + [](void* data) { + auto IDLE = (CEventLoopManager::SIdleData*)data; + auto cpy = IDLE->fns; + IDLE->fns.clear(); + IDLE->eventSource = nullptr; + for (auto& c : cpy) { + if (c) + c(); + } + }, + &m_sIdle); +} diff --git a/src/managers/eventLoop/EventLoopManager.hpp b/src/managers/eventLoop/EventLoopManager.hpp index 7a4fa19e..0b2f9578 100644 --- a/src/managers/eventLoop/EventLoopManager.hpp +++ b/src/managers/eventLoop/EventLoopManager.hpp @@ -9,10 +9,10 @@ class CEventLoopManager { public: - CEventLoopManager(); + CEventLoopManager(wl_display* display, wl_event_loop* wlEventLoop); ~CEventLoopManager(); - void enterLoop(wl_display* display, wl_event_loop* wlEventLoop); + void enterLoop(); // Note: will remove the timer if the ptr is lost. void addTimer(SP timer); @@ -23,6 +23,14 @@ class CEventLoopManager { // recalculates timers void nudgeTimers(); + // schedules a function to run later, aka in a wayland idle event. + void doLater(const std::function& fn); + + struct SIdleData { + wl_event_source* eventSource = nullptr; + std::vector> fns; + }; + private: struct { wl_event_loop* loop = nullptr; @@ -34,6 +42,8 @@ class CEventLoopManager { std::vector> timers; int timerfd = -1; } m_sTimers; + + SIdleData m_sIdle; }; inline std::unique_ptr g_pEventLoopManager; \ No newline at end of file diff --git a/src/protocols/Tablet.cpp b/src/protocols/Tablet.cpp index 393dfd38..518ea5bd 100644 --- a/src/protocols/Tablet.cpp +++ b/src/protocols/Tablet.cpp @@ -599,10 +599,10 @@ void CTabletV2Protocol::proximityOut(SP tool) { if (t->tool != tool || !t->current) continue; - t->current = false; t->lastSurf.reset(); t->resource->sendProximityOut(); t->sendFrame(); + t->current = false; } }