summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2023-01-12 18:31:14 +0000
committerLinus Groh <mail@linusgroh.de>2023-01-12 18:52:32 +0000
commit36866730cea7d3868fb49de88ce2d2844beb885a (patch)
tree890d8f5bd6c6cf783a682090db3fc9e05a9d12dc /Userland
parent966d808135c03d16b1be65df7ca028ae7813476d (diff)
downloadserenity-36866730cea7d3868fb49de88ce2d2844beb885a.zip
Browser: Implement zoom :^)
Largely based on the Ladybird implementation in 0cc151b.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Applications/Browser/BrowserWindow.cpp19
-rw-r--r--Userland/Libraries/LibWebView/OutOfProcessWebView.cpp29
-rw-r--r--Userland/Libraries/LibWebView/OutOfProcessWebView.h12
3 files changed, 60 insertions, 0 deletions
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<void()> 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<InputEvent> m_pending_input_events;
bool m_content_scales_to_viewport { false };
+
+ float m_zoom_level { 1.0 };
+ float m_device_pixel_ratio { 1.0 };
};
}