keepInArea, client geometry containment condition
Since windows can place the decoration outside the screen this needs to be still a valid condition when checking whether we've to keep in area In addition: calculate tx, ty and perform one move call (include rule check and XMoveWindow unless there's a geometry blocker ...) BUG: 324792 FIXED-IN: 4.11.2 REVIEW: 112805
This commit is contained in:
parent
4c170a2fdb
commit
cb88bc8848
1 changed files with 13 additions and 13 deletions
26
geometry.cpp
26
geometry.cpp
|
@ -852,19 +852,19 @@ void Client::keepInArea(QRect area, bool partial)
|
||||||
if (area.width() < width() || area.height() < height())
|
if (area.width() < width() || area.height() < height())
|
||||||
resizeWithChecks(qMin(area.width(), width()), qMin(area.height(), height()));
|
resizeWithChecks(qMin(area.width(), width()), qMin(area.height(), height()));
|
||||||
}
|
}
|
||||||
|
int tx = x(), ty = y();
|
||||||
if (geometry().right() > area.right() && width() <= area.width())
|
if (geometry().right() > area.right() && width() <= area.width())
|
||||||
move(area.right() - width() + 1, y());
|
tx = area.right() - width() + 1;
|
||||||
if (geometry().bottom() > area.bottom() && height() <= area.height())
|
if (geometry().bottom() > area.bottom() && height() <= area.height())
|
||||||
move(x(), area.bottom() - height() + 1);
|
ty = area.bottom() - height() + 1;
|
||||||
if (!area.contains(geometry().topLeft())) {
|
if (!area.contains(geometry().topLeft())) {
|
||||||
int tx = x();
|
|
||||||
int ty = y();
|
|
||||||
if (tx < area.x())
|
if (tx < area.x())
|
||||||
tx = area.x();
|
tx = area.x();
|
||||||
if (ty < area.y())
|
if (ty < area.y())
|
||||||
ty = area.y();
|
ty = area.y();
|
||||||
move(tx, ty);
|
|
||||||
}
|
}
|
||||||
|
if (tx != x() || ty != y())
|
||||||
|
move(tx, ty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -1491,16 +1491,16 @@ void Client::getWmNormalHints()
|
||||||
// update to match restrictions
|
// update to match restrictions
|
||||||
QSize new_size = adjustedSize();
|
QSize new_size = adjustedSize();
|
||||||
if (new_size != size() && !isFullScreen()) {
|
if (new_size != size() && !isFullScreen()) {
|
||||||
QRect orig_geometry = geometry();
|
QRect origClientGeometry(pos() + clientPos(), clientSize());
|
||||||
resizeWithChecks(new_size);
|
resizeWithChecks(new_size);
|
||||||
if ((!isSpecialWindow() || isToolbar()) && !isFullScreen()) {
|
if ((!isSpecialWindow() || isToolbar()) && !isFullScreen()) {
|
||||||
// try to keep the window in its xinerama screen if possible,
|
// try to keep the window in its xinerama screen if possible,
|
||||||
// if that fails at least keep it visible somewhere
|
// if that fails at least keep it visible somewhere
|
||||||
QRect area = workspace()->clientArea(MovementArea, this);
|
QRect area = workspace()->clientArea(MovementArea, this);
|
||||||
if (area.contains(orig_geometry))
|
if (area.contains(origClientGeometry))
|
||||||
keepInArea(area);
|
keepInArea(area);
|
||||||
area = workspace()->clientArea(WorkArea, this);
|
area = workspace()->clientArea(WorkArea, this);
|
||||||
if (area.contains(orig_geometry))
|
if (area.contains(origClientGeometry))
|
||||||
keepInArea(area);
|
keepInArea(area);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1682,7 +1682,7 @@ void Client::configureRequest(int value_mask, int rx, int ry, int rw, int rh, in
|
||||||
if (newScreen != rules()->checkScreen(newScreen))
|
if (newScreen != rules()->checkScreen(newScreen))
|
||||||
return; // not allowed by rule
|
return; // not allowed by rule
|
||||||
|
|
||||||
QRect orig_geometry = geometry();
|
QRect origClientGeometry(pos() + clientPos(), clientSize());
|
||||||
GeometryUpdatesBlocker blocker(this);
|
GeometryUpdatesBlocker blocker(this);
|
||||||
move(new_pos);
|
move(new_pos);
|
||||||
plainResize(ns);
|
plainResize(ns);
|
||||||
|
@ -1690,7 +1690,7 @@ void Client::configureRequest(int value_mask, int rx, int ry, int rw, int rh, in
|
||||||
updateFullScreenHack(QRect(new_pos, QSize(nw, nh)));
|
updateFullScreenHack(QRect(new_pos, QSize(nw, nh)));
|
||||||
QRect area = workspace()->clientArea(WorkArea, this);
|
QRect area = workspace()->clientArea(WorkArea, this);
|
||||||
if (!from_tool && (!isSpecialWindow() || isToolbar()) && !isFullScreen()
|
if (!from_tool && (!isSpecialWindow() || isToolbar()) && !isFullScreen()
|
||||||
&& area.contains(orig_geometry))
|
&& area.contains(origClientGeometry))
|
||||||
keepInArea(area);
|
keepInArea(area);
|
||||||
|
|
||||||
// this is part of the kicker-xinerama-hack... it should be
|
// this is part of the kicker-xinerama-hack... it should be
|
||||||
|
@ -1712,7 +1712,7 @@ void Client::configureRequest(int value_mask, int rx, int ry, int rw, int rh, in
|
||||||
QSize ns = sizeForClientSize(QSize(nw, nh));
|
QSize ns = sizeForClientSize(QSize(nw, nh));
|
||||||
|
|
||||||
if (ns != size()) { // don't restore if some app sets its own size again
|
if (ns != size()) { // don't restore if some app sets its own size again
|
||||||
QRect orig_geometry = geometry();
|
QRect origClientGeometry(pos() + clientPos(), clientSize());
|
||||||
GeometryUpdatesBlocker blocker(this);
|
GeometryUpdatesBlocker blocker(this);
|
||||||
int save_gravity = xSizeHint.win_gravity;
|
int save_gravity = xSizeHint.win_gravity;
|
||||||
xSizeHint.win_gravity = gravity;
|
xSizeHint.win_gravity = gravity;
|
||||||
|
@ -1723,10 +1723,10 @@ void Client::configureRequest(int value_mask, int rx, int ry, int rw, int rh, in
|
||||||
// try to keep the window in its xinerama screen if possible,
|
// try to keep the window in its xinerama screen if possible,
|
||||||
// if that fails at least keep it visible somewhere
|
// if that fails at least keep it visible somewhere
|
||||||
QRect area = workspace()->clientArea(MovementArea, this);
|
QRect area = workspace()->clientArea(MovementArea, this);
|
||||||
if (area.contains(orig_geometry))
|
if (area.contains(origClientGeometry))
|
||||||
keepInArea(area);
|
keepInArea(area);
|
||||||
area = workspace()->clientArea(WorkArea, this);
|
area = workspace()->clientArea(WorkArea, this);
|
||||||
if (area.contains(orig_geometry))
|
if (area.contains(origClientGeometry))
|
||||||
keepInArea(area);
|
keepInArea(area);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue