summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Applications/DisplaySettings/BackgroundSettingsWidget.cpp15
-rw-r--r--Userland/Applications/DisplaySettings/BackgroundSettingsWidget.h4
-rw-r--r--Userland/Applications/DisplaySettings/ThemesSettingsWidget.cpp6
-rw-r--r--Userland/Applications/DisplaySettings/ThemesSettingsWidget.h4
-rw-r--r--Userland/Applications/DisplaySettings/main.cpp6
-rw-r--r--Userland/Services/Taskbar/main.cpp2
-rw-r--r--Userland/Services/WindowServer/ConnectionFromClient.cpp4
-rw-r--r--Userland/Services/WindowServer/ConnectionFromClient.h2
-rw-r--r--Userland/Services/WindowServer/WindowManager.cpp5
-rw-r--r--Userland/Services/WindowServer/WindowManager.h2
-rw-r--r--Userland/Services/WindowServer/WindowServer.ipc2
11 files changed, 35 insertions, 17 deletions
diff --git a/Userland/Applications/DisplaySettings/BackgroundSettingsWidget.cpp b/Userland/Applications/DisplaySettings/BackgroundSettingsWidget.cpp
index d4c9fdc060..36e635abce 100644
--- a/Userland/Applications/DisplaySettings/BackgroundSettingsWidget.cpp
+++ b/Userland/Applications/DisplaySettings/BackgroundSettingsWidget.cpp
@@ -31,7 +31,8 @@
namespace DisplaySettings {
-BackgroundSettingsWidget::BackgroundSettingsWidget()
+BackgroundSettingsWidget::BackgroundSettingsWidget(bool& background_settings_changed)
+ : m_background_settings_changed { background_settings_changed }
{
m_modes.append("tile");
m_modes.append("center");
@@ -86,20 +87,27 @@ void BackgroundSettingsWidget::create_frame()
return;
m_wallpaper_view->selection().clear();
m_monitor_widget->set_wallpaper(path.value());
+ m_background_settings_changed = true;
};
m_mode_combo = *find_descendant_of_type_named<GUI::ComboBox>("mode_combo");
m_mode_combo->set_only_allow_values_from_model(true);
m_mode_combo->set_model(*GUI::ItemListModel<String>::create(m_modes));
- m_mode_combo->on_change = [this](auto&, const GUI::ModelIndex& index) {
+ bool first_mode_change = true;
+ m_mode_combo->on_change = [this, first_mode_change](auto&, const GUI::ModelIndex& index) mutable {
m_monitor_widget->set_wallpaper_mode(m_modes.at(index.row()));
+ m_background_settings_changed = !first_mode_change;
+ first_mode_change = false;
};
m_color_input = *find_descendant_of_type_named<GUI::ColorInput>("color_input");
m_color_input->set_color_has_alpha_channel(false);
m_color_input->set_color_picker_title("Select color for desktop");
- m_color_input->on_change = [this] {
+ bool first_color_change = true;
+ m_color_input->on_change = [this, first_color_change]() mutable {
m_monitor_widget->set_background_color(m_color_input->color());
+ m_background_settings_changed = !first_color_change;
+ first_color_change = false;
};
}
@@ -133,6 +141,7 @@ void BackgroundSettingsWidget::load_current_settings()
m_color_input->set_color(palette_desktop_color);
m_monitor_widget->set_background_color(palette_desktop_color);
+ m_background_settings_changed = false;
}
void BackgroundSettingsWidget::apply_settings()
diff --git a/Userland/Applications/DisplaySettings/BackgroundSettingsWidget.h b/Userland/Applications/DisplaySettings/BackgroundSettingsWidget.h
index 0fa8a191cf..2a187b0f58 100644
--- a/Userland/Applications/DisplaySettings/BackgroundSettingsWidget.h
+++ b/Userland/Applications/DisplaySettings/BackgroundSettingsWidget.h
@@ -27,13 +27,15 @@ public:
virtual void apply_settings() override;
private:
- BackgroundSettingsWidget();
+ BackgroundSettingsWidget(bool& background_settings_changed);
void create_frame();
void load_current_settings();
Vector<String> m_modes;
+ bool& m_background_settings_changed;
+
RefPtr<DisplaySettings::MonitorWidget> m_monitor_widget;
RefPtr<GUI::IconView> m_wallpaper_view;
RefPtr<GUI::ComboBox> m_mode_combo;
diff --git a/Userland/Applications/DisplaySettings/ThemesSettingsWidget.cpp b/Userland/Applications/DisplaySettings/ThemesSettingsWidget.cpp
index 955c079612..bdfd64ccac 100644
--- a/Userland/Applications/DisplaySettings/ThemesSettingsWidget.cpp
+++ b/Userland/Applications/DisplaySettings/ThemesSettingsWidget.cpp
@@ -19,7 +19,8 @@ static inline String current_system_theme()
return GUI::ConnectionToWindowServer::the().get_system_theme();
}
-ThemesSettingsWidget::ThemesSettingsWidget()
+ThemesSettingsWidget::ThemesSettingsWidget(bool& background_settings_changed)
+ : m_background_settings_changed { background_settings_changed }
{
load_from_gml(themes_settings_gml);
m_themes = Gfx::list_installed_system_themes();
@@ -50,7 +51,8 @@ ThemesSettingsWidget::ThemesSettingsWidget()
void ThemesSettingsWidget::apply_settings()
{
if (m_selected_theme && m_selected_theme->name != current_system_theme())
- VERIFY(GUI::ConnectionToWindowServer::the().set_system_theme(m_selected_theme->path, m_selected_theme->name));
+ VERIFY(GUI::ConnectionToWindowServer::the().set_system_theme(m_selected_theme->path, m_selected_theme->name, m_background_settings_changed));
+ m_background_settings_changed = false;
}
}
diff --git a/Userland/Applications/DisplaySettings/ThemesSettingsWidget.h b/Userland/Applications/DisplaySettings/ThemesSettingsWidget.h
index 520a754642..7975487148 100644
--- a/Userland/Applications/DisplaySettings/ThemesSettingsWidget.h
+++ b/Userland/Applications/DisplaySettings/ThemesSettingsWidget.h
@@ -31,7 +31,9 @@ private:
Gfx::SystemThemeMetaData const* m_selected_theme { nullptr };
- ThemesSettingsWidget();
+ bool& m_background_settings_changed;
+
+ ThemesSettingsWidget(bool& background_settings_changed);
};
}
diff --git a/Userland/Applications/DisplaySettings/main.cpp b/Userland/Applications/DisplaySettings/main.cpp
index b8b2fef93a..154d9da393 100644
--- a/Userland/Applications/DisplaySettings/main.cpp
+++ b/Userland/Applications/DisplaySettings/main.cpp
@@ -27,9 +27,11 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
auto app_icon = GUI::Icon::default_icon("app-display-settings");
+ bool background_settings_changed = false;
+
auto window = TRY(GUI::SettingsWindow::create("Display Settings"));
- (void)TRY(window->add_tab<DisplaySettings::BackgroundSettingsWidget>("Background"));
- (void)TRY(window->add_tab<DisplaySettings::ThemesSettingsWidget>("Themes"));
+ (void)TRY(window->add_tab<DisplaySettings::BackgroundSettingsWidget>("Background", background_settings_changed));
+ (void)TRY(window->add_tab<DisplaySettings::ThemesSettingsWidget>("Themes", background_settings_changed));
(void)TRY(window->add_tab<DisplaySettings::FontSettingsWidget>("Fonts"));
(void)TRY(window->add_tab<DisplaySettings::MonitorSettingsWidget>("Monitor"));
(void)TRY(window->add_tab<DisplaySettings::DesktopSettingsWidget>("Workspaces"));
diff --git a/Userland/Services/Taskbar/main.cpp b/Userland/Services/Taskbar/main.cpp
index 5d3f66376a..4150145aa0 100644
--- a/Userland/Services/Taskbar/main.cpp
+++ b/Userland/Services/Taskbar/main.cpp
@@ -217,7 +217,7 @@ ErrorOr<NonnullRefPtr<GUI::Menu>> build_system_menu()
auto action = GUI::Action::create_checkable(theme.name, [theme_identifier](auto&) {
auto& theme = g_themes[theme_identifier];
dbgln("Theme switched to {} at path {}", theme.name, theme.path);
- auto success = GUI::ConnectionToWindowServer::the().set_system_theme(theme.path, theme.name);
+ auto success = GUI::ConnectionToWindowServer::the().set_system_theme(theme.path, theme.name, false);
VERIFY(success);
});
if (theme.name == current_theme_name)
diff --git a/Userland/Services/WindowServer/ConnectionFromClient.cpp b/Userland/Services/WindowServer/ConnectionFromClient.cpp
index aebd1f3e72..76f05ff10f 100644
--- a/Userland/Services/WindowServer/ConnectionFromClient.cpp
+++ b/Userland/Services/WindowServer/ConnectionFromClient.cpp
@@ -790,9 +790,9 @@ Messages::WindowServer::StartDragResponse ConnectionFromClient::start_drag(Strin
return true;
}
-Messages::WindowServer::SetSystemThemeResponse ConnectionFromClient::set_system_theme(String const& theme_path, String const& theme_name)
+Messages::WindowServer::SetSystemThemeResponse ConnectionFromClient::set_system_theme(String const& theme_path, String const& theme_name, bool keep_desktop_background)
{
- bool success = WindowManager::the().update_theme(theme_path, theme_name);
+ bool success = WindowManager::the().update_theme(theme_path, theme_name, keep_desktop_background);
return success;
}
diff --git a/Userland/Services/WindowServer/ConnectionFromClient.h b/Userland/Services/WindowServer/ConnectionFromClient.h
index 6b12169355..1a87563b9c 100644
--- a/Userland/Services/WindowServer/ConnectionFromClient.h
+++ b/Userland/Services/WindowServer/ConnectionFromClient.h
@@ -140,7 +140,7 @@ private:
virtual void dismiss_menu(i32) override;
virtual void set_window_icon_bitmap(i32, Gfx::ShareableBitmap const&) override;
virtual Messages::WindowServer::StartDragResponse start_drag(String const&, HashMap<String, ByteBuffer> const&, Gfx::ShareableBitmap const&) override;
- virtual Messages::WindowServer::SetSystemThemeResponse set_system_theme(String const&, String const&) override;
+ virtual Messages::WindowServer::SetSystemThemeResponse set_system_theme(String const&, String const&, bool keep_desktop_background) override;
virtual Messages::WindowServer::GetSystemThemeResponse get_system_theme() override;
virtual void apply_cursor_theme(String const&) override;
virtual Messages::WindowServer::GetCursorThemeResponse get_cursor_theme() override;
diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp
index bf57e84207..bdbbe2c1a5 100644
--- a/Userland/Services/WindowServer/WindowManager.cpp
+++ b/Userland/Services/WindowServer/WindowManager.cpp
@@ -2089,7 +2089,7 @@ void WindowManager::invalidate_after_theme_or_font_change()
Compositor::the().invalidate_after_theme_or_font_change();
}
-bool WindowManager::update_theme(String theme_path, String theme_name)
+bool WindowManager::update_theme(String theme_path, String theme_name, bool keep_desktop_background)
{
auto new_theme = Gfx::load_system_theme(theme_path);
if (!new_theme.is_valid())
@@ -2097,7 +2097,8 @@ bool WindowManager::update_theme(String theme_path, String theme_name)
Gfx::set_system_theme(new_theme);
m_palette = Gfx::PaletteImpl::create_with_anonymous_buffer(new_theme);
m_config->write_entry("Theme", "Name", theme_name);
- m_config->remove_entry("Background", "Color");
+ if (!keep_desktop_background)
+ m_config->remove_entry("Background", "Color");
if (auto result = m_config->sync(); result.is_error()) {
dbgln("Failed to save config file: {}", result.error());
return false;
diff --git a/Userland/Services/WindowServer/WindowManager.h b/Userland/Services/WindowServer/WindowManager.h
index 047d6f3866..115b718350 100644
--- a/Userland/Services/WindowServer/WindowManager.h
+++ b/Userland/Services/WindowServer/WindowManager.h
@@ -213,7 +213,7 @@ public:
return nullptr;
}
- bool update_theme(String theme_path, String theme_name);
+ bool update_theme(String theme_path, String theme_name, bool keep_desktop_background);
void invalidate_after_theme_or_font_change();
bool set_hovered_window(Window*);
diff --git a/Userland/Services/WindowServer/WindowServer.ipc b/Userland/Services/WindowServer/WindowServer.ipc
index 53849dd3ba..91f69a4467 100644
--- a/Userland/Services/WindowServer/WindowServer.ipc
+++ b/Userland/Services/WindowServer/WindowServer.ipc
@@ -113,7 +113,7 @@ endpoint WindowServer
start_drag([UTF8] String text, HashMap<String,ByteBuffer> mime_data, Gfx::ShareableBitmap drag_bitmap) => (bool started)
- set_system_theme(String theme_path, [UTF8] String theme_name) => (bool success)
+ set_system_theme(String theme_path, [UTF8] String theme_name, bool keep_desktop_background) => (bool success)
get_system_theme() => ([UTF8] String theme_name)
refresh_system_theme() =|