diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2023-09-23 01:21:59 +0100 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2023-09-23 01:28:45 +0100 |
| commit | fb80cbe415835a7e0c64e2038d0fc56e8aba0ab4 (patch) | |
| tree | 15058bb43121adf14735c4e551064716de92a8a8 /src/Compositor.cpp | |
| parent | 1b48642fd15c433c53876f1b933dcd46265caf8f (diff) | |
input: properly track mouse focus on drag operations
Diffstat (limited to 'src/Compositor.cpp')
| -rw-r--r-- | src/Compositor.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp index d3f8bab2..92545faf 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -830,6 +830,34 @@ wlr_surface* CCompositor::vectorWindowToSurface(const Vector2D& pos, CWindow* pW return PSURFACE->surface; } +Vector2D CCompositor::vectorToSurfaceLocal(const Vector2D& vec, CWindow* pWindow, wlr_surface* pSurface) { + if (!windowValidMapped(pWindow)) + return {}; + + if (pWindow->m_bIsX11) + return vec - pWindow->m_vRealPosition.goalv(); + + const auto PSURFACE = pWindow->m_uSurface.xdg; + + std::tuple<wlr_surface*, int, int> iterData = {pSurface, -1337, -1337}; + + wlr_xdg_surface_for_each_surface( + PSURFACE, + [](wlr_surface* surf, int x, int y, void* data) { + const auto PDATA = (std::tuple<wlr_surface*, int, int>*)data; + if (surf == std::get<0>(*PDATA)) { + std::get<1>(*PDATA) = x; + std::get<2>(*PDATA) = y; + } + }, + &iterData); + + if (std::get<1>(iterData) == -1337 && std::get<2>(iterData) == -1337) + return vec - pWindow->m_vRealPosition.goalv(); + + return vec - pWindow->m_vRealPosition.goalv() - Vector2D{std::get<1>(iterData), std::get<2>(iterData)}; +} + CMonitor* CCompositor::getMonitorFromOutput(wlr_output* out) { for (auto& m : m_vMonitors) { if (m->output == out) { |
