Emit clientMaximizedStateAboutToChange when maximized mode is actually about to change

Window rules code can call maximize(requestedMaximizeMode()), in which
case the Window will emit clientMaximizedStateAboutToChange but the
maximize mode may not actually change.

This change moves the emission of of the clientMaximizedStateAboutToChange
signal to Window::changeMaximize(). The reason for doing so is that
window rules have the final decision what the maximize mode will be.

CCBUG: 459301
This commit is contained in:
Vlad Zahorodnii 2022-09-22 13:34:20 +03:00
parent f2defd1dfa
commit 7b3ae310e6
3 changed files with 21 additions and 15 deletions

View file

@ -1587,8 +1587,6 @@ void Window::maximize(MaximizeMode m)
void Window::setMaximize(bool vertically, bool horizontally)
{
// changeMaximize() flips the state, so change from set->flip
Q_EMIT clientMaximizedStateAboutToChange(this, MaximizeMode((vertically ? MaximizeVertical : 0) | (horizontally ? MaximizeHorizontal : 0)));
const MaximizeMode oldMode = requestedMaximizeMode();
changeMaximize(
oldMode & MaximizeHorizontal ? !horizontally : horizontally,

View file

@ -4307,39 +4307,43 @@ void X11Window::changeMaximize(bool horizontal, bool vertical, bool adjust)
MaximizeMode old_mode = max_mode;
// 'adjust == true' means to update the size only, e.g. after changing workspace size
MaximizeMode mode = max_mode;
if (!adjust) {
if (vertical) {
max_mode = MaximizeMode(max_mode ^ MaximizeVertical);
mode = MaximizeMode(mode ^ MaximizeVertical);
}
if (horizontal) {
max_mode = MaximizeMode(max_mode ^ MaximizeHorizontal);
mode = MaximizeMode(mode ^ MaximizeHorizontal);
}
}
// if the client insist on a fix aspect ratio, we check whether the maximizing will get us
// out of screen bounds and take that as a "full maximization with aspect check" then
if (m_geometryHints.hasAspect() && // fixed aspect
(max_mode == MaximizeVertical || max_mode == MaximizeHorizontal) && // ondimensional maximization
(mode == MaximizeVertical || mode == MaximizeHorizontal) && // ondimensional maximization
rules()->checkStrictGeometry(true)) { // obey aspect
const QSize minAspect = m_geometryHints.minAspect();
const QSize maxAspect = m_geometryHints.maxAspect();
if (max_mode == MaximizeVertical || (old_mode & MaximizeVertical)) {
if (mode == MaximizeVertical || (old_mode & MaximizeVertical)) {
const double fx = minAspect.width(); // use doubles, because the values can be MAX_INT
const double fy = maxAspect.height(); // use doubles, because the values can be MAX_INT
if (fx * clientArea.height() / fy > clientArea.width()) { // too big
max_mode = old_mode & MaximizeHorizontal ? MaximizeRestore : MaximizeFull;
mode = old_mode & MaximizeHorizontal ? MaximizeRestore : MaximizeFull;
}
} else { // max_mode == MaximizeHorizontal
} else { // mode == MaximizeHorizontal
const double fx = maxAspect.width();
const double fy = minAspect.height();
if (fy * clientArea.width() / fx > clientArea.height()) { // too big
max_mode = old_mode & MaximizeVertical ? MaximizeRestore : MaximizeFull;
mode = old_mode & MaximizeVertical ? MaximizeRestore : MaximizeFull;
}
}
}
max_mode = rules()->checkMaximize(max_mode);
if (!adjust && max_mode == old_mode) {
mode = rules()->checkMaximize(mode);
if (max_mode != mode) {
Q_EMIT clientMaximizedStateAboutToChange(this, mode);
max_mode = mode;
} else if (!adjust) {
return;
}

View file

@ -1658,17 +1658,21 @@ void XdgToplevelWindow::changeMaximize(bool horizontal, bool vertical, bool adju
const QRectF oldGeometry = moveResizeGeometry();
// 'adjust == true' means to update the size only, e.g. after changing workspace size
MaximizeMode mode = m_requestedMaximizeMode;
if (!adjust) {
if (vertical) {
m_requestedMaximizeMode = MaximizeMode(m_requestedMaximizeMode ^ MaximizeVertical);
mode = MaximizeMode(mode ^ MaximizeVertical);
}
if (horizontal) {
m_requestedMaximizeMode = MaximizeMode(m_requestedMaximizeMode ^ MaximizeHorizontal);
mode = MaximizeMode(mode ^ MaximizeHorizontal);
}
}
m_requestedMaximizeMode = rules()->checkMaximize(m_requestedMaximizeMode);
if (!adjust && m_requestedMaximizeMode == oldMode) {
mode = rules()->checkMaximize(mode);
if (m_requestedMaximizeMode != mode) {
Q_EMIT clientMaximizedStateAboutToChange(this, mode);
m_requestedMaximizeMode = mode;
} else if (!adjust) {
return;
}