From 3fc0c21b6c1543ff031cdf5811cb25abef9c7c71 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sat, 26 Aug 2023 23:12:30 -0400 Subject: [PATCH] Ladybird: Inform WebContent whether the AppKit chrome is in dark mode --- Ladybird/AppKit/UI/LadybirdWebView.mm | 5 +++ Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp | 17 ++++---- Ladybird/AppKit/UI/LadybirdWebViewBridge.h | 4 +- Ladybird/AppKit/UI/Palette.h | 16 +++++++ Ladybird/AppKit/UI/Palette.mm | 45 ++++++++++++++++++++ Ladybird/CMakeLists.txt | 1 + 6 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 Ladybird/AppKit/UI/Palette.h create mode 100644 Ladybird/AppKit/UI/Palette.mm diff --git a/Ladybird/AppKit/UI/LadybirdWebView.mm b/Ladybird/AppKit/UI/LadybirdWebView.mm index 261f6d65899..36d2cdf4d50 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.mm +++ b/Ladybird/AppKit/UI/LadybirdWebView.mm @@ -872,6 +872,11 @@ static void copy_text_to_clipboard(StringView text) [self handleResize]; } +- (void)viewDidChangeEffectiveAppearance +{ + m_web_view_bridge->update_palette(); +} + - (BOOL)isFlipped { // The origin of a NSScrollView is the lower-left corner, with the y-axis extending upwards. Instead, diff --git a/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp b/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp index 3bef8c8a21f..372209740f8 100644 --- a/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp +++ b/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp @@ -13,6 +13,8 @@ #include #include +#import + namespace Ladybird { template @@ -85,6 +87,12 @@ void WebViewBridge::set_viewport_rect(Gfx::IntRect viewport_rect, ForResize for_ } } +void WebViewBridge::update_palette() +{ + auto theme = create_system_palette(); + client().async_update_system_theme(move(theme)); +} + void WebViewBridge::mouse_down_event(Gfx::IntPoint position, GUI::MouseButton button, KeyModifier modifiers) { client().async_mouse_down(to_content_position(position), to_underlying(button), to_underlying(button), modifiers); @@ -183,13 +191,4 @@ void WebViewBridge::create_client(WebView::EnableCallgrindProfiling enable_callg } } -void WebViewBridge::update_palette() -{ - auto theme = MUST(Gfx::load_system_theme(DeprecatedString::formatted("{}/res/themes/Default.ini", s_serenity_resource_root))); - auto palette_impl = Gfx::PaletteImpl::create_with_anonymous_buffer(theme); - auto palette = Gfx::Palette(move(palette_impl)); - - client().async_update_system_theme(move(theme)); -} - } diff --git a/Ladybird/AppKit/UI/LadybirdWebViewBridge.h b/Ladybird/AppKit/UI/LadybirdWebViewBridge.h index 5e923cd3097..b472a67eb57 100644 --- a/Ladybird/AppKit/UI/LadybirdWebViewBridge.h +++ b/Ladybird/AppKit/UI/LadybirdWebViewBridge.h @@ -35,6 +35,8 @@ public: }; void set_viewport_rect(Gfx::IntRect, ForResize = ForResize::No); + void update_palette(); + void mouse_down_event(Gfx::IntPoint, GUI::MouseButton, KeyModifier); void mouse_up_event(Gfx::IntPoint, GUI::MouseButton, KeyModifier); void mouse_move_event(Gfx::IntPoint, GUI::MouseButton, KeyModifier); @@ -59,8 +61,6 @@ private: virtual void create_client(WebView::EnableCallgrindProfiling) override; - void update_palette(); - Vector m_screen_rects; Gfx::IntRect m_viewport_rect; diff --git a/Ladybird/AppKit/UI/Palette.h b/Ladybird/AppKit/UI/Palette.h new file mode 100644 index 00000000000..cbd189194fb --- /dev/null +++ b/Ladybird/AppKit/UI/Palette.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2023, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Ladybird { + +bool is_using_dark_system_theme(); +Core::AnonymousBuffer create_system_palette(); + +} diff --git a/Ladybird/AppKit/UI/Palette.mm b/Ladybird/AppKit/UI/Palette.mm new file mode 100644 index 00000000000..84864e78c9e --- /dev/null +++ b/Ladybird/AppKit/UI/Palette.mm @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +#import +#import + +namespace Ladybird { + +bool is_using_dark_system_theme() +{ + auto* appearance = [NSApp effectiveAppearance]; + + auto* matched_appearance = [appearance bestMatchFromAppearancesWithNames:@[ + NSAppearanceNameAqua, + NSAppearanceNameDarkAqua, + ]]; + + return [matched_appearance isEqualToString:NSAppearanceNameDarkAqua]; +} + +Core::AnonymousBuffer create_system_palette() +{ + auto is_dark = is_using_dark_system_theme(); + + auto theme_file = is_dark ? "Default"sv : "Dark"sv; + auto theme_path = DeprecatedString::formatted("{}/res/themes/{}.ini", s_serenity_resource_root, theme_file); + + auto theme = MUST(Gfx::load_system_theme(theme_path)); + auto palette_impl = Gfx::PaletteImpl::create_with_anonymous_buffer(theme); + auto palette = Gfx::Palette(move(palette_impl)); + + palette.set_flag(Gfx::FlagRole::IsDark, is_dark); + + return theme; +} + +} diff --git a/Ladybird/CMakeLists.txt b/Ladybird/CMakeLists.txt index f1a60e791d7..e849b38dd7a 100644 --- a/Ladybird/CMakeLists.txt +++ b/Ladybird/CMakeLists.txt @@ -136,6 +136,7 @@ elseif (APPLE) AppKit/UI/Event.mm AppKit/UI/LadybirdWebView.mm AppKit/UI/LadybirdWebViewBridge.cpp + AppKit/UI/Palette.mm AppKit/UI/Tab.mm AppKit/UI/TabController.mm AppKit/Utilities/Conversions.mm