diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 356d6aeb..9b9643bd 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -151,7 +151,8 @@ SMonitor* CCompositor::getMonitorFromCursor() { } void CCompositor::removeWindowFromVectorSafe(CWindow* pWindow) { - m_lWindows.remove(*pWindow); + if (windowExists(pWindow)) + m_lWindows.remove(*pWindow); } bool CCompositor::windowExists(CWindow* pWindow) { @@ -189,10 +190,23 @@ void CCompositor::focusWindow(CWindow* pWindow) { wlr_seat_keyboard_notify_enter(m_sWLRSeat, PWINDOWSURFACE, KEYBOARD->keycodes, KEYBOARD->num_keycodes, &KEYBOARD->modifiers); g_pXWaylandManager->activateSurface(PWINDOWSURFACE, true); - if (m_pLastFocus && windowExists(m_pLastFocus)) + if (m_pLastFocus && windowValidMapped(m_pLastFocus)) g_pXWaylandManager->activateSurface(g_pXWaylandManager->getWindowSurface(m_pLastFocus), false); m_pLastFocus = pWindow; Debug::log(LOG, "Set focus to %x", pWindow); +} + +bool CCompositor::windowValidMapped(CWindow* pWindow) { + if (!windowExists(pWindow)) + return false; + + if (pWindow->m_bIsX11 && !pWindow->m_bMappedX11) + return false; + + if (!g_pXWaylandManager->getWindowSurface(pWindow)) + return false; + + return true; } \ No newline at end of file diff --git a/src/Compositor.hpp b/src/Compositor.hpp index d35604a7..6963b6c7 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -60,6 +60,7 @@ public: void removeWindowFromVectorSafe(CWindow*); void focusWindow(CWindow*); bool windowExists(CWindow*); + bool windowValidMapped(CWindow*); CWindow* vectorToWindow(const Vector2D&); }; diff --git a/src/Window.hpp b/src/Window.hpp index 8c9c25ce..c1c0dfb0 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -41,6 +41,7 @@ public: // XWayland stuff bool m_bIsX11 = false; + bool m_bMappedX11 = false; uint64_t m_iX11Type = 0; DYNLISTENER(activateX11); DYNLISTENER(configureX11); diff --git a/src/events/Events.cpp b/src/events/Events.cpp index fbc5c71f..a3a71d7f 100644 --- a/src/events/Events.cpp +++ b/src/events/Events.cpp @@ -200,6 +200,7 @@ void Events::listener_mapWindow(wl_listener* listener, void* data) { const auto PMONITOR = g_pCompositor->getMonitorFromCursor(); PWINDOW->m_iMonitorID = PMONITOR->ID; + PWINDOW->m_bMappedX11 = true; // test g_pXWaylandManager->setWindowSize(PWINDOW, PMONITOR->vecSize); @@ -395,7 +396,10 @@ void Events::listener_outputMgrTest(wl_listener* listener, void* data) { } void Events::listener_requestMouse(wl_listener* listener, void* data) { - + const auto EVENT = (wlr_seat_pointer_request_set_cursor_event*)data; + + if (EVENT->seat_client == g_pCompositor->m_sWLRSeat->pointer_state.focused_client) + wlr_cursor_set_surface(g_pCompositor->m_sWLRCursor, EVENT->surface, EVENT->hotspot_x, EVENT->hotspot_y); } void Events::listener_requestSetPrimarySel(wl_listener* listener, void* data) {