58 || (ee->type() != QEvent::MouseButtonPress
59 && ee->type() != QEvent::MouseButtonRelease
60 && ee->type() != QEvent::MouseMove
61 && ee->type() != QEvent::KeyPress
62 && ee->type() != QEvent::ShortcutOverride)
66 Q_ASSERT(o == widget);
68 if (QApplication::activePopupWidget()) {
69 if (buttonDown && ee->type() == QEvent::MouseButtonRelease)
75 case QEvent::MouseButtonPress: {
76 QMouseEvent *e =
static_cast<QMouseEvent *>(ee);
79 const QRect widgetRect = widget->rect().marginsAdded(QMargins(range, range, range, range));
80 const QPoint cursorPoint = widget->mapFromGlobal(e->globalPosition().toPoint());
81 if (!widgetRect.contains(cursorPoint))
83 if (e->button() == Qt::LeftButton) {
88 moveOffset = widget->mapFromGlobal(e->globalPosition().toPoint());
89 invertedMoveOffset = widget->rect().bottomRight() - moveOffset;
94 case QEvent::MouseButtonRelease:
97 if (
static_cast<QMouseEvent *>(ee)->button() == Qt::LeftButton) {
100 widget->releaseMouse();
101 widget->releaseKeyboard();
106 case QEvent::MouseMove: {
107 if (w->isMaximized())
109 QMouseEvent *e =
static_cast<QMouseEvent *>(ee);
110 buttonDown = buttonDown && (e->buttons() & Qt::LeftButton);
115 case QEvent::KeyPress:
118 case QEvent::ShortcutOverride:
119 buttonDown &= ((QGuiApplication::mouseButtons() & Qt::LeftButton) != Qt::NoButton);
134 QPoint pos = widget->mapFromGlobal(e->globalPosition().toPoint());
135 if (!active && !buttonDown) {
136 if (pos.y() <= range && pos.x() <= range)
138 else if (pos.y() >= widget->height()-range && pos.x() >= widget->width()-range)
140 else if (pos.y() >= widget->height()-range && pos.x() <= range)
142 else if (pos.y() <= range && pos.x() >= widget->width()-range)
144 else if (pos.y() <= range)
146 else if (pos.y() >= widget->height()-range)
148 else if (pos.x() <= range)
150 else if ( pos.x() >= widget->width()-range)
152 else if (widget->rect().contains(pos))
157 if (widget->isMinimized() || !isEnabled())
160 setMouseCursor(mode);
168 if (widget->testAttribute(Qt::WA_WState_ConfigPending))
172 QPoint globalPos = (!widget->isWindow() && widget->parentWidget()) ?
173 widget->parentWidget()->mapFromGlobal(e->globalPosition().toPoint()) : e->globalPosition().toPoint();
174 if (!widget->isWindow() && !widget->parentWidget()->rect().contains(globalPos)) {
175 if (globalPos.x() < 0)
177 if (globalPos.y() < 0)
179 if (globalPos.x() > widget->parentWidget()->width())
180 globalPos.rx() = widget->parentWidget()->width();
181 if (globalPos.y() > widget->parentWidget()->height())
182 globalPos.ry() = widget->parentWidget()->height();
185 QPoint p = globalPos + invertedMoveOffset;
186 QPoint pp = globalPos - moveOffset;
189 if (QGuiApplication::platformName() ==
"xcb"_L1) {
190 const QRect desktop = QWidgetPrivate::availableScreenGeometry(widget);
191 pp.rx() = qMax(pp.x(), desktop.left());
192 pp.ry() = qMax(pp.y(), desktop.top());
193 p.rx() = qMin(p.x(), desktop.right());
194 p.ry() = qMin(p.y(), desktop.bottom());
197 QSize ms = qSmartMinSize(childWidget);
199 int mh = ms.height();
200 if (childWidget != widget) {
202 mh += 2 * fw + extrahei;
205 QSize maxsize(childWidget->maximumSize());
206 if (childWidget != widget)
207 maxsize += QSize(2 * fw, 2 * fw + extrahei);
208 QSize mpsize(widget->geometry().right() - pp.x() + 1,
209 widget->geometry().bottom() - pp.y() + 1);
210 mpsize = mpsize.expandedTo(widget->minimumSize()).expandedTo(QSize(mw, mh))
212 QPoint mp(widget->geometry().right() - mpsize.width() + 1,
213 widget->geometry().bottom() - mpsize.height() + 1);
215 QRect geom = widget->geometry();
219 geom = QRect(mp, widget->geometry().bottomRight()) ;
222 geom = QRect(widget->geometry().topLeft(), p) ;
225 geom = QRect(QPoint(mp.x(), widget->geometry().y()), QPoint(widget->geometry().right(), p.y())) ;
228 geom = QRect(QPoint(widget->geometry().x(), mp.y()), QPoint(p.x(), widget->geometry().bottom())) ;
231 geom = QRect(QPoint(widget->geometry().left(), mp.y()), widget->geometry().bottomRight()) ;
234 geom = QRect(widget->geometry().topLeft(), QPoint(widget->geometry().right(), p.y())) ;
237 geom = QRect(QPoint(mp.x(), widget->geometry().top()), widget->geometry().bottomRight()) ;
240 geom = QRect(widget->geometry().topLeft(), QPoint(p.x(), widget->geometry().bottom())) ;
246 geom = QRect(geom.topLeft(),
247 geom.size().expandedTo(widget->minimumSize())
248 .expandedTo(QSize(mw, mh))
249 .boundedTo(maxsize));
251 if (geom != widget->geometry() &&
252 (widget->isWindow() || widget->parentWidget()->rect().intersects(geom))) {
253 widget->setGeometry(geom);
299 bool is_control = e->modifiers() & Qt::ControlModifier;
300 int delta = is_control?1:8;
301 QPoint pos = QCursor::pos();
305 if (pos.x() <= QGuiApplication::primaryScreen()->virtualGeometry().left()) {
306 if (mode == TopLeft || mode == BottomLeft) {
307 moveOffset.rx() += delta;
308 invertedMoveOffset.rx() += delta;
310 moveOffset.rx() -= delta;
311 invertedMoveOffset.rx() -= delta;
316 if (mode == BottomRight)
318 else if (mode == TopRight)
321 setMouseCursor(mode);
322 widget->grabMouse(widget->cursor());
330 if (pos.x() >= QGuiApplication::primaryScreen()->virtualGeometry().right()) {
331 if (mode == TopRight || mode == BottomRight) {
332 moveOffset.rx() += delta;
333 invertedMoveOffset.rx() += delta;
335 moveOffset.rx() -= delta;
336 invertedMoveOffset.rx() -= delta;
341 if (mode == BottomLeft)
343 else if (mode == TopLeft)
346 setMouseCursor(mode);
347 widget->grabMouse(widget->cursor());
355 if (pos.y() <= QGuiApplication::primaryScreen()->virtualGeometry().top()) {
356 if (mode == TopLeft || mode == TopRight) {
357 moveOffset.ry() += delta;
358 invertedMoveOffset.ry() += delta;
360 moveOffset.ry() -= delta;
361 invertedMoveOffset.ry() -= delta;
366 if (mode == BottomLeft)
368 else if (mode == BottomRight)
371 setMouseCursor(mode);
372 widget->grabMouse(widget->cursor());
380 if (pos.y() >= QGuiApplication::primaryScreen()->virtualGeometry().bottom()) {
381 if (mode == BottomLeft || mode == BottomRight) {
382 moveOffset.ry() += delta;
383 invertedMoveOffset.ry() += delta;
385 moveOffset.ry() -= delta;
386 invertedMoveOffset.ry() -= delta;
393 else if (mode == TopRight)
396 setMouseCursor(mode);
397 widget->grabMouse(widget->cursor());
408 widget->releaseMouse();
409 widget->releaseKeyboard();
415 QCursor::setPos(pos);