From ee942d7ab40e1d29008695ad1406d25d25780d28 Mon Sep 17 00:00:00 2001 From: Morteza Jamshidi Date: Thu, 17 Oct 2024 21:02:13 +0200 Subject: [PATCH] Windows: Fix title bar artifact for frameless windows after restoring If windows is frameless we don't let windows os handle WM_NCACTIVATE event. Fixes: QTBUG-127116 Change-Id: I90f6a394018d0b275c77d319f0dc6fe93707694e Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/windows/qtwindowsglobal.h | 3 +++ src/plugins/platforms/windows/qwindowscontext.cpp | 2 ++ src/plugins/platforms/windows/qwindowswindow.cpp | 12 ++++++++++++ src/plugins/platforms/windows/qwindowswindow.h | 1 + 4 files changed, 18 insertions(+) diff --git a/src/plugins/platforms/windows/qtwindowsglobal.h b/src/plugins/platforms/windows/qtwindowsglobal.h index 96a72600eb9..5b1711fb5aa 100644 --- a/src/plugins/platforms/windows/qtwindowsglobal.h +++ b/src/plugins/platforms/windows/qtwindowsglobal.h @@ -116,6 +116,7 @@ enum WindowsEventType // Simplify event types NonClientMouseEvent = NonClientEventFlag + MouseEventFlag + 1, NonClientHitTest = NonClientEventFlag + 2, NonClientCreate = NonClientEventFlag + 3, + NonClientActivate = NonClientEventFlag + 4, NonClientPointerEvent = NonClientEventFlag + PointerEventFlag + 4, KeyEvent = KeyEventFlag + 1, KeyDownEvent = KeyEventFlag + KeyDownEventFlag + 1, @@ -215,6 +216,8 @@ inline QtWindows::WindowsEventType windowsEventType(UINT message, WPARAM wParamI return QtWindows::CalculateSize; case WM_NCHITTEST: return QtWindows::NonClientHitTest; + case WM_NCACTIVATE: + return QtWindows::NonClientActivate; case WM_GETMINMAXINFO: return QtWindows::QuerySizeHints; case WM_KEYDOWN: // keyboard event diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 58514c96e1d..17eef9a95e8 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -1172,6 +1172,8 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, platformWindow->updateCustomTitlebar(); return platformWindow->handleNonClientHitTest(QPoint(msg.pt.x, msg.pt.y), result); } + case QtWindows::NonClientActivate: + return platformWindow->handleNonClientActivate(result); case QtWindows::GeometryChangingEvent: return platformWindow->handleGeometryChanging(&msg); case QtWindows::ExposeEvent: diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 55abd6dd04a..b14bc42c0a4 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -3454,6 +3454,18 @@ bool QWindowsWindow::handleNonClientHitTest(const QPoint &globalPos, LRESULT *re return false; } +bool QWindowsWindow::handleNonClientActivate(LRESULT *result) const +{ + // If this window is frameless we choose to consume the event, + // since the default logic causes the window title to appear. + // QTBUG-127116 + if (m_data.flags & Qt::FramelessWindowHint) { + *result = true; + return true; + } + return false; +} + static void _q_drawCustomTitleBarButton(QPainter& p, const QRectF& r) { QPainterPath path(QPointF(r.x(), r.y())); diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index d8a62160927..7805530681a 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -314,6 +314,7 @@ public: void releaseDC(); void getSizeHints(MINMAXINFO *mmi) const; bool handleNonClientHitTest(const QPoint &globalPos, LRESULT *result) const; + bool handleNonClientActivate(LRESULT *result) const; void updateCustomTitlebar(); #ifndef QT_NO_CURSOR