summaryrefslogtreecommitdiff
path: root/src/protocols/XDGOutput.cpp
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2023-08-15 19:15:37 +0200
committervaxerski <vaxry@vaxry.net>2023-08-15 19:15:37 +0200
commit91e28bbe9df85e2e94fbcc0137106362aea14ab5 (patch)
treec2199ee9918e8905a52e91d5d3ea8d5d59443b81 /src/protocols/XDGOutput.cpp
parent2b4537606f604f29b2d42d7be369182831269958 (diff)
xwayland: use a completely separate coordinate system
Use a completely separate coordinate system for XWayland. This fixes all issues with force_zero_scaling overlaps. Fixes #2916
Diffstat (limited to 'src/protocols/XDGOutput.cpp')
-rw-r--r--src/protocols/XDGOutput.cpp40
1 files changed, 1 insertions, 39 deletions
diff --git a/src/protocols/XDGOutput.cpp b/src/protocols/XDGOutput.cpp
index c6635def..82159155 100644
--- a/src/protocols/XDGOutput.cpp
+++ b/src/protocols/XDGOutput.cpp
@@ -107,7 +107,7 @@ void CXDGOutputProtocol::onManagerGetXDGOutput(wl_client* client, wl_resource* r
void CXDGOutputProtocol::updateOutputDetails(SXDGOutput* pOutput) {
static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue;
- const auto POS = pOutput->overridePosition.value_or(pOutput->monitor->vecPosition);
+ const auto POS = pOutput->isXWayland ? pOutput->monitor->vecXWaylandPosition : pOutput->monitor->vecPosition;
zxdg_output_v1_send_logical_position(pOutput->resource->resource(), POS.x, POS.y);
if (*PXWLFORCESCALEZERO && pOutput->isXWayland)
@@ -120,47 +120,9 @@ void CXDGOutputProtocol::updateOutputDetails(SXDGOutput* pOutput) {
}
void CXDGOutputProtocol::updateAllOutputs() {
- static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue;
- std::vector<SXDGOutput*> xwlOutputs;
-
for (auto& o : m_vXDGOutputs) {
- if (o->isXWayland && *PXWLFORCESCALEZERO) {
- xwlOutputs.push_back(o.get());
- o->overridePosition.reset();
- continue;
- }
-
updateOutputDetails(o.get());
wlr_output_schedule_done(o->monitor->output);
}
-
- // all of this will be noop if force_zero_scaling is off
- std::sort(xwlOutputs.begin(), xwlOutputs.end(), [&](const auto& a, const auto& b) { return a->monitor->vecPosition < b->monitor->vecPosition; });
-
- for (auto& o : xwlOutputs) {
- Vector2D suggestedPos = o->monitor->vecPosition;
-
- // check for overlaps
- for (auto& o1 : xwlOutputs) {
- if (!o1->overridePosition.has_value())
- continue;
-
- const auto OPOS = o1->overridePosition.value();
-
- if (OPOS.x + o1->monitor->vecTransformedSize.x > suggestedPos.x && /* Y overlap */
- !(suggestedPos.y + o->monitor->vecTransformedSize.y <= OPOS.y || OPOS.y + o1->monitor->vecTransformedSize.y <= suggestedPos.y))
- suggestedPos.x = OPOS.x + o1->monitor->vecTransformedSize.x;
-
- if (OPOS.y + o1->monitor->vecTransformedSize.y > suggestedPos.y && /* X overlap */
- !(suggestedPos.x + o->monitor->vecTransformedSize.x <= OPOS.x || OPOS.x + o1->monitor->vecTransformedSize.x <= suggestedPos.x))
- suggestedPos.y = OPOS.y + o1->monitor->vecTransformedSize.y;
- }
-
- o->overridePosition = suggestedPos;
-
- updateOutputDetails(o);
-
- wlr_output_schedule_done(o->monitor->output);
- }
}