1817void QApplicationPrivate::setActiveWindow(QWidget* act)
1819 QWidget* window = act?act->window():
nullptr;
1821 if (QApplicationPrivate::active_window == window)
1824#if QT_CONFIG(graphicsview)
1825 if (window && window->graphicsProxyWidget()) {
1831 QWidgetList toBeActivated;
1832 QWidgetList toBeDeactivated;
1834 if (QApplicationPrivate::active_window) {
1835 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1836 const QWidgetList list = QApplication::topLevelWidgets();
1837 for (
auto *w : list) {
1838 if (w->isVisible() && w->isActiveWindow())
1839 toBeDeactivated.append(w);
1842 toBeDeactivated.append(QApplicationPrivate::active_window);
1846 if (QApplicationPrivate::focus_widget) {
1847 if (QApplicationPrivate::focus_widget->testAttribute(Qt::WA_InputMethodEnabled))
1848 QGuiApplication::inputMethod()->commit();
1850 QFocusEvent focusAboutToChange(QEvent::FocusAboutToChange, Qt::ActiveWindowFocusReason);
1851 QCoreApplication::sendEvent(QApplicationPrivate::focus_widget, &focusAboutToChange);
1854 QApplicationPrivate::active_window = window;
1856 if (QApplicationPrivate::active_window) {
1857 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1858 const QWidgetList list = QApplication::topLevelWidgets();
1859 for (
auto *w : list) {
1860 if (w->isVisible() && w->isActiveWindow())
1861 toBeActivated.append(w);
1864 toBeActivated.append(QApplicationPrivate::active_window);
1870 QEvent activationChange(QEvent::ActivationChange);
1871 QEvent windowActivate(QEvent::WindowActivate);
1872 QEvent windowDeactivate(QEvent::WindowDeactivate);
1874 for (QWidget *w : std::as_const(toBeActivated)) {
1875 QApplication::sendSpontaneousEvent(w, &windowActivate);
1876 QApplication::sendSpontaneousEvent(w, &activationChange);
1879 for (QWidget *w : std::as_const(toBeDeactivated)) {
1880 QApplication::sendSpontaneousEvent(w, &windowDeactivate);
1881 QApplication::sendSpontaneousEvent(w, &activationChange);
1884 if (!inPopupMode()) {
1886 if (!QApplicationPrivate::active_window && QApplicationPrivate::focus_widget) {
1887 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
1888 }
else if (QApplicationPrivate::active_window) {
1889 QWidget *w = QApplicationPrivate::active_window->focusWidget();
1890 if (w && w->isVisible() )
1891 w->setFocus(Qt::ActiveWindowFocusReason);
1893 w = QApplicationPrivate::focusNextPrevChild_helper(QApplicationPrivate::active_window,
true);
1895 w->setFocus(Qt::ActiveWindowFocusReason);
1897 w = QApplicationPrivate::focus_widget;
1898 if (!w && QApplicationPrivate::active_window->focusPolicy() != Qt::NoFocus) {
1899 QApplicationPrivate::active_window->setFocus(Qt::ActiveWindowFocusReason);
1900 }
else if (!QApplicationPrivate::active_window->isAncestorOf(w)) {
1902 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
2038void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave,
const QPointF &globalPosF)
2040 if ((!enter && !leave) || (enter == leave))
2043 QWidgetList leaveList;
2044 QWidgetList enterList;
2046 bool sameWindow = leave && enter && leave->window() == enter->window();
2047 if (leave && !sameWindow) {
2050 leaveList.append(w);
2051 }
while (!w->isWindow() && (w = w->parentWidget()));
2053 if (enter && !sameWindow) {
2056 enterList.append(w);
2057 }
while (!w->isWindow() && (w = w->parentWidget()));
2063 while (!e->isWindow() && (e = e->parentWidget()))
2066 while (!l->isWindow() && (l = l->parentWidget()))
2068 QWidget* wenter = enter;
2069 QWidget* wleave = leave;
2070 while (enterDepth > leaveDepth) {
2071 wenter = wenter->parentWidget();
2074 while (leaveDepth > enterDepth) {
2075 wleave = wleave->parentWidget();
2078 while (!wenter->isWindow() && wenter != wleave) {
2079 wenter = wenter->parentWidget();
2080 wleave = wleave->parentWidget();
2083 for (
auto *w = leave; w != wleave; w = w->parentWidget())
2084 leaveList.append(w);
2086 for (
auto *w = enter; w != wenter; w = w->parentWidget())
2087 enterList.append(w);
2090 QEvent leaveEvent(QEvent::Leave);
2091 for (QWidget *w : std::as_const(leaveList)) {
2092 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2093 QCoreApplication::sendEvent(w, &leaveEvent);
2094 if (w->testAttribute(Qt::WA_Hover) &&
2095 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2096 Q_ASSERT(instance());
2097 QHoverEvent he(QEvent::HoverLeave, QPointF(-1, -1), globalPosF, w->mapFromGlobal(globalPosF),
2098 QGuiApplication::keyboardModifiers());
2099 qApp->d_func()->notify_helper(w, &he);
2103 if (!enterList.isEmpty()) {
2105 const QPointF globalPos = qIsInf(globalPosF.x())
2108 const QPointF windowPos = std::as_const(enterList).back()->window()->mapFromGlobal(globalPos);
2109 for (
auto it = enterList.crbegin(), end = enterList.crend(); it != end; ++it) {
2111 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2112 const QPointF localPos = w->mapFromGlobal(globalPos);
2113 QEnterEvent enterEvent(localPos, windowPos, globalPos);
2114 QCoreApplication::sendEvent(w, &enterEvent);
2115 if (w->testAttribute(Qt::WA_Hover) &&
2116 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2117 QHoverEvent he(QEvent::HoverEnter, windowPos, QPointF(-1, -1), globalPos,
2118 QGuiApplication::keyboardModifiers());
2119 QMutableEventPoint::setPosition(he.point(0), localPos);
2120 qApp->d_func()->notify_helper(w, &he);
2129 const bool enterOnAlien = (enter && (isAlien(enter) || enter->testAttribute(Qt::WA_DontShowOnScreen)));
2132 QWidget *parentOfLeavingCursor =
nullptr;
2133 for (QWidget *w : std::as_const(leaveList)) {
2136 if (w->testAttribute(Qt::WA_SetCursor)) {
2137 QWidget *parent = w->parentWidget();
2138 while (parent && parent->d_func()->data.in_destructor)
2139 parent = parent->parentWidget();
2140 parentOfLeavingCursor = parent;
2146 if (parentOfLeavingCursor && (!enterOnAlien
2147 || parentOfLeavingCursor->effectiveWinId() != enter->effectiveWinId())) {
2148#if QT_CONFIG(graphicsview)
2149 if (!parentOfLeavingCursor->window()->graphicsProxyWidget())
2152 qt_qpa_set_cursor(parentOfLeavingCursor,
true);
2156 QWidget *cursorWidget = enter;
2157 while (!cursorWidget->isWindow() && !cursorWidget->isEnabled())
2158 cursorWidget = cursorWidget->parentWidget();
2163#if QT_CONFIG(graphicsview)
2164 if (cursorWidget->window()->graphicsProxyWidget()) {
2165 QWidgetPrivate::nearestGraphicsProxyWidget(cursorWidget)->setCursor(cursorWidget->cursor());
2169 qt_qpa_set_cursor(cursorWidget,
true);
2549bool QApplication::notify(QObject *receiver, QEvent *e)
2553 if (QApplicationPrivate::is_app_closing)
2556 if (Q_UNLIKELY(!receiver)) {
2557 qWarning(
"QApplication::notify: Unexpected null receiver");
2562 QCoreApplicationPrivate::checkReceiverThread(receiver);
2565 const bool isWindowType = receiver->isWindowType();
2566 const bool isWidgetType = receiver->isWidgetType();
2568 && QGuiApplicationPrivate::sendQWindowEventToQPlatformWindow(
static_cast<QWindow *>(receiver), e)) {
2572 QGuiApplicationPrivate::captureGlobalModifierState(e);
2574#ifndef QT_NO_GESTURES
2576 if (d->gestureManager) {
2577 switch (e->type()) {
2579 case QEvent::MetaCall:
2580 case QEvent::DeferredDelete:
2581 case QEvent::DragEnter:
case QEvent::DragMove:
case QEvent::DragLeave:
2582 case QEvent::Drop:
case QEvent::DragResponse:
2583 case QEvent::ChildAdded:
case QEvent::ChildPolished:
2584 case QEvent::ChildRemoved:
2585 case QEvent::UpdateRequest:
2586 case QEvent::UpdateLater:
2587 case QEvent::LocaleChange:
2589 case QEvent::IconDrag:
2590 case QEvent::StyleChange:
2591 case QEvent::GraphicsSceneDragEnter:
2592 case QEvent::GraphicsSceneDragMove:
2593 case QEvent::GraphicsSceneDragLeave:
2594 case QEvent::GraphicsSceneDrop:
2595 case QEvent::DynamicPropertyChange:
2596 case QEvent::NetworkReplyUpdated:
2599 if (d->gestureManager->thread() == QThread::currentThread()) {
2601 if (d->gestureManager->filterEvent(
static_cast<QWidget *>(receiver), e))
2607 if (d->gestureManager->filterEvent(receiver, e))
2616 switch (e->type()) {
2617 case QEvent::ApplicationDeactivate:
2618 case QEvent::OrientationChange:
2622 d->closeAllPopups();
2625 case QEvent::ActivationChange:
2626 case QEvent::KeyPress:
2627 case QEvent::KeyRelease:
2628 case QEvent::FocusOut:
2629 case QEvent::FocusIn:
2630 case QEvent::MouseButtonPress:
2631 case QEvent::MouseButtonRelease:
2632 case QEvent::MouseButtonDblClick:
2633 d->toolTipFallAsleep.stop();
2636 d->toolTipWakeUp.stop();
2642 switch (e->type()) {
2643 case QEvent::KeyPress: {
2644 QKeyEvent* keyEvent =
static_cast<QKeyEvent*>(e);
2645 const int key = keyEvent->key();
2650 if (!e->spontaneous() && isWidgetType
2651 && qt_sendShortcutOverrideEvent(
static_cast<QWidget *>(receiver), keyEvent->timestamp(),
2652 key, keyEvent->modifiers(), keyEvent->text(),
2653 keyEvent->isAutoRepeat(), keyEvent->count())) {
2656 qt_in_tab_key_event = (key == Qt::Key_Backtab
2657 || key == Qt::Key_Tab
2658 || key == Qt::Key_Left
2659 || key == Qt::Key_Up
2660 || key == Qt::Key_Right
2661 || key == Qt::Key_Down);
2670 QWidget * w =
static_cast<QWidget *>(receiver);
2671 switch (e->type()) {
2672 case QEvent::ShortcutOverride:
2673 case QEvent::KeyPress:
2674 case QEvent::KeyRelease: {
2675 QKeyEvent* key =
static_cast<QKeyEvent*>(e);
2676 bool def = key->isAccepted();
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689 QPointer<QObject> pr = receiver;
2695 res = d->notify_helper(w, e);
2697 if (res && key->isAccepted())
2699 if (!pr || w->isWindow())
2702 w = w->parentWidget();
2704 qt_in_tab_key_event =
false;
2707 case QEvent::MouseButtonPress:
2708 case QEvent::MouseButtonRelease:
2709 case QEvent::MouseButtonDblClick:
2710 case QEvent::MouseMove: {
2711 QMouseEvent* mouse =
static_cast<QMouseEvent*>(e);
2712 QPoint relpos = mouse->position().toPoint();
2714 if (e->spontaneous()) {
2715 if (e->type() != QEvent::MouseMove)
2716 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos);
2725 if (e->type() == QEvent::MouseMove && mouse->buttons() == 0
2726 && w->rect().contains(relpos)) {
2727 d->toolTipWidget = w;
2728 d->toolTipPos = relpos;
2729 d->toolTipGlobalPos = mouse->globalPosition().toPoint();
2730 QStyle *s = d->toolTipWidget->style();
2731 int wakeDelay = s->styleHint(QStyle::SH_ToolTip_WakeUpDelay,
nullptr, d->toolTipWidget,
nullptr);
2732 d->toolTipWakeUp.start(d->toolTipFallAsleep.isActive() ? 20 : wakeDelay,
this);
2736 bool eventAccepted = mouse->isAccepted();
2738 QPointer<QWidget> pw = w;
2740 QMouseEvent me(mouse->type(), relpos, mouse->scenePosition(), mouse->globalPosition(),
2741 mouse->button(), mouse->buttons(), mouse->modifiers(), mouse->source(),
2742 mouse->pointingDevice());
2743 me.m_spont = mouse->spontaneous();
2744 me.setTimestamp(mouse->timestamp());
2745 QMutableSinglePointEvent::setDoubleClick(&me, QMutableSinglePointEvent::isDoubleClick(mouse));
2747 if (!w->hasMouseTracking()
2748 && mouse->type() == QEvent::MouseMove && mouse->buttons() == 0) {
2750 d->sendThroughApplicationEventFilters(w, w == receiver ? mouse : &me);
2753 w->setAttribute(Qt::WA_NoMouseReplay,
false);
2754 res = d->notify_helper(w, w == receiver ? mouse : &me);
2757 eventAccepted = (w == receiver ? mouse : &me)->isAccepted();
2758 if (res && eventAccepted)
2760 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2763 w = w->parentWidget();
2766 mouse->setAccepted(eventAccepted);
2768 if (e->type() == QEvent::MouseMove) {
2772 w =
static_cast<QWidget *>(receiver);
2773 relpos = mouse->position().toPoint();
2774 QPoint diff = relpos - w->mapFromGlobal(mouse->globalPosition()).toPoint();
2776 if (w->testAttribute(Qt::WA_Hover) &&
2777 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2778 QHoverEvent he(QEvent::HoverMove, mouse->scenePosition(), mouse->globalPosition(), relpos - diff, mouse->modifiers());
2779 QMutableEventPoint::setPosition(he.point(0), relpos);
2780 d->notify_helper(w, &he);
2782 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2785 w = w->parentWidget();
2790#if QT_CONFIG(wheelevent)
2791 case QEvent::Wheel: {
2793 if (
const QWidget *popup = QApplication::activePopupWidget()) {
2794 if (w->window() != popup)
2798 QWheelEvent* wheel =
static_cast<QWheelEvent*>(e);
2799 if (!wheel->spontaneous()) {
2801
2802
2803
2804
2805 res = d->notify_helper(w, wheel);
2809 const Qt::ScrollPhase phase = wheel->phase();
2810 QPointF relpos = wheel->position();
2833 if (QApplicationPrivate::wheel_widget) {
2834 Q_ASSERT(phase != Qt::NoScrollPhase);
2835 w = QApplicationPrivate::wheel_widget;
2836 relpos = w->mapFromGlobal(wheel->globalPosition());
2839
2840
2841
2842
2845 QApplicationPrivate::wheel_widget =
nullptr;
2847 case Qt::ScrollBegin:
2848 QApplicationPrivate::wheel_widget = w;
2850 case Qt::ScrollUpdate:
2851 case Qt::ScrollMomentum:
2852 if (!QApplicationPrivate::wheel_widget)
2853 QApplicationPrivate::wheel_widget = w;
2855 case Qt::NoScrollPhase:
2856 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos.toPoint());
2861 QWheelEvent we(relpos, wheel->globalPosition(), wheel->pixelDelta(), wheel->angleDelta(), wheel->buttons(),
2862 wheel->modifiers(), phase, wheel->inverted(), wheel->source(), wheel->pointingDevice());
2864 we.setTimestamp(wheel->timestamp());
2869 we.setAccepted(
true);
2870 we.m_spont = wheel->spontaneous() && w == receiver;
2871 res = d->notify_helper(w, &we);
2872 eventAccepted = we.isAccepted();
2873 if (res && eventAccepted)
2875 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2878 QMutableEventPoint::setPosition(we.point(0), we.position() + w->pos());
2879 w = w->parentWidget();
2881 wheel->setAccepted(eventAccepted);
2885#ifndef QT_NO_CONTEXTMENU
2886 case QEvent::ContextMenu: {
2887 QContextMenuEvent *context =
static_cast<QContextMenuEvent*>(e);
2888 QPoint relpos = context->pos();
2889 bool eventAccepted = context->isAccepted();
2891 QContextMenuEvent ce(context->reason(), relpos, context->globalPos(), context->modifiers());
2892 ce.m_spont = e->spontaneous();
2893 res = d->notify_helper(w, w == receiver ? context : &ce);
2894 eventAccepted = ((w == receiver) ? context : &ce)->isAccepted();
2897 if (res && eventAccepted)
2899 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2903 w = w->parentWidget();
2905 context->setAccepted(eventAccepted);
2909#if QT_CONFIG(tabletevent)
2910 case QEvent::TabletMove:
2911 case QEvent::TabletPress:
2912 case QEvent::TabletRelease: {
2913 QTabletEvent *tablet =
static_cast<QTabletEvent*>(e);
2914 QPointF relpos = tablet->position();
2915 bool eventAccepted = tablet->isAccepted();
2917 QTabletEvent te(tablet->type(), tablet->pointingDevice(), relpos, tablet->globalPosition(),
2918 tablet->pressure(), tablet->xTilt(), tablet->yTilt(),
2919 tablet->tangentialPressure(), tablet->rotation(), tablet->z(),
2920 tablet->modifiers(), tablet->button(), tablet->buttons());
2921 te.m_spont = e->spontaneous();
2922 te.setTimestamp(tablet->timestamp());
2923 te.setAccepted(
false);
2924 res = d->notify_helper(w, w == receiver ? tablet : &te);
2925 eventAccepted = ((w == receiver) ? tablet : &te)->isAccepted();
2927 if (res && eventAccepted)
2929 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2933 w = w->parentWidget();
2935 tablet->setAccepted(eventAccepted);
2940#if QT_CONFIG(tooltip) || QT_CONFIG(whatsthis)
2941 case QEvent::ToolTip:
2942 case QEvent::WhatsThis:
2943 case QEvent::QueryWhatsThis: {
2944 QHelpEvent *help =
static_cast<QHelpEvent*>(e);
2945 QPoint relpos = help->pos();
2946 bool eventAccepted = help->isAccepted();
2948 QHelpEvent he(help->type(), relpos, help->globalPos());
2949 he.m_spont = e->spontaneous();
2950 res = d->notify_helper(w, w == receiver ? help : &he);
2952 eventAccepted = (w == receiver ? help : &he)->isAccepted();
2953 if (res && eventAccepted)
2959 w = w->parentWidget();
2961 help->setAccepted(eventAccepted);
2965#if QT_CONFIG(statustip) || QT_CONFIG(whatsthis)
2966 case QEvent::StatusTip:
2967 case QEvent::WhatsThisClicked:
2969 res = d->notify_helper(w, e);
2970 if (res && e->isAccepted())
2974 w = w->parentWidget();
2979#if QT_CONFIG(draganddrop)
2980 case QEvent::DragEnter: {
2981 QDragEnterEvent *dragEvent =
static_cast<QDragEnterEvent *>(e);
2982#if QT_CONFIG(graphicsview)
2985 const auto &extra = w->window()->d_func()->extra;
2986 if (extra && extra->proxyWidget) {
2987 res = d->notify_helper(w, dragEvent);
2992 if (w->isEnabled() && w->acceptDrops()) {
2993 res = d->notify_helper(w, dragEvent);
2994 if (res && dragEvent->isAccepted()) {
2995 QDragManager::self()->setCurrentTarget(w);
3001 dragEvent->m_pos = w->mapToParent(dragEvent->m_pos);
3002 w = w->parentWidget();
3006 case QEvent::DragMove:
3008 case QEvent::DragLeave: {
3009#if QT_CONFIG(graphicsview)
3012 const auto &extra = w->window()->d_func()->extra;
3013 bool isProxyWidget = extra && extra->proxyWidget;
3016 w = qobject_cast<QWidget *>(QDragManager::self()->currentTarget());
3023 if (e->type() == QEvent::DragLeave)
3024 w =
static_cast<QWidget *>(receiver);
3028 if (e->type() == QEvent::DragMove || e->type() == QEvent::Drop) {
3029 QDropEvent *dragEvent =
static_cast<QDropEvent *>(e);
3030 QWidget *origReceiver =
static_cast<QWidget *>(receiver);
3031 while (origReceiver && w != origReceiver) {
3032 dragEvent->m_pos = origReceiver->mapToParent(dragEvent->m_pos);
3033 origReceiver = origReceiver->parentWidget();
3036 res = d->notify_helper(w, e);
3037 if (e->type() != QEvent::DragMove
3038#if QT_CONFIG(graphicsview)
3042 QDragManager::self()->setCurrentTarget(
nullptr, e->type() == QEvent::Drop);
3046 case QEvent::TouchBegin: {
3048 QTouchEvent *touchEvent =
static_cast<QTouchEvent *>(e);
3049 bool eventAccepted = touchEvent->isAccepted();
3050 bool acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
3052 if (acceptTouchEvents && e->spontaneous()
3053 && touchEvent->device()->type() != QInputDevice::DeviceType::TouchPad) {
3054 const QPoint localPos = touchEvent->points()[0].position().toPoint();
3055 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, localPos);
3058#ifndef QT_NO_GESTURES
3059 QPointer<QWidget> gesturePendingWidget;
3064 acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
3065 QMutableTouchEvent::setTarget(touchEvent, w);
3066 touchEvent->setAccepted(acceptTouchEvents);
3067 QPointer<QWidget> p = w;
3068 res = acceptTouchEvents && d->notify_helper(w, touchEvent);
3069 eventAccepted = touchEvent->isAccepted();
3074 w->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent, res && eventAccepted);
3076 touchEvent->m_spont =
false;
3077 if (res && eventAccepted) {
3079 d->activateImplicitTouchGrab(w, touchEvent);
3082#ifndef QT_NO_GESTURES
3083 if (gesturePendingWidget.isNull() && w && QGestureManager::gesturePending(w))
3084 gesturePendingWidget = w;
3086 if (!w || w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
3089 const QPoint offset = w->pos();
3090 w = w->parentWidget();
3091 QMutableTouchEvent::setTarget(touchEvent, w);
3092 for (qsizetype cnt = touchEvent->pointCount(), i = 0; i < cnt; ++i) {
3093 auto &pt = touchEvent->point(i);
3094 QMutableEventPoint::setPosition(pt, pt.position() + offset);
3098#ifndef QT_NO_GESTURES
3099 if (!eventAccepted && !gesturePendingWidget.isNull()) {
3102 d->activateImplicitTouchGrab(gesturePendingWidget, touchEvent, QApplicationPrivate::GrabAllPoints);
3106 touchEvent->setAccepted(eventAccepted);
3109 case QEvent::TouchUpdate:
3110 case QEvent::TouchEnd:
3114 if (w->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent))
3115 res = d->notify_helper(w, e);
3117 case QEvent::RequestSoftwareInputPanel:
3118 inputMethod()->show();
3120 case QEvent::CloseSoftwareInputPanel:
3121 inputMethod()->hide();
3124#ifndef QT_NO_GESTURES
3125 case QEvent::NativeGesture:
3128 res = d->notify_helper(w, e);
3129 if (res && e->isAccepted())
3133 w = w->parentWidget();
3136 case QEvent::Gesture:
3137 case QEvent::GestureOverride: {
3138 QGestureEvent *gestureEvent =
static_cast<QGestureEvent *>(e);
3139 QList<QGesture *> allGestures = gestureEvent->gestures();
3141 bool eventAccepted = gestureEvent->isAccepted();
3142 bool wasAccepted = eventAccepted;
3145 QList<QGesture *> gestures;
3146 QWidgetPrivate *wd = w->d_func();
3147 for (
int i = 0; i < allGestures.size();) {
3148 QGesture *g = allGestures.at(i);
3149 Qt::GestureType type = g->gestureType();
3150 QMap<Qt::GestureType, Qt::GestureFlags>::iterator contextit =
3151 wd->gestureContext.find(type);
3152 bool deliver = contextit != wd->gestureContext.end() &&
3153 (g->state() == Qt::GestureStarted || w == receiver ||
3154 (contextit.value() & Qt::ReceivePartialGestures));
3156 allGestures.removeAt(i);
3162 if (!gestures.isEmpty()) {
3163 QGestureEvent ge(gestures);
3164 ge.t = gestureEvent->t;
3165 ge.m_spont = gestureEvent->spontaneous();
3166 ge.m_accept = wasAccepted;
3167 ge.m_accepted = gestureEvent->m_accepted;
3168 res = d->notify_helper(w, &ge);
3169 gestureEvent->m_spont =
false;
3170 eventAccepted = ge.isAccepted();
3171 for (QGesture *g : std::as_const(gestures)) {
3174 if (eventAccepted || ge.isAccepted(g)) {
3176 gestureEvent->m_targetWidgets[g->gestureType()] = w;
3177 gestureEvent->setAccepted(g,
true);
3181 allGestures.append(g);
3185 if (allGestures.isEmpty())
3189 w = w->parentWidget();
3191 for (QGesture *g : std::as_const(allGestures))
3192 gestureEvent->setAccepted(g,
false);
3193 gestureEvent->m_accept =
false;
3199 typedef void (*RegisterTouchWindowFn)(QWindow *,
bool);
3201 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3202 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>(
3203 QFunctionPointer(platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow")));
3204 if (registerTouchWindow)
3205 registerTouchWindow(w->window()->windowHandle(),
true);
3207 res = d->notify_helper(receiver, e);
3210 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3211 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>(
3212 QFunctionPointer(platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow")));
3213 if (registerTouchWindow)
3214 registerTouchWindow(w->window()->windowHandle(),
false);
3216 res = d->notify_helper(receiver, e);
3220 res = d->notify_helper(receiver, e);
3224 res = d->notify_helper(receiver, e);
3793bool QApplicationPrivate::translateRawTouchEvent(QWidget *window,
const QTouchEvent *te)
3795 QApplicationPrivate *d = self;
3797 typedef std::pair<QEventPoint::State, QList<QEventPoint> > StatesAndTouchPoints;
3798 QHash<QWidget *, StatesAndTouchPoints> widgetsNeedingEvents;
3800 const auto *device = te->pointingDevice();
3801 auto touchPoints = te->points();
3802 for (
auto &touchPoint : touchPoints) {
3804 QPointer<QObject> target;
3805 if (touchPoint.state() == QEventPoint::State::Pressed) {
3806 if (device->type() == QInputDevice::DeviceType::TouchPad) {
3809 target = QPointingDevicePrivate::get(device)->firstActiveTarget();
3812 if (target.isNull()) {
3815 window = QApplication::topLevelAt(touchPoint.globalPosition().toPoint());
3818 target = window->childAt(window->mapFromGlobal(touchPoint.globalPosition()));
3823 bool usingClosestWidget =
false;
3824 if (device->type() == QInputDevice::DeviceType::TouchScreen) {
3825 QWidget *closestWidget = d->findClosestTouchPointTarget(device, touchPoint);
3826 QWidget *widget =
static_cast<QWidget *>(target.data());
3828 && (widget->isAncestorOf(closestWidget) || closestWidget->isAncestorOf(widget))) {
3829 target = closestWidget;
3830 usingClosestWidget =
true;
3836 if (device->type() == QInputDevice::DeviceType::TouchPad || usingClosestWidget)
3837 QMutableEventPoint::setTarget(touchPoint, target);
3839 target = QMutableEventPoint::target(touchPoint);
3843 Q_ASSERT(!target.isNull());
3845 QWidget *targetWidget =
static_cast<QWidget *>(target.data());
3850 if (touchPoints.count() == 1
3851 && device->type() == QInputDevice::DeviceType::TouchPad
3852 && !targetWidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents))
3856 StatesAndTouchPoints &maskAndPoints = widgetsNeedingEvents[targetWidget];
3857 maskAndPoints.first = QEventPoint::State(maskAndPoints.first | touchPoint.state());
3858 maskAndPoints.second.append(touchPoint);
3861 if (widgetsNeedingEvents.isEmpty())
3864 bool accepted =
false;
3865 QHash<QWidget *, StatesAndTouchPoints>::ConstIterator it = widgetsNeedingEvents.constBegin();
3866 const QHash<QWidget *, StatesAndTouchPoints>::ConstIterator end = widgetsNeedingEvents.constEnd();
3867 for (; it != end; ++it) {
3868 const QPointer<QWidget> widget = it.key();
3869 if (!QApplicationPrivate::tryModalHelper(widget,
nullptr))
3872 QEvent::Type eventType;
3873 switch (it.value().first) {
3874 case QEventPoint::State::Pressed:
3875 eventType = QEvent::TouchBegin;
3877 case QEventPoint::State::Released:
3878 eventType = QEvent::TouchEnd;
3880 case QEventPoint::State::Stationary:
3884 eventType = QEvent::TouchUpdate;
3888 QMutableTouchEvent touchEvent(eventType, device, QGuiApplication::keyboardModifiers(),
3890 bool containsPress = updateTouchPointsForWidget(widget, &touchEvent);
3891 touchEvent.setTimestamp(te->timestamp());
3892 touchEvent.setTarget(widget);
3895 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3897 switch (touchEvent.type()) {
3898 case QEvent::TouchBegin:
3902 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3903 : QApplication::sendEvent(widget, &touchEvent);
3904 if (res && touchEvent.isAccepted()) {
3906 if (!widget.isNull())
3907 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3912 if (widget->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent)
3913#ifndef QT_NO_GESTURES
3914 || QGestureManager::gesturePending(widget)
3917 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3918 : QApplication::sendEvent(widget, &touchEvent);
3919 if (res && touchEvent.isAccepted())
3922 if (touchEvent.type() == QEvent::TouchEnd && !widget.isNull())
3923 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent,
false);