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();
598 if (QApplication::activePopupWidget() != activePopupWidget
599 && QApplicationPrivate::replayMousePress
600 && QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::ReplayMousePressOutsidePopup).toBool()) {
601 if (m_widget->windowType() != Qt::Popup)
602 qt_button_down =
nullptr;
603 if (event->type() == QEvent::MouseButtonPress) {
605 QWidget *w = QApplication::widgetAt(event->globalPosition().toPoint());
606 if (w && !QApplicationPrivate::isBlockedByModal(w)) {
608 if (!w->isActiveWindow()) {
610 w->window()->raise();
613 if (
auto win = qt_widget_private(w)->windowHandle(QWidgetPrivate::WindowHandleMode::Closest)) {
614 const QRect globalGeometry = win->isTopLevel()
616 : QRect(win->mapToGlobal(QPoint(0, 0)), win->size());
617 if (globalGeometry.contains(event->globalPosition().toPoint())) {
619 const QPoint localPos = win->mapFromGlobal(event->globalPosition().toPoint());
620 QMouseEvent *e =
new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPosition().toPoint(),
621 event->button(), event->buttons(), event->modifiers(), event->source());
622 QCoreApplicationPrivate::setEventSpontaneous(e,
true);
623 e->setTimestamp(event->timestamp());
624 QCoreApplication::postEvent(win, e);
629 QApplicationPrivate::replayMousePress =
false;
630#ifndef QT_NO_CONTEXTMENU
631 }
else if (event->type() == QGuiApplicationPrivate::contextMenuEventType()
632 && event->button() == Qt::RightButton) {
633 QWidget *receiver = activePopupWidget;
635 receiver = qt_button_down;
637 receiver = popupChild;
638 const QPoint localPos = receiver->mapFromGlobal(event->globalPosition().toPoint());
639 QContextMenuEvent e(QContextMenuEvent::Mouse, localPos, event->globalPosition().toPoint(), event->modifiers());
640 QApplication::forwardEvent(receiver, &e, event);
647 qt_button_down =
nullptr;
656 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
660 QWidget *widget = m_widget->childAt(event->position());
661 QPointF mapped = event->position();
666 const bool initialPress = event->buttons() == event->button();
667 if (event->type() == QEvent::MouseButtonPress && initialPress)
668 qt_button_down = widget;
670 QWidget *receiver = QApplicationPrivate::pickMouseReceiver(m_widget, event->scenePosition(), &mapped, event->type(), event->buttons(),
671 qt_button_down, widget);
675 if (d->isPopup() && receiver->window()->windowHandle() !=
this) {
677 mapped = event->position().toPoint();
680 if ((event->type() != QEvent::MouseButtonPress) || !QMutableSinglePointEvent::isDoubleClick(event)) {
684 QMouseEvent translated(event->type(), mapped, event->scenePosition(), event->globalPosition(),
685 event->button(), event->buttons(), event->modifiers(),
686 event->source(), event->pointingDevice());
687 translated.setTimestamp(event->timestamp());
688 QApplicationPrivate::sendMouseEvent(receiver, &translated, widget, m_widget,
689 &qt_button_down, qt_last_mouse_receiver);
690 event->setAccepted(translated.isAccepted());
696#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
699 if (event->isAccepted() &&
701 (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease))
702 d->maybeSynthesizeContextMenuEvent(event);
707 if (event->type() == QEvent::TouchCancel) {
708 QApplicationPrivate::translateTouchCancel(event->pointingDevice(), event->timestamp());
710 }
else if (QApplication::activePopupWidget()) {
715 event->setAccepted(QApplicationPrivate::translateRawTouchEvent(m_widget, event));
721 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
724 QObject *receiver = QWidget::keyboardGrabber();
725 if (
auto *popup = QApplication::activePopupWidget(); !receiver && popup) {
726 QWidget *popupFocusWidget = popup->focusWidget();
727 receiver = popupFocusWidget ? popupFocusWidget : popup;
730 receiver = focusObject();
731 QGuiApplication::forwardEvent(receiver, event);
736 bool changed =
false;
737 if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
739 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
742 if (m_widget->data->crect.size() != geometry().size()) {
744 m_widget->data->crect.setSize(geometry().size());
755 QTLWExtra *te = m_widget->d_func()->topData();
756 if (te->window ==
nullptr || te->window->handle() ==
nullptr)
758 const QMargins margins = frameMargins();
759 te->posIncludesFrame=
false;
760 te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom());
761 m_widget->data->fstrut_dirty =
false;
767 QCoreApplication::sendEvent(widget, &e);
768 QWidgetPrivate *d = QWidgetPrivate::get(widget);
769 for (
int i = 0; i < d->children.size(); ++i) {
770 QWidget *w = qobject_cast<QWidget *>(d->children.at(i));
772 sendChangeRecursively(w, type);
779 sendChangeRecursively(m_widget, QEvent::ScreenChangeInternal);
788 sendChangeRecursively(m_widget, QEvent::DevicePixelRatioChange);
795
796
797
798
799
800
801
802
803
804
805
811 if (!m_widget->isVisible() || !m_widget->updatesEnabled() || !m_widget->rect().isValid())
814 QTLWExtra *tlwExtra = m_widget->window()->d_func()->maybeTopData();
815 if (tlwExtra && tlwExtra->backingStore) {
816 tlwExtra->repaintManager->markDirty(m_widget->rect(), m_widget,
817 QWidgetRepaintManager::UpdateLater, QWidgetRepaintManager::BufferInvalid);
824 QTLWExtra *tle = m_widget->d_func()->maybeTopData();
828 QRect normalGeometry;
829 if (
const QPlatformWindow *pw = handle())
830 normalGeometry = QHighDpi::fromNativePixels(pw->normalGeometry(),
this);
831 if (!normalGeometry.isValid() && !(m_widget->windowState() & ~Qt::WindowActive))
832 normalGeometry = m_widget->geometry();
833 if (normalGeometry.isValid())
834 tle->normalGeometry = normalGeometry;
839 if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
841 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
844 auto oldPosition = m_widget->data->crect.topLeft();
845 auto newPosition = geometry().topLeft();
847 if (!m_widget->isWindow()) {
848 if (
auto *nativeParent = m_widget->nativeParentWidget())
849 newPosition = m_widget->parentWidget()->mapFrom(nativeParent, newPosition);
852 bool changed = newPosition != oldPosition;
855 m_widget->data->crect.moveTopLeft(newPosition);
860 QMoveEvent widgetEvent(newPosition, oldPosition);
861 QGuiApplication::forwardEvent(m_widget, &widgetEvent, event);
867 auto oldRect = m_widget->rect();
870 QGuiApplication::forwardEvent(m_widget, event);
872 if (m_widget->d_func()->shouldPaintOnScreen()) {
873 QRegion dirtyRegion = m_widget->rect();
874 if (m_widget->testAttribute(Qt::WA_StaticContents))
875 dirtyRegion -= oldRect;
876 m_widget->d_func()->syncBackingStore(dirtyRegion);
878 m_widget->d_func()->syncBackingStore();
886 if (qt_popup_down == m_widget) {
890 bool accepted = m_widget->d_func()->handleClose(d->inClose ? QWidgetPrivate::CloseWithEvent
891 : QWidgetPrivate::CloseWithSpontaneousEvent);
892 event->setAccepted(accepted);
897 Q_Q(
const QWidgetWindow);
903 if (!q->widget()->testAttribute(Qt::WA_QuitOnClose))
906 return QWindowPrivate::participatesInLastWindowClosed();
911 Q_Q(
const QWidgetWindow);
918 return q->widget()->isVisible();
921#if QT_CONFIG(wheelevent)
923void QWidgetWindow::handleWheelEvent(QWheelEvent *event)
925 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
928 QWidget *rootWidget = m_widget;
929 QPointF pos = event->position();
933 QWidget *activePopupWidget = QApplication::activePopupWidget();
934 if (activePopupWidget && activePopupWidget != m_widget) {
935 rootWidget = activePopupWidget;
936 pos = rootWidget->mapFromGlobal(event->globalPosition());
940 QWidget *widget = rootWidget->childAt(pos);
945 QPointF mapped = widget->mapFrom(rootWidget, pos);
947 QWheelEvent translated(mapped, event->globalPosition(), event->pixelDelta(), event->angleDelta(),
948 event->buttons(), event->modifiers(), event->phase(), event->inverted(),
949 event->source(), event->pointingDevice());
950 translated.setTimestamp(event->timestamp());
951 QGuiApplication::forwardEvent(widget, &translated, event);
956#if QT_CONFIG(draganddrop)
958static QWidget *findDnDTarget(QWidget *parent,
const QPoint &pos)
961 QWidget *widget = parent->childAt(pos);
964 for ( ; widget && !widget->isWindow() && !widget->acceptDrops(); widget = widget->parentWidget()) ;
965 if (widget && !widget->acceptDrops())
971
972
973
974
975
976
977
978
979
980void QWidgetWindow::handleDragEnterEvent(QDragMoveEvent *event, QWidget *widget)
982 Q_ASSERT(m_dragTarget ==
nullptr);
984 widget = findDnDTarget(m_widget, event->position().toPoint());
989 m_dragTarget = widget;
991 const QPoint mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->position().toPoint()));
992 QDragEnterEvent translated(mapped, event->possibleActions(), event->mimeData(),
993 event->buttons(), event->modifiers());
994 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
995 event->setAccepted(translated.isAccepted());
996 event->setDropAction(translated.dropAction());
999void QWidgetWindow::handleDragMoveEvent(QDragMoveEvent *event)
1001 QPointer<QWidget> widget = findDnDTarget(m_widget, event->position().toPoint());
1005 QDragLeaveEvent leaveEvent;
1006 QWidget *dragTarget = m_dragTarget;
1007 m_dragTarget =
nullptr;
1008 QGuiApplication::forwardEvent(dragTarget, &leaveEvent, event);
1011 const QPoint mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->position().toPoint()));
1012 QDragMoveEvent translated(mapped, event->possibleActions(), event->mimeData(),
1013 event->buttons(), event->modifiers());
1015 if (widget == m_dragTarget) {
1016 translated.setDropAction(event->dropAction());
1017 translated.setAccepted(event->isAccepted());
1018 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1021 QDragLeaveEvent leaveEvent;
1022 QWidget *dragTarget = m_dragTarget;
1023 m_dragTarget =
nullptr;
1024 QGuiApplication::forwardEvent(dragTarget, &leaveEvent, event);
1029 handleDragEnterEvent(event, widget);
1031 translated.setDropAction(event->dropAction());
1032 translated.setAccepted(event->isAccepted());
1036 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1039 event->setAccepted(translated.isAccepted());
1040 event->setDropAction(translated.dropAction());
1044void QWidgetWindow::handleDragLeaveEvent(QDragLeaveEvent *event)
1047 QWidget *dragTarget = m_dragTarget;
1048 m_dragTarget =
nullptr;
1049 QGuiApplication::forwardEvent(dragTarget, event);
1053void QWidgetWindow::handleDropEvent(QDropEvent *event)
1055 if (Q_UNLIKELY(m_dragTarget.isNull())) {
1056 qWarning() << m_widget <<
": No drag target set.";
1060 const QPoint mapped = m_dragTarget->mapFromGlobal(m_widget->mapToGlobal(event->position().toPoint()));
1061 QDropEvent translated(mapped, event->possibleActions(), event->mimeData(), event->buttons(), event->modifiers());
1062 QWidget *dragTarget = m_dragTarget;
1063 m_dragTarget =
nullptr;
1064 QGuiApplication::forwardEvent(dragTarget, &translated, event);
1065 event->setAccepted(translated.isAccepted());
1066 event->setDropAction(translated.dropAction());
1073 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
1076 QWidgetPrivate *wPriv = m_widget->d_func();
1077 const bool exposed = isExposed();
1083 if (exposed && wPriv->data.in_destructor)
1086 if (wPriv->childrenHiddenByWState) {
1091 if (!wPriv->childrenShownByExpose) {
1093 wPriv->showChildren(
true);
1094 QShowEvent showEvent;
1095 QCoreApplication::forwardEvent(m_widget, &showEvent, event);
1096 wPriv->childrenShownByExpose =
true;
1100 if (wPriv->childrenShownByExpose) {
1105 wPriv->hideChildren(
true);
1106 QHideEvent hideEvent;
1107 QCoreApplication::forwardEvent(m_widget, &hideEvent, event);
1108 wPriv->childrenShownByExpose =
false;
1115 m_widget->setAttribute(Qt::WA_Mapped);
1116 for (QWidget *p = m_widget->parentWidget(); p && !p->testAttribute(Qt::WA_Mapped); p = p->parentWidget())
1117 p->setAttribute(Qt::WA_Mapped);
1118 if (!event->m_region.isNull())
1119 wPriv->syncBackingStore(event->m_region);
1121 m_widget->setAttribute(Qt::WA_Mapped,
false);
1128 Qt::WindowStates eventState = event->oldState();
1129 Qt::WindowStates widgetState = m_widget->windowState();
1130 Qt::WindowStates windowState = windowStates();
1131 if (widgetState & Qt::WindowActive)
1132 eventState |= Qt::WindowActive;
1136 if (windowState & Qt::WindowMinimized) {
1137 widgetState |= Qt::WindowMinimized;
1139 widgetState = windowState | (widgetState & Qt::WindowActive);
1141 updateNormalGeometry();
1146 if (widgetState != Qt::WindowStates::Int(m_widget->data->window_state)) {
1147 m_widget->data->window_state = uint(widgetState);
1148 QWindowStateChangeEvent widgetEvent(eventState);
1149 QGuiApplication::forwardEvent(m_widget, &widgetEvent, event);
1155 return m_widget->nativeEvent(eventType, message, result);
1158#if QT_CONFIG(tabletevent)
1159void QWidgetWindow::handleTabletEvent(QTabletEvent *event)
1161 static QPointer<QWidget> qt_tablet_target =
nullptr;
1163 QWidget *widget = qt_tablet_target;
1166 widget = m_widget->childAt(event->position());
1169 if (event->type() == QEvent::TabletPress)
1170 qt_tablet_target = widget;
1174 QPointF delta = event->globalPosition() - event->globalPosition().toPoint();
1175 QPointF mapped = widget->mapFromGlobal(event->globalPosition().toPoint()) + delta;
1176 QTabletEvent ev(event->type(), event->pointingDevice(), mapped, event->globalPosition(),
1177 event->pressure(), event->xTilt(), event->yTilt(), event->tangentialPressure(),
1178 event->rotation(), event->z(), event->modifiers(), event->button(), event->buttons());
1179 ev.setTimestamp(event->timestamp());
1180 ev.setAccepted(
false);
1181 QGuiApplication::forwardEvent(widget, &ev, event);
1182 event->setAccepted(ev.isAccepted());
1185 if (event->type() == QEvent::TabletRelease && event->buttons() == Qt::NoButton)
1186 qt_tablet_target =
nullptr;
1190#ifndef QT_NO_GESTURES
1194 QObject *receiver =
nullptr;
1195 if (
auto *popup = QApplication::activePopupWidget()) {
1196 QWidget *popupFocusWidget = popup->focusWidget();
1197 receiver = popupFocusWidget ? popupFocusWidget : popup;
1200 receiver = QApplication::widgetAt(e->globalPosition().toPoint());
1202 receiver = m_widget;
1204 QApplication::forwardEvent(receiver, e);
1208#ifndef QT_NO_CONTEXTMENU
1211 QWidget *receiver = qt_last_mouse_receiver.get();
1212 QPoint pos = e->pos();
1213 QPoint globalPos = e->globalPos();
1217 if (e->reason() == QContextMenuEvent::Keyboard) {
1218 receiver = QWidget::keyboardGrabber();
1220 if (QApplication::activePopupWidget()) {
1221 receiver = (QApplication::activePopupWidget()->focusWidget()
1222 ? QApplication::activePopupWidget()->focusWidget()
1223 : QApplication::activePopupWidget());
1224 }
else if (QApplication::focusWidget()) {
1225 receiver = QApplication::focusWidget();
1227 receiver = m_widget;
1230 if (Q_LIKELY(receiver)) {
1231 pos = receiver->inputMethodQuery(Qt::ImCursorRectangle).toRect().center();
1232 globalPos = receiver->mapToGlobal(pos);
1234 }
else if (Q_LIKELY(receiver)) {
1235 pos = receiver->mapFromGlobal(e->globalPos());
1238 if (receiver && receiver->isEnabled()) {
1239 QContextMenuEvent widgetEvent(e->reason(), pos, globalPos, e->modifiers());
1240 QGuiApplication::forwardEvent(receiver, &widgetEvent, e);
1247 QString name = m_widget->objectName();
1249 name = QString::fromUtf8(m_widget->metaObject()->className()) +
"Class"_L1;
1250 name +=
"Window"_L1;
1251 setObjectName(name);
1256#include "moc_qwidgetwindow_p.cpp"
Combined button and popup list for selecting options.
QPointer< QWindow > qt_last_mouse_receiver