diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 99bb5713..b2947025 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -289,34 +289,6 @@ CWindow* CCompositor::vectorToWindowIdeal(const Vector2D& pos) { return nullptr; } -CWindow* CCompositor::vectorToWindowIdealExcludeWithSurface(const Vector2D& pos, CWindow* pWindow, wlr_surface** ppSurface) { - const auto PMONITOR = getMonitorFromVector(pos); - // first loop over floating cuz they're above - // TODO: make an actual Z-system - for (auto& w : m_lWindows) { - wlr_box box = {w.m_vRealPosition.x, w.m_vRealPosition.y, w.m_vRealSize.x, w.m_vRealSize.y}; - if (&w != pWindow && w.m_bIsFloating && w.m_bIsMapped && wlr_box_contains_point(&box, m_sWLRCursor->x, m_sWLRCursor->y) && isWorkspaceVisible(w.m_iWorkspaceID)) { - double sx, sy; - if (ppSurface) - *ppSurface = wlr_surface_surface_at(g_pXWaylandManager->getWindowSurface(&w), pos.x - w.m_vRealPosition.x, pos.y - w.m_vRealPosition.y, &sx, &sy); - - return &w; - } - } - - for (auto& w : m_lWindows) { - wlr_box box = {w.m_vPosition.x, w.m_vPosition.y, w.m_vSize.x, w.m_vSize.y}; - if (&w != pWindow && !w.m_bIsFloating && w.m_bIsMapped && wlr_box_contains_point(&box, pos.x, pos.y) && w.m_iWorkspaceID == PMONITOR->activeWorkspace){ - double sx, sy; - if (ppSurface) - *ppSurface = wlr_surface_surface_at(g_pXWaylandManager->getWindowSurface(&w), pos.x - w.m_vRealPosition.x, pos.y - w.m_vRealPosition.y, &sx, &sy); - return &w; - } - } - - return nullptr; -} - CWindow* CCompositor::windowFromCursor() { const auto PMONITOR = getMonitorFromCursor(); @@ -370,17 +342,16 @@ void CCompositor::focusWindow(CWindow* pWindow) { } void CCompositor::focusSurface(wlr_surface* pSurface) { - if (m_pLastFocus == pSurface) + if (m_sSeat.seat->keyboard_state.focused_surface == pSurface) return; // Don't focus when already focused on this. if (!pSurface) return; // Unfocus last surface if should - if (m_pLastFocus && !wlr_surface_is_xwayland_surface(pSurface)) { + const auto PWINDOWATCURSOR = vectorToWindowIdeal(g_pInputManager->getMouseCoordsInternal()); + if (m_pLastFocus && !(PWINDOWATCURSOR && g_pXWaylandManager->getWindowSurface(PWINDOWATCURSOR) == m_pLastFocus)) g_pXWaylandManager->activateSurface(m_pLastFocus, false); - Debug::log(LOG, "Last focus %x deactivated", m_pLastFocus); - } const auto KEYBOARD = wlr_seat_get_keyboard(m_sSeat.seat); @@ -394,9 +365,9 @@ void CCompositor::focusSurface(wlr_surface* pSurface) { g_pXWaylandManager->activateSurface(pSurface, true); if (const auto PWINDOW = getWindowFromSurface(pSurface); PWINDOW) - Debug::log(LOG, "Set keyboard focus to surface %x, with window name: %s (%dx%d)", pSurface, PWINDOW->m_szTitle.c_str(), pSurface->current.width, pSurface->current.height); + Debug::log(LOG, "Set keyboard focus to surface %x, with window name: %s", pSurface, PWINDOW->m_szTitle.c_str()); else - Debug::log(LOG, "Set keyboard focus to surface %x (%dx%d)", pSurface, pSurface->current.width, pSurface->current.height); + Debug::log(LOG, "Set keyboard focus to surface %x", pSurface); } bool CCompositor::windowValidMapped(CWindow* pWindow) { diff --git a/src/Compositor.hpp b/src/Compositor.hpp index b81560c1..5d67356d 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -76,7 +76,6 @@ public: bool windowValidMapped(CWindow*); CWindow* vectorToWindow(const Vector2D&); CWindow* vectorToWindowIdeal(const Vector2D&); - CWindow* vectorToWindowIdealExcludeWithSurface(const Vector2D&, CWindow*, wlr_surface**); CWindow* vectorToWindowTiled(const Vector2D&); wlr_surface* vectorToLayerSurface(const Vector2D&, std::list*, Vector2D*); CWindow* windowFromCursor(); diff --git a/src/managers/InputManager.cpp b/src/managers/InputManager.cpp index 20ee8041..10b1ad95 100644 --- a/src/managers/InputManager.cpp +++ b/src/managers/InputManager.cpp @@ -23,6 +23,7 @@ void CInputManager::mouseMoveUnified(uint32_t time) { // update stuff updateDragIcon(); + // focus wlr_surface* foundSurface = nullptr; Vector2D mouseCoords = getMouseCoordsInternal(); @@ -65,10 +66,11 @@ void CInputManager::mouseMoveUnified(uint32_t time) { foundSurface = g_pCompositor->vectorToLayerSurface(mouseCoords, &PMONITOR->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &surfaceCoords); // then windows - const auto PWINDOWIDEAL = g_pCompositor->vectorToWindowIdealExcludeWithSurface(mouseCoords, nullptr, &foundSurface); - - if (foundSurface && PWINDOWIDEAL) { - surfacePos = PWINDOWIDEAL->m_vRealPosition; + const auto PWINDOWIDEAL = g_pCompositor->vectorToWindowIdeal(mouseCoords); + if (!foundSurface && PWINDOWIDEAL) { + foundSurface = g_pXWaylandManager->getWindowSurface(PWINDOWIDEAL); + if (foundSurface) + surfacePos = PWINDOWIDEAL->m_vRealPosition; } // then surfaces below @@ -122,6 +124,8 @@ void CInputManager::onMouseButton(wlr_pointer_button_event* e) { break; } + refocus(); + // notify app if we didnt handle it if (g_pCompositor->doesSeatAcceptInput(g_pCompositor->m_pLastFocus)) { wlr_seat_pointer_notify_button(g_pCompositor->m_sSeat.seat, e->time_msec, e->button, e->state);