1809void QApplicationPrivate::setActiveWindow(QWidget* act)
1811 QWidget* window = act?act->window():
nullptr;
1813 if (QApplicationPrivate::active_window == window)
1816#if QT_CONFIG(graphicsview)
1817 if (window && window->graphicsProxyWidget()) {
1823 QWidgetList toBeActivated;
1824 QWidgetList toBeDeactivated;
1826 if (QApplicationPrivate::active_window) {
1827 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1828 const QWidgetList list = QApplication::topLevelWidgets();
1829 for (
auto *w : list) {
1830 if (w->isVisible() && w->isActiveWindow())
1831 toBeDeactivated.append(w);
1834 toBeDeactivated.append(QApplicationPrivate::active_window);
1838 if (QApplicationPrivate::focus_widget) {
1839 if (QApplicationPrivate::focus_widget->testAttribute(Qt::WA_InputMethodEnabled))
1840 QGuiApplication::inputMethod()->commit();
1842 QFocusEvent focusAboutToChange(QEvent::FocusAboutToChange, Qt::ActiveWindowFocusReason);
1843 QCoreApplication::sendEvent(QApplicationPrivate::focus_widget, &focusAboutToChange);
1846 QApplicationPrivate::active_window = window;
1848 if (QApplicationPrivate::active_window) {
1849 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1850 const QWidgetList list = QApplication::topLevelWidgets();
1851 for (
auto *w : list) {
1852 if (w->isVisible() && w->isActiveWindow())
1853 toBeActivated.append(w);
1856 toBeActivated.append(QApplicationPrivate::active_window);
1862 QEvent activationChange(QEvent::ActivationChange);
1863 QEvent windowActivate(QEvent::WindowActivate);
1864 QEvent windowDeactivate(QEvent::WindowDeactivate);
1866 for (
int i = 0; i < toBeActivated.size(); ++i) {
1867 QWidget *w = toBeActivated.at(i);
1868 QApplication::sendSpontaneousEvent(w, &windowActivate);
1869 QApplication::sendSpontaneousEvent(w, &activationChange);
1872 for(
int i = 0; i < toBeDeactivated.size(); ++i) {
1873 QWidget *w = toBeDeactivated.at(i);
1874 QApplication::sendSpontaneousEvent(w, &windowDeactivate);
1875 QApplication::sendSpontaneousEvent(w, &activationChange);
1878 if (!inPopupMode()) {
1880 if (!QApplicationPrivate::active_window && QApplicationPrivate::focus_widget) {
1881 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
1882 }
else if (QApplicationPrivate::active_window) {
1883 QWidget *w = QApplicationPrivate::active_window->focusWidget();
1884 if (w && w->isVisible() )
1885 w->setFocus(Qt::ActiveWindowFocusReason);
1887 w = QApplicationPrivate::focusNextPrevChild_helper(QApplicationPrivate::active_window,
true);
1889 w->setFocus(Qt::ActiveWindowFocusReason);
1891 w = QApplicationPrivate::focus_widget;
1892 if (!w && QApplicationPrivate::active_window->focusPolicy() != Qt::NoFocus) {
1893 QApplicationPrivate::active_window->setFocus(Qt::ActiveWindowFocusReason);
1894 }
else if (!QApplicationPrivate::active_window->isAncestorOf(w)) {
1896 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
2032void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave,
const QPointF &globalPosF)
2034 if ((!enter && !leave) || (enter == leave))
2037 QWidgetList leaveList;
2038 QWidgetList enterList;
2040 bool sameWindow = leave && enter && leave->window() == enter->window();
2041 if (leave && !sameWindow) {
2044 leaveList.append(w);
2045 }
while (!w->isWindow() && (w = w->parentWidget()));
2047 if (enter && !sameWindow) {
2050 enterList.append(w);
2051 }
while (!w->isWindow() && (w = w->parentWidget()));
2057 while (!e->isWindow() && (e = e->parentWidget()))
2060 while (!l->isWindow() && (l = l->parentWidget()))
2062 QWidget* wenter = enter;
2063 QWidget* wleave = leave;
2064 while (enterDepth > leaveDepth) {
2065 wenter = wenter->parentWidget();
2068 while (leaveDepth > enterDepth) {
2069 wleave = wleave->parentWidget();
2072 while (!wenter->isWindow() && wenter != wleave) {
2073 wenter = wenter->parentWidget();
2074 wleave = wleave->parentWidget();
2077 for (
auto *w = leave; w != wleave; w = w->parentWidget())
2078 leaveList.append(w);
2080 for (
auto *w = enter; w != wenter; w = w->parentWidget())
2081 enterList.append(w);
2084 QEvent leaveEvent(QEvent::Leave);
2085 for (
int i = 0; i < leaveList.size(); ++i) {
2086 auto *w = leaveList.at(i);
2087 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2088 QCoreApplication::sendEvent(w, &leaveEvent);
2089 if (w->testAttribute(Qt::WA_Hover) &&
2090 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2091 Q_ASSERT(instance());
2092 QHoverEvent he(QEvent::HoverLeave, QPointF(-1, -1), globalPosF, w->mapFromGlobal(globalPosF),
2093 QGuiApplication::keyboardModifiers());
2094 qApp->d_func()->notify_helper(w, &he);
2098 if (!enterList.isEmpty()) {
2100 const QPointF globalPos = qIsInf(globalPosF.x())
2103 const QPointF windowPos = std::as_const(enterList).back()->window()->mapFromGlobal(globalPos);
2104 for (
auto it = enterList.crbegin(), end = enterList.crend(); it != end; ++it) {
2106 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2107 const QPointF localPos = w->mapFromGlobal(globalPos);
2108 QEnterEvent enterEvent(localPos, windowPos, globalPos);
2109 QCoreApplication::sendEvent(w, &enterEvent);
2110 if (w->testAttribute(Qt::WA_Hover) &&
2111 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2112 QHoverEvent he(QEvent::HoverEnter, windowPos, QPointF(-1, -1), globalPos,
2113 QGuiApplication::keyboardModifiers());
2114 QMutableEventPoint::setPosition(he.point(0), localPos);
2115 qApp->d_func()->notify_helper(w, &he);
2124 const bool enterOnAlien = (enter && (isAlien(enter) || enter->testAttribute(Qt::WA_DontShowOnScreen)));
2127 QWidget *parentOfLeavingCursor =
nullptr;
2128 for (
int i = 0; i < leaveList.size(); ++i) {
2129 auto *w = leaveList.at(i);
2132 if (w->testAttribute(Qt::WA_SetCursor)) {
2133 QWidget *parent = w->parentWidget();
2134 while (parent && parent->d_func()->data.in_destructor)
2135 parent = parent->parentWidget();
2136 parentOfLeavingCursor = parent;
2142 if (parentOfLeavingCursor && (!enterOnAlien
2143 || parentOfLeavingCursor->effectiveWinId() != enter->effectiveWinId())) {
2144#if QT_CONFIG(graphicsview)
2145 if (!parentOfLeavingCursor->window()->graphicsProxyWidget())
2148 qt_qpa_set_cursor(parentOfLeavingCursor,
true);
2152 QWidget *cursorWidget = enter;
2153 while (!cursorWidget->isWindow() && !cursorWidget->isEnabled())
2154 cursorWidget = cursorWidget->parentWidget();
2159#if QT_CONFIG(graphicsview)
2160 if (cursorWidget->window()->graphicsProxyWidget()) {
2161 QWidgetPrivate::nearestGraphicsProxyWidget(cursorWidget)->setCursor(cursorWidget->cursor());
2165 qt_qpa_set_cursor(cursorWidget,
true);
2545bool QApplication::notify(QObject *receiver, QEvent *e)
2549 if (QApplicationPrivate::is_app_closing)
2552 if (Q_UNLIKELY(!receiver)) {
2553 qWarning(
"QApplication::notify: Unexpected null receiver");
2558 QCoreApplicationPrivate::checkReceiverThread(receiver);
2561 const bool isWindowType = receiver->isWindowType();
2562 const bool isWidgetType = receiver->isWidgetType();
2564 && QGuiApplicationPrivate::sendQWindowEventToQPlatformWindow(
static_cast<QWindow *>(receiver), e)) {
2568 QGuiApplicationPrivate::captureGlobalModifierState(e);
2570#ifndef QT_NO_GESTURES
2572 if (d->gestureManager) {
2573 switch (e->type()) {
2575 case QEvent::MetaCall:
2576 case QEvent::DeferredDelete:
2577 case QEvent::DragEnter:
case QEvent::DragMove:
case QEvent::DragLeave:
2578 case QEvent::Drop:
case QEvent::DragResponse:
2579 case QEvent::ChildAdded:
case QEvent::ChildPolished:
2580 case QEvent::ChildRemoved:
2581 case QEvent::UpdateRequest:
2582 case QEvent::UpdateLater:
2583 case QEvent::LocaleChange:
2585 case QEvent::IconDrag:
2586 case QEvent::StyleChange:
2587 case QEvent::GraphicsSceneDragEnter:
2588 case QEvent::GraphicsSceneDragMove:
2589 case QEvent::GraphicsSceneDragLeave:
2590 case QEvent::GraphicsSceneDrop:
2591 case QEvent::DynamicPropertyChange:
2592 case QEvent::NetworkReplyUpdated:
2595 if (d->gestureManager->thread() == QThread::currentThread()) {
2597 if (d->gestureManager->filterEvent(
static_cast<QWidget *>(receiver), e))
2603 if (d->gestureManager->filterEvent(receiver, e))
2612 switch (e->type()) {
2613 case QEvent::ApplicationDeactivate:
2614 case QEvent::OrientationChange:
2618 d->closeAllPopups();
2621 case QEvent::ActivationChange:
2622 case QEvent::KeyPress:
2623 case QEvent::KeyRelease:
2624 case QEvent::FocusOut:
2625 case QEvent::FocusIn:
2626 case QEvent::MouseButtonPress:
2627 case QEvent::MouseButtonRelease:
2628 case QEvent::MouseButtonDblClick:
2629 d->toolTipFallAsleep.stop();
2632 d->toolTipWakeUp.stop();
2638 switch (e->type()) {
2639 case QEvent::KeyPress: {
2640 QKeyEvent* keyEvent =
static_cast<QKeyEvent*>(e);
2641 const int key = keyEvent->key();
2646 if (!e->spontaneous() && isWidgetType
2647 && qt_sendShortcutOverrideEvent(
static_cast<QWidget *>(receiver), keyEvent->timestamp(),
2648 key, keyEvent->modifiers(), keyEvent->text(),
2649 keyEvent->isAutoRepeat(), keyEvent->count())) {
2652 qt_in_tab_key_event = (key == Qt::Key_Backtab
2653 || key == Qt::Key_Tab
2654 || key == Qt::Key_Left
2655 || key == Qt::Key_Up
2656 || key == Qt::Key_Right
2657 || key == Qt::Key_Down);
2666 QWidget * w =
static_cast<QWidget *>(receiver);
2667 switch (e->type()) {
2668 case QEvent::ShortcutOverride:
2669 case QEvent::KeyPress:
2670 case QEvent::KeyRelease: {
2671 QKeyEvent* key =
static_cast<QKeyEvent*>(e);
2672 bool def = key->isAccepted();
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685 QPointer<QObject> pr = receiver;
2691 res = d->notify_helper(w, e);
2693 if (res && key->isAccepted())
2695 if (!pr || w->isWindow())
2698 w = w->parentWidget();
2700 qt_in_tab_key_event =
false;
2703 case QEvent::MouseButtonPress:
2704 case QEvent::MouseButtonRelease:
2705 case QEvent::MouseButtonDblClick:
2706 case QEvent::MouseMove: {
2707 QMouseEvent* mouse =
static_cast<QMouseEvent*>(e);
2708 QPoint relpos = mouse->position().toPoint();
2710 if (e->spontaneous()) {
2711 if (e->type() != QEvent::MouseMove)
2712 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos);
2721 if (e->type() == QEvent::MouseMove && mouse->buttons() == 0
2722 && w->rect().contains(relpos)) {
2723 d->toolTipWidget = w;
2724 d->toolTipPos = relpos;
2725 d->toolTipGlobalPos = mouse->globalPosition().toPoint();
2726 QStyle *s = d->toolTipWidget->style();
2727 int wakeDelay = s->styleHint(QStyle::SH_ToolTip_WakeUpDelay,
nullptr, d->toolTipWidget,
nullptr);
2728 d->toolTipWakeUp.start(d->toolTipFallAsleep.isActive() ? 20 : wakeDelay,
this);
2732 bool eventAccepted = mouse->isAccepted();
2734 QPointer<QWidget> pw = w;
2736 QMouseEvent me(mouse->type(), relpos, mouse->scenePosition(), mouse->globalPosition(),
2737 mouse->button(), mouse->buttons(), mouse->modifiers(), mouse->source(),
2738 mouse->pointingDevice());
2739 me.m_spont = mouse->spontaneous();
2740 me.setTimestamp(mouse->timestamp());
2741 QMutableSinglePointEvent::setDoubleClick(&me, QMutableSinglePointEvent::isDoubleClick(mouse));
2743 if (!w->hasMouseTracking()
2744 && mouse->type() == QEvent::MouseMove && mouse->buttons() == 0) {
2746 d->sendThroughApplicationEventFilters(w, w == receiver ? mouse : &me);
2749 w->setAttribute(Qt::WA_NoMouseReplay,
false);
2750 res = d->notify_helper(w, w == receiver ? mouse : &me);
2753 eventAccepted = (w == receiver ? mouse : &me)->isAccepted();
2754 if (res && eventAccepted)
2756 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2759 w = w->parentWidget();
2762 mouse->setAccepted(eventAccepted);
2764 if (e->type() == QEvent::MouseMove) {
2768 w =
static_cast<QWidget *>(receiver);
2769 relpos = mouse->position().toPoint();
2770 QPoint diff = relpos - w->mapFromGlobal(mouse->globalPosition()).toPoint();
2772 if (w->testAttribute(Qt::WA_Hover) &&
2773 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2774 QHoverEvent he(QEvent::HoverMove, mouse->scenePosition(), mouse->globalPosition(), relpos - diff, mouse->modifiers());
2775 QMutableEventPoint::setPosition(he.point(0), relpos);
2776 d->notify_helper(w, &he);
2778 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2781 w = w->parentWidget();
2786#if QT_CONFIG(wheelevent)
2787 case QEvent::Wheel: {
2789 if (
const QWidget *popup = QApplication::activePopupWidget()) {
2790 if (w->window() != popup)
2794 QWheelEvent* wheel =
static_cast<QWheelEvent*>(e);
2795 if (!wheel->spontaneous()) {
2797
2798
2799
2800
2801 res = d->notify_helper(w, wheel);
2805 const Qt::ScrollPhase phase = wheel->phase();
2806 QPoint relpos = wheel->position().toPoint();
2829 if (QApplicationPrivate::wheel_widget) {
2830 Q_ASSERT(phase != Qt::NoScrollPhase);
2831 w = QApplicationPrivate::wheel_widget;
2832 relpos = w->mapFromGlobal(wheel->globalPosition().toPoint());
2835
2836
2837
2838
2841 QApplicationPrivate::wheel_widget =
nullptr;
2843 case Qt::ScrollBegin:
2844 QApplicationPrivate::wheel_widget = w;
2846 case Qt::ScrollUpdate:
2847 case Qt::ScrollMomentum:
2848 if (!QApplicationPrivate::wheel_widget)
2849 QApplicationPrivate::wheel_widget = w;
2851 case Qt::NoScrollPhase:
2852 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos);
2857 QWheelEvent we(relpos, wheel->globalPosition(), wheel->pixelDelta(), wheel->angleDelta(), wheel->buttons(),
2858 wheel->modifiers(), phase, wheel->inverted(), wheel->source(), wheel->pointingDevice());
2860 we.setTimestamp(wheel->timestamp());
2865 we.setAccepted(
true);
2866 we.m_spont = wheel->spontaneous() && w == receiver;
2867 res = d->notify_helper(w, &we);
2868 eventAccepted = we.isAccepted();
2869 if (res && eventAccepted)
2871 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2874 QMutableEventPoint::setPosition(we.point(0), we.position() + w->pos());
2875 w = w->parentWidget();
2877 wheel->setAccepted(eventAccepted);
2881#ifndef QT_NO_CONTEXTMENU
2882 case QEvent::ContextMenu: {
2883 QContextMenuEvent *context =
static_cast<QContextMenuEvent*>(e);
2884 QPoint relpos = context->pos();
2885 bool eventAccepted = context->isAccepted();
2887 QContextMenuEvent ce(context->reason(), relpos, context->globalPos(), context->modifiers());
2888 ce.m_spont = e->spontaneous();
2889 res = d->notify_helper(w, w == receiver ? context : &ce);
2890 eventAccepted = ((w == receiver) ? context : &ce)->isAccepted();
2893 if (res && eventAccepted)
2895 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2899 w = w->parentWidget();
2901 context->setAccepted(eventAccepted);
2905#if QT_CONFIG(tabletevent)
2906 case QEvent::TabletMove:
2907 case QEvent::TabletPress:
2908 case QEvent::TabletRelease: {
2909 QTabletEvent *tablet =
static_cast<QTabletEvent*>(e);
2910 QPointF relpos = tablet->position();
2911 bool eventAccepted = tablet->isAccepted();
2913 QTabletEvent te(tablet->type(), tablet->pointingDevice(), relpos, tablet->globalPosition(),
2914 tablet->pressure(), tablet->xTilt(), tablet->yTilt(),
2915 tablet->tangentialPressure(), tablet->rotation(), tablet->z(),
2916 tablet->modifiers(), tablet->button(), tablet->buttons());
2917 te.m_spont = e->spontaneous();
2918 te.setTimestamp(tablet->timestamp());
2919 te.setAccepted(
false);
2920 res = d->notify_helper(w, w == receiver ? tablet : &te);
2921 eventAccepted = ((w == receiver) ? tablet : &te)->isAccepted();
2923 if (res && eventAccepted)
2925 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2929 w = w->parentWidget();
2931 tablet->setAccepted(eventAccepted);
2936#if QT_CONFIG(tooltip) || QT_CONFIG(whatsthis)
2937 case QEvent::ToolTip:
2938 case QEvent::WhatsThis:
2939 case QEvent::QueryWhatsThis: {
2940 QHelpEvent *help =
static_cast<QHelpEvent*>(e);
2941 QPoint relpos = help->pos();
2942 bool eventAccepted = help->isAccepted();
2944 QHelpEvent he(help->type(), relpos, help->globalPos());
2945 he.m_spont = e->spontaneous();
2946 res = d->notify_helper(w, w == receiver ? help : &he);
2948 eventAccepted = (w == receiver ? help : &he)->isAccepted();
2949 if (res && eventAccepted)
2955 w = w->parentWidget();
2957 help->setAccepted(eventAccepted);
2961#if QT_CONFIG(statustip) || QT_CONFIG(whatsthis)
2962 case QEvent::StatusTip:
2963 case QEvent::WhatsThisClicked:
2965 res = d->notify_helper(w, e);
2966 if (res && e->isAccepted())
2970 w = w->parentWidget();
2975#if QT_CONFIG(draganddrop)
2976 case QEvent::DragEnter: {
2977 QDragEnterEvent *dragEvent =
static_cast<QDragEnterEvent *>(e);
2978#if QT_CONFIG(graphicsview)
2981 const auto &extra = w->window()->d_func()->extra;
2982 if (extra && extra->proxyWidget) {
2983 res = d->notify_helper(w, dragEvent);
2988 if (w->isEnabled() && w->acceptDrops()) {
2989 res = d->notify_helper(w, dragEvent);
2990 if (res && dragEvent->isAccepted()) {
2991 QDragManager::self()->setCurrentTarget(w);
2997 dragEvent->m_pos = w->mapToParent(dragEvent->m_pos);
2998 w = w->parentWidget();
3002 case QEvent::DragMove:
3004 case QEvent::DragLeave: {
3005#if QT_CONFIG(graphicsview)
3008 const auto &extra = w->window()->d_func()->extra;
3009 bool isProxyWidget = extra && extra->proxyWidget;
3012 w = qobject_cast<QWidget *>(QDragManager::self()->currentTarget());
3019 if (e->type() == QEvent::DragLeave)
3020 w =
static_cast<QWidget *>(receiver);
3024 if (e->type() == QEvent::DragMove || e->type() == QEvent::Drop) {
3025 QDropEvent *dragEvent =
static_cast<QDropEvent *>(e);
3026 QWidget *origReceiver =
static_cast<QWidget *>(receiver);
3027 while (origReceiver && w != origReceiver) {
3028 dragEvent->m_pos = origReceiver->mapToParent(dragEvent->m_pos);
3029 origReceiver = origReceiver->parentWidget();
3032 res = d->notify_helper(w, e);
3033 if (e->type() != QEvent::DragMove
3034#if QT_CONFIG(graphicsview)
3038 QDragManager::self()->setCurrentTarget(
nullptr, e->type() == QEvent::Drop);
3042 case QEvent::TouchBegin: {
3044 QTouchEvent *touchEvent =
static_cast<QTouchEvent *>(e);
3045 bool eventAccepted = touchEvent->isAccepted();
3046 bool acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
3048 if (acceptTouchEvents && e->spontaneous()
3049 && touchEvent->device()->type() != QInputDevice::DeviceType::TouchPad) {
3050 const QPoint localPos = touchEvent->points()[0].position().toPoint();
3051 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, localPos);
3054#ifndef QT_NO_GESTURES
3055 QPointer<QWidget> gesturePendingWidget;
3060 acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
3061 QMutableTouchEvent::setTarget(touchEvent, w);
3062 touchEvent->setAccepted(acceptTouchEvents);
3063 QPointer<QWidget> p = w;
3064 res = acceptTouchEvents && d->notify_helper(w, touchEvent);
3065 eventAccepted = touchEvent->isAccepted();
3070 w->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent, res && eventAccepted);
3072 touchEvent->m_spont =
false;
3073 if (res && eventAccepted) {
3075 d->activateImplicitTouchGrab(w, touchEvent);
3078#ifndef QT_NO_GESTURES
3079 if (gesturePendingWidget.isNull() && w && QGestureManager::gesturePending(w))
3080 gesturePendingWidget = w;
3082 if (!w || w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
3085 const QPoint offset = w->pos();
3086 w = w->parentWidget();
3087 QMutableTouchEvent::setTarget(touchEvent, w);
3088 for (
int i = 0; i < touchEvent->pointCount(); ++i) {
3089 auto &pt = touchEvent->point(i);
3090 QMutableEventPoint::setPosition(pt, pt.position() + offset);
3094#ifndef QT_NO_GESTURES
3095 if (!eventAccepted && !gesturePendingWidget.isNull()) {
3098 d->activateImplicitTouchGrab(gesturePendingWidget, touchEvent, QApplicationPrivate::GrabAllPoints);
3102 touchEvent->setAccepted(eventAccepted);
3105 case QEvent::TouchUpdate:
3106 case QEvent::TouchEnd:
3110 if (w->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent))
3111 res = d->notify_helper(w, e);
3113 case QEvent::RequestSoftwareInputPanel:
3114 inputMethod()->show();
3116 case QEvent::CloseSoftwareInputPanel:
3117 inputMethod()->hide();
3120#ifndef QT_NO_GESTURES
3121 case QEvent::NativeGesture:
3124 res = d->notify_helper(w, e);
3125 if (res && e->isAccepted())
3129 w = w->parentWidget();
3132 case QEvent::Gesture:
3133 case QEvent::GestureOverride: {
3134 QGestureEvent *gestureEvent =
static_cast<QGestureEvent *>(e);
3135 QList<QGesture *> allGestures = gestureEvent->gestures();
3137 bool eventAccepted = gestureEvent->isAccepted();
3138 bool wasAccepted = eventAccepted;
3141 QList<QGesture *> gestures;
3142 QWidgetPrivate *wd = w->d_func();
3143 for (
int i = 0; i < allGestures.size();) {
3144 QGesture *g = allGestures.at(i);
3145 Qt::GestureType type = g->gestureType();
3146 QMap<Qt::GestureType, Qt::GestureFlags>::iterator contextit =
3147 wd->gestureContext.find(type);
3148 bool deliver = contextit != wd->gestureContext.end() &&
3149 (g->state() == Qt::GestureStarted || w == receiver ||
3150 (contextit.value() & Qt::ReceivePartialGestures));
3152 allGestures.removeAt(i);
3158 if (!gestures.isEmpty()) {
3159 QGestureEvent ge(gestures);
3160 ge.t = gestureEvent->t;
3161 ge.m_spont = gestureEvent->spontaneous();
3162 ge.m_accept = wasAccepted;
3163 ge.m_accepted = gestureEvent->m_accepted;
3164 res = d->notify_helper(w, &ge);
3165 gestureEvent->m_spont =
false;
3166 eventAccepted = ge.isAccepted();
3167 for (
int i = 0; i < gestures.size(); ++i) {
3168 QGesture *g = gestures.at(i);
3171 if (eventAccepted || ge.isAccepted(g)) {
3173 gestureEvent->m_targetWidgets[g->gestureType()] = w;
3174 gestureEvent->setAccepted(g,
true);
3178 allGestures.append(g);
3182 if (allGestures.isEmpty())
3186 w = w->parentWidget();
3188 for (QGesture *g : std::as_const(allGestures))
3189 gestureEvent->setAccepted(g,
false);
3190 gestureEvent->m_accept =
false;
3196 typedef void (*RegisterTouchWindowFn)(QWindow *,
bool);
3198 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3199 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>(
3200 QFunctionPointer(platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow")));
3201 if (registerTouchWindow)
3202 registerTouchWindow(w->window()->windowHandle(),
true);
3204 res = d->notify_helper(receiver, e);
3207 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3208 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>(
3209 QFunctionPointer(platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow")));
3210 if (registerTouchWindow)
3211 registerTouchWindow(w->window()->windowHandle(),
false);
3213 res = d->notify_helper(receiver, e);
3217 res = d->notify_helper(receiver, e);
3221 res = d->notify_helper(receiver, e);
3779bool QApplicationPrivate::translateRawTouchEvent(QWidget *window,
const QTouchEvent *te)
3781 QApplicationPrivate *d = self;
3783 typedef std::pair<QEventPoint::State, QList<QEventPoint> > StatesAndTouchPoints;
3784 QHash<QWidget *, StatesAndTouchPoints> widgetsNeedingEvents;
3786 const auto *device = te->pointingDevice();
3787 auto touchPoints = te->points();
3788 for (
auto &touchPoint : touchPoints) {
3790 QPointer<QObject> target;
3791 if (touchPoint.state() == QEventPoint::State::Pressed) {
3792 if (device->type() == QInputDevice::DeviceType::TouchPad) {
3795 target = QPointingDevicePrivate::get(device)->firstActiveTarget();
3798 if (target.isNull()) {
3801 window = QApplication::topLevelAt(touchPoint.globalPosition().toPoint());
3804 target = window->childAt(window->mapFromGlobal(touchPoint.globalPosition()));
3809 bool usingClosestWidget =
false;
3810 if (device->type() == QInputDevice::DeviceType::TouchScreen) {
3811 QWidget *closestWidget = d->findClosestTouchPointTarget(device, touchPoint);
3812 QWidget *widget =
static_cast<QWidget *>(target.data());
3814 && (widget->isAncestorOf(closestWidget) || closestWidget->isAncestorOf(widget))) {
3815 target = closestWidget;
3816 usingClosestWidget =
true;
3822 if (device->type() == QInputDevice::DeviceType::TouchPad || usingClosestWidget)
3823 QMutableEventPoint::setTarget(touchPoint, target);
3825 target = QMutableEventPoint::target(touchPoint);
3829 Q_ASSERT(!target.isNull());
3831 QWidget *targetWidget =
static_cast<QWidget *>(target.data());
3836 if (touchPoints.count() == 1
3837 && device->type() == QInputDevice::DeviceType::TouchPad
3838 && !targetWidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents))
3842 StatesAndTouchPoints &maskAndPoints = widgetsNeedingEvents[targetWidget];
3843 maskAndPoints.first = QEventPoint::State(maskAndPoints.first | touchPoint.state());
3844 maskAndPoints.second.append(touchPoint);
3847 if (widgetsNeedingEvents.isEmpty())
3850 bool accepted =
false;
3851 QHash<QWidget *, StatesAndTouchPoints>::ConstIterator it = widgetsNeedingEvents.constBegin();
3852 const QHash<QWidget *, StatesAndTouchPoints>::ConstIterator end = widgetsNeedingEvents.constEnd();
3853 for (; it != end; ++it) {
3854 const QPointer<QWidget> widget = it.key();
3855 if (!QApplicationPrivate::tryModalHelper(widget,
nullptr))
3858 QEvent::Type eventType;
3859 switch (it.value().first) {
3860 case QEventPoint::State::Pressed:
3861 eventType = QEvent::TouchBegin;
3863 case QEventPoint::State::Released:
3864 eventType = QEvent::TouchEnd;
3866 case QEventPoint::State::Stationary:
3870 eventType = QEvent::TouchUpdate;
3874 QMutableTouchEvent touchEvent(eventType, device, QGuiApplication::keyboardModifiers(),
3876 bool containsPress = updateTouchPointsForWidget(widget, &touchEvent);
3877 touchEvent.setTimestamp(te->timestamp());
3878 touchEvent.setTarget(widget);
3881 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3883 switch (touchEvent.type()) {
3884 case QEvent::TouchBegin:
3888 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3889 : QApplication::sendEvent(widget, &touchEvent);
3890 if (res && touchEvent.isAccepted()) {
3892 if (!widget.isNull())
3893 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3898 if (widget->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent)
3899#ifndef QT_NO_GESTURES
3900 || QGestureManager::gesturePending(widget)
3903 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3904 : QApplication::sendEvent(widget, &touchEvent);
3905 if (res && touchEvent.isAccepted())
3908 if (touchEvent.type() == QEvent::TouchEnd && !widget.isNull())
3909 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent,
false);