1819void QApplicationPrivate::setActiveWindow(QWidget* act)
1821 QWidget* window = act?act->window():
nullptr;
1823 if (QApplicationPrivate::active_window == window)
1826#if QT_CONFIG(graphicsview)
1827 if (window && window->graphicsProxyWidget()) {
1833 QWidgetList toBeActivated;
1834 QWidgetList toBeDeactivated;
1836 if (QApplicationPrivate::active_window) {
1837 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1838 const QWidgetList list = QApplication::topLevelWidgets();
1839 for (
auto *w : list) {
1840 if (w->isVisible() && w->isActiveWindow())
1841 toBeDeactivated.append(w);
1844 toBeDeactivated.append(QApplicationPrivate::active_window);
1848 if (QApplicationPrivate::focus_widget) {
1849 if (QApplicationPrivate::focus_widget->testAttribute(Qt::WA_InputMethodEnabled))
1850 QGuiApplication::inputMethod()->commit();
1852 QFocusEvent focusAboutToChange(QEvent::FocusAboutToChange, Qt::ActiveWindowFocusReason);
1853 QCoreApplication::sendEvent(QApplicationPrivate::focus_widget, &focusAboutToChange);
1856 QApplicationPrivate::active_window = window;
1858 if (QApplicationPrivate::active_window) {
1859 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1860 const QWidgetList list = QApplication::topLevelWidgets();
1861 for (
auto *w : list) {
1862 if (w->isVisible() && w->isActiveWindow())
1863 toBeActivated.append(w);
1866 toBeActivated.append(QApplicationPrivate::active_window);
1872 QEvent activationChange(QEvent::ActivationChange);
1873 QEvent windowActivate(QEvent::WindowActivate);
1874 QEvent windowDeactivate(QEvent::WindowDeactivate);
1876 for (QWidget *w : std::as_const(toBeActivated)) {
1877 QApplication::sendSpontaneousEvent(w, &windowActivate);
1878 QApplication::sendSpontaneousEvent(w, &activationChange);
1881 for (QWidget *w : std::as_const(toBeDeactivated)) {
1882 QApplication::sendSpontaneousEvent(w, &windowDeactivate);
1883 QApplication::sendSpontaneousEvent(w, &activationChange);
1886 if (!inPopupMode()) {
1888 if (!QApplicationPrivate::active_window && QApplicationPrivate::focus_widget) {
1889 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
1890 }
else if (QApplicationPrivate::active_window) {
1891 QWidget *w = QApplicationPrivate::active_window->focusWidget();
1892 if (w && w->isVisible() )
1893 w->setFocus(Qt::ActiveWindowFocusReason);
1895 w = QApplicationPrivate::focusNextPrevChild_helper(QApplicationPrivate::active_window,
true);
1897 w->setFocus(Qt::ActiveWindowFocusReason);
1899 w = QApplicationPrivate::focus_widget;
1900 if (!w && QApplicationPrivate::active_window->focusPolicy() != Qt::NoFocus) {
1901 QApplicationPrivate::active_window->setFocus(Qt::ActiveWindowFocusReason);
1902 }
else if (!QApplicationPrivate::active_window->isAncestorOf(w)) {
1904 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
2040void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave,
const QPointF &globalPosF)
2042 if ((!enter && !leave) || (enter == leave))
2045 QWidgetList leaveList;
2046 QWidgetList enterList;
2048 bool sameWindow = leave && enter && leave->window() == enter->window();
2049 if (leave && !sameWindow) {
2052 leaveList.append(w);
2053 }
while (!w->isWindow() && (w = w->parentWidget()));
2055 if (enter && !sameWindow) {
2058 enterList.append(w);
2059 }
while (!w->isWindow() && (w = w->parentWidget()));
2065 while (!e->isWindow() && (e = e->parentWidget()))
2068 while (!l->isWindow() && (l = l->parentWidget()))
2070 QWidget* wenter = enter;
2071 QWidget* wleave = leave;
2072 while (enterDepth > leaveDepth) {
2073 wenter = wenter->parentWidget();
2076 while (leaveDepth > enterDepth) {
2077 wleave = wleave->parentWidget();
2080 while (!wenter->isWindow() && wenter != wleave) {
2081 wenter = wenter->parentWidget();
2082 wleave = wleave->parentWidget();
2085 for (
auto *w = leave; w != wleave; w = w->parentWidget())
2086 leaveList.append(w);
2088 for (
auto *w = enter; w != wenter; w = w->parentWidget())
2089 enterList.append(w);
2092 QEvent leaveEvent(QEvent::Leave);
2093 for (QWidget *w : std::as_const(leaveList)) {
2094 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2095 QCoreApplication::sendEvent(w, &leaveEvent);
2096 if (w->testAttribute(Qt::WA_Hover) &&
2097 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2098 Q_ASSERT(instance());
2099 QHoverEvent he(QEvent::HoverLeave, QPointF(-1, -1), globalPosF, w->mapFromGlobal(globalPosF),
2100 QGuiApplication::keyboardModifiers());
2101 qApp->d_func()->notify_helper(w, &he);
2105 if (!enterList.isEmpty()) {
2107 const QPointF globalPos = qIsInf(globalPosF.x())
2110 const QPointF windowPos = std::as_const(enterList).back()->window()->mapFromGlobal(globalPos);
2111 for (
auto it = enterList.crbegin(), end = enterList.crend(); it != end; ++it) {
2113 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2114 const QPointF localPos = w->mapFromGlobal(globalPos);
2115 QEnterEvent enterEvent(localPos, windowPos, globalPos);
2116 QCoreApplication::sendEvent(w, &enterEvent);
2117 if (w->testAttribute(Qt::WA_Hover) &&
2118 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2119 QHoverEvent he(QEvent::HoverEnter, windowPos, QPointF(-1, -1), globalPos,
2120 QGuiApplication::keyboardModifiers());
2121 QMutableEventPoint::setPosition(he.point(0), localPos);
2122 qApp->d_func()->notify_helper(w, &he);
2131 const bool enterOnAlien = (enter && (isAlien(enter) || enter->testAttribute(Qt::WA_DontShowOnScreen)));
2134 QWidget *parentOfLeavingCursor =
nullptr;
2135 for (QWidget *w : std::as_const(leaveList)) {
2138 if (w->testAttribute(Qt::WA_SetCursor)) {
2139 QWidget *parent = w->parentWidget();
2140 while (parent && parent->d_func()->data.in_destructor)
2141 parent = parent->parentWidget();
2142 parentOfLeavingCursor = parent;
2148 if (parentOfLeavingCursor && (!enterOnAlien
2149 || parentOfLeavingCursor->effectiveWinId() != enter->effectiveWinId())) {
2150#if QT_CONFIG(graphicsview)
2151 if (!parentOfLeavingCursor->window()->graphicsProxyWidget())
2154 qt_qpa_set_cursor(parentOfLeavingCursor,
true);
2158 QWidget *cursorWidget = enter;
2159 while (!cursorWidget->isWindow() && !cursorWidget->isEnabled())
2160 cursorWidget = cursorWidget->parentWidget();
2165#if QT_CONFIG(graphicsview)
2166 if (cursorWidget->window()->graphicsProxyWidget()) {
2167 QWidgetPrivate::nearestGraphicsProxyWidget(cursorWidget)->setCursor(cursorWidget->cursor());
2171 qt_qpa_set_cursor(cursorWidget,
true);
2551bool QApplication::notify(QObject *receiver, QEvent *e)
2555 if (QApplicationPrivate::is_app_closing)
2558 if (Q_UNLIKELY(!receiver)) {
2559 qWarning(
"QApplication::notify: Unexpected null receiver");
2564 QCoreApplicationPrivate::checkReceiverThread(receiver);
2567 const bool isWindowType = receiver->isWindowType();
2568 const bool isWidgetType = receiver->isWidgetType();
2570 && QGuiApplicationPrivate::sendQWindowEventToQPlatformWindow(
static_cast<QWindow *>(receiver), e)) {
2574 QGuiApplicationPrivate::captureGlobalModifierState(e);
2576#ifndef QT_NO_GESTURES
2578 if (d->gestureManager) {
2579 switch (e->type()) {
2581 case QEvent::MetaCall:
2582 case QEvent::DeferredDelete:
2583 case QEvent::DragEnter:
case QEvent::DragMove:
case QEvent::DragLeave:
2584 case QEvent::Drop:
case QEvent::DragResponse:
2585 case QEvent::ChildAdded:
case QEvent::ChildPolished:
2586 case QEvent::ChildRemoved:
2587 case QEvent::UpdateRequest:
2588 case QEvent::UpdateLater:
2589 case QEvent::LocaleChange:
2591 case QEvent::IconDrag:
2592 case QEvent::StyleChange:
2593 case QEvent::GraphicsSceneDragEnter:
2594 case QEvent::GraphicsSceneDragMove:
2595 case QEvent::GraphicsSceneDragLeave:
2596 case QEvent::GraphicsSceneDrop:
2597 case QEvent::DynamicPropertyChange:
2598 case QEvent::NetworkReplyUpdated:
2601 if (d->gestureManager->thread() == QThread::currentThread()) {
2603 if (d->gestureManager->filterEvent(
static_cast<QWidget *>(receiver), e))
2609 if (d->gestureManager->filterEvent(receiver, e))
2618 switch (e->type()) {
2619 case QEvent::ApplicationDeactivate:
2620 case QEvent::OrientationChange:
2624 d->closeAllPopups();
2627 case QEvent::ActivationChange:
2628 case QEvent::KeyPress:
2629 case QEvent::KeyRelease:
2630 case QEvent::FocusOut:
2631 case QEvent::FocusIn:
2632 case QEvent::MouseButtonPress:
2633 case QEvent::MouseButtonRelease:
2634 case QEvent::MouseButtonDblClick:
2635 d->toolTipFallAsleep.stop();
2638 d->toolTipWakeUp.stop();
2644 switch (e->type()) {
2645 case QEvent::KeyPress: {
2646 QKeyEvent* keyEvent =
static_cast<QKeyEvent*>(e);
2647 const int key = keyEvent->key();
2652 if (!e->spontaneous() && isWidgetType
2653 && qt_sendShortcutOverrideEvent(
static_cast<QWidget *>(receiver), keyEvent->timestamp(),
2654 key, keyEvent->modifiers(), keyEvent->text(),
2655 keyEvent->isAutoRepeat(), keyEvent->count())) {
2658 qt_in_tab_key_event = (key == Qt::Key_Backtab
2659 || key == Qt::Key_Tab
2660 || key == Qt::Key_Left
2661 || key == Qt::Key_Up
2662 || key == Qt::Key_Right
2663 || key == Qt::Key_Down);
2672 QWidget * w =
static_cast<QWidget *>(receiver);
2673 switch (e->type()) {
2674 case QEvent::ShortcutOverride:
2675 case QEvent::KeyPress:
2676 case QEvent::KeyRelease: {
2677 QKeyEvent* key =
static_cast<QKeyEvent*>(e);
2678 bool def = key->isAccepted();
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691 QPointer<QObject> pr = receiver;
2697 res = d->notify_helper(w, e);
2699 if (res && key->isAccepted())
2701 if (!pr || w->isWindow())
2704 w = w->parentWidget();
2706 qt_in_tab_key_event =
false;
2709 case QEvent::MouseButtonPress:
2710 case QEvent::MouseButtonRelease:
2711 case QEvent::MouseButtonDblClick:
2712 case QEvent::MouseMove: {
2713 QMouseEvent* mouse =
static_cast<QMouseEvent*>(e);
2714 QPoint relpos = mouse->position().toPoint();
2716 if (e->spontaneous()) {
2717 if (e->type() != QEvent::MouseMove)
2718 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos);
2727 if (e->type() == QEvent::MouseMove && mouse->buttons() == 0
2728 && w->rect().contains(relpos)) {
2729 d->toolTipWidget = w;
2730 d->toolTipPos = relpos;
2731 d->toolTipGlobalPos = mouse->globalPosition().toPoint();
2732 QStyle *s = d->toolTipWidget->style();
2733 int wakeDelay = s->styleHint(QStyle::SH_ToolTip_WakeUpDelay,
nullptr, d->toolTipWidget,
nullptr);
2734 d->toolTipWakeUp.start(d->toolTipFallAsleep.isActive() ? 20 : wakeDelay,
this);
2738 bool eventAccepted = mouse->isAccepted();
2740 QPointer<QWidget> pw = w;
2742 QMouseEvent me(mouse->type(), relpos, mouse->scenePosition(), mouse->globalPosition(),
2743 mouse->button(), mouse->buttons(), mouse->modifiers(), mouse->source(),
2744 mouse->pointingDevice());
2745 me.m_spont = mouse->spontaneous();
2746 me.setTimestamp(mouse->timestamp());
2747 QMutableSinglePointEvent::setDoubleClick(&me, QMutableSinglePointEvent::isDoubleClick(mouse));
2749 if (!w->hasMouseTracking()
2750 && mouse->type() == QEvent::MouseMove && mouse->buttons() == 0) {
2752 d->sendThroughApplicationEventFilters(w, w == receiver ? mouse : &me);
2755 w->setAttribute(Qt::WA_NoMouseReplay,
false);
2756 res = d->notify_helper(w, w == receiver ? mouse : &me);
2759 eventAccepted = (w == receiver ? mouse : &me)->isAccepted();
2760 if (res && eventAccepted)
2762 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2765 w = w->parentWidget();
2768 mouse->setAccepted(eventAccepted);
2770 if (e->type() == QEvent::MouseMove) {
2774 w =
static_cast<QWidget *>(receiver);
2775 relpos = mouse->position().toPoint();
2776 QPoint diff = relpos - w->mapFromGlobal(mouse->globalPosition()).toPoint();
2778 if (w->testAttribute(Qt::WA_Hover) &&
2779 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2780 QHoverEvent he(QEvent::HoverMove, mouse->scenePosition(), mouse->globalPosition(), relpos - diff, mouse->modifiers());
2781 QMutableEventPoint::setPosition(he.point(0), relpos);
2782 d->notify_helper(w, &he);
2784 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2787 w = w->parentWidget();
2792#if QT_CONFIG(wheelevent)
2793 case QEvent::Wheel: {
2795 if (
const QWidget *popup = QApplication::activePopupWidget()) {
2796 if (w->window() != popup)
2800 QWheelEvent* wheel =
static_cast<QWheelEvent*>(e);
2801 if (!wheel->spontaneous()) {
2803
2804
2805
2806
2807 res = d->notify_helper(w, wheel);
2811 const Qt::ScrollPhase phase = wheel->phase();
2812 QPoint relpos = wheel->position().toPoint();
2835 if (QApplicationPrivate::wheel_widget) {
2836 Q_ASSERT(phase != Qt::NoScrollPhase);
2837 w = QApplicationPrivate::wheel_widget;
2838 relpos = w->mapFromGlobal(wheel->globalPosition().toPoint());
2841
2842
2843
2844
2847 QApplicationPrivate::wheel_widget =
nullptr;
2849 case Qt::ScrollBegin:
2850 QApplicationPrivate::wheel_widget = w;
2852 case Qt::ScrollUpdate:
2853 case Qt::ScrollMomentum:
2854 if (!QApplicationPrivate::wheel_widget)
2855 QApplicationPrivate::wheel_widget = w;
2857 case Qt::NoScrollPhase:
2858 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos);
2863 QWheelEvent we(relpos, wheel->globalPosition(), wheel->pixelDelta(), wheel->angleDelta(), wheel->buttons(),
2864 wheel->modifiers(), phase, wheel->inverted(), wheel->source(), wheel->pointingDevice());
2866 we.setTimestamp(wheel->timestamp());
2871 we.setAccepted(
true);
2872 we.m_spont = wheel->spontaneous() && w == receiver;
2873 res = d->notify_helper(w, &we);
2874 eventAccepted = we.isAccepted();
2875 if (res && eventAccepted)
2877 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2880 QMutableEventPoint::setPosition(we.point(0), we.position() + w->pos());
2881 w = w->parentWidget();
2883 wheel->setAccepted(eventAccepted);
2887#ifndef QT_NO_CONTEXTMENU
2888 case QEvent::ContextMenu: {
2889 QContextMenuEvent *context =
static_cast<QContextMenuEvent*>(e);
2890 QPoint relpos = context->pos();
2891 bool eventAccepted = context->isAccepted();
2893 QContextMenuEvent ce(context->reason(), relpos, context->globalPos(), context->modifiers());
2894 ce.m_spont = e->spontaneous();
2895 res = d->notify_helper(w, w == receiver ? context : &ce);
2896 eventAccepted = ((w == receiver) ? context : &ce)->isAccepted();
2899 if (res && eventAccepted)
2901 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2905 w = w->parentWidget();
2907 context->setAccepted(eventAccepted);
2911#if QT_CONFIG(tabletevent)
2912 case QEvent::TabletMove:
2913 case QEvent::TabletPress:
2914 case QEvent::TabletRelease: {
2915 QTabletEvent *tablet =
static_cast<QTabletEvent*>(e);
2916 QPointF relpos = tablet->position();
2917 bool eventAccepted = tablet->isAccepted();
2919 QTabletEvent te(tablet->type(), tablet->pointingDevice(), relpos, tablet->globalPosition(),
2920 tablet->pressure(), tablet->xTilt(), tablet->yTilt(),
2921 tablet->tangentialPressure(), tablet->rotation(), tablet->z(),
2922 tablet->modifiers(), tablet->button(), tablet->buttons());
2923 te.m_spont = e->spontaneous();
2924 te.setTimestamp(tablet->timestamp());
2925 te.setAccepted(
false);
2926 res = d->notify_helper(w, w == receiver ? tablet : &te);
2927 eventAccepted = ((w == receiver) ? tablet : &te)->isAccepted();
2929 if (res && eventAccepted)
2931 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2935 w = w->parentWidget();
2937 tablet->setAccepted(eventAccepted);
2942#if QT_CONFIG(tooltip) || QT_CONFIG(whatsthis)
2943 case QEvent::ToolTip:
2944 case QEvent::WhatsThis:
2945 case QEvent::QueryWhatsThis: {
2946 QHelpEvent *help =
static_cast<QHelpEvent*>(e);
2947 QPoint relpos = help->pos();
2948 bool eventAccepted = help->isAccepted();
2950 QHelpEvent he(help->type(), relpos, help->globalPos());
2951 he.m_spont = e->spontaneous();
2952 res = d->notify_helper(w, w == receiver ? help : &he);
2954 eventAccepted = (w == receiver ? help : &he)->isAccepted();
2955 if (res && eventAccepted)
2961 w = w->parentWidget();
2963 help->setAccepted(eventAccepted);
2967#if QT_CONFIG(statustip) || QT_CONFIG(whatsthis)
2968 case QEvent::StatusTip:
2969 case QEvent::WhatsThisClicked:
2971 res = d->notify_helper(w, e);
2972 if (res && e->isAccepted())
2976 w = w->parentWidget();
2981#if QT_CONFIG(draganddrop)
2982 case QEvent::DragEnter: {
2983 QDragEnterEvent *dragEvent =
static_cast<QDragEnterEvent *>(e);
2984#if QT_CONFIG(graphicsview)
2987 const auto &extra = w->window()->d_func()->extra;
2988 if (extra && extra->proxyWidget) {
2989 res = d->notify_helper(w, dragEvent);
2994 if (w->isEnabled() && w->acceptDrops()) {
2995 res = d->notify_helper(w, dragEvent);
2996 if (res && dragEvent->isAccepted()) {
2997 QDragManager::self()->setCurrentTarget(w);
3003 dragEvent->m_pos = w->mapToParent(dragEvent->m_pos);
3004 w = w->parentWidget();
3008 case QEvent::DragMove:
3010 case QEvent::DragLeave: {
3011#if QT_CONFIG(graphicsview)
3014 const auto &extra = w->window()->d_func()->extra;
3015 bool isProxyWidget = extra && extra->proxyWidget;
3018 w = qobject_cast<QWidget *>(QDragManager::self()->currentTarget());
3025 if (e->type() == QEvent::DragLeave)
3026 w =
static_cast<QWidget *>(receiver);
3030 if (e->type() == QEvent::DragMove || e->type() == QEvent::Drop) {
3031 QDropEvent *dragEvent =
static_cast<QDropEvent *>(e);
3032 QWidget *origReceiver =
static_cast<QWidget *>(receiver);
3033 while (origReceiver && w != origReceiver) {
3034 dragEvent->m_pos = origReceiver->mapToParent(dragEvent->m_pos);
3035 origReceiver = origReceiver->parentWidget();
3038 res = d->notify_helper(w, e);
3039 if (e->type() != QEvent::DragMove
3040#if QT_CONFIG(graphicsview)
3044 QDragManager::self()->setCurrentTarget(
nullptr, e->type() == QEvent::Drop);
3048 case QEvent::TouchBegin: {
3050 QTouchEvent *touchEvent =
static_cast<QTouchEvent *>(e);
3051 bool eventAccepted = touchEvent->isAccepted();
3052 bool acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
3054 if (acceptTouchEvents && e->spontaneous()
3055 && touchEvent->device()->type() != QInputDevice::DeviceType::TouchPad) {
3056 const QPoint localPos = touchEvent->points()[0].position().toPoint();
3057 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, localPos);
3060#ifndef QT_NO_GESTURES
3061 QPointer<QWidget> gesturePendingWidget;
3066 acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
3067 QMutableTouchEvent::setTarget(touchEvent, w);
3068 touchEvent->setAccepted(acceptTouchEvents);
3069 QPointer<QWidget> p = w;
3070 res = acceptTouchEvents && d->notify_helper(w, touchEvent);
3071 eventAccepted = touchEvent->isAccepted();
3076 w->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent, res && eventAccepted);
3078 touchEvent->m_spont =
false;
3079 if (res && eventAccepted) {
3081 d->activateImplicitTouchGrab(w, touchEvent);
3084#ifndef QT_NO_GESTURES
3085 if (gesturePendingWidget.isNull() && w && QGestureManager::gesturePending(w))
3086 gesturePendingWidget = w;
3088 if (!w || w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
3091 const QPoint offset = w->pos();
3092 w = w->parentWidget();
3093 QMutableTouchEvent::setTarget(touchEvent, w);
3094 for (qsizetype cnt = touchEvent->pointCount(), i = 0; i < cnt; ++i) {
3095 auto &pt = touchEvent->point(i);
3096 QMutableEventPoint::setPosition(pt, pt.position() + offset);
3100#ifndef QT_NO_GESTURES
3101 if (!eventAccepted && !gesturePendingWidget.isNull()) {
3104 d->activateImplicitTouchGrab(gesturePendingWidget, touchEvent, QApplicationPrivate::GrabAllPoints);
3108 touchEvent->setAccepted(eventAccepted);
3111 case QEvent::TouchUpdate:
3112 case QEvent::TouchEnd:
3116 if (w->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent))
3117 res = d->notify_helper(w, e);
3119 case QEvent::RequestSoftwareInputPanel:
3120 inputMethod()->show();
3122 case QEvent::CloseSoftwareInputPanel:
3123 inputMethod()->hide();
3126#ifndef QT_NO_GESTURES
3127 case QEvent::NativeGesture:
3130 res = d->notify_helper(w, e);
3131 if (res && e->isAccepted())
3135 w = w->parentWidget();
3138 case QEvent::Gesture:
3139 case QEvent::GestureOverride: {
3140 QGestureEvent *gestureEvent =
static_cast<QGestureEvent *>(e);
3141 QList<QGesture *> allGestures = gestureEvent->gestures();
3143 bool eventAccepted = gestureEvent->isAccepted();
3144 bool wasAccepted = eventAccepted;
3147 QList<QGesture *> gestures;
3148 QWidgetPrivate *wd = w->d_func();
3149 for (
int i = 0; i < allGestures.size();) {
3150 QGesture *g = allGestures.at(i);
3151 Qt::GestureType type = g->gestureType();
3152 QMap<Qt::GestureType, Qt::GestureFlags>::iterator contextit =
3153 wd->gestureContext.find(type);
3154 bool deliver = contextit != wd->gestureContext.end() &&
3155 (g->state() == Qt::GestureStarted || w == receiver ||
3156 (contextit.value() & Qt::ReceivePartialGestures));
3158 allGestures.removeAt(i);
3164 if (!gestures.isEmpty()) {
3165 QGestureEvent ge(gestures);
3166 ge.t = gestureEvent->t;
3167 ge.m_spont = gestureEvent->spontaneous();
3168 ge.m_accept = wasAccepted;
3169 ge.m_accepted = gestureEvent->m_accepted;
3170 res = d->notify_helper(w, &ge);
3171 gestureEvent->m_spont =
false;
3172 eventAccepted = ge.isAccepted();
3173 for (QGesture *g : std::as_const(gestures)) {
3176 if (eventAccepted || ge.isAccepted(g)) {
3178 gestureEvent->m_targetWidgets[g->gestureType()] = w;
3179 gestureEvent->setAccepted(g,
true);
3183 allGestures.append(g);
3187 if (allGestures.isEmpty())
3191 w = w->parentWidget();
3193 for (QGesture *g : std::as_const(allGestures))
3194 gestureEvent->setAccepted(g,
false);
3195 gestureEvent->m_accept =
false;
3201 typedef void (*RegisterTouchWindowFn)(QWindow *,
bool);
3203 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3204 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>(
3205 QFunctionPointer(platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow")));
3206 if (registerTouchWindow)
3207 registerTouchWindow(w->window()->windowHandle(),
true);
3209 res = d->notify_helper(receiver, e);
3212 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3213 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>(
3214 QFunctionPointer(platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow")));
3215 if (registerTouchWindow)
3216 registerTouchWindow(w->window()->windowHandle(),
false);
3218 res = d->notify_helper(receiver, e);
3222 res = d->notify_helper(receiver, e);
3226 res = d->notify_helper(receiver, e);
3795bool QApplicationPrivate::translateRawTouchEvent(QWidget *window,
const QTouchEvent *te)
3797 QApplicationPrivate *d = self;
3799 typedef std::pair<QEventPoint::State, QList<QEventPoint> > StatesAndTouchPoints;
3800 QHash<QWidget *, StatesAndTouchPoints> widgetsNeedingEvents;
3802 const auto *device = te->pointingDevice();
3803 auto touchPoints = te->points();
3804 for (
auto &touchPoint : touchPoints) {
3806 QPointer<QObject> target;
3807 if (touchPoint.state() == QEventPoint::State::Pressed) {
3808 if (device->type() == QInputDevice::DeviceType::TouchPad) {
3811 target = QPointingDevicePrivate::get(device)->firstActiveTarget();
3814 if (target.isNull()) {
3817 window = QApplication::topLevelAt(touchPoint.globalPosition().toPoint());
3820 target = window->childAt(window->mapFromGlobal(touchPoint.globalPosition()));
3825 bool usingClosestWidget =
false;
3826 if (device->type() == QInputDevice::DeviceType::TouchScreen) {
3827 QWidget *closestWidget = d->findClosestTouchPointTarget(device, touchPoint);
3828 QWidget *widget =
static_cast<QWidget *>(target.data());
3830 && (widget->isAncestorOf(closestWidget) || closestWidget->isAncestorOf(widget))) {
3831 target = closestWidget;
3832 usingClosestWidget =
true;
3838 if (device->type() == QInputDevice::DeviceType::TouchPad || usingClosestWidget)
3839 QMutableEventPoint::setTarget(touchPoint, target);
3841 target = QMutableEventPoint::target(touchPoint);
3845 Q_ASSERT(!target.isNull());
3847 QWidget *targetWidget =
static_cast<QWidget *>(target.data());
3852 if (touchPoints.count() == 1
3853 && device->type() == QInputDevice::DeviceType::TouchPad
3854 && !targetWidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents))
3858 StatesAndTouchPoints &maskAndPoints = widgetsNeedingEvents[targetWidget];
3859 maskAndPoints.first = QEventPoint::State(maskAndPoints.first | touchPoint.state());
3860 maskAndPoints.second.append(touchPoint);
3863 if (widgetsNeedingEvents.isEmpty())
3866 bool accepted =
false;
3867 QHash<QWidget *, StatesAndTouchPoints>::ConstIterator it = widgetsNeedingEvents.constBegin();
3868 const QHash<QWidget *, StatesAndTouchPoints>::ConstIterator end = widgetsNeedingEvents.constEnd();
3869 for (; it != end; ++it) {
3870 const QPointer<QWidget> widget = it.key();
3871 if (!QApplicationPrivate::tryModalHelper(widget,
nullptr))
3874 QEvent::Type eventType;
3875 switch (it.value().first) {
3876 case QEventPoint::State::Pressed:
3877 eventType = QEvent::TouchBegin;
3879 case QEventPoint::State::Released:
3880 eventType = QEvent::TouchEnd;
3882 case QEventPoint::State::Stationary:
3886 eventType = QEvent::TouchUpdate;
3890 QMutableTouchEvent touchEvent(eventType, device, QGuiApplication::keyboardModifiers(),
3892 bool containsPress = updateTouchPointsForWidget(widget, &touchEvent);
3893 touchEvent.setTimestamp(te->timestamp());
3894 touchEvent.setTarget(widget);
3897 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3899 switch (touchEvent.type()) {
3900 case QEvent::TouchBegin:
3904 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3905 : QApplication::sendEvent(widget, &touchEvent);
3906 if (res && touchEvent.isAccepted()) {
3908 if (!widget.isNull())
3909 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3914 if (widget->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent)
3915#ifndef QT_NO_GESTURES
3916 || QGestureManager::gesturePending(widget)
3919 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3920 : QApplication::sendEvent(widget, &touchEvent);
3921 if (res && touchEvent.isAccepted())
3924 if (touchEvent.type() == QEvent::TouchEnd && !widget.isNull())
3925 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent,
false);