1813void QApplicationPrivate::setActiveWindow(QWidget* act)
1815 QWidget* window = act?act->window():
nullptr;
1817 if (QApplicationPrivate::active_window == window)
1820#if QT_CONFIG(graphicsview)
1821 if (window && window->graphicsProxyWidget()) {
1827 QWidgetList toBeActivated;
1828 QWidgetList toBeDeactivated;
1830 if (QApplicationPrivate::active_window) {
1831 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1832 const QWidgetList list = QApplication::topLevelWidgets();
1833 for (
auto *w : list) {
1834 if (w->isVisible() && w->isActiveWindow())
1835 toBeDeactivated.append(w);
1838 toBeDeactivated.append(QApplicationPrivate::active_window);
1842 if (QApplicationPrivate::focus_widget) {
1843 if (QApplicationPrivate::focus_widget->testAttribute(Qt::WA_InputMethodEnabled))
1844 QGuiApplication::inputMethod()->commit();
1846 QFocusEvent focusAboutToChange(QEvent::FocusAboutToChange, Qt::ActiveWindowFocusReason);
1847 QCoreApplication::sendEvent(QApplicationPrivate::focus_widget, &focusAboutToChange);
1850 QApplicationPrivate::active_window = window;
1852 if (QApplicationPrivate::active_window) {
1853 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1854 const QWidgetList list = QApplication::topLevelWidgets();
1855 for (
auto *w : list) {
1856 if (w->isVisible() && w->isActiveWindow())
1857 toBeActivated.append(w);
1860 toBeActivated.append(QApplicationPrivate::active_window);
1866 QEvent activationChange(QEvent::ActivationChange);
1867 QEvent windowActivate(QEvent::WindowActivate);
1868 QEvent windowDeactivate(QEvent::WindowDeactivate);
1870 for (QWidget *w : std::as_const(toBeActivated)) {
1871 QApplication::sendSpontaneousEvent(w, &windowActivate);
1872 QApplication::sendSpontaneousEvent(w, &activationChange);
1875 for (QWidget *w : std::as_const(toBeDeactivated)) {
1876 QApplication::sendSpontaneousEvent(w, &windowDeactivate);
1877 QApplication::sendSpontaneousEvent(w, &activationChange);
1880 if (!inPopupMode()) {
1882 if (!QApplicationPrivate::active_window && QApplicationPrivate::focus_widget) {
1883 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
1884 }
else if (QApplicationPrivate::active_window) {
1885 QWidget *w = QApplicationPrivate::active_window->focusWidget();
1886 if (w && w->isVisible() )
1887 w->setFocus(Qt::ActiveWindowFocusReason);
1889 w = QApplicationPrivate::focusNextPrevChild_helper(QApplicationPrivate::active_window,
true);
1891 w->setFocus(Qt::ActiveWindowFocusReason);
1893 w = QApplicationPrivate::focus_widget;
1894 if (!w && QApplicationPrivate::active_window->focusPolicy() != Qt::NoFocus) {
1895 QApplicationPrivate::active_window->setFocus(Qt::ActiveWindowFocusReason);
1896 }
else if (!QApplicationPrivate::active_window->isAncestorOf(w)) {
1898 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
2034void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave,
const QPointF &globalPosF)
2036 if ((!enter && !leave) || (enter == leave))
2039 QWidgetList leaveList;
2040 QWidgetList enterList;
2042 bool sameWindow = leave && enter && leave->window() == enter->window();
2043 if (leave && !sameWindow) {
2046 leaveList.append(w);
2047 }
while (!w->isWindow() && (w = w->parentWidget()));
2049 if (enter && !sameWindow) {
2052 enterList.append(w);
2053 }
while (!w->isWindow() && (w = w->parentWidget()));
2059 while (!e->isWindow() && (e = e->parentWidget()))
2062 while (!l->isWindow() && (l = l->parentWidget()))
2064 QWidget* wenter = enter;
2065 QWidget* wleave = leave;
2066 while (enterDepth > leaveDepth) {
2067 wenter = wenter->parentWidget();
2070 while (leaveDepth > enterDepth) {
2071 wleave = wleave->parentWidget();
2074 while (!wenter->isWindow() && wenter != wleave) {
2075 wenter = wenter->parentWidget();
2076 wleave = wleave->parentWidget();
2079 for (
auto *w = leave; w != wleave; w = w->parentWidget())
2080 leaveList.append(w);
2082 for (
auto *w = enter; w != wenter; w = w->parentWidget())
2083 enterList.append(w);
2086 QEvent leaveEvent(QEvent::Leave);
2087 for (QWidget *w : std::as_const(leaveList)) {
2088 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2089 QCoreApplication::sendEvent(w, &leaveEvent);
2090 if (w->testAttribute(Qt::WA_Hover) &&
2091 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2092 Q_ASSERT(instance());
2093 QHoverEvent he(QEvent::HoverLeave, QPointF(-1, -1), globalPosF, w->mapFromGlobal(globalPosF),
2094 QGuiApplication::keyboardModifiers());
2095 qApp->d_func()->notify_helper(w, &he);
2099 if (!enterList.isEmpty()) {
2101 const QPointF globalPos = qIsInf(globalPosF.x())
2104 const QPointF windowPos = std::as_const(enterList).back()->window()->mapFromGlobal(globalPos);
2105 for (
auto it = enterList.crbegin(), end = enterList.crend(); it != end; ++it) {
2107 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2108 const QPointF localPos = w->mapFromGlobal(globalPos);
2109 QEnterEvent enterEvent(localPos, windowPos, globalPos);
2110 QCoreApplication::sendEvent(w, &enterEvent);
2111 if (w->testAttribute(Qt::WA_Hover) &&
2112 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2113 QHoverEvent he(QEvent::HoverEnter, windowPos, QPointF(-1, -1), globalPos,
2114 QGuiApplication::keyboardModifiers());
2115 QMutableEventPoint::setPosition(he.point(0), localPos);
2116 qApp->d_func()->notify_helper(w, &he);
2125 const bool enterOnAlien = (enter && (isAlien(enter) || enter->testAttribute(Qt::WA_DontShowOnScreen)));
2128 QWidget *parentOfLeavingCursor =
nullptr;
2129 for (QWidget *w : std::as_const(leaveList)) {
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 (qsizetype cnt = touchEvent->pointCount(), i = 0; i < cnt; ++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 (QGesture *g : std::as_const(gestures)) {
3170 if (eventAccepted || ge.isAccepted(g)) {
3172 gestureEvent->m_targetWidgets[g->gestureType()] = w;
3173 gestureEvent->setAccepted(g,
true);
3177 allGestures.append(g);
3181 if (allGestures.isEmpty())
3185 w = w->parentWidget();
3187 for (QGesture *g : std::as_const(allGestures))
3188 gestureEvent->setAccepted(g,
false);
3189 gestureEvent->m_accept =
false;
3195 typedef void (*RegisterTouchWindowFn)(QWindow *,
bool);
3197 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3198 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>(
3199 QFunctionPointer(platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow")));
3200 if (registerTouchWindow)
3201 registerTouchWindow(w->window()->windowHandle(),
true);
3203 res = d->notify_helper(receiver, e);
3206 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3207 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>(
3208 QFunctionPointer(platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow")));
3209 if (registerTouchWindow)
3210 registerTouchWindow(w->window()->windowHandle(),
false);
3212 res = d->notify_helper(receiver, e);
3216 res = d->notify_helper(receiver, e);
3220 res = d->notify_helper(receiver, e);
3778bool QApplicationPrivate::translateRawTouchEvent(QWidget *window,
const QTouchEvent *te)
3780 QApplicationPrivate *d = self;
3782 typedef std::pair<QEventPoint::State, QList<QEventPoint> > StatesAndTouchPoints;
3783 QHash<QWidget *, StatesAndTouchPoints> widgetsNeedingEvents;
3785 const auto *device = te->pointingDevice();
3786 auto touchPoints = te->points();
3787 for (
auto &touchPoint : touchPoints) {
3789 QPointer<QObject> target;
3790 if (touchPoint.state() == QEventPoint::State::Pressed) {
3791 if (device->type() == QInputDevice::DeviceType::TouchPad) {
3794 target = QPointingDevicePrivate::get(device)->firstActiveTarget();
3797 if (target.isNull()) {
3800 window = QApplication::topLevelAt(touchPoint.globalPosition().toPoint());
3803 target = window->childAt(window->mapFromGlobal(touchPoint.globalPosition()));
3808 bool usingClosestWidget =
false;
3809 if (device->type() == QInputDevice::DeviceType::TouchScreen) {
3810 QWidget *closestWidget = d->findClosestTouchPointTarget(device, touchPoint);
3811 QWidget *widget =
static_cast<QWidget *>(target.data());
3813 && (widget->isAncestorOf(closestWidget) || closestWidget->isAncestorOf(widget))) {
3814 target = closestWidget;
3815 usingClosestWidget =
true;
3821 if (device->type() == QInputDevice::DeviceType::TouchPad || usingClosestWidget)
3822 QMutableEventPoint::setTarget(touchPoint, target);
3824 target = QMutableEventPoint::target(touchPoint);
3828 Q_ASSERT(!target.isNull());
3830 QWidget *targetWidget =
static_cast<QWidget *>(target.data());
3835 if (touchPoints.count() == 1
3836 && device->type() == QInputDevice::DeviceType::TouchPad
3837 && !targetWidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents))
3841 StatesAndTouchPoints &maskAndPoints = widgetsNeedingEvents[targetWidget];
3842 maskAndPoints.first = QEventPoint::State(maskAndPoints.first | touchPoint.state());
3843 maskAndPoints.second.append(touchPoint);
3846 if (widgetsNeedingEvents.isEmpty())
3849 bool accepted =
false;
3850 QHash<QWidget *, StatesAndTouchPoints>::ConstIterator it = widgetsNeedingEvents.constBegin();
3851 const QHash<QWidget *, StatesAndTouchPoints>::ConstIterator end = widgetsNeedingEvents.constEnd();
3852 for (; it != end; ++it) {
3853 const QPointer<QWidget> widget = it.key();
3854 if (!QApplicationPrivate::tryModalHelper(widget,
nullptr))
3857 QEvent::Type eventType;
3858 switch (it.value().first) {
3859 case QEventPoint::State::Pressed:
3860 eventType = QEvent::TouchBegin;
3862 case QEventPoint::State::Released:
3863 eventType = QEvent::TouchEnd;
3865 case QEventPoint::State::Stationary:
3869 eventType = QEvent::TouchUpdate;
3873 QMutableTouchEvent touchEvent(eventType, device, QGuiApplication::keyboardModifiers(),
3875 bool containsPress = updateTouchPointsForWidget(widget, &touchEvent);
3876 touchEvent.setTimestamp(te->timestamp());
3877 touchEvent.setTarget(widget);
3880 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3882 switch (touchEvent.type()) {
3883 case QEvent::TouchBegin:
3887 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3888 : QApplication::sendEvent(widget, &touchEvent);
3889 if (res && touchEvent.isAccepted()) {
3891 if (!widget.isNull())
3892 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3897 if (widget->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent)
3898#ifndef QT_NO_GESTURES
3899 || QGestureManager::gesturePending(widget)
3902 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3903 : QApplication::sendEvent(widget, &touchEvent);
3904 if (res && touchEvent.isAccepted())
3907 if (touchEvent.type() == QEvent::TouchEnd && !widget.isNull())
3908 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent,
false);