SineStriker
2023-12-22 a5d13e19dd7f6037e10b649c49805922ae5e0fa6
src/core/contexts/abstractwindowcontext.cpp
@@ -3,10 +3,32 @@
#include <QtGui/QPen>
#include <QtGui/QPainter>
#include <QtGui/QScreen>
#include <memory>
#include "qwkglobal_p.h"
namespace QWK {
    class WinIdChangeEventFilter : public QObject {
    public:
        explicit WinIdChangeEventFilter(QObject *widget, AbstractWindowContext *ctx,
                                        QObject *parent = nullptr)
            : QObject(parent), ctx(ctx) {
            widget->installEventFilter(this);
        }
    protected:
        bool eventFilter(QObject *obj, QEvent *event) override {
            Q_UNUSED(obj)
            if (event->type() == QEvent::WinIdChange) {
                ctx->notifyWinIdChange();
            }
            return false;
        }
    protected:
        AbstractWindowContext *ctx;
    };
    AbstractWindowContext::AbstractWindowContext() = default;
@@ -18,6 +40,7 @@
        }
        m_host = host;
        m_delegate.reset(delegate);
        m_winIdChangeEventFilter = std::make_unique<WinIdChangeEventFilter>(host, this);
        m_windowHandle = m_delegate->hostWindow(m_host);
        if (m_windowHandle) {
@@ -27,23 +50,29 @@
    bool AbstractWindowContext::setWindowAttribute(const QString &key, const QVariant &attribute) {
        auto it = m_windowAttributes.find(key);
        if (it == m_windowAttributes.end()) {
            if (!attribute.isValid()) {
                return true;
            }
            if (m_windowHandle && !windowAttributeChanged(key, attribute, {})) {
                return false;
            }
            m_windowAttributes.insert(key, attribute);
            return true;
        }
        if (it.value() == attribute)
            return true;
        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;
        if (m_windowHandle && !windowAttributeChanged(key, attribute, it.value())) {
            return false;
        }
        return res;
        if (attribute.isValid()) {
            it.value() = attribute;
        } else {
            m_windowAttributes.erase(it);
        }
        return true;
    }
    bool AbstractWindowContext::setHitTestVisible(const QObject *obj, bool visible) {
@@ -79,6 +108,15 @@
        if (m_titleBar == item) {
            return false;
        }
        if (m_titleBar) {
            // Since the title bar is changed, all items inside it should be dereferenced right away
            for (auto &button : m_systemButtons) {
                button = nullptr;
            }
            m_hitTestVisibleItems.clear();
        }
        m_titleBar = item;
        return true;
    }
@@ -208,6 +246,24 @@
        if (oldWindow == m_windowHandle)
            return;
        winIdChanged();
        if (m_windowHandle) {
            // Refresh window attributes
            auto attributes = m_windowAttributes;
            m_windowAttributes.clear();
            for (auto it = attributes.begin(); it != attributes.end(); ++it) {
                if (!windowAttributeChanged(it.key(), it.value(), {})) {
                    continue;
                }
                m_windowAttributes.insert(it.key(), it.value());
            }
        }
    }
    bool AbstractWindowContext::windowAttributeChanged(const QString &key,
                                                       const QVariant &attribute,
                                                       const QVariant &oldAttribute) {
        return false;
    }
}