Sine Striker
2023-12-19 f874811443991759df4231b5127788af059a0df9
src/core/contexts/win32windowcontext.cpp
@@ -780,7 +780,7 @@
        g_wndProcHash->insert(hWnd, ctx);
    }
    static inline void removeManagedWindow(HWND hWnd, bool restore) {
    static inline void removeManagedWindow(HWND hWnd) {
        // Remove window handle mapping
        if (!g_wndProcHash->remove(hWnd))
            return;
@@ -789,11 +789,6 @@
        if (g_wndProcHash->empty()) {
            WindowsNativeEventFilter::uninstall();
        }
        // Restore window proc
        if (restore) {
            ::SetWindowLongPtrW(hWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(g_qtWindowProc));
        }
    }
    Win32WindowContext::Win32WindowContext() : AbstractWindowContext() {
@@ -801,7 +796,7 @@
    Win32WindowContext::~Win32WindowContext() {
        if (windowId) {
            removeManagedWindow(reinterpret_cast<HWND>(windowId), false);
            removeManagedWindow(reinterpret_cast<HWND>(windowId));
        }
    }
@@ -817,6 +812,26 @@
                return;
            }
            case RaiseWindowHook: {
                if (m_windowHandle->windowStates() & Qt::WindowMinimized)
                    m_windowHandle->showNormal();
                auto hWnd = reinterpret_cast<HWND>(windowId);
                // I have no idea what this does, but it works mostly
                // https://www.codeproject.com/Articles/1724/Some-handy-dialog-box-tricks-tips-and-workarounds
                ::AttachThreadInput(::GetWindowThreadProcessId(::GetForegroundWindow(), nullptr),
                                    ::GetCurrentThreadId(), TRUE);
                ::SetForegroundWindow(hWnd);
                ::SetFocus(hWnd);
                ::AttachThreadInput(GetWindowThreadProcessId(GetForegroundWindow(), nullptr),
                                    GetCurrentThreadId(), FALSE);
                return;
            }
            case ShowSystemMenuHook: {
                const auto &pos = *static_cast<const QPoint *>(data);
                auto hWnd = reinterpret_cast<HWND>(windowId);
@@ -829,6 +844,23 @@
                showSystemMenu2(hWnd, qpoint2point(nativeGlobalPos), false,
                                m_delegate->isHostSizeFixed(m_host));
                return;
            }
            case WindowAttributeChangedHook: {
                auto args = static_cast<void **>(data);
                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]);
                if (key == QStringLiteral("no-frame-shadow")) {
                    if (newVar.toBool()) {
                        // TODO: set off
                    } else {
                        // TODO: set on
                    }
                }
                break;
            }
            case DefaultColorsHook: {
@@ -897,11 +929,8 @@
        return getWindowFrameBorderThickness(reinterpret_cast<HWND>(windowId));
    }
    void Win32WindowContext::winIdChanged(QWindow *oldWindow, bool destroyed) {
        if (oldWindow) {
            removeManagedWindow(reinterpret_cast<HWND>(windowId), !destroyed);
        }
    void Win32WindowContext::winIdChanged(QWindow *oldWindow) {
        removeManagedWindow(reinterpret_cast<HWND>(windowId));
        if (!m_windowHandle) {
            return;
        }