summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2023-08-15 20:09:32 +0200
committervaxerski <vaxry@vaxry.net>2023-08-15 20:10:43 +0200
commit4986d74ef201171a930c312a8e3b72a22d9b84ee (patch)
tree49a8a6db7178fe3cd7cfe063180d87fd4ada6005 /src
parent91e28bbe9df85e2e94fbcc0137106362aea14ab5 (diff)
xwayland: fix use of xwayland coords in native spaces
Diffstat (limited to 'src')
-rw-r--r--src/events/Windows.cpp8
-rw-r--r--src/layout/IHyprLayout.cpp17
-rw-r--r--src/managers/XWaylandManager.cpp29
-rw-r--r--src/managers/XWaylandManager.hpp1
4 files changed, 45 insertions, 10 deletions
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index a45aa91e..211f6ed3 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -413,8 +413,8 @@ void Events::listener_mapWindow(void* owner, void* data) {
PWINDOW->setHidden(false);
} catch (...) { Debug::log(LOG, "Rule move failed, rule: %s -> %s", r.szRule.c_str(), r.szValue.c_str()); }
} else if (r.szRule.find("center") == 0) {
- auto RESERVEDOFFSET = Vector2D();
- const auto ARGS = CVarList(r.szRule, 2, ' ');
+ auto RESERVEDOFFSET = Vector2D();
+ const auto ARGS = CVarList(r.szRule, 2, ' ');
if (ARGS[1] == "1")
RESERVEDOFFSET = (PMONITOR->vecReservedTopLeft - PMONITOR->vecReservedBottomRight) / 2.f;
@@ -994,7 +994,9 @@ void Events::listener_configureX11(void* owner, void* data) {
else
PWINDOW->setHidden(true);
- PWINDOW->m_vRealPosition.setValueAndWarp(Vector2D(E->x, E->y));
+ const auto LOGICALPOS = g_pXWaylandManager->xwaylandToWaylandCoords({E->x, E->y});
+
+ PWINDOW->m_vRealPosition.setValueAndWarp(LOGICALPOS);
PWINDOW->m_vRealSize.setValueAndWarp(Vector2D(E->width, E->height));
static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue;
diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp
index f39b190a..2e3f690f 100644
--- a/src/layout/IHyprLayout.cpp
+++ b/src/layout/IHyprLayout.cpp
@@ -77,7 +77,14 @@ void IHyprLayout::onWindowRemovedFloating(CWindow* pWindow) {
void IHyprLayout::onWindowCreatedFloating(CWindow* pWindow) {
wlr_box desiredGeometry = {0};
g_pXWaylandManager->getGeometryForWindow(pWindow, &desiredGeometry);
- const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
+ const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
+
+ if (pWindow->m_bIsX11) {
+ Vector2D xy = {desiredGeometry.x, desiredGeometry.y};
+ xy = g_pXWaylandManager->xwaylandToWaylandCoords(xy);
+ desiredGeometry.x = xy.x;
+ desiredGeometry.y = xy.y;
+ }
static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue;
@@ -103,7 +110,7 @@ void IHyprLayout::onWindowCreatedFloating(CWindow* pWindow) {
if (pWindow->m_bIsX11 && pWindow->m_uSurface.xwayland->override_redirect) {
if (pWindow->m_uSurface.xwayland->x != 0 && pWindow->m_uSurface.xwayland->y != 0)
- pWindow->m_vRealPosition = Vector2D{pWindow->m_uSurface.xwayland->x, pWindow->m_uSurface.xwayland->y};
+ pWindow->m_vRealPosition = g_pXWaylandManager->xwaylandToWaylandCoords({pWindow->m_uSurface.xwayland->x, pWindow->m_uSurface.xwayland->y});
else
pWindow->m_vRealPosition = Vector2D(PMONITOR->vecPosition.x + (PMONITOR->vecSize.x - pWindow->m_vRealSize.goalv().x) / 2.f,
PMONITOR->vecPosition.y + (PMONITOR->vecSize.y - pWindow->m_vRealSize.goalv().y) / 2.f);
@@ -153,10 +160,8 @@ void IHyprLayout::onWindowCreatedFloating(CWindow* pWindow) {
}
}
- if (*PXWLFORCESCALEZERO && pWindow->m_bIsX11) {
- pWindow->m_vRealSize = pWindow->m_vRealSize.goalv() / PMONITOR->scale;
- pWindow->m_vRealPosition = pWindow->m_vRealPosition.goalv() / PMONITOR->scale;
- }
+ if (*PXWLFORCESCALEZERO && pWindow->m_bIsX11)
+ pWindow->m_vRealSize = pWindow->m_vRealSize.goalv() / PMONITOR->scale;
if (pWindow->m_bX11DoesntWantBorders || (pWindow->m_bIsX11 && pWindow->m_uSurface.xwayland->override_redirect)) {
pWindow->m_vRealPosition.warp();
diff --git a/src/managers/XWaylandManager.cpp b/src/managers/XWaylandManager.cpp
index fcd64280..5820f9a3 100644
--- a/src/managers/XWaylandManager.cpp
+++ b/src/managers/XWaylandManager.cpp
@@ -308,4 +308,31 @@ Vector2D CHyprXWaylandManager::getMaxSizeForWindow(CWindow* pWindow) {
MAXSIZE.y = 99999;
return MAXSIZE;
-} \ No newline at end of file
+}
+
+Vector2D CHyprXWaylandManager::xwaylandToWaylandCoords(const Vector2D& coord) {
+
+ static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue;
+
+ CMonitor* pMonitor = nullptr;
+ for (auto& m : g_pCompositor->m_vMonitors) {
+ const auto SIZ = *PXWLFORCESCALEZERO ? m->vecTransformedSize : m->vecSize;
+ if (VECINRECT(coord, m->vecXWaylandPosition.x, m->vecXWaylandPosition.y, SIZ.x, SIZ.y)) {
+ pMonitor = m.get();
+ break;
+ }
+ }
+
+ if (!pMonitor)
+ return Vector2D{};
+
+ // get local coords
+ Vector2D result = coord - pMonitor->vecXWaylandPosition;
+ // if scaled, unscale
+ if (*PXWLFORCESCALEZERO)
+ result = result / pMonitor->scale;
+ // add pos
+ result = result + pMonitor->vecPosition;
+
+ return result;
+}
diff --git a/src/managers/XWaylandManager.hpp b/src/managers/XWaylandManager.hpp
index 27bce17d..28ae67cc 100644
--- a/src/managers/XWaylandManager.hpp
+++ b/src/managers/XWaylandManager.hpp
@@ -26,6 +26,7 @@ class CHyprXWaylandManager {
void moveXWaylandWindow(CWindow*, const Vector2D&);
void checkBorders(CWindow*);
Vector2D getMaxSizeForWindow(CWindow*);
+ Vector2D xwaylandToWaylandCoords(const Vector2D&);
};
inline std::unique_ptr<CHyprXWaylandManager> g_pXWaylandManager; \ No newline at end of file