From b40d77151286a5c3a7fbb793804064d8ad770c25 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Mon, 12 Jul 2021 09:57:34 +0200 Subject: [PATCH] LibGUI: Add FontsChanged event and deliver it to windows and widgets --- Userland/Libraries/LibGUI/Event.h | 9 +++++++++ Userland/Libraries/LibGUI/Forward.h | 1 + Userland/Libraries/LibGUI/Widget.cpp | 6 ++++++ Userland/Libraries/LibGUI/Widget.h | 1 + Userland/Libraries/LibGUI/Window.cpp | 18 ++++++++++++++++++ Userland/Libraries/LibGUI/Window.h | 1 + .../LibGUI/WindowServerConnection.cpp | 3 +++ 7 files changed, 39 insertions(+) diff --git a/Userland/Libraries/LibGUI/Event.h b/Userland/Libraries/LibGUI/Event.h index 446e020beb..e2a0cd520b 100644 --- a/Userland/Libraries/LibGUI/Event.h +++ b/Userland/Libraries/LibGUI/Event.h @@ -52,6 +52,7 @@ public: DragMove, Drop, ThemeChange, + FontsChange, ScreenRectsChange, ActionEnter, ActionLeave, @@ -425,6 +426,14 @@ public: } }; +class FontsChangeEvent final : public Event { +public: + FontsChangeEvent() + : Event(Type::FontsChange) + { + } +}; + class ScreenRectsChangeEvent final : public Event { public: explicit ScreenRectsChangeEvent(const Vector& rects, size_t main_screen_index) diff --git a/Userland/Libraries/LibGUI/Forward.h b/Userland/Libraries/LibGUI/Forward.h index a12e0e9f68..30d1c4d76f 100644 --- a/Userland/Libraries/LibGUI/Forward.h +++ b/Userland/Libraries/LibGUI/Forward.h @@ -70,6 +70,7 @@ struct TextDocumentSpan; class TextDocumentUndoCommand; class TextEditor; class ThemeChangeEvent; +class FontsChangeEvent; class Toolbar; class ToolbarContainer; class TreeView; diff --git a/Userland/Libraries/LibGUI/Widget.cpp b/Userland/Libraries/LibGUI/Widget.cpp index b4b07aea5e..2a5737c0a9 100644 --- a/Userland/Libraries/LibGUI/Widget.cpp +++ b/Userland/Libraries/LibGUI/Widget.cpp @@ -295,6 +295,8 @@ void Widget::event(Core::Event& event) return drop_event(static_cast(event)); case Event::ThemeChange: return theme_change_event(static_cast(event)); + case Event::FontsChange: + return fonts_change_event(static_cast(event)); case Event::Enter: return handle_enter_event(event); case Event::Leave: @@ -558,6 +560,10 @@ void Widget::theme_change_event(ThemeChangeEvent&) { } +void Widget::fonts_change_event(FontsChangeEvent&) +{ +} + void Widget::screen_rects_change_event(ScreenRectsChangeEvent&) { } diff --git a/Userland/Libraries/LibGUI/Widget.h b/Userland/Libraries/LibGUI/Widget.h index 3090b6799c..07913a6ac5 100644 --- a/Userland/Libraries/LibGUI/Widget.h +++ b/Userland/Libraries/LibGUI/Widget.h @@ -314,6 +314,7 @@ protected: virtual void drag_leave_event(Event&); virtual void drop_event(DropEvent&); virtual void theme_change_event(ThemeChangeEvent&); + virtual void fonts_change_event(FontsChangeEvent&); virtual void screen_rects_change_event(ScreenRectsChangeEvent&); virtual void did_begin_inspection() override; diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index c2b29d3e7e..d021eafc0b 100644 --- a/Userland/Libraries/LibGUI/Window.cpp +++ b/Userland/Libraries/LibGUI/Window.cpp @@ -511,6 +511,21 @@ void Window::handle_theme_change_event(ThemeChangeEvent& event) dispatch_theme_change(*m_main_widget.ptr(), dispatch_theme_change); } +void Window::handle_fonts_change_event(FontsChangeEvent& event) +{ + if (!m_main_widget) + return; + auto dispatch_fonts_change = [&](auto& widget, auto recursive) { + widget.dispatch_event(event, this); + widget.for_each_child_widget([&](auto& widget) -> IterationDecision { + widget.dispatch_event(event, this); + recursive(widget, recursive); + return IterationDecision::Continue; + }); + }; + dispatch_fonts_change(*m_main_widget.ptr(), dispatch_fonts_change); +} + void Window::handle_screen_rects_change_event(ScreenRectsChangeEvent& event) { if (!m_main_widget) @@ -594,6 +609,9 @@ void Window::event(Core::Event& event) if (event.type() == Event::ThemeChange) return handle_theme_change_event(static_cast(event)); + if (event.type() == Event::FontsChange) + return handle_fonts_change_event(static_cast(event)); + if (event.type() == Event::ScreenRectsChange) return handle_screen_rects_change_event(static_cast(event)); diff --git a/Userland/Libraries/LibGUI/Window.h b/Userland/Libraries/LibGUI/Window.h index bfbf518930..d0d9d4b2dd 100644 --- a/Userland/Libraries/LibGUI/Window.h +++ b/Userland/Libraries/LibGUI/Window.h @@ -220,6 +220,7 @@ private: void handle_became_active_or_inactive_event(Core::Event&); void handle_close_request(); void handle_theme_change_event(ThemeChangeEvent&); + void handle_fonts_change_event(FontsChangeEvent&); void handle_screen_rects_change_event(ScreenRectsChangeEvent&); void handle_drag_move_event(DragEvent&); void handle_left_event(); diff --git a/Userland/Libraries/LibGUI/WindowServerConnection.cpp b/Userland/Libraries/LibGUI/WindowServerConnection.cpp index 64ea48c4f0..b05133e902 100644 --- a/Userland/Libraries/LibGUI/WindowServerConnection.cpp +++ b/Userland/Libraries/LibGUI/WindowServerConnection.cpp @@ -72,6 +72,9 @@ void WindowServerConnection::update_system_fonts(const String& default_font_quer Gfx::FontDatabase::set_default_font_query(default_font_query); Gfx::FontDatabase::set_fixed_width_font_query(fixed_width_font_query); Window::update_all_windows({}); + Window::for_each_window({}, [](auto& window) { + Core::EventLoop::current().post_event(window, make()); + }); } void WindowServerConnection::paint(i32 window_id, Gfx::IntSize const& window_size, Vector const& rects)