| | |
| | | // Original Qt window proc function |
| | | static WNDPROC g_qtWindowProc = nullptr; |
| | | |
| | | static inline bool |
| | | #if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) |
| | | constexpr |
| | | #endif |
| | | |
| | | isSystemBorderEnabled() { |
| | | return |
| | | #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) |
| | | isWin10OrGreater() |
| | | #else |
| | | false |
| | | #endif |
| | | ; |
| | | } |
| | | |
| | | static inline void triggerFrameChange(HWND hwnd) { |
| | | ::SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, |
| | | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | |
| | |
| | | static inline void addManagedWindow(QWindow *window, HWND hWnd, Win32WindowContext *ctx) { |
| | | const auto margins = [hWnd]() -> QMargins { |
| | | const auto titleBarHeight = int(getTitleBarHeight(hWnd)); |
| | | if (isWin10OrGreater()) { |
| | | if (isSystemBorderEnabled()) { |
| | | return {0, -titleBarHeight, 0, 0}; |
| | | } else { |
| | | const auto frameSize = int(getResizeBorderThickness(hWnd)); |
| | |
| | | } |
| | | |
| | | bool Win32WindowContext::needBorderPainter() const { |
| | | return isWin10OrGreater() && !isWin11OrGreater(); |
| | | Q_UNUSED(this) |
| | | return isSystemBorderEnabled() && !isWin11OrGreater(); |
| | | } |
| | | |
| | | int Win32WindowContext::borderThickness() const { |
| | |
| | | auto winId = m_windowHandle->winId(); |
| | | auto hWnd = reinterpret_cast<HWND>(winId); |
| | | |
| | | #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) |
| | | if (!isWin10OrGreater()) { |
| | | if (!isSystemBorderEnabled()) { |
| | | static constexpr const MARGINS margins = {1, 1, 1, 1}; |
| | | DynamicApis::instance().pDwmExtendFrameIntoClientArea(hWnd, &margins); |
| | | } |
| | | #else |
| | | { |
| | | static const MARGINS margins = |
| | | isWin10OrGreater() ? MARGINS{0, 0, 0, 0} : MARGINS{1, 1, 1, 1}; |
| | | DynamicApis::instance().pDwmExtendFrameIntoClientArea(hWnd, &margins); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | { |
| | | auto style = ::GetWindowLongPtrW(hWnd, GWL_STYLE); |
| | |
| | | const DynamicApis &apis = DynamicApis::instance(); |
| | | static constexpr const MARGINS extendMargins = {-1, -1, -1, -1}; |
| | | static const auto defaultMargins = |
| | | isWin10OrGreater() ? MARGINS{0, 0, 0, 0} : MARGINS{1, 1, 1, 1}; |
| | | isSystemBorderEnabled() ? MARGINS{0, 0, 0, 0} : MARGINS{1, 1, 1, 1}; |
| | | if (key == QStringLiteral("mica")) { |
| | | if (!isWin11OrGreater()) { |
| | | return false; |
| | |
| | | int frameSize = getResizeBorderThickness(hWnd); |
| | | bool isTop = (nativeLocalPos.y < frameSize); |
| | | |
| | | #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) |
| | | if (isWin10OrGreater()) { |
| | | if (isSystemBorderEnabled()) { |
| | | // This will handle the left, right and bottom parts of the frame |
| | | // because we didn't change them. |
| | | LRESULT originalHitTestResult = ::DefWindowProcW(hWnd, WM_NCHITTEST, 0, lParam); |
| | |
| | | } |
| | | *result = HTCLIENT; |
| | | return true; |
| | | } else |
| | | #endif |
| | | { |
| | | } else { |
| | | if (full) { |
| | | *result = HTCLIENT; |
| | | return true; |
| | |
| | | break; |
| | | } |
| | | |
| | | if (!isWin10OrGreater()) { |
| | | if (!isSystemBorderEnabled()) { |
| | | switch (message) { |
| | | case WM_NCUAHDRAWCAPTION: |
| | | case WM_NCUAHDRAWFRAME: { |
| | |
| | | // and align it with the upper-left corner of our new client area". |
| | | const auto clientRect = wParam ? &(reinterpret_cast<LPNCCALCSIZE_PARAMS>(lParam))->rgrc[0] |
| | | : reinterpret_cast<LPRECT>(lParam); |
| | | #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) |
| | | if (isWin10OrGreater()) { |
| | | if (isSystemBorderEnabled()) { |
| | | // Store the original top margin before the default window procedure applies the |
| | | // default frame. |
| | | const LONG originalTop = clientRect->top; |
| | |
| | | // technique to bring the top border back. |
| | | clientRect->top = originalTop; |
| | | } |
| | | #endif |
| | | |
| | | const bool max = IsMaximized(hWnd); |
| | | const bool full = isFullScreen(hWnd); |
| | | // We don't need this correction when we're fullscreen. We will |
| | |
| | | // a window when it's maximized unless you restore it). |
| | | const quint32 frameSize = getResizeBorderThickness(hWnd); |
| | | clientRect->top += frameSize; |
| | | |
| | | #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) |
| | | if (!isWin10OrGreater()) { |
| | | #endif |
| | | if (!isSystemBorderEnabled()) { |
| | | clientRect->bottom -= frameSize; |
| | | clientRect->left += frameSize; |
| | | clientRect->right -= frameSize; |
| | | #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) |
| | | } |
| | | #endif |
| | | } |
| | | // Attempt to detect if there's an autohide taskbar, and if |
| | | // there is, reduce our size a bit on the side with the taskbar, |
| | |
| | | const auto getNativeGlobalPosFromKeyboard = [hWnd]() -> POINT { |
| | | const bool maxOrFull = IsMaximized(hWnd) || isFullScreen(hWnd); |
| | | const quint32 frameSize = getResizeBorderThickness(hWnd); |
| | | const quint32 horizontalOffset = ((maxOrFull || !isWin10OrGreater()) ? 0 : frameSize); |
| | | const quint32 horizontalOffset = |
| | | ((maxOrFull || !isSystemBorderEnabled()) ? 0 : frameSize); |
| | | const auto verticalOffset = [hWnd, maxOrFull, frameSize]() -> quint32 { |
| | | const quint32 titleBarHeight = getTitleBarHeight(hWnd); |
| | | if (!isWin10OrGreater()) { |
| | | if (!isSystemBorderEnabled()) { |
| | | return titleBarHeight; |
| | | } |
| | | if (isWin11OrGreater()) { |