summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-01 23:11:09 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-01 23:11:09 +0200
commitcd62eb56249d9db6b3bb33aacdd578c8c162e3ae (patch)
tree8e6db697e9e4b6919f5eaef1aa9f0a3299491890 /src
parenta64943fd12a65fb265e5aed49a0da315947cf31a (diff)
Fixed XWayland (GTK/?) popups focus
Diffstat (limited to 'src')
-rw-r--r--src/Compositor.cpp39
-rw-r--r--src/Compositor.hpp1
-rw-r--r--src/managers/InputManager.cpp12
3 files changed, 39 insertions, 13 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index b2947025..99bb5713 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -289,6 +289,34 @@ 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();
@@ -342,16 +370,17 @@ void CCompositor::focusWindow(CWindow* pWindow) {
}
void CCompositor::focusSurface(wlr_surface* pSurface) {
- if (m_sSeat.seat->keyboard_state.focused_surface == pSurface)
+ if (m_pLastFocus == pSurface)
return; // Don't focus when already focused on this.
if (!pSurface)
return;
// Unfocus last surface if should
- const auto PWINDOWATCURSOR = vectorToWindowIdeal(g_pInputManager->getMouseCoordsInternal());
- if (m_pLastFocus && !(PWINDOWATCURSOR && g_pXWaylandManager->getWindowSurface(PWINDOWATCURSOR) == m_pLastFocus))
+ if (m_pLastFocus && !wlr_surface_is_xwayland_surface(pSurface)) {
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);
@@ -365,9 +394,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", pSurface, PWINDOW->m_szTitle.c_str());
+ 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);
else
- Debug::log(LOG, "Set keyboard focus to surface %x", pSurface);
+ Debug::log(LOG, "Set keyboard focus to surface %x (%dx%d)", pSurface, pSurface->current.width, pSurface->current.height);
}
bool CCompositor::windowValidMapped(CWindow* pWindow) {
diff --git a/src/Compositor.hpp b/src/Compositor.hpp
index 5d67356d..b81560c1 100644
--- a/src/Compositor.hpp
+++ b/src/Compositor.hpp
@@ -76,6 +76,7 @@ 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<SLayerSurface*>*, Vector2D*);
CWindow* windowFromCursor();
diff --git a/src/managers/InputManager.cpp b/src/managers/InputManager.cpp
index 10b1ad95..20ee8041 100644
--- a/src/managers/InputManager.cpp
+++ b/src/managers/InputManager.cpp
@@ -23,7 +23,6 @@ void CInputManager::mouseMoveUnified(uint32_t time) {
// update stuff
updateDragIcon();
-
// focus
wlr_surface* foundSurface = nullptr;
Vector2D mouseCoords = getMouseCoordsInternal();
@@ -66,11 +65,10 @@ 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->vectorToWindowIdeal(mouseCoords);
- if (!foundSurface && PWINDOWIDEAL) {
- foundSurface = g_pXWaylandManager->getWindowSurface(PWINDOWIDEAL);
- if (foundSurface)
- surfacePos = PWINDOWIDEAL->m_vRealPosition;
+ const auto PWINDOWIDEAL = g_pCompositor->vectorToWindowIdealExcludeWithSurface(mouseCoords, nullptr, &foundSurface);
+
+ if (foundSurface && PWINDOWIDEAL) {
+ surfacePos = PWINDOWIDEAL->m_vRealPosition;
}
// then surfaces below
@@ -124,8 +122,6 @@ 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);