xdgshell: set predicted tiled windows to monitor res size pre-map

Should improve #4022 although not exactly fix. Fixing would require more witchcraft
This commit is contained in:
Vaxry 2023-12-17 20:09:34 +00:00
parent 9fd928e114
commit 763d5fa05f
2 changed files with 38 additions and 2 deletions

View file

@ -230,6 +230,7 @@ class CWindow {
int m_iWorkspaceID = -1;
bool m_bIsMapped = false;
bool m_bInitialCommitPassed = false;
bool m_bRequestsFloat = false;

View file

@ -791,7 +791,42 @@ void Events::listener_ackConfigure(void* owner, void* data) {
void Events::listener_commitWindow(void* owner, void* data) {
CWindow* PWINDOW = (CWindow*)owner;
if (!PWINDOW->m_bIsMapped || PWINDOW->isHidden())
if (!PWINDOW->m_bIsMapped) {
// dupes shouldn't happen, but you never know, really.
if (PWINDOW->m_bInitialCommitPassed || PWINDOW->m_bIsX11)
return;
PWINDOW->m_bInitialCommitPassed = true;
// this is an initial commit of a surface
// in here, the surface will ask us what size we'd like it to be.
// wlroots by default doesn't send anything, so the app can use its preferred floating size
// if we predict it will be tiled, it's better to set it to the monitor size
// so it doesn't appear with the wrong size at the beginning.
// too big > too small, because will be clipped and won't look that bad.
auto willFloat = g_pXWaylandManager->shouldBeFloated(PWINDOW);
const auto WRULES = g_pConfigManager->getMatchingRules(PWINDOW);
for (auto& r : WRULES) {
if (r.szRule == "float") {
willFloat = true;
break;
} else if (r.szRule == "tile") {
willFloat = false;
break;
}
}
if (willFloat)
return;
g_pXWaylandManager->setWindowSize(PWINDOW, g_pCompositor->m_pLastMonitor ? g_pCompositor->m_pLastMonitor->vecSize : Vector2D{1920, 1080}, true);
return;
}
if (PWINDOW->isHidden())
return;
if (PWINDOW->m_bIsX11)