const QRect QDesktopWidget::availableGeometry(int screenNo) const { const QScreen *screen = QScreen::instance(); if (screenNo == -1) screenNo = 0; if (!screen || screenNo < 0) return QRect(); const QList<QScreen*> subScreens = screen->subScreens(); if (!subScreens.isEmpty()) { if (screenNo >= subScreens.size()) return QRect(); screen = subScreens.at(screenNo); } QApplicationPrivate *ap = QApplicationPrivate::instance(); const QRect r = ap->maxWindowRect(screen); if (!r.isEmpty()) return r; return screen->region().boundingRect(); }
void QWSManager::handleMove(QPoint g) { Q_D(QWSManager); // don't allow dragging to where the user probably cannot click! QApplicationPrivate *ap = QApplicationPrivate::instance(); const QRect maxWindowRect = ap->maxWindowRect(qt_screen); if (maxWindowRect.isValid()) { if (g.x() < maxWindowRect.x()) g.setX(maxWindowRect.x()); if (g.y() < maxWindowRect.y()) g.setY(maxWindowRect.y()); if (g.x() > maxWindowRect.right()) g.setX(maxWindowRect.right()); if (g.y() > maxWindowRect.bottom()) g.setY(maxWindowRect.bottom()); } if (g == d->mousePos) return; if ( d->managed->isMaximized() ) return; int x = d->managed->geometry().x(); int y = d->managed->geometry().y(); int w = d->managed->width(); int h = d->managed->height(); QRect geom(d->managed->geometry()); QPoint delta = g - d->mousePos; d->mousePos = g; if (d->activeRegion == QDecoration::Title) { geom = QRect(x + delta.x(), y + delta.y(), w, h); } else { bool keepTop = true; bool keepLeft = true; switch (d->activeRegion) { case QDecoration::Top: geom.setTop(geom.top() + delta.y()); keepTop = false; break; case QDecoration::Bottom: geom.setBottom(geom.bottom() + delta.y()); keepTop = true; break; case QDecoration::Left: geom.setLeft(geom.left() + delta.x()); keepLeft = false; break; case QDecoration::Right: geom.setRight(geom.right() + delta.x()); keepLeft = true; break; case QDecoration::TopRight: geom.setTopRight(geom.topRight() + delta); keepLeft = true; keepTop = false; break; case QDecoration::TopLeft: geom.setTopLeft(geom.topLeft() + delta); keepLeft = false; keepTop = false; break; case QDecoration::BottomLeft: geom.setBottomLeft(geom.bottomLeft() + delta); keepLeft = false; keepTop = true; break; case QDecoration::BottomRight: geom.setBottomRight(geom.bottomRight() + delta); keepLeft = true; keepTop = true; break; default: return; } QSize newSize = QLayout::closestAcceptableSize(d->managed, geom.size()); int dx = newSize.width() - geom.width(); int dy = newSize.height() - geom.height(); if (keepTop) { geom.setBottom(geom.bottom() + dy); d->mousePos.ry() += dy; } else { geom.setTop(geom.top() - dy); d->mousePos.ry() -= dy; } if (keepLeft) { geom.setRight(geom.right() + dx); d->mousePos.rx() += dx; } else { geom.setLeft(geom.left() - dx); d->mousePos.rx() -= dx; } } if (geom != d->managed->geometry()) { QApplication::sendPostedEvents(); d->managed->setGeometry(geom); } }