5#include "private/qwindow_p.h"
9#include "private/qwidget_p.h"
10#include "private/qapplication_p.h"
11#if QT_CONFIG(accessibility)
12#include <QtGui/qaccessible.h>
14#include <private/qwidgetrepaintmanager_p.h>
15#include <qpa/qwindowsysteminterface_p.h>
16#include <qpa/qplatformtheme.h>
17#include <qpa/qplatformwindow.h>
18#include <private/qgesturemanager_p.h>
19#include <private/qhighdpiscaling_p.h>
23using namespace Qt::StringLiterals;
27Q_WIDGETS_EXPORT
QWidget *qt_button_down =
nullptr;
33extern bool qt_try_modal(QWidget *widget, QEvent::Type type);
37 Q_DECLARE_PUBLIC(QWidgetWindow)
43 <<
"to" <<
visible <<
"via QWidgetWindowPrivate";
116 Q_Q(
const QWidgetWindow);
117 const QWidget *widget = q->widget();
118 if (!widget || !widget->isWindow() || !widget->hasHeightForWidth())
120 const QSize oldSize = rect.size().toSize();
121 const QSize newSize = QLayout::closestAcceptableSize(widget, oldSize);
122 if (newSize == oldSize)
124 const int dw = newSize.width() - oldSize.width();
125 const int dh = newSize.height() - oldSize.height();
126 QRectF result = rect;
127 const QRectF currentGeometry(widget->geometry());
128 const qreal topOffset = result.top() - currentGeometry.top();
129 const qreal bottomOffset = result.bottom() - currentGeometry.bottom();
130 if (qAbs(topOffset) > qAbs(bottomOffset))
131 result.setTop(result.top() - dh);
133 result.setBottom(result.bottom() + dh);
134 const qreal leftOffset = result.left() - currentGeometry.left();
135 const qreal rightOffset = result.right() - currentGeometry.right();
136 if (qAbs(leftOffset) > qAbs(rightOffset))
137 result.setLeft(result.left() - dw);
139 result.setRight(result.right() + dw);
143bool q_evaluateRhiConfig(
const QWidget *w, QPlatformBackingStoreRhiConfig *outConfig, QSurface::SurfaceType *outType);
146 : QWindow(*
new QWidgetWindowPrivate(),
nullptr)
150 if (!QCoreApplication::testAttribute(Qt::AA_ForceRasterWidgets)) {
151 QSurface::SurfaceType type = QSurface::RasterSurface;
152 if (q_evaluateRhiConfig(m_widget,
nullptr, &type))
153 setSurfaceType(type);
156 connect(widget, &QObject::objectNameChanged,
this, &QWidgetWindow::updateObjectName);
157 connect(
this, &QWidgetWindow::screenChanged,
this, &QWidgetWindow::handleScreenChange);
168 QTLWExtra *topData = QWidgetPrivate::get(m_widget)->topData();
173 topData->repaintManager.reset(
nullptr);
174 delete topData->backingStore;
175 topData->backingStore =
nullptr;
176 topData->widgetTextures.clear();
179 topData->window =
nullptr;
182#if QT_CONFIG(accessibility)
183QAccessibleInterface *QWidgetWindow::accessibleRoot()
const
186 return QAccessible::queryAccessibleInterface(m_widget);
193 QWidget *windowWidget = m_widget;
198 if (QWidgetPrivate::get(windowWidget)->data.in_destructor)
201 QWidget *widget = windowWidget->focusWidget();
204 widget = windowWidget;
206 QObject *focusObj = QWidgetPrivate::get(widget)->focusObject();
216 qCDebug(lcWidgetShowHide) <<
"Setting visibility of" <<
this
217 <<
"to" << visible <<
"via QWidgetWindow::setNativeWindowVisibility";
222 d->QWindowPrivate::setVisible(visible);
228 widget->focusNextPrevChild(next);
233 switch (event->type()) {
238 case QEvent::DynamicPropertyChange:
239 case QEvent::ChildAdded:
240 case QEvent::ChildRemoved:
252 return QWindow::event(event);
254 switch (event->type()) {
257 handleEnterLeaveEvent(event);
262 case QEvent::FocusIn:
263 handleFocusInEvent(
static_cast<QFocusEvent *>(event));
265 case QEvent::FocusOut: {
266#if QT_CONFIG(accessibility)
267 QAccessible::State state;
269 QAccessibleStateChangeEvent ev(m_widget, state);
270 QAccessible::updateAccessibility(&ev);
274 case QEvent::FocusAboutToChange:
275 if (QApplicationPrivate::focus_widget) {
276 if (QApplicationPrivate::focus_widget->testAttribute(Qt::WA_InputMethodEnabled))
277 QGuiApplication::inputMethod()->commit();
279 QGuiApplication::forwardEvent(QApplicationPrivate::focus_widget, event);
283 case QEvent::KeyPress:
284 case QEvent::KeyRelease:
285 case QEvent::ShortcutOverride:
286 handleKeyEvent(
static_cast<QKeyEvent *>(event));
289 case QEvent::MouseMove:
290 case QEvent::MouseButtonPress:
291 case QEvent::MouseButtonRelease:
292 case QEvent::MouseButtonDblClick:
293 handleMouseEvent(
static_cast<QMouseEvent *>(event));
296 case QEvent::NonClientAreaMouseMove:
297 case QEvent::NonClientAreaMouseButtonPress:
298 case QEvent::NonClientAreaMouseButtonRelease:
299 case QEvent::NonClientAreaMouseButtonDblClick:
300 handleNonClientAreaMouseEvent(
static_cast<QMouseEvent *>(event));
303 case QEvent::TouchBegin:
304 case QEvent::TouchUpdate:
305 case QEvent::TouchEnd:
306 case QEvent::TouchCancel:
307 handleTouchEvent(
static_cast<QTouchEvent *>(event));
315 handleResizeEvent(
static_cast<QResizeEvent *>(event));
318#if QT_CONFIG(wheelevent)
320 handleWheelEvent(
static_cast<QWheelEvent *>(event));
324#if QT_CONFIG(draganddrop)
325 case QEvent::DragEnter:
326 handleDragEnterEvent(
static_cast<QDragEnterEvent *>(event));
328 case QEvent::DragMove:
329 handleDragMoveEvent(
static_cast<QDragMoveEvent *>(event));
331 case QEvent::DragLeave:
332 handleDragLeaveEvent(
static_cast<QDragLeaveEvent *>(event));
335 handleDropEvent(
static_cast<QDropEvent *>(event));
340 handleExposeEvent(
static_cast<QExposeEvent *>(event));
343 case QEvent::WindowStateChange:
344 QWindow::event(event);
345 handleWindowStateChangedEvent(
static_cast<QWindowStateChangeEvent *>(event));
348 case QEvent::ThemeChange: {
349 QEvent widgetEvent(QEvent::ThemeChange);
350 QCoreApplication::forwardEvent(m_widget, &widgetEvent, event);
354#if QT_CONFIG(tabletevent)
355 case QEvent::TabletPress:
356 case QEvent::TabletMove:
357 case QEvent::TabletRelease:
358 handleTabletEvent(
static_cast<QTabletEvent *>(event));
362#ifndef QT_NO_GESTURES
363 case QEvent::NativeGesture:
364 handleGestureEvent(
static_cast<QNativeGestureEvent *>(event));
368#ifndef QT_NO_CONTEXTMENU
369 case QEvent::ContextMenu:
370 handleContextMenuEvent(
static_cast<QContextMenuEvent *>(event));
374 case QEvent::WindowBlocked:
375 qt_button_down =
nullptr;
378 case QEvent::UpdateRequest:
384 case QEvent::DevicePixelRatioChange:
385 handleDevicePixelRatioChange();
388 case QEvent::SafeAreaMarginsChange:
389 QWidgetPrivate::get(m_widget)->updateContentsRect();
396 if (shouldBePropagatedToWidget(event) && QCoreApplication::forwardEvent(m_widget, event))
399 return QWindow::event(event);
410 if (QApplicationPrivate::inPopupMode() && m_widget != QApplication::activePopupWidget() && !m_widget->underMouse())
413 if (event->type() == QEvent::Leave) {
414 QWidget *enter =
nullptr;
418 QWindowSystemInterfacePrivate::EnterEvent *systemEvent =
419 static_cast<QWindowSystemInterfacePrivate::EnterEvent *>
420 (QWindowSystemInterfacePrivate::peekWindowSystemEvent(QWindowSystemInterfacePrivate::Enter));
421 const QPointF globalPosF = systemEvent ? systemEvent->globalPos : QPointF(QGuiApplicationPrivate::lastCursorPosition);
425 QWindow *thisParent =
this;
426 QWindow *enterParent = enterWindow;
427 while (thisParent->parent())
428 thisParent = thisParent->parent();
429 while (enterParent->parent())
430 enterParent = enterParent->parent();
431 if (thisParent == enterParent) {
432 QGuiApplicationPrivate::currentMouseWindow = enterWindow;
433 enter = enterWindow->widget();
434 QWindowSystemInterfacePrivate::removeWindowSystemEvent(systemEvent);
441 if (!enter || !QWidget::mouseGrabber()) {
444 QWidget *leave = m_widget;
445 if (qt_last_mouse_receiver && !qt_last_mouse_receiver->internalWinId())
446 leave = qt_last_mouse_receiver.data();
447 QApplicationPrivate::dispatchEnterLeave(enter, leave, globalPosF);
448 qt_last_mouse_receiver = enter;
451 const QEnterEvent *ee =
static_cast<QEnterEvent *>(event);
452 QWidget *child = m_widget->childAt(ee->position());
453 QWidget *receiver = child ? child : m_widget.data();
454 QWidget *leave =
nullptr;
455 if (QApplicationPrivate::inPopupMode() && receiver == m_widget
456 && qt_last_mouse_receiver != m_widget) {
459 leave = qt_last_mouse_receiver;
461 QApplicationPrivate::dispatchEnterLeave(receiver, leave, ee->globalPosition());
462 qt_last_mouse_receiver = receiver;
468 QWidget *tlw = m_widget;
469 QWidget *w = tlw->nextInFocusChain();
473 uint focus_flag = qt_tab_all_widgets() ? Qt::TabFocus : Qt::StrongFocus;
477 if (((w->focusPolicy() & focus_flag) == focus_flag)
478 && w->isVisibleTo(m_widget) && w->isEnabled())
481 if (fw == FirstFocusWidget)
484 w = w->nextInFocusChain();
492 QWidget *focusWidget =
nullptr;
493 if (e->reason() == Qt::BacktabFocusReason)
494 focusWidget = getFocusWidget(LastFocusWidget);
495 else if (e->reason() == Qt::TabFocusReason)
496 focusWidget = getFocusWidget(FirstFocusWidget);
498 if (focusWidget !=
nullptr)
499 focusWidget->setFocus();
504 QApplication::forwardEvent(m_widget, e);
513 QPointer<QWidgetWindow> self =
this;
515 if (
auto *activePopupWidget = QApplication::activePopupWidget()) {
516 QPointF mapped = event->position();
517 if (activePopupWidget != m_widget)
518 mapped = activePopupWidget->mapFromGlobal(event->globalPosition());
519 bool releaseAfter =
false;
520 QWidget *popupChild = activePopupWidget->childAt(mapped);
522 if (activePopupWidget != qt_popup_down) {
523 qt_button_down =
nullptr;
527 switch (event->type()) {
528 case QEvent::MouseButtonPress:
529 case QEvent::MouseButtonDblClick:
530 qt_button_down = popupChild;
534 case QEvent::MouseButtonRelease:
541 if (activePopupWidget->isEnabled()) {
543 QPointer<QWidget> receiver = activePopupWidget;
544 QPointF widgetPos = mapped;
546 receiver = qt_button_down;
548 receiver = popupChild;
549 if (receiver != activePopupWidget)
550 widgetPos = receiver->mapFromGlobal(event->globalPosition());
552 const bool reallyUnderMouse = activePopupWidget->rect().contains(mapped.toPoint());
553 const bool underMouse = activePopupWidget->underMouse();
554 if (underMouse != reallyUnderMouse) {
555 if (reallyUnderMouse) {
556 const QPoint receiverMapped = receiver->mapFromGlobal(event->globalPosition().toPoint());
559 if (receiverMapped.x() >= 0 && receiverMapped.y() >= 0) {
560 QApplicationPrivate::dispatchEnterLeave(receiver,
nullptr, event->globalPosition());
564 QApplicationPrivate::dispatchEnterLeave(
nullptr, qt_last_mouse_receiver, event->globalPosition());
566 receiver = activePopupWidget;
570 if ((event->type() != QEvent::MouseButtonPress) || !(QMutableSinglePointEvent::isDoubleClick(event))) {
572 const auto buttons = event->type() == QEvent::MouseMove && qt_popup_down_closed
573 ? Qt::NoButton : event->buttons();
574 QMouseEvent e(event->type(), widgetPos, event->scenePosition(), event->globalPosition(),
575 event->button(), buttons, event->modifiers(),
576 event->source(), event->pointingDevice());
577 e.setTimestamp(event->timestamp());
578 QApplicationPrivate::sendMouseEvent(receiver, &e, receiver, receiver->window(), &qt_button_down, qt_last_mouse_receiver);
583 switch (event->type()) {
584 case QEvent::MouseButtonPress:
585 case QEvent::MouseButtonDblClick:
586 case QEvent::MouseButtonRelease:
587 activePopupWidget->close();
594 if (QApplication::activePopupWidget() != activePopupWidget
595 && QApplicationPrivate::replayMousePress
596 && QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::ReplayMousePressOutsidePopup).toBool()) {
597 if (m_widget->windowType() != Qt::Popup)
598 qt_button_down =
nullptr;
599 if (event->type() == QEvent::MouseButtonPress) {
601 QWidget *w = QApplication::widgetAt(event->globalPosition().toPoint());
602 if (w && !QApplicationPrivate::isBlockedByModal(w)) {
604 if (!w->isActiveWindow()) {
606 w->window()->raise();
609 if (
auto win = qt_widget_private(w)->windowHandle(QWidgetPrivate::WindowHandleMode::Closest)) {
610 const QRect globalGeometry = win->isTopLevel()
612 : QRect(win->mapToGlobal(QPoint(0, 0)), win->size());
613 if (globalGeometry.contains(event->globalPosition().toPoint())) {
615 const QPoint localPos = win->mapFromGlobal(event->globalPosition().toPoint());
616 QMouseEvent *e =
new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPosition().toPoint(),
617 event->button(), event->buttons(), event->modifiers(), event->source());
618 QCoreApplicationPrivate::setEventSpontaneous(e,
true);
619 e->setTimestamp(event->timestamp());
620 QCoreApplication::postEvent(win, e);
625 QApplicationPrivate::replayMousePress =
false;
626#ifndef QT_NO_CONTEXTMENU
627 }
else if (event->type() == QGuiApplicationPrivate::contextMenuEventType()
628 && event->button() == Qt::RightButton) {
629 QWidget *receiver = activePopupWidget;
631 receiver = qt_button_down;
633 receiver = popupChild;
634 const QPoint localPos = receiver->mapFromGlobal(event->globalPosition().toPoint());
635 QContextMenuEvent e(QContextMenuEvent::Mouse, localPos, event->globalPosition().toPoint(), event->modifiers());
636 QApplication::forwardEvent(receiver, &e, event);
643 qt_button_down =
nullptr;
652 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
656 QWidget *widget = m_widget->childAt(event->position());
657 QPointF mapped = event->position();
662 const bool initialPress = event->buttons() == event->button();
663 if (event->type() == QEvent::MouseButtonPress && initialPress)
664 qt_button_down = widget;
666 QWidget *receiver = QApplicationPrivate::pickMouseReceiver(m_widget, event->scenePosition(), &mapped, event->type(), event->buttons(),
667 qt_button_down, widget);
671 if (d->isPopup() && receiver->window()->windowHandle() !=
this) {
673 mapped = event->position().toPoint();
676 if ((event->type() != QEvent::MouseButtonPress) || !QMutableSinglePointEvent::isDoubleClick(event)) {
680 QMouseEvent translated(event->type(), mapped, event->scenePosition(), event->globalPosition(),
681 event->button(), event->buttons(), event->modifiers(),
682 event->source(), event->pointingDevice());
683 translated.setTimestamp(event->timestamp());
684 QApplicationPrivate::sendMouseEvent(receiver, &translated, widget, m_widget,
685 &qt_button_down, qt_last_mouse_receiver);
686 event->setAccepted(translated.isAccepted());
692#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
695 if (event->isAccepted() &&
697 (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease))
698 d->maybeSynthesizeContextMenuEvent(event);
703 if (event->type() == QEvent::TouchCancel) {
704 QApplicationPrivate::translateTouchCancel(event->pointingDevice(), event->timestamp());
706 }
else if (QApplication::activePopupWidget()) {
711 event->setAccepted(QApplicationPrivate::translateRawTouchEvent(m_widget, event));
717 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
720 QObject *receiver = QWidget::keyboardGrabber();
721 if (
auto *popup = QApplication::activePopupWidget(); !receiver && popup) {
722 QWidget *popupFocusWidget = popup->focusWidget();
723 receiver = popupFocusWidget ? popupFocusWidget : popup;
726 receiver = focusObject();
727 QGuiApplication::forwardEvent(receiver, event);
732 bool changed =
false;
733 if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
735 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
738 if (m_widget->data->crect.size() != geometry().size()) {
740 m_widget->data->crect.setSize(geometry().size());
751 QTLWExtra *te = m_widget->d_func()->topData();
752 if (te->window ==
nullptr || te->window->handle() ==
nullptr)
754 const QMargins margins = frameMargins();
755 te->posIncludesFrame=
false;
756 te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom());
757 m_widget->data->fstrut_dirty =
false;
763 QCoreApplication::sendEvent(widget, &e);
764 QWidgetPrivate *d = QWidgetPrivate::get(widget);
765 for (
int i = 0; i < d->children.size(); ++i) {
766 QWidget *w = qobject_cast<QWidget *>(d->children.at(i));
768 sendChangeRecursively(w, type);
775 sendChangeRecursively(m_widget, QEvent::ScreenChangeInternal);
784 sendChangeRecursively(m_widget, QEvent::DevicePixelRatioChange);
791
792
793
794
795
796
797
798
799
800
801
807 if (!m_widget->isVisible() || !m_widget->updatesEnabled() || !m_widget->rect().isValid())
810 QTLWExtra *tlwExtra = m_widget->window()->d_func()->maybeTopData();
811 if (tlwExtra && tlwExtra->backingStore) {
812 tlwExtra->repaintManager->markDirty(m_widget->rect(), m_widget,
813 QWidgetRepaintManager::UpdateLater, QWidgetRepaintManager::BufferInvalid);
820 QTLWExtra *tle = m_widget->d_func()->maybeTopData();
824 QRect normalGeometry;
825 if (
const QPlatformWindow *pw = handle())
826 normalGeometry = QHighDpi::fromNativePixels(pw->normalGeometry(),
this);
827 if (!normalGeometry.isValid() && !(m_widget->windowState() & ~Qt::WindowActive))
828 normalGeometry = m_widget->geometry();
829 if (normalGeometry.isValid())
830 tle->normalGeometry = normalGeometry;
835 if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
837 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
840 auto oldPosition = m_widget->data->crect.topLeft();
841 auto newPosition = geometry().topLeft();
843 if (!m_widget->isWindow()) {
844 if (
auto *nativeParent = m_widget->nativeParentWidget())
845 newPosition = m_widget->parentWidget()->mapFrom(nativeParent, newPosition);
848 bool changed = newPosition != oldPosition;
851 m_widget->data->crect.moveTopLeft(newPosition);
856 QMoveEvent widgetEvent(newPosition, oldPosition);
857 QGuiApplication::forwardEvent(m_widget, &widgetEvent, event);
863 auto oldRect = m_widget->rect();
866 QGuiApplication::forwardEvent(m_widget, event);
868 if (m_widget->d_func()->shouldPaintOnScreen()) {
869 QRegion dirtyRegion = m_widget->rect();
870 if (m_widget->testAttribute(Qt::WA_StaticContents))
871 dirtyRegion -= oldRect;
872 m_widget->d_func()->syncBackingStore(dirtyRegion);
874 m_widget->d_func()->syncBackingStore();
882 if (qt_popup_down == m_widget) {
886 bool accepted = m_widget->d_func()->handleClose(d->inClose ? QWidgetPrivate::CloseWithEvent
887 : QWidgetPrivate::CloseWithSpontaneousEvent);
888 event->setAccepted(accepted);
893 Q_Q(
const QWidgetWindow);
899 if (!q->widget()->testAttribute(Qt::WA_QuitOnClose))
902 return QWindowPrivate::participatesInLastWindowClosed();
907 Q_Q(
const QWidgetWindow);
914 return q->widget()->isVisible();
917#if QT_CONFIG(wheelevent)
919void QWidgetWindow::handleWheelEvent(QWheelEvent *event)
921 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
924 QWidget *rootWidget = m_widget;
925 QPointF pos = event->position();
929 QWidget *activePopupWidget = QApplication::activePopupWidget();
930 if (activePopupWidget && activePopupWidget != m_widget) {
931 rootWidget = activePopupWidget;
932 pos = rootWidget->mapFromGlobal(event->globalPosition());
936 QWidget *widget = rootWidget->childAt(pos);
941 QPointF mapped = widget->mapFrom(rootWidget, pos);
943 QWheelEvent translated(mapped, event->globalPosition(), event->pixelDelta(), event->angleDelta(),
944 event->buttons(), event->modifiers(), event->phase(), event->inverted(),
945 event->source(), event->pointingDevice());
946 translated.setTimestamp(event->timestamp());
947 QGuiApplication::forwardEvent(widget, &translated, event);
952#if QT_CONFIG(draganddrop)
954static QWidget *findDnDTarget(QWidget *parent,
const QPoint &pos)
957 QWidget *widget = parent->childAt(pos);
960 for ( ; widget && !widget->isWindow() && !widget->acceptDrops(); widget = widget->parentWidget()) ;
961 if (widget && !widget->acceptDrops())
967
968
969
970
971
972
973
974
975
976void QWidgetWindow::handleDragEnterEvent(QDragMoveEvent *event, QWidget *widget)
978 Q_ASSERT(m_dragTarget ==
nullptr);
980 widget = findDnDTarget(m_widget, event->position().toPoint());
985 m_dragTarget = widget;
987 const QPoint mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->position().toPoint()));
988 QDragEnterEvent translated(mapped, event->possibleActions(), event->mimeData(),
989 event->buttons(), event->modifiers());
990 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
991 event->setAccepted(translated.isAccepted());
992 event->setDropAction(translated.dropAction());
995void QWidgetWindow::handleDragMoveEvent(QDragMoveEvent *event)
997 QPointer<QWidget> widget = findDnDTarget(m_widget, event->position().toPoint());
1001 QDragLeaveEvent leaveEvent;
1002 QWidget *dragTarget = m_dragTarget;
1003 m_dragTarget =
nullptr;
1004 QGuiApplication::forwardEvent(dragTarget, &leaveEvent, event);
1007 const QPoint mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->position().toPoint()));
1008 QDragMoveEvent translated(mapped, event->possibleActions(), event->mimeData(),
1009 event->buttons(), event->modifiers());
1011 if (widget == m_dragTarget) {
1012 translated.setDropAction(event->dropAction());
1013 translated.setAccepted(event->isAccepted());
1014 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1017 QDragLeaveEvent leaveEvent;
1018 QWidget *dragTarget = m_dragTarget;
1019 m_dragTarget =
nullptr;
1020 QGuiApplication::forwardEvent(dragTarget, &leaveEvent, event);
1025 handleDragEnterEvent(event, widget);
1027 translated.setDropAction(event->dropAction());
1028 translated.setAccepted(event->isAccepted());
1032 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1035 event->setAccepted(translated.isAccepted());
1036 event->setDropAction(translated.dropAction());
1040void QWidgetWindow::handleDragLeaveEvent(QDragLeaveEvent *event)
1043 QWidget *dragTarget = m_dragTarget;
1044 m_dragTarget =
nullptr;
1045 QGuiApplication::forwardEvent(dragTarget, event);
1049void QWidgetWindow::handleDropEvent(QDropEvent *event)
1051 if (Q_UNLIKELY(m_dragTarget.isNull())) {
1052 qWarning() << m_widget <<
": No drag target set.";
1056 const QPoint mapped = m_dragTarget->mapFromGlobal(m_widget->mapToGlobal(event->position().toPoint()));
1057 QDropEvent translated(mapped, event->possibleActions(), event->mimeData(), event->buttons(), event->modifiers());
1058 QWidget *dragTarget = m_dragTarget;
1059 m_dragTarget =
nullptr;
1060 QGuiApplication::forwardEvent(dragTarget, &translated, event);
1061 event->setAccepted(translated.isAccepted());
1062 event->setDropAction(translated.dropAction());
1069 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
1072 QWidgetPrivate *wPriv = m_widget->d_func();
1073 const bool exposed = isExposed();
1079 if (exposed && wPriv->data.in_destructor)
1082 if (wPriv->childrenHiddenByWState) {
1087 if (!wPriv->childrenShownByExpose) {
1089 wPriv->showChildren(
true);
1090 QShowEvent showEvent;
1091 QCoreApplication::forwardEvent(m_widget, &showEvent, event);
1092 wPriv->childrenShownByExpose =
true;
1096 if (wPriv->childrenShownByExpose) {
1101 wPriv->hideChildren(
true);
1102 QHideEvent hideEvent;
1103 QCoreApplication::forwardEvent(m_widget, &hideEvent, event);
1104 wPriv->childrenShownByExpose =
false;
1111 m_widget->setAttribute(Qt::WA_Mapped);
1112 for (QWidget *p = m_widget->parentWidget(); p && !p->testAttribute(Qt::WA_Mapped); p = p->parentWidget())
1113 p->setAttribute(Qt::WA_Mapped);
1114 if (!event->m_region.isNull())
1115 wPriv->syncBackingStore(event->m_region);
1117 m_widget->setAttribute(Qt::WA_Mapped,
false);
1124 Qt::WindowStates eventState = event->oldState();
1125 Qt::WindowStates widgetState = m_widget->windowState();
1126 Qt::WindowStates windowState = windowStates();
1127 if (widgetState & Qt::WindowActive)
1128 eventState |= Qt::WindowActive;
1132 if (windowState & Qt::WindowMinimized) {
1133 widgetState |= Qt::WindowMinimized;
1135 widgetState = windowState | (widgetState & Qt::WindowActive);
1137 updateNormalGeometry();
1142 if (widgetState != Qt::WindowStates::Int(m_widget->data->window_state)) {
1143 m_widget->data->window_state = uint(widgetState);
1144 QWindowStateChangeEvent widgetEvent(eventState);
1145 QGuiApplication::forwardEvent(m_widget, &widgetEvent, event);
1151 return m_widget->nativeEvent(eventType, message, result);
1154#if QT_CONFIG(tabletevent)
1155void QWidgetWindow::handleTabletEvent(QTabletEvent *event)
1157 static QPointer<QWidget> qt_tablet_target =
nullptr;
1159 QWidget *widget = qt_tablet_target;
1162 widget = m_widget->childAt(event->position());
1165 if (event->type() == QEvent::TabletPress)
1166 qt_tablet_target = widget;
1170 QPointF delta = event->globalPosition() - event->globalPosition().toPoint();
1171 QPointF mapped = widget->mapFromGlobal(event->globalPosition().toPoint()) + delta;
1172 QTabletEvent ev(event->type(), event->pointingDevice(), mapped, event->globalPosition(),
1173 event->pressure(), event->xTilt(), event->yTilt(), event->tangentialPressure(),
1174 event->rotation(), event->z(), event->modifiers(), event->button(), event->buttons());
1175 ev.setTimestamp(event->timestamp());
1176 ev.setAccepted(
false);
1177 QGuiApplication::forwardEvent(widget, &ev, event);
1178 event->setAccepted(ev.isAccepted());
1181 if (event->type() == QEvent::TabletRelease && event->buttons() == Qt::NoButton)
1182 qt_tablet_target =
nullptr;
1186#ifndef QT_NO_GESTURES
1190 QObject *receiver =
nullptr;
1191 if (
auto *popup = QApplication::activePopupWidget()) {
1192 QWidget *popupFocusWidget = popup->focusWidget();
1193 receiver = popupFocusWidget ? popupFocusWidget : popup;
1196 receiver = QApplication::widgetAt(e->globalPosition().toPoint());
1198 receiver = m_widget;
1200 QApplication::forwardEvent(receiver, e);
1204#ifndef QT_NO_CONTEXTMENU
1207 QWidget *receiver = qt_last_mouse_receiver.get();
1208 QPoint pos = e->pos();
1209 QPoint globalPos = e->globalPos();
1213 if (e->reason() == QContextMenuEvent::Keyboard) {
1214 receiver = QWidget::keyboardGrabber();
1216 if (QApplication::activePopupWidget()) {
1217 receiver = (QApplication::activePopupWidget()->focusWidget()
1218 ? QApplication::activePopupWidget()->focusWidget()
1219 : QApplication::activePopupWidget());
1220 }
else if (QApplication::focusWidget()) {
1221 receiver = QApplication::focusWidget();
1223 receiver = m_widget;
1226 if (Q_LIKELY(receiver)) {
1227 pos = receiver->inputMethodQuery(Qt::ImCursorRectangle).toRect().center();
1228 globalPos = receiver->mapToGlobal(pos);
1230 }
else if (Q_LIKELY(receiver)) {
1231 pos = receiver->mapFromGlobal(e->globalPos());
1234 if (receiver && receiver->isEnabled()) {
1235 QContextMenuEvent widgetEvent(e->reason(), pos, globalPos, e->modifiers());
1236 QGuiApplication::forwardEvent(receiver, &widgetEvent, e);
1243 QString name = m_widget->objectName();
1245 name = QString::fromUtf8(m_widget->metaObject()->className()) +
"Class"_L1;
1246 name +=
"Window"_L1;
1247 setObjectName(name);
1252#include "moc_qwidgetwindow_p.cpp"
QPointer< QWindow > qt_last_mouse_receiver