diff --git a/src/Compositor.cpp b/src/Compositor.cpp index ca62843e..9269dff0 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -2021,14 +2021,14 @@ CWindow* CCompositor::getWindowByRegex(const std::string& regexp) { return nullptr; } -void CCompositor::warpCursorTo(const Vector2D& pos) { +void CCompositor::warpCursorTo(const Vector2D& pos, bool force) { // warpCursorTo should only be used for warps that // should be disabled with no_cursor_warps static auto* const PNOWARPS = &g_pConfigManager->getConfigValuePtr("general:no_cursor_warps")->intValue; - if (*PNOWARPS) + if (*PNOWARPS && !force) return; wlr_cursor_warp(m_sWLRCursor, m_sSeat.mouse->mouse, pos.x, pos.y); diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 0d9dba67..efb8bcc7 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -167,7 +167,7 @@ class CCompositor { void addToFadingOutSafe(SLayerSurface*); void addToFadingOutSafe(CWindow*); CWindow* getWindowByRegex(const std::string&); - void warpCursorTo(const Vector2D&); + void warpCursorTo(const Vector2D&, bool force = false); SLayerSurface* getLayerSurfaceFromWlr(wlr_layer_surface_v1*); SLayerSurface* getLayerSurfaceFromSurface(wlr_surface*); void closeWindow(CWindow*); diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index a631b0a1..1e199683 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -44,6 +44,9 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { // new monitor added, let's accomodate for that. const auto OUTPUT = (wlr_output*)data; + // for warping the cursor on launch + static bool firstLaunch = true; + if (!OUTPUT->name) { Debug::log(ERR, "New monitor has no name?? Ignoring"); return; @@ -89,6 +92,11 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { g_pConfigManager->m_bWantsMonitorReload = true; g_pCompositor->scheduleFrameForMonitor(PNEWMONITOR); + + if (firstLaunch) { + firstLaunch = false; + g_pCompositor->warpCursorTo(PNEWMONITOR->vecPosition + PNEWMONITOR->vecSize / 2.f, true); + } } void Events::listener_monitorFrame(void* owner, void* data) {