From 929c44e361fe5cc535a9226b05fba21a0e317d69 Mon Sep 17 00:00:00 2001 From: Junxuan Liao <70618504+MikeWalrus@users.noreply.github.com> Date: Sat, 25 Nov 2023 22:27:57 +0800 Subject: [PATCH] input: pass mouse input to IME popups (#3922) --- src/Compositor.cpp | 15 +++++++++++++++ src/Compositor.hpp | 1 + src/managers/input/InputManager.cpp | 15 ++++++++++++--- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 42b620fe..b0e1fcb3 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1106,6 +1106,21 @@ wlr_surface* CCompositor::vectorToLayerSurface(const Vector2D& pos, std::vector< return nullptr; } +SIMEPopup* CCompositor::vectorToIMEPopup(const Vector2D& pos, std::list& popups) { + for (auto& popup : popups) { + auto surface = popup.pSurface->surface; + CBox box{ + popup.realX, + popup.realY, + surface->current.width, + surface->current.height, + }; + if (box.containsPoint(pos)) + return &popup; + } + return nullptr; +} + CWindow* CCompositor::getWindowFromSurface(wlr_surface* pSurface) { for (auto& w : m_vWindows) { if (!w->m_bIsMapped || w->m_bFadingOut || !w->m_bMappedX11) diff --git a/src/Compositor.hpp b/src/Compositor.hpp index d39725aa..8ca43d84 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -139,6 +139,7 @@ class CCompositor { CWindow* vectorToWindowIdeal(const Vector2D&, CWindow* pIgnoreWindow = nullptr); // used only for finding a window to focus on, basically a "findFocusableWindow" CWindow* vectorToWindowTiled(const Vector2D&); wlr_surface* vectorToLayerSurface(const Vector2D&, std::vector>*, Vector2D*, SLayerSurface**); + SIMEPopup* vectorToIMEPopup(const Vector2D& pos, std::list& popups); wlr_surface* vectorWindowToSurface(const Vector2D&, CWindow*, Vector2D& sl); Vector2D vectorToSurfaceLocal(const Vector2D&, CWindow*, wlr_surface*); CWindow* windowFromCursor(); diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 2dba7515..058429c9 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -233,10 +233,20 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { surfacePos = PMONITOR->vecPosition; } - // overlay is above fullscreen + // overlays are above fullscreen if (!foundSurface) foundSurface = g_pCompositor->vectorToLayerSurface(mouseCoords, &PMONITOR->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], &surfaceCoords, &pFoundLayerSurface); + // also IME popups + if (!foundSurface) { + auto popup = g_pCompositor->vectorToIMEPopup(mouseCoords, m_sIMERelay.m_lIMEPopups); + if (popup) { + foundSurface = popup->pSurface->surface; + surfacePos = Vector2D(popup->realX, popup->realY); + } + } + + // also top layers if (!foundSurface) foundSurface = g_pCompositor->vectorToLayerSurface(mouseCoords, &PMONITOR->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &surfaceCoords, &pFoundLayerSurface); @@ -471,7 +481,6 @@ void CInputManager::onMouseButton(wlr_pointer_button_event* e) { } void CInputManager::processMouseRequest(wlr_seat_pointer_request_set_cursor_event* e) { - if (!e->surface) g_pHyprRenderer->m_bWindowRequestedCursorHide = true; else @@ -1636,7 +1645,7 @@ void CInputManager::setCursorIconOnBorder(CWindow* w) { CBox box = w->getWindowMainSurfaceBox(); eBorderIconDirection direction = BORDERICON_NONE; CBox boxFullGrabInput = {box.x - *PEXTENDBORDERGRAB - BORDERSIZE, box.y - *PEXTENDBORDERGRAB - BORDERSIZE, box.width + 2 * (*PEXTENDBORDERGRAB + BORDERSIZE), - box.height + 2 * (*PEXTENDBORDERGRAB + BORDERSIZE)}; + box.height + 2 * (*PEXTENDBORDERGRAB + BORDERSIZE)}; if (w->hasPopupAt(mouseCoords)) direction = BORDERICON_NONE;