| | |
| | | // Copyright (C) 2023-2024 Stdware Collections (https://www.github.com/stdware) |
| | | // Copyright (C) 2021-2023 wangwenx190 (Yuhang Zhao) |
| | | // SPDX-License-Identifier: Apache-2.0 |
| | | |
| | | #ifndef WINDOWS10BORDERHANDLER_P_H |
| | | #define WINDOWS10BORDERHANDLER_P_H |
| | | |
| | | // |
| | | // W A R N I N G !!! |
| | | // ----------------- |
| | | // |
| | | // This file is not part of the QWindowKit API. It is used purely as an |
| | | // implementation detail. This header file may change from version to |
| | | // version without notice, or may even be removed. |
| | | // |
| | | |
| | | #include <QtGui/QWindow> |
| | | #include <QtGui/QMouseEvent> |
| | |
| | | } |
| | | |
| | | inline void setupNecessaryAttributes() { |
| | | // https://github.com/microsoft/terminal/blob/71a6f26e6ece656084e87de1a528c4a8072eeabd/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp#L940 |
| | | // Must extend top frame to client area |
| | | static QVariant defaultMargins = QVariant::fromValue(QMargins(0, 1, 0, 0)); |
| | | ctx->setWindowAttribute(QStringLiteral("extra-margins"), defaultMargins); |
| | | if (!isWin11OrGreater()) { |
| | | // https://github.com/microsoft/terminal/blob/71a6f26e6ece656084e87de1a528c4a8072eeabd/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp#L940 |
| | | // Must extend top frame to client area |
| | | static QVariant defaultMargins = QVariant::fromValue(QMargins(0, 1, 0, 0)); |
| | | ctx->setWindowAttribute(QStringLiteral("extra-margins"), defaultMargins); |
| | | } |
| | | |
| | | // Enable dark mode by default, otherwise the system borders are white |
| | | ctx->setWindowAttribute(QStringLiteral("dark-mode"), true); |
| | |
| | | (Qt::WindowMinimized | Qt::WindowMaximized | Qt::WindowFullScreen)); |
| | | } |
| | | |
| | | inline void drawBorder() { |
| | | ctx->virtual_hook(AbstractWindowContext::DrawWindows10BorderHook2, nullptr); |
| | | inline void drawBorderEmulated(QPainter *painter, const QRect &rect) { |
| | | QRegion region(rect); |
| | | void *args[] = { |
| | | painter, |
| | | const_cast<QRect *>(&rect), |
| | | ®ion, |
| | | }; |
| | | ctx->virtual_hook(AbstractWindowContext::DrawWindows10BorderHook_Emulated, args); |
| | | } |
| | | |
| | | inline void drawBorderNative() { |
| | | ctx->virtual_hook(AbstractWindowContext::DrawWindows10BorderHook_Native, nullptr); |
| | | } |
| | | |
| | | inline int borderThickness() const { |
| | |
| | | } |
| | | |
| | | inline void updateExtraMargins(bool windowActive) { |
| | | if (isWin11OrGreater()) { |
| | | return; |
| | | } |
| | | |
| | | // ### FIXME: transparent seam |
| | | if (windowActive) { |
| | | // Restore margins when the window is active |
| | | static QVariant defaultMargins = QVariant::fromValue(QMargins(0, 1, 0, 0)); |
| | |
| | | break; |
| | | } |
| | | |
| | | case WM_THEMECHANGED: |
| | | case WM_SYSCOLORCHANGE: |
| | | case WM_DWMCOLORIZATIONCOLORCHANGED: { |
| | | // If we do not refresh this property, the native border will turn white |
| | | // permanently (like the dark mode is turned off) after the user changes |
| | | // the accent color in system personalization settings. |
| | | // So we need this ugly hack to re-apply dark mode to get rid of this |
| | | // strange Windows bug. |
| | | if (ctx->windowAttribute(QStringLiteral("dark-mode")).toBool()) { |
| | | ctx->setWindowAttribute(QStringLiteral("dark-mode"), true); |
| | | } |
| | | break; |
| | | } |
| | | |
| | | default: |
| | | break; |
| | | } |