xwayland: normalize OR geometry to logical coords with force_zero_scaling (#13359)
Fixes X11 popups, tooltips, and menus showing black boxes on scaled monitors with xwayland:force_zero_scaling = 1 #13334
This commit is contained in:
parent
c60b3cb2ed
commit
457617b5a3
3 changed files with 23 additions and 19 deletions
|
|
@ -2111,8 +2111,11 @@ void CWindow::mapWindow() {
|
||||||
if (m_workspace)
|
if (m_workspace)
|
||||||
m_workspace->updateWindows();
|
m_workspace->updateWindows();
|
||||||
|
|
||||||
if (PMONITOR && isX11OverrideRedirect())
|
if (PMONITOR && isX11OverrideRedirect()) {
|
||||||
m_X11SurfaceScaledBy = PMONITOR->m_scale;
|
static auto PXWLFORCESCALEZERO = CConfigValue<Hyprlang::INT>("xwayland:force_zero_scaling");
|
||||||
|
if (*PXWLFORCESCALEZERO)
|
||||||
|
m_X11SurfaceScaledBy = PMONITOR->m_scale;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWindow::unmapWindow() {
|
void CWindow::unmapWindow() {
|
||||||
|
|
@ -2413,21 +2416,19 @@ void CWindow::unmanagedSetGeometry() {
|
||||||
|
|
||||||
const auto LOGICALPOS = g_pXWaylandManager->xwaylandToWaylandCoords(m_xwaylandSurface->m_geometry.pos());
|
const auto LOGICALPOS = g_pXWaylandManager->xwaylandToWaylandCoords(m_xwaylandSurface->m_geometry.pos());
|
||||||
|
|
||||||
if (abs(std::floor(POS.x) - LOGICALPOS.x) > 2 || abs(std::floor(POS.y) - LOGICALPOS.y) > 2 || abs(std::floor(SIZ.x) - m_xwaylandSurface->m_geometry.width) > 2 ||
|
const auto PMONITOR = m_monitor.lock();
|
||||||
abs(std::floor(SIZ.y) - m_xwaylandSurface->m_geometry.height) > 2) {
|
const auto XWLSCALE = (*PXWLFORCESCALEZERO && PMONITOR) ? PMONITOR->m_scale : 1.0;
|
||||||
|
const auto LOGICALGEOSIZE = m_xwaylandSurface->m_geometry.size() / XWLSCALE;
|
||||||
|
|
||||||
|
if (abs(std::floor(POS.x) - LOGICALPOS.x) > 2 || abs(std::floor(POS.y) - LOGICALPOS.y) > 2 || abs(std::floor(SIZ.x) - LOGICALGEOSIZE.x) > 2 ||
|
||||||
|
abs(std::floor(SIZ.y) - LOGICALGEOSIZE.y) > 2) {
|
||||||
Log::logger->log(Log::DEBUG, "Unmanaged window {} requests geometry update to {:j} {:j}", m_self.lock(), LOGICALPOS, m_xwaylandSurface->m_geometry.size());
|
Log::logger->log(Log::DEBUG, "Unmanaged window {} requests geometry update to {:j} {:j}", m_self.lock(), LOGICALPOS, m_xwaylandSurface->m_geometry.size());
|
||||||
|
|
||||||
g_pHyprRenderer->damageWindow(m_self.lock());
|
g_pHyprRenderer->damageWindow(m_self.lock());
|
||||||
m_realPosition->setValueAndWarp(Vector2D(LOGICALPOS.x, LOGICALPOS.y));
|
m_realPosition->setValueAndWarp(Vector2D(LOGICALPOS.x, LOGICALPOS.y));
|
||||||
|
|
||||||
if (abs(std::floor(SIZ.x) - m_xwaylandSurface->m_geometry.w) > 2 || abs(std::floor(SIZ.y) - m_xwaylandSurface->m_geometry.h) > 2)
|
if (abs(std::floor(SIZ.x) - LOGICALGEOSIZE.x) > 2 || abs(std::floor(SIZ.y) - LOGICALGEOSIZE.y) > 2)
|
||||||
m_realSize->setValueAndWarp(m_xwaylandSurface->m_geometry.size());
|
m_realSize->setValueAndWarp(LOGICALGEOSIZE);
|
||||||
|
|
||||||
if (*PXWLFORCESCALEZERO) {
|
|
||||||
if (const auto PMONITOR = m_monitor.lock(); PMONITOR) {
|
|
||||||
m_realSize->setValueAndWarp(m_realSize->goal() / PMONITOR->m_scale);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_position = m_realPosition->goal();
|
m_position = m_realPosition->goal();
|
||||||
m_size = m_realSize->goal();
|
m_size = m_realSize->goal();
|
||||||
|
|
|
||||||
|
|
@ -102,13 +102,7 @@ void CDefaultFloatingAlgorithm::newTarget(SP<ITarget> target) {
|
||||||
|
|
||||||
// TODO: not very OOP, is it?
|
// TODO: not very OOP, is it?
|
||||||
if (const auto WTARGET = dynamicPointerCast<CWindowTarget>(target); WTARGET) {
|
if (const auto WTARGET = dynamicPointerCast<CWindowTarget>(target); WTARGET) {
|
||||||
static auto PXWLFORCESCALEZERO = CConfigValue<Hyprlang::INT>("xwayland:force_zero_scaling");
|
const auto PWINDOW = WTARGET->window();
|
||||||
|
|
||||||
const auto PWINDOW = WTARGET->window();
|
|
||||||
const auto PMONITOR = WTARGET->space()->workspace()->m_monitor.lock();
|
|
||||||
|
|
||||||
if (*PXWLFORCESCALEZERO && PWINDOW->m_isX11)
|
|
||||||
*PWINDOW->m_realSize = PWINDOW->m_realSize->goal() / PMONITOR->m_scale;
|
|
||||||
|
|
||||||
if (PWINDOW->m_X11DoesntWantBorders || (PWINDOW->m_isX11 && PWINDOW->isX11OverrideRedirect())) {
|
if (PWINDOW->m_X11DoesntWantBorders || (PWINDOW->m_isX11 && PWINDOW->isX11OverrideRedirect())) {
|
||||||
PWINDOW->m_realPosition->warp();
|
PWINDOW->m_realPosition->warp();
|
||||||
|
|
|
||||||
|
|
@ -266,6 +266,12 @@ std::expected<SGeometryRequested, eGeometryFailure> CWindowTarget::desiredGeomet
|
||||||
return std::unexpected(GEOMETRY_NO_DESIRED);
|
return std::unexpected(GEOMETRY_NO_DESIRED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static auto PXWLFORCESCALEZERO = CConfigValue<Hyprlang::INT>("xwayland:force_zero_scaling");
|
||||||
|
const auto toLogical = [&](SGeometryRequested& req) {
|
||||||
|
if (m_window->m_isX11 && *PXWLFORCESCALEZERO && PMONITOR)
|
||||||
|
req.size /= PMONITOR->m_scale;
|
||||||
|
};
|
||||||
|
|
||||||
if (DESIRED_GEOM.width <= 2 || DESIRED_GEOM.height <= 2) {
|
if (DESIRED_GEOM.width <= 2 || DESIRED_GEOM.height <= 2) {
|
||||||
const auto SURFACE = m_window->wlSurface()->resource();
|
const auto SURFACE = m_window->wlSurface()->resource();
|
||||||
|
|
||||||
|
|
@ -273,6 +279,7 @@ std::expected<SGeometryRequested, eGeometryFailure> CWindowTarget::desiredGeomet
|
||||||
// center on mon and call it a day
|
// center on mon and call it a day
|
||||||
requested.pos.reset();
|
requested.pos.reset();
|
||||||
requested.size = clampSizeForDesired(SURFACE->m_current.size);
|
requested.size = clampSizeForDesired(SURFACE->m_current.size);
|
||||||
|
toLogical(requested);
|
||||||
return requested;
|
return requested;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -285,6 +292,7 @@ std::expected<SGeometryRequested, eGeometryFailure> CWindowTarget::desiredGeomet
|
||||||
if (m_window->m_xwaylandSurface->m_geometry.x != 0 && m_window->m_xwaylandSurface->m_geometry.y != 0) {
|
if (m_window->m_xwaylandSurface->m_geometry.x != 0 && m_window->m_xwaylandSurface->m_geometry.y != 0) {
|
||||||
requested.size = SIZE;
|
requested.size = SIZE;
|
||||||
requested.pos = g_pXWaylandManager->xwaylandToWaylandCoords(m_window->m_xwaylandSurface->m_geometry.pos());
|
requested.pos = g_pXWaylandManager->xwaylandToWaylandCoords(m_window->m_xwaylandSurface->m_geometry.pos());
|
||||||
|
toLogical(requested);
|
||||||
return requested;
|
return requested;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -318,6 +326,7 @@ std::expected<SGeometryRequested, eGeometryFailure> CWindowTarget::desiredGeomet
|
||||||
if (DESIRED_GEOM.w <= 2 || DESIRED_GEOM.h <= 2)
|
if (DESIRED_GEOM.w <= 2 || DESIRED_GEOM.h <= 2)
|
||||||
return std::unexpected(GEOMETRY_NO_DESIRED);
|
return std::unexpected(GEOMETRY_NO_DESIRED);
|
||||||
|
|
||||||
|
toLogical(requested);
|
||||||
return requested;
|
return requested;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue