From 36866730cea7d3868fb49de88ce2d2844beb885a Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Thu, 12 Jan 2023 18:31:14 +0000 Subject: Browser: Implement zoom :^) Largely based on the Ladybird implementation in 0cc151b. --- Userland/Applications/Browser/BrowserWindow.cpp | 19 ++++++++++++++ .../Libraries/LibWebView/OutOfProcessWebView.cpp | 29 ++++++++++++++++++++++ .../Libraries/LibWebView/OutOfProcessWebView.h | 12 +++++++++ 3 files changed, 60 insertions(+) (limited to 'Userland') diff --git a/Userland/Applications/Browser/BrowserWindow.cpp b/Userland/Applications/Browser/BrowserWindow.cpp index 82ae620b72..298287b320 100644 --- a/Userland/Applications/Browser/BrowserWindow.cpp +++ b/Userland/Applications/Browser/BrowserWindow.cpp @@ -180,6 +180,25 @@ void BrowserWindow::build_menus() view_menu.add_action(WindowActions::the().show_bookmarks_bar_action()); view_menu.add_action(WindowActions::the().vertical_tabs_action()); view_menu.add_separator(); + view_menu.add_action(GUI::CommonActions::make_zoom_in_action( + [this](auto&) { + auto& tab = active_tab(); + tab.view().zoom_in(); + }, + this)); + view_menu.add_action(GUI::CommonActions::make_zoom_out_action( + [this](auto&) { + auto& tab = active_tab(); + tab.view().zoom_out(); + }, + this)); + view_menu.add_action(GUI::CommonActions::make_reset_zoom_action( + [this](auto&) { + auto& tab = active_tab(); + tab.view().reset_zoom(); + }, + this)); + view_menu.add_separator(); view_menu.add_action(GUI::CommonActions::make_fullscreen_action( [this](auto&) { auto& tab = active_tab(); diff --git a/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp b/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp index d9c5a89cd3..f8560e0368 100644 --- a/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp +++ b/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp @@ -159,6 +159,35 @@ void OutOfProcessWebView::handle_resize() request_repaint(); } +void OutOfProcessWebView::zoom_in() +{ + if (m_zoom_level >= ZOOM_MAX_LEVEL) + return; + m_zoom_level += ZOOM_STEP; + update_zoom(); +} + +void OutOfProcessWebView::zoom_out() +{ + if (m_zoom_level <= ZOOM_MIN_LEVEL) + return; + m_zoom_level -= ZOOM_STEP; + update_zoom(); +} + +void OutOfProcessWebView::reset_zoom() +{ + m_zoom_level = 1.0f; + update_zoom(); +} + +void OutOfProcessWebView::update_zoom() +{ + client().async_set_device_pixels_per_css_pixel(m_device_pixel_ratio * m_zoom_level); + // FIXME: Refactor this into separate update_viewport_rect() + request_repaint() like in Ladybird + handle_resize(); +} + void OutOfProcessWebView::keydown_event(GUI::KeyEvent& event) { enqueue_input_event(event); diff --git a/Userland/Libraries/LibWebView/OutOfProcessWebView.h b/Userland/Libraries/LibWebView/OutOfProcessWebView.h index 935af25e89..73bc7a66ec 100644 --- a/Userland/Libraries/LibWebView/OutOfProcessWebView.h +++ b/Userland/Libraries/LibWebView/OutOfProcessWebView.h @@ -77,6 +77,10 @@ public: void set_system_visibility_state(bool visible); + void zoom_in(); + void zoom_out(); + void reset_zoom(); + Gfx::ShareableBitmap take_screenshot() const; Gfx::ShareableBitmap take_document_screenshot(); @@ -121,6 +125,10 @@ public: Function on_forward_button; private: + static constexpr auto ZOOM_MIN_LEVEL = 0.3f; + static constexpr auto ZOOM_MAX_LEVEL = 5.0f; + static constexpr auto ZOOM_STEP = 0.1f; + OutOfProcessWebView(); // ^Widget @@ -197,6 +205,7 @@ private: void request_repaint(); void handle_resize(); + void update_zoom(); void create_client(); WebContentClient& client(); @@ -231,6 +240,9 @@ private: Queue m_pending_input_events; bool m_content_scales_to_viewport { false }; + + float m_zoom_level { 1.0 }; + float m_device_pixel_ratio { 1.0 }; }; } -- cgit v1.2.3