diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index 6eff2f8d262..fbc7d319112 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -634,7 +634,18 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) return false; } - if (!filterNativeEvent(QByteArrayLiteral("windows_generic_MSG"), &msg, 0)) { + // 3ds Max extension: Emit a signal that allows 3ds Max to do it's specific message preprocessing + // before Qt translates and dispatches the message. If 3ds Max already processed the message, + // there is no need to propagate / dispatch it further by Qt. + // Note, that 3ds Max cannot use the native event filter mechanism below for doing it's message + // preprocessing, since filterNativeEvent() with the event type "windows_generic_MSG" is also used + // by the QWindowsContext::windowsProc(). + // Getting called twice from two different locations without be able to do a proper distinction of + // the calling source on the 3ds Max side, can lead to endless loops causing stack overflows. + bool eventProcessed = false; + emit preProcessNativeEvent( &msg, &eventProcessed ); + + if ( !eventProcessed && !filterNativeEvent(QByteArrayLiteral("windows_generic_MSG"), &msg, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } @@ -670,6 +681,9 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) if (needWM_QT_SENDPOSTEDEVENTS) PostMessage(d->internalHwnd, WM_QT_SENDPOSTEDEVENTS, 0, 0); + // 3ds Max extension for triggering progressive rendering. + emit allEventsProcessed(); + return retVal; } diff --git a/src/corelib/kernel/qeventdispatcher_win_p.h b/src/corelib/kernel/qeventdispatcher_win_p.h index 3bb618153b3..7a927d5826d 100644 --- a/src/corelib/kernel/qeventdispatcher_win_p.h +++ b/src/corelib/kernel/qeventdispatcher_win_p.h @@ -108,6 +108,16 @@ class Q_CORE_EXPORT QEventDispatcherWin32 : public QAbstractEventDispatcher HWND internalHwnd(); +Q_SIGNALS: + + // 3ds Max extension for win32 message preprocessing. + // Emitted before the native event filter are called and the win32 message gets translated/dispatched. + void preProcessNativeEvent( void* message, bool* returnProcessed ); + + // 3ds Max extension for progressive rendering. + // Emitted after all win32 messages has been dispatched. + void allEventsProcessed(); + protected: QEventDispatcherWin32(QEventDispatcherWin32Private &dd, QObject *parent = 0); virtual void sendPostedEvents();