| | |
| | | |
| | | #include <optional> |
| | | |
| | | #include <QtCore/QAbstractEventDispatcher> |
| | | #include <QtCore/QDateTime> |
| | | #include <QtCore/QHash> |
| | | #include <QtCore/QScopeGuard> |
| | | #include <QtCore/QTimer> |
| | | #include <QtCore/QDateTime> |
| | | #include <QtGui/QGuiApplication> |
| | | #include <QtGui/QPainter> |
| | | #include <QtGui/QPalette> |
| | | |
| | | #include <QtGui/qpa/qwindowsysteminterface.h> |
| | | |
| | | #include <QtGui/private/qhighdpiscaling_p.h> |
| | | #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) |
| | |
| | | |
| | | #include "qwkglobal_p.h" |
| | | #include "qwkwindowsextra_p.h" |
| | | |
| | | // https://github.com/qt/qtbase/blob/6.6.1/src/plugins/platforms/windows/qwindowswindow.cpp#L2791 |
| | | // https://github.com/qt/qtbase/blob/6.6.1/src/plugins/platforms/windows/qwindowswindow.cpp#L3321 |
| | | // This issue exists only in Qt 6.6.1, and was introduced by QTBUG-113736 patch and fixed by |
| | | // QTBUG-117704 patch. |
| | | #if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS) && QT_VERSION == QT_VERSION_CHECK(6, 6, 1) |
| | | # define QTBUG_113736_WORKAROUND |
| | | #endif |
| | | |
| | | namespace QWK { |
| | | |
| | |
| | | [[maybe_unused]] const auto &cleaner = |
| | | qScopeGuard([windowThreadProcessId, currentThreadId]() { |
| | | ::AttachThreadInput(windowThreadProcessId, currentThreadId, FALSE); // |
| | | }); |
| | | }); // TODO: Remove it |
| | | |
| | | ::BringWindowToTop(hwnd); |
| | | // Activate the window too. This will force us to the virtual desktop this |
| | |
| | | return false; |
| | | } |
| | | |
| | | static inline bool forwardFilteredEvents(QWindow *window, HWND hWnd, UINT message, |
| | | WPARAM wParam, LPARAM lParam, LRESULT *result) { |
| | | static inline bool forwardFilteredEvent(QWindow *window, HWND hWnd, UINT message, WPARAM wParam, |
| | | LPARAM lParam, LRESULT *result) { |
| | | MSG msg = createMessageBlock(hWnd, message, wParam, lParam); |
| | | |
| | | // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/plugins/platforms/windows/qwindowscontext.cpp#L1025 |
| | | // Do exact the same as what Qt Windows plugin does. |
| | | |
| | | // Run the native event filters. QTBUG-67095: Exclude input messages which are sent |
| | | // by QEventDispatcherWin32::processEvents() |
| | |
| | | // Forward the event to user-defined native event filters, there may be some messages |
| | | // that need to be processed by the user. |
| | | std::ignore = |
| | | forwardFilteredEvents(ctx->window(), hWnd, message, wParam, lParam, &result); |
| | | forwardFilteredEvent(ctx->window(), hWnd, message, wParam, lParam, &result); |
| | | return result; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | static inline void addManagedWindow(QWindow *window, HWND hWnd, Win32WindowContext *ctx) { |
| | | const auto margins = [hWnd]() -> QMargins { |
| | | #ifndef QTBUG_113736_WORKAROUND |
| | | const auto margins = [](HWND hWnd) -> QMargins { |
| | | const auto titleBarHeight = int(getTitleBarHeight(hWnd)); |
| | | if (isSystemBorderEnabled()) { |
| | | return {0, -titleBarHeight, 0, 0}; |
| | |
| | | const auto frameSize = int(getResizeBorderThickness(hWnd)); |
| | | return {-frameSize, -titleBarHeight, -frameSize, -frameSize}; |
| | | } |
| | | }(); |
| | | }(hWnd); |
| | | |
| | | // Inform Qt we want and have set custom margins |
| | | setInternalWindowFrameMargins(window, margins); |
| | | #endif |
| | | |
| | | // Store original window proc |
| | | if (!g_qtWindowProc) { |
| | |
| | | mouseLeaveBlocked = false; |
| | | lastHitTestResult = WindowPart::Outside; |
| | | |
| | | #ifdef QTBUG_113736_WORKAROUND |
| | | m_delegate->setWindowFlags(m_host, |
| | | m_delegate->getWindowFlags(m_host) | Qt::FramelessWindowHint); |
| | | #endif |
| | | |
| | | // If the original window id is valid, remove all resources related |
| | | if (oldWinId) { |
| | | removeManagedWindow(reinterpret_cast<HWND>(oldWinId)); |