Sine Striker
2023-12-21 be703385249bafd679a125efc1477ff166e2c9e2
minor tweaks
6个文件已修改
68 ■■■■■ 已修改文件
src/core/contexts/abstractwindowcontext.cpp 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/contexts/abstractwindowcontext_p.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/contexts/cocoawindowcontext.mm 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/contexts/win32windowcontext.cpp 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/windowagentbase.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/windowagentbase.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/contexts/abstractwindowcontext.cpp
@@ -25,19 +25,25 @@
        }
    }
    void AbstractWindowContext::setWindowAttribute(const QString &key, const QVariant &var) {
    bool AbstractWindowContext::setWindowAttribute(const QString &key, const QVariant &attribute) {
        auto it = m_windowAttributes.find(key);
        if (it.value() == var)
            return;
        if (it.value() == attribute)
            return true;
        auto newVar = var;
        auto newVar = attribute;
        auto oldVar = it.value();
        bool res = false;
        void *args[] = {
            &const_cast<QString &>(key),
            &newVar,
            &oldVar,
            &res,
        };
        virtual_hook(WindowAttributeChangedHook, args);
        if (res) {
            it.value() = newVar;
        }
        return res;
    }
    bool AbstractWindowContext::setHitTestVisible(const QObject *obj, bool visible) {
src/core/contexts/abstractwindowcontext_p.h
@@ -38,7 +38,7 @@
        inline WindowItemDelegate *delegate() const;
        inline QVariant windowAttribute(const QString &key) const;
        void setWindowAttribute(const QString &key, const QVariant &var);
        bool setWindowAttribute(const QString &key, const QVariant &attribute);
        inline bool isHitTestVisible(const QObject *obj) const;
        bool setHitTestVisible(const QObject *obj, bool visible);
src/core/contexts/cocoawindowcontext.mm
@@ -381,6 +381,7 @@
                const auto &key = *static_cast<const QString *>(args[0]);
                const auto &newVar = *static_cast<const QVariant *>(args[1]);
                const auto &oldVar = *static_cast<const QVariant *>(args[2]);
                auto &res = *static_cast<bool *>(args[3]);
                if (key == QStringLiteral("no-system-buttons")) {
                    if (newVar.toBool()) {
@@ -388,6 +389,7 @@
                    } else {
                        // TODO: set on
                    }
                    res = true;
                }
                return;
            }
src/core/contexts/win32windowcontext.cpp
@@ -998,6 +998,7 @@
                const auto &key = *static_cast<const QString *>(args[0]);
                const auto &newVar = *static_cast<const QVariant *>(args[1]);
                const auto &oldVar = *static_cast<const QVariant *>(args[2]);
                auto &res = *static_cast<bool *>(args[3]);
                if (!windowId)
                    return;
@@ -1021,21 +1022,27 @@
                        static constexpr const MARGINS margins = {-1, -1, -1, -1};
                        apis.pDwmExtendFrameIntoClientArea(hwnd, &margins);
                        if (isWin1122H2OrGreater()) {
                            // Use official DWM API to enable Mica, available since Windows 11 22H2 (10.0.22621).
                            // Use official DWM API to enable Mica, available since Windows 11 22H2
                            // (10.0.22621).
                            const _DWM_SYSTEMBACKDROP_TYPE backdropType = _DWMSBT_MAINWINDOW;
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE, &backdropType, sizeof(backdropType));
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE,
                                                        &backdropType, sizeof(backdropType));
                        } else {
                            // Use undocumented DWM API to enable Mica, available since Windows 11 (10.0.22000).
                            // Use undocumented DWM API to enable Mica, available since Windows 11
                            // (10.0.22000).
                            const BOOL enable = TRUE;
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_MICA_EFFECT, &enable, sizeof(enable));
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_MICA_EFFECT, &enable,
                                                        sizeof(enable));
                        }
                    } else {
                        if (isWin1122H2OrGreater()) {
                            const _DWM_SYSTEMBACKDROP_TYPE backdropType = _DWMSBT_AUTO;
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE, &backdropType, sizeof(backdropType));
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE,
                                                        &backdropType, sizeof(backdropType));
                        } else {
                            const BOOL enable = FALSE;
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_MICA_EFFECT, &enable, sizeof(enable));
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_MICA_EFFECT, &enable,
                                                        sizeof(enable));
                        }
                        static constexpr const MARGINS margins = {0, 0, 0, 0};
                        apis.pDwmExtendFrameIntoClientArea(hwnd, &margins);
