From 325e3c7bc646765ea16b603060bfa3ea47624dde Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 1 Nov 2022 15:43:53 -0400 Subject: [PATCH] Browser: Inform WebView processes of the browser window's position/size --- .../Applications/Browser/BrowserWindow.cpp | 32 +++++++++++++++++++ Userland/Applications/Browser/BrowserWindow.h | 5 +++ Userland/Applications/Browser/Tab.cpp | 10 ++++++ Userland/Applications/Browser/Tab.h | 3 ++ Userland/Applications/Browser/main.cpp | 3 ++ 5 files changed, 53 insertions(+) diff --git a/Userland/Applications/Browser/BrowserWindow.cpp b/Userland/Applications/Browser/BrowserWindow.cpp index b8ad8d549e..e5b69d7d36 100644 --- a/Userland/Applications/Browser/BrowserWindow.cpp +++ b/Userland/Applications/Browser/BrowserWindow.cpp @@ -682,4 +682,36 @@ void BrowserWindow::config_bool_did_change(String const& domain, String const& g // NOTE: CloseDownloadWidgetOnFinish is read each time in DownloadWindow } +void BrowserWindow::broadcast_window_position(Gfx::IntPoint const& position) +{ + tab_widget().for_each_child_of_type([&](auto& tab) { + tab.window_position_changed(position); + return IterationDecision::Continue; + }); +} + +void BrowserWindow::broadcast_window_size(Gfx::IntSize const& size) +{ + tab_widget().for_each_child_of_type([&](auto& tab) { + tab.window_size_changed(size); + return IterationDecision::Continue; + }); +} + +void BrowserWindow::event(Core::Event& event) +{ + switch (event.type()) { + case GUI::Event::Move: + broadcast_window_position(static_cast(event).position()); + break; + case GUI::Event::Resize: + broadcast_window_size(static_cast(event).size()); + break; + default: + break; + } + + Window::event(event); +} + } diff --git a/Userland/Applications/Browser/BrowserWindow.h b/Userland/Applications/Browser/BrowserWindow.h index fe6e9e3efe..e6bd26fcec 100644 --- a/Userland/Applications/Browser/BrowserWindow.h +++ b/Userland/Applications/Browser/BrowserWindow.h @@ -43,6 +43,9 @@ public: void content_filters_changed(); void proxy_mappings_changed(); + void broadcast_window_position(Gfx::IntPoint const&); + void broadcast_window_size(Gfx::IntSize const&); + private: explicit BrowserWindow(CookieJar&, URL); @@ -53,6 +56,8 @@ private: virtual void config_string_did_change(String const& domain, String const& group, String const& key, String const& value) override; virtual void config_bool_did_change(String const& domain, String const& group, String const& key, bool value) override; + virtual void event(Core::Event&) override; + RefPtr m_go_back_action; RefPtr m_go_forward_action; RefPtr m_go_home_action; diff --git a/Userland/Applications/Browser/Tab.cpp b/Userland/Applications/Browser/Tab.cpp index b149d5fa47..5513756892 100644 --- a/Userland/Applications/Browser/Tab.cpp +++ b/Userland/Applications/Browser/Tab.cpp @@ -545,6 +545,16 @@ void Tab::action_left(GUI::Action&) m_statusbar->set_override_text({}); } +void Tab::window_position_changed(Gfx::IntPoint const& position) +{ + m_web_content_view->set_window_position(position); +} + +void Tab::window_size_changed(Gfx::IntSize const& size) +{ + m_web_content_view->set_window_size(size); +} + BrowserWindow const& Tab::window() const { return static_cast(*Widget::window()); diff --git a/Userland/Applications/Browser/Tab.h b/Userland/Applications/Browser/Tab.h index 103b0acf95..cc2664879f 100644 --- a/Userland/Applications/Browser/Tab.h +++ b/Userland/Applications/Browser/Tab.h @@ -57,6 +57,9 @@ public: void action_entered(GUI::Action&); void action_left(GUI::Action&); + void window_position_changed(Gfx::IntPoint const&); + void window_size_changed(Gfx::IntSize const&); + Function on_title_change; Function on_tab_open_request; Function on_tab_close_request; diff --git a/Userland/Applications/Browser/main.cpp b/Userland/Applications/Browser/main.cpp index 7efdbde658..2d6d4e6678 100644 --- a/Userland/Applications/Browser/main.cpp +++ b/Userland/Applications/Browser/main.cpp @@ -190,5 +190,8 @@ ErrorOr serenity_main(Main::Arguments arguments) window->show(); + window->broadcast_window_position(window->position()); + window->broadcast_window_size(window->size()); + return app->exec(); }