prevent clients from positioning out of workspace
Still enough stupid ones around which ask for 0,0 (despite there's a panel ...) or restore a position on a VGA screen which they stored while being on a 4k screen. Otoh, do not forcefully position the window just because the topleft position is outside any head, this can still be desired and isn't a problem. Actually, the corner could be covered by the close button and if *only* it is onscreen the window can hardly by used or seen.
This commit is contained in:
parent
6201286cdf
commit
484c33bf25
1 changed files with 35 additions and 6 deletions
|
@ -457,14 +457,43 @@ void FluxboxWindow::init() {
|
||||||
|
|
||||||
setWindowType(m_client->getWindowType());
|
setWindowType(m_client->getWindowType());
|
||||||
|
|
||||||
bool is_visible = isWindowVisibleOnSomeHeadOrScreen(*this);
|
if (fluxbox.isStartup()) {
|
||||||
|
|
||||||
if (fluxbox.isStartup())
|
|
||||||
m_placed = true;
|
m_placed = true;
|
||||||
else if (m_client->normal_hint_flags & (PPosition|USPosition)) {
|
} else if (m_client->normal_hint_flags & (PPosition|USPosition)) {
|
||||||
m_placed = is_visible;
|
m_placed = true;
|
||||||
|
// sanitize explicit position
|
||||||
|
int head = screen().getHead(fbWindow());
|
||||||
|
if (head == 0 && screen().hasXinerama())
|
||||||
|
head = screen().getCurrHead();
|
||||||
|
int left = screen().maxLeft(head), top = screen().maxTop(head),
|
||||||
|
btm = screen().maxBottom(head), rght = screen().maxRight(head);
|
||||||
|
const int margin = hasTitlebar() ? 32 : 8;
|
||||||
|
// ensure the window intersects with the workspace x-axis
|
||||||
|
if (int(frame().x() + frame().width()) < left) {
|
||||||
|
left += margin - frame().width();
|
||||||
|
} else if (frame().x() > rght) {
|
||||||
|
left = rght - margin;
|
||||||
|
} else {
|
||||||
|
left = frame().x();
|
||||||
|
}
|
||||||
|
if (hasTitlebar()) {
|
||||||
|
// ensure the titlebar is inside the workspace
|
||||||
|
top = std::max(top, std::min(frame().y(), btm - margin));
|
||||||
|
} else {
|
||||||
|
// ensure "something" is inside the workspace
|
||||||
|
if (int(frame().y() + frame().height()) < top)
|
||||||
|
top += margin - frame().height();
|
||||||
|
else if (frame().y() > btm)
|
||||||
|
top = btm - margin;
|
||||||
|
else
|
||||||
|
top = frame().y();
|
||||||
|
}
|
||||||
|
frame().move(left, top);
|
||||||
} else {
|
} else {
|
||||||
if (!is_visible) {
|
if (!isWindowVisibleOnSomeHeadOrScreen(*this)) {
|
||||||
|
// this probably should never happen, but if a window
|
||||||
|
// unexplicitly has its topleft corner outside any screen,
|
||||||
|
// move it to the current screen and ensure it's just placed
|
||||||
int cur = screen().getHead(fbWindow());
|
int cur = screen().getHead(fbWindow());
|
||||||
move(screen().getHeadX(cur), screen().getHeadY(cur));
|
move(screen().getHeadX(cur), screen().getHeadY(cur));
|
||||||
m_placed = false; // allow placement strategy to fix position
|
m_placed = false; // allow placement strategy to fix position
|
||||||
|
|
Loading…
Reference in a new issue