From f40dc661b3f5235c11829dc5e7069fe79766984b Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 24 Jun 2022 20:33:02 +0400 Subject: [PATCH] Revert "Simplify Windows native event filter." With that commit the window frame on Windows 7 is still bugged :( --- ui/platform/ui_platform_window.cpp | 7 --- ui/platform/ui_platform_window.h | 5 -- ui/platform/win/ui_window_win.cpp | 79 ++++++++++++++++++++++-------- ui/platform/win/ui_window_win.h | 9 ++-- ui/widgets/rp_window.cpp | 15 ------ ui/widgets/rp_window.h | 8 --- 6 files changed, 63 insertions(+), 60 deletions(-) diff --git a/ui/platform/ui_platform_window.cpp b/ui/platform/ui_platform_window.cpp index b11831f..2ce63a2 100644 --- a/ui/platform/ui_platform_window.cpp +++ b/ui/platform/ui_platform_window.cpp @@ -70,13 +70,6 @@ rpl::producer BasicWindowHelper::systemButtonDown() const { return rpl::never(); } -bool BasicWindowHelper::nativeEvent( - const QByteArray &eventType, - void *message, - base::NativeEventResult *result) { - return false; -} - void BasicWindowHelper::setTitle(const QString &title) { _window->setWindowTitle(title); } diff --git a/ui/platform/ui_platform_window.h b/ui/platform/ui_platform_window.h index eadcbca..e34f1d7 100644 --- a/ui/platform/ui_platform_window.h +++ b/ui/platform/ui_platform_window.h @@ -8,7 +8,6 @@ #include "base/flags.h" #include "base/object_ptr.h" -#include "base/qt/qt_common_adapters.h" #include "ui/round_rect.h" namespace style { @@ -49,10 +48,6 @@ public: -> rpl::producer; [[nodiscard]] virtual auto systemButtonDown() const -> rpl::producer; - [[nodiscard]] virtual bool nativeEvent( - const QByteArray &eventType, - void *message, - base::NativeEventResult *result); virtual void setTitle(const QString &title); virtual void setTitleStyle(const style::WindowTitle &st); virtual void setNativeFrame(bool enabled); diff --git a/ui/platform/win/ui_window_win.cpp b/ui/platform/win/ui_window_win.cpp index 9357993..95957c0 100644 --- a/ui/platform/win/ui_window_win.cpp +++ b/ui/platform/win/ui_window_win.cpp @@ -17,6 +17,7 @@ #include "styles/palette.h" #include "styles/style_widgets.h" +#include #include #include #include @@ -128,6 +129,50 @@ void FixAeroSnap(HWND handle) { } // namespace +class WindowHelper::NativeFilter final : public QAbstractNativeEventFilter { +public: + void registerWindow(HWND handle, not_null helper); + void unregisterWindow(HWND handle); + + bool nativeEventFilter( + const QByteArray &eventType, + void *message, + long *result) override; + +private: + base::flat_map> _windowByHandle; + +}; + +void WindowHelper::NativeFilter::registerWindow( + HWND handle, + not_null helper) { + _windowByHandle.emplace(handle, helper); +} + +void WindowHelper::NativeFilter::unregisterWindow(HWND handle) { + _windowByHandle.remove(handle); +} + +bool WindowHelper::NativeFilter::nativeEventFilter( + const QByteArray &eventType, + void *message, + long *result) { + auto filtered = false; + const auto msg = static_cast(message); + const auto i = _windowByHandle.find(msg->hwnd); + if (i != end(_windowByHandle)) { + base::Integration::Instance().enterFromEventLoop([&] { + filtered = i->second->handleNativeEvent( + msg->message, + msg->wParam, + msg->lParam, + reinterpret_cast(result)); + }); + } + return filtered; +} + WindowHelper::WindowHelper(not_null window) : BasicWindowHelper(window) , _handle(ResolveWindowHandle(window)) @@ -141,6 +186,7 @@ WindowHelper::WindowHelper(not_null window) } WindowHelper::~WindowHelper() { + GetNativeFilter()->unregisterWindow(_handle); } void WindowHelper::initInWindow(not_null window) { @@ -272,6 +318,7 @@ rpl::producer WindowHelper::systemButtonDown() const { void WindowHelper::init() { _title->show(); + GetNativeFilter()->registerWindow(_handle, this); style::PaletteChanged( ) | rpl::start_with_next([=] { @@ -321,26 +368,6 @@ void WindowHelper::init() { initialShadowUpdate(); } -bool WindowHelper::nativeEvent( - const QByteArray &eventType, - void *message, - base::NativeEventResult *result) { - const auto msg = static_cast(message); - auto lresult = LRESULT(*result); - const auto guard = gsl::finally([&] { - *result = base::NativeEventResult(lresult); - }); - auto filtered = false; - base::Integration::Instance().enterFromEventLoop([&] { - filtered = handleNativeEvent( - msg->message, - msg->wParam, - msg->lParam, - &lresult); - }); - return filtered; -} - bool WindowHelper::handleNativeEvent( UINT msg, WPARAM wParam, @@ -762,6 +789,18 @@ void WindowHelper::fixMaximizedWindow() { } } +not_null WindowHelper::GetNativeFilter() { + Expects(QCoreApplication::instance() != nullptr); + + static const auto GlobalFilter = [&] { + const auto application = QCoreApplication::instance(); + const auto filter = Ui::CreateChild(application); + application->installNativeEventFilter(filter); + return filter; + }(); + return GlobalFilter; +} + HWND GetWindowHandle(not_null widget) { const auto toplevel = widget->window(); toplevel->createWinId(); diff --git a/ui/platform/win/ui_window_win.h b/ui/platform/win/ui_window_win.h index eada67c..d3ec58d 100644 --- a/ui/platform/win/ui_window_win.h +++ b/ui/platform/win/ui_window_win.h @@ -44,12 +44,10 @@ public: [[nodiscard]] auto systemButtonDown() const -> rpl::producer override; - [[nodiscard]] bool nativeEvent( - const QByteArray &eventType, - void *message, - base::NativeEventResult *result) override; - private: + class NativeFilter; + friend class NativeFilter; + void init(); void updateMargins(); void updateWindowFrameColors(); @@ -72,6 +70,7 @@ private: [[nodiscard]] HitTestResult systemButtonHitTest(int result) const; [[nodiscard]] int titleHeight() const; + static not_null GetNativeFilter(); const HWND _handle = nullptr; const not_null _title; diff --git a/ui/widgets/rp_window.cpp b/ui/widgets/rp_window.cpp index f1dc292..d1c38a6 100644 --- a/ui/widgets/rp_window.cpp +++ b/ui/widgets/rp_window.cpp @@ -17,8 +17,6 @@ RpWindow::RpWindow(QWidget *parent) _helper->initInWindow(this); hide(); - - _initialized = true; } RpWindow::~RpWindow() = default; @@ -101,17 +99,4 @@ void RpWindow::setBodyTitleArea( _helper->setBodyTitleArea(std::move(testMethod)); } -bool RpWindow::nativeEvent( - const QByteArray &eventType, - void *message, - base::NativeEventResult *result) { - if (_initialized && _helper->nativeEvent( - eventType, - message, - result)) { - return true; - } - return RpWidget::nativeEvent(eventType, message, result); -} - } // namespace Ui diff --git a/ui/widgets/rp_window.h b/ui/widgets/rp_window.h index 77311fc..04b4d99 100644 --- a/ui/widgets/rp_window.h +++ b/ui/widgets/rp_window.h @@ -8,7 +8,6 @@ #include "ui/rp_widget.h" #include "base/flags.h" -#include "base/qt/qt_common_adapters.h" namespace style { struct WindowTitle; @@ -68,14 +67,7 @@ public: void close(); void setBodyTitleArea(Fn testMethod); -protected: - bool nativeEvent( - const QByteArray &eventType, - void *message, - base::NativeEventResult *result) override; - private: - bool _initialized = false; const std::unique_ptr _helper; };