Sine Striker
2023-12-27 b2471667e1377df998ec50a6f952f3d164e73e3d
src/core/windowagentbase.cpp
@@ -5,9 +5,9 @@
#include "qwkglobal_p.h"
#if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT)
#if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT)
#  include "win32windowcontext_p.h"
#elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT)
#elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT)
#  include "cocoawindowcontext_p.h"
#else
#  include "qtwindowcontext_p.h"
@@ -16,6 +16,20 @@
Q_LOGGING_CATEGORY(qWindowKitLog, "qwindowkit")
namespace QWK {
    /*!
        \namespace QWK
        \brief QWindowKit namespace
    */
    /*!
        \class WindowAgentBase
        \brief WindowAgentBase is the base class of the specifiy window agent for QtWidgets and
        QtQuick.
        It processes some system events and the implements of frameless logic, and provides some
        common methods for derived classes to call.
    */
    WindowAgentBasePrivate::WindowContextFactoryMethod
        WindowAgentBasePrivate::windowContextFactoryMethod = nullptr;
@@ -33,9 +47,9 @@
            return windowContextFactoryMethod();
        }
#if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT)
#if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT)
        return new Win32WindowContext();
#elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT)
#elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT)
        return new CocoaWindowContext();
#else
        return new QtWindowContext();
@@ -48,33 +62,74 @@
        context.reset(ctx);
    }
    /*!
        Destructor.
    */
    WindowAgentBase::~WindowAgentBase() = default;
    /*!
        Returns the window attribute value.
        \sa setWindowAttribute()
    */
    QVariant WindowAgentBase::windowAttribute(const QString &key) const {
        Q_D(const WindowAgentBase);
        return d->context->windowAttribute(key);
    }
    void WindowAgentBase::setWindowAttribute(const QString &key, const QVariant &var) {
    /*!
        Sets the platform-related attribute for the window.
        Available attributes:
        On Windows,
            \li \c acrylic-material: Specify a boolean value to enable or disable acrylic material,
                    this attribute is only available on Windows 11.
            \li \c mica: Specify a boolean value to enable or disable mica material,
                    this attribute is only available on Windows 11.
            \li \c mica-alt: Specify a boolean value to enable or disable mica-alt material,
                    this attribute is only available on Windows 11.
            \li \c dark-mode: Specify a boolean value to enable or disable the dark mode, it is
                    enabled by default on Windows 10 if the system borders config is enabled.
            \li \c extra-margins: Specify a margin value to change the \c dwm extended area
                    geometry, you shouldn't change this attribute because it may break the
                    internal state.
        On macOS,
            \li \c no-system-buttons: Specify a boolean value to set the system buttons' visibility.
    */
    bool WindowAgentBase::setWindowAttribute(const QString &key, const QVariant &attribute) {
        Q_D(WindowAgentBase);
        d->context->setWindowAttribute(key, var);
        return d->context->setWindowAttribute(key, attribute);
    }
    /*!
        Shows the system menu, it's only implemented on Windows.
    */
    void WindowAgentBase::showSystemMenu(const QPoint &pos) {
        Q_D(WindowAgentBase);
        d->context->showSystemMenu(pos);
    }
    /*!
        Makes the window show in center of the current screen.
    */
    void WindowAgentBase::centralize() {
        Q_D(WindowAgentBase);
        d->context->virtual_hook(AbstractWindowContext::CentralizeHook, nullptr);
    }
    /*!
        Brings the window to top.
    */
    void WindowAgentBase::raise() {
        Q_D(WindowAgentBase);
        d->context->virtual_hook(AbstractWindowContext::RaiseWindowHook, nullptr);
    }
    /*!
        \internal
    */
    WindowAgentBase::WindowAgentBase(WindowAgentBasePrivate &d, QObject *parent)
        : QObject(parent), d_ptr(&d) {
        d.q_ptr = this;