diff --git a/Userland/Libraries/LibGUI/ConnectionToWindowServer.cpp b/Userland/Libraries/LibGUI/ConnectionToWindowServer.cpp index fb5f280e88..aa8c3e49b8 100644 --- a/Userland/Libraries/LibGUI/ConnectionToWindowServer.cpp +++ b/Userland/Libraries/LibGUI/ConnectionToWindowServer.cpp @@ -50,13 +50,14 @@ ConnectionToWindowServer::ConnectionToWindowServer(NonnullOwnPtr(); set_system_theme_from_anonymous_buffer(message->theme_buffer()); Desktop::the().did_receive_screen_rects({}, message->screen_rects(), message->main_screen_index(), message->workspace_rows(), message->workspace_columns()); + Desktop::the().set_system_effects(message->effects()); Gfx::FontDatabase::set_default_font_query(message->default_font_query()); Gfx::FontDatabase::set_fixed_width_font_query(message->fixed_width_font_query()); Gfx::FontDatabase::set_window_title_font_query(message->window_title_font_query()); m_client_id = message->client_id(); } -void ConnectionToWindowServer::fast_greet(Vector const&, u32, u32, u32, Core::AnonymousBuffer const&, String const&, String const&, String const&, i32) +void ConnectionToWindowServer::fast_greet(Vector const&, u32, u32, u32, Core::AnonymousBuffer const&, String const&, String const&, String const&, Vector const&, i32) { // NOTE: This message is handled in the constructor. } @@ -83,6 +84,11 @@ void ConnectionToWindowServer::update_system_fonts(String const& default_font_qu }); } +void ConnectionToWindowServer::update_system_effects(Vector const& effects) +{ + Desktop::the().set_system_effects(effects); +} + void ConnectionToWindowServer::paint(i32 window_id, Gfx::IntSize const& window_size, Vector const& rects) { if (auto* window = Window::from_window_id(window_id)) diff --git a/Userland/Libraries/LibGUI/ConnectionToWindowServer.h b/Userland/Libraries/LibGUI/ConnectionToWindowServer.h index 5e6707fc97..94f8de89f4 100644 --- a/Userland/Libraries/LibGUI/ConnectionToWindowServer.h +++ b/Userland/Libraries/LibGUI/ConnectionToWindowServer.h @@ -24,7 +24,7 @@ public: private: ConnectionToWindowServer(NonnullOwnPtr); - virtual void fast_greet(Vector const&, u32, u32, u32, Core::AnonymousBuffer const&, String const&, String const&, String const&, i32) override; + virtual void fast_greet(Vector const&, u32, u32, u32, Core::AnonymousBuffer const&, String const&, String const&, String const&, Vector const&, i32) override; virtual void paint(i32, Gfx::IntSize const&, Vector const&) override; virtual void mouse_move(i32, Gfx::IntPoint const&, u32, u32, u32, i32, i32, i32, i32, bool, Vector const&) override; virtual void mouse_down(i32, Gfx::IntPoint const&, u32, u32, u32, i32, i32, i32, i32) override; @@ -52,6 +52,7 @@ private: virtual void drag_cancelled() override; virtual void update_system_theme(Core::AnonymousBuffer const&) override; virtual void update_system_fonts(String const&, String const&, String const&) override; + virtual void update_system_effects(Vector const&) override; virtual void window_state_changed(i32, bool, bool, bool) override; virtual void display_link_notification() override; virtual void track_mouse_move(Gfx::IntPoint const&) override; diff --git a/Userland/Services/WindowServer/ConnectionFromClient.cpp b/Userland/Services/WindowServer/ConnectionFromClient.cpp index be9f0f63db..4a547f9df5 100644 --- a/Userland/Services/WindowServer/ConnectionFromClient.cpp +++ b/Userland/Services/WindowServer/ConnectionFromClient.cpp @@ -53,7 +53,7 @@ ConnectionFromClient::ConnectionFromClient(NonnullOwnPtrset(client_id, *this); auto& wm = WindowManager::the(); - async_fast_greet(Screen::rects(), Screen::main().index(), wm.window_stack_rows(), wm.window_stack_columns(), Gfx::current_system_theme_buffer(), Gfx::FontDatabase::default_font_query(), Gfx::FontDatabase::fixed_width_font_query(), Gfx::FontDatabase::window_title_font_query(), client_id); + async_fast_greet(Screen::rects(), Screen::main().index(), wm.window_stack_rows(), wm.window_stack_columns(), Gfx::current_system_theme_buffer(), Gfx::FontDatabase::default_font_query(), Gfx::FontDatabase::fixed_width_font_query(), Gfx::FontDatabase::window_title_font_query(), wm.system_effects().effects(), client_id); } ConnectionFromClient::~ConnectionFromClient() @@ -922,6 +922,14 @@ Messages::WindowServer::SetSystemFontsResponse ConnectionFromClient::set_system_ return true; } +void ConnectionFromClient::set_system_effects(Vector const& effects, u8 geometry) +{ + WindowManager::the().apply_system_effects(effects, static_cast(geometry)); + ConnectionFromClient::for_each_client([&](auto& client) { + client.async_update_system_effects(effects); + }); +} + void ConnectionFromClient::set_window_base_size_and_size_increment(i32 window_id, Gfx::IntSize const& base_size, Gfx::IntSize const& size_increment) { auto it = m_windows.find(window_id); diff --git a/Userland/Services/WindowServer/ConnectionFromClient.h b/Userland/Services/WindowServer/ConnectionFromClient.h index e36db2fad8..7abb13e584 100644 --- a/Userland/Services/WindowServer/ConnectionFromClient.h +++ b/Userland/Services/WindowServer/ConnectionFromClient.h @@ -155,6 +155,7 @@ private: virtual Messages::WindowServer::GetCursorHighlightColorResponse get_cursor_highlight_color() override; virtual Messages::WindowServer::GetCursorThemeResponse get_cursor_theme() override; virtual Messages::WindowServer::SetSystemFontsResponse set_system_fonts(String const&, String const&, String const&) override; + virtual void set_system_effects(Vector const&, u8) override; virtual void set_window_base_size_and_size_increment(i32, Gfx::IntSize const&, Gfx::IntSize const&) override; virtual void set_window_resize_aspect_ratio(i32, Optional const&) override; virtual void enable_display_link() override; diff --git a/Userland/Services/WindowServer/WindowClient.ipc b/Userland/Services/WindowServer/WindowClient.ipc index ab8b53d943..7318931233 100644 --- a/Userland/Services/WindowServer/WindowClient.ipc +++ b/Userland/Services/WindowServer/WindowClient.ipc @@ -3,7 +3,7 @@ endpoint WindowClient { - fast_greet(Vector screen_rects, u32 main_screen_index, u32 workspace_rows, u32 workspace_columns, Core::AnonymousBuffer theme_buffer, String default_font_query, String fixed_width_font_query, String window_title_font_query, i32 client_id) =| + fast_greet(Vector screen_rects, u32 main_screen_index, u32 workspace_rows, u32 workspace_columns, Core::AnonymousBuffer theme_buffer, String default_font_query, String fixed_width_font_query, String window_title_font_query, Vector effects, i32 client_id) =| paint(i32 window_id, Gfx::IntSize window_size, Vector rects) =| mouse_move(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y, i32 wheel_raw_delta_x, i32 wheel_raw_delta_y, bool is_drag, Vector mime_types) =| @@ -39,6 +39,7 @@ endpoint WindowClient update_system_theme(Core::AnonymousBuffer theme_buffer) =| update_system_fonts(String default_font_query, String fixed_width_font_query, String window_title_font_query) =| + update_system_effects(Vector effects) =| display_link_notification() =| diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 8d49fd62b9..1979df2db5 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -101,6 +101,8 @@ void WindowManager::reload_config() Compositor::the().invalidate_after_theme_or_font_change(); WindowFrame::reload_config(); + + load_system_effects(); } Gfx::Font const& WindowManager::font() const @@ -2331,6 +2333,46 @@ void WindowManager::set_cursor_highlight_color(Gfx::Color const& color) sync_config_to_disk(); } +void WindowManager::apply_system_effects(Vector effects, ShowGeometry geometry) +{ + if (m_system_effects == SystemEffects { effects, geometry }) + return; + + m_system_effects = { effects, geometry }; + m_config->write_bool_entry("Effects", "AnimateMenus", m_system_effects.animate_menus()); + m_config->write_bool_entry("Effects", "FlashMenus", m_system_effects.flash_menus()); + m_config->write_bool_entry("Effects", "AnimateWindows", m_system_effects.animate_windows()); + m_config->write_bool_entry("Effects", "SmoothScrolling", m_system_effects.smooth_scrolling()); + m_config->write_bool_entry("Effects", "TabAccents", m_system_effects.tab_accents()); + m_config->write_bool_entry("Effects", "SplitterKnurls", m_system_effects.splitter_knurls()); + m_config->write_bool_entry("Effects", "MenuShadow", m_system_effects.menu_shadow()); + m_config->write_bool_entry("Effects", "WindowShadow", m_system_effects.window_shadow()); + m_config->write_bool_entry("Effects", "TooltipShadow", m_system_effects.tooltip_shadow()); + m_config->write_entry("Effects", "ShowGeometry", ShowGeometryTools::enum_to_string(geometry)); + sync_config_to_disk(); +} + +void WindowManager::load_system_effects() +{ + Vector effects = { + m_config->read_bool_entry("Effects", "AnimateMenus", true), + m_config->read_bool_entry("Effects", "FlashMenus", true), + m_config->read_bool_entry("Effects", "AnimateWindows", true), + m_config->read_bool_entry("Effects", "SmoothScrolling", true), + m_config->read_bool_entry("Effects", "TabAccents", true), + m_config->read_bool_entry("Effects", "SplitterKnurls", true), + m_config->read_bool_entry("Effects", "MenuShadow", true), + m_config->read_bool_entry("Effects", "WindowShadow", true), + m_config->read_bool_entry("Effects", "TooltipShadow", true) + }; + ShowGeometry geometry = ShowGeometryTools::string_to_enum(m_config->read_entry("Effects", "ShowGeometry", "OnMoveAndResize")); + m_system_effects = { effects, geometry }; + + ConnectionFromClient::for_each_client([&](auto& client) { + client.async_update_system_effects(effects); + }); +} + bool WindowManager::sync_config_to_disk() { if (auto result = m_config->sync(); result.is_error()) { diff --git a/Userland/Services/WindowServer/WindowManager.h b/Userland/Services/WindowServer/WindowManager.h index 3c205c278c..20924fa37c 100644 --- a/Userland/Services/WindowServer/WindowManager.h +++ b/Userland/Services/WindowServer/WindowManager.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -336,6 +337,10 @@ public: bool is_cursor_highlight_enabled() const { return m_cursor_highlight_radius > 0 && m_cursor_highlight_enabled; } + void load_system_effects(); + void apply_system_effects(Vector, ShowGeometry); + SystemEffects& system_effects() { return m_system_effects; } + RefPtr keymap_switcher() { return m_keymap_switcher; } private: @@ -478,6 +483,8 @@ private: WindowStack* m_switching_to_window_stack { nullptr }; Vector, 4> m_carry_window_to_new_stack; + + SystemEffects m_system_effects; }; template diff --git a/Userland/Services/WindowServer/WindowServer.ipc b/Userland/Services/WindowServer/WindowServer.ipc index b7db386999..8939039da9 100644 --- a/Userland/Services/WindowServer/WindowServer.ipc +++ b/Userland/Services/WindowServer/WindowServer.ipc @@ -144,6 +144,7 @@ endpoint WindowServer get_cursor_highlight_color() => (Gfx::Color color) set_system_fonts(String default_font_query, String fixed_width_font_query, String window_title_font_query) => (bool success) + set_system_effects(Vector effects, u8 geometry) =| set_window_base_size_and_size_increment(i32 window_id, Gfx::IntSize base_size, Gfx::IntSize size_increment) =| set_window_resize_aspect_ratio(i32 window_id, Optional resize_aspect_ratio) =|