From 0574c0e474dff0876715a4546b6e1114b1e688d2 Mon Sep 17 00:00:00 2001 From: Bastiaan van der Plaat Date: Wed, 20 Sep 2023 22:10:42 +0200 Subject: [PATCH] Ladybird/AppKit: Listen for device pixel ratio changes --- Ladybird/AppKit/UI/ConsoleController.mm | 5 +++++ Ladybird/AppKit/UI/LadybirdWebView.h | 1 + Ladybird/AppKit/UI/LadybirdWebView.mm | 8 ++++++++ Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp | 9 +++++++-- Ladybird/AppKit/UI/LadybirdWebViewBridge.h | 5 ++--- Ladybird/AppKit/UI/TabController.mm | 5 +++++ 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Ladybird/AppKit/UI/ConsoleController.mm b/Ladybird/AppKit/UI/ConsoleController.mm index d7cdb97130..9d1e9aebbb 100644 --- a/Ladybird/AppKit/UI/ConsoleController.mm +++ b/Ladybird/AppKit/UI/ConsoleController.mm @@ -60,4 +60,9 @@ } } +- (void)windowDidChangeBackingProperties:(NSNotification*)notification +{ + [[[self console] web_view] handleDevicePixelRatioChange]; +} + @end diff --git a/Ladybird/AppKit/UI/LadybirdWebView.h b/Ladybird/AppKit/UI/LadybirdWebView.h index f839ee7012..48cd82eee3 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.h +++ b/Ladybird/AppKit/UI/LadybirdWebView.h @@ -47,6 +47,7 @@ - (String const&)handle; - (void)handleResize; +- (void)handleDevicePixelRatioChange; - (void)handleScroll; - (void)handleVisibility:(BOOL)is_visible; diff --git a/Ladybird/AppKit/UI/LadybirdWebView.mm b/Ladybird/AppKit/UI/LadybirdWebView.mm index c29546a6ed..76934a7b7b 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.mm +++ b/Ladybird/AppKit/UI/LadybirdWebView.mm @@ -87,6 +87,7 @@ struct HideCursor { screen_rects.unchecked_append(screen_rect); } + // This returns device pixel ratio of the screen the window is opened in auto device_pixel_ratio = [[NSScreen mainScreen] backingScaleFactor]; m_web_view_bridge = MUST(Ladybird::WebViewBridge::create(move(screen_rects), device_pixel_ratio, [delegate webdriverContentIPCPath], [delegate preferredColorScheme])); @@ -130,6 +131,13 @@ struct HideCursor { [self updateStatusLabelPosition]; } +- (void)handleDevicePixelRatioChange +{ + m_web_view_bridge->set_device_pixel_ratio([[self window] backingScaleFactor]); + [self updateViewportRect:Ladybird::WebViewBridge::ForResize::Yes]; + [self updateStatusLabelPosition]; +} + - (void)handleScroll { [self updateViewportRect:Ladybird::WebViewBridge::ForResize::No]; diff --git a/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp b/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp index 6bdc178371..d0e6a62464 100644 --- a/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp +++ b/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp @@ -34,7 +34,6 @@ WebViewBridge::WebViewBridge(Vector screen_rects, float device_pix , m_preferred_color_scheme(preferred_color_scheme) { m_device_pixel_ratio = device_pixel_ratio; - m_inverse_device_pixel_ratio = 1.0 / device_pixel_ratio; create_client(WebView::EnableCallgrindProfiling::No); @@ -70,6 +69,12 @@ WebViewBridge::WebViewBridge(Vector screen_rects, float device_pix WebViewBridge::~WebViewBridge() = default; +void WebViewBridge::set_device_pixel_ratio(float device_pixel_ratio) +{ + m_device_pixel_ratio = device_pixel_ratio; + client().async_set_device_pixels_per_css_pixel(device_pixel_ratio); +} + void WebViewBridge::set_system_visibility_state(bool is_visible) { client().async_set_system_visibility_state(is_visible); @@ -169,7 +174,7 @@ Gfx::IntPoint WebViewBridge::to_content_position(Gfx::IntPoint widget_position) Gfx::IntPoint WebViewBridge::to_widget_position(Gfx::IntPoint content_position) const { - return scale_for_device(content_position, m_inverse_device_pixel_ratio); + return scale_for_device(content_position, inverse_device_pixel_ratio()); } void WebViewBridge::create_client(WebView::EnableCallgrindProfiling enable_callgrind_profiling) diff --git a/Ladybird/AppKit/UI/LadybirdWebViewBridge.h b/Ladybird/AppKit/UI/LadybirdWebViewBridge.h index 80496e7c85..337ba94a1c 100644 --- a/Ladybird/AppKit/UI/LadybirdWebViewBridge.h +++ b/Ladybird/AppKit/UI/LadybirdWebViewBridge.h @@ -26,7 +26,8 @@ public: virtual ~WebViewBridge() override; float device_pixel_ratio() const { return m_device_pixel_ratio; } - float inverse_device_pixel_ratio() const { return m_inverse_device_pixel_ratio; } + void set_device_pixel_ratio(float device_pixel_ratio); + float inverse_device_pixel_ratio() const { return 1.0f / m_device_pixel_ratio; } void set_system_visibility_state(bool is_visible); @@ -67,8 +68,6 @@ private: Vector m_screen_rects; Gfx::IntRect m_viewport_rect; - float m_inverse_device_pixel_ratio { 1.0 }; - Optional m_webdriver_content_ipc_path; Web::CSS::PreferredColorScheme m_preferred_color_scheme { Web::CSS::PreferredColorScheme::Auto }; }; diff --git a/Ladybird/AppKit/UI/TabController.mm b/Ladybird/AppKit/UI/TabController.mm index ecb0d68f00..a25ee7f98f 100644 --- a/Ladybird/AppKit/UI/TabController.mm +++ b/Ladybird/AppKit/UI/TabController.mm @@ -472,6 +472,11 @@ enum class IsHistoryNavigation { } } +- (void)windowDidChangeBackingProperties:(NSNotification*)notification +{ + [[[self tab] web_view] handleDevicePixelRatioChange]; +} + - (BOOL)validateMenuItem:(NSMenuItem*)item { if ([item action] == @selector(toggleLineBoxBorders:)) {