@@ -1049,30 +1056,39 @@
                        // to see the blurred window background.
                        static constexpr const MARGINS margins = {-1, -1, -1, -1};
                        apis.pDwmExtendFrameIntoClientArea(hwnd, &margins);
                        // Use official DWM API to enable Mica Alt, available since Windows 11 22H2 (10.0.22621).
                        // Use official DWM API to enable Mica Alt, available since Windows 11 22H2
                        // (10.0.22621).
                        const _DWM_SYSTEMBACKDROP_TYPE backdropType = _DWMSBT_TABBEDWINDOW;
                        apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE, &backdropType, sizeof(backdropType));
                        apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE, &backdropType,
                                                    sizeof(backdropType));
                    } else {
                        const _DWM_SYSTEMBACKDROP_TYPE backdropType = _DWMSBT_AUTO;
                        apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE, &backdropType, sizeof(backdropType));
                        apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE, &backdropType,
                                                    sizeof(backdropType));
                        static constexpr const MARGINS margins = {0, 0, 0, 0};
                        apis.pDwmExtendFrameIntoClientArea(hwnd, &margins);
                    }
                    res = true;
                } else if (key == QStringLiteral("acrylic-material")) {
                    if (newVar.toBool()) {
                    if (newVar.type() == QVariant::Color) {
                        // We need to extend the window frame into the whole client area to be able
                        // to see the blurred window background.
                        static constexpr const MARGINS margins = {-1, -1, -1, -1};
                        apis.pDwmExtendFrameIntoClientArea(hwnd, &margins);
                        if (isWin11OrGreater()) {
                            const _DWM_SYSTEMBACKDROP_TYPE backdropType = _DWMSBT_TRANSIENTWINDOW;
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE, &backdropType, sizeof(backdropType));
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE,
                                                        &backdropType, sizeof(backdropType));
                        } else {
                            auto gradientColor = newVar.value<QColor>();
                            ACCENT_POLICY policy{};
                            policy.dwAccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND;
                            policy.dwAccentFlags = ACCENT_ENABLE_ACRYLIC_WITH_LUMINOSITY;
                            // This API expects the #AABBGGRR format.
                            //policy.dwGradientColor = DWORD(qRgba(gradientColor.blue(), gradientColor.green(), gradientColor.red(), gradientColor.alpha()));
                            policy.dwGradientColor =
                                DWORD(qRgba(gradientColor.blue(), gradientColor.green(),
                                            gradientColor.red(), gradientColor.alpha()));
                            WINDOWCOMPOSITIONATTRIBDATA wcad{};
                            wcad.Attrib = WCA_ACCENT_POLICY;
                            wcad.pvData = &policy;
@@ -1082,7 +1098,8 @@
                    } else {
                        if (isWin11OrGreater()) {
                            const _DWM_SYSTEMBACKDROP_TYPE backdropType = _DWMSBT_AUTO;
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE, &backdropType, sizeof(backdropType));
                            apis.pDwmSetWindowAttribute(hwnd, _DWMWA_SYSTEMBACKDROP_TYPE,
                                                        &backdropType, sizeof(backdropType));
                        } else {
                            ACCENT_POLICY policy{};
                            policy.dwAccentState = ACCENT_DISABLED;
@@ -1096,6 +1113,7 @@
                        static constexpr const MARGINS margins = {0, 0, 0, 0};
                        apis.pDwmExtendFrameIntoClientArea(hwnd, &margins);
                    }
                    res = true;
                }
                return;
            }
src/core/windowagentbase.cpp
@@ -55,9 +55,9 @@
        return d->context->windowAttribute(key);
    }
    void WindowAgentBase::setWindowAttribute(const QString &key, const QVariant &var) {
    bool WindowAgentBase::setWindowAttribute(const QString &key, const QVariant &attribute) {
        Q_D(WindowAgentBase);
        d->context->setWindowAttribute(key, var);
        return d->context->setWindowAttribute(key, attribute);
    }
    void WindowAgentBase::showSystemMenu(const QPoint &pos) {
src/core/windowagentbase.h
@@ -29,7 +29,7 @@
        Q_ENUM(SystemButton)
        QVariant windowAttribute(const QString &key) const;
        void setWindowAttribute(const QString &key, const QVariant &var);
        bool setWindowAttribute(const QString &key, const QVariant &attribute);
    public Q_SLOTS:
        void showSystemMenu(const QPoint &pos); // Only available on Windows now