Serenity Operating System
at master 136 lines 5.9 kB view raw
1/* 2 * Copyright (c) 2022, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include "EffectsSettingsWidget.h" 8#include <Applications/DisplaySettings/EffectsSettingsGML.h> 9#include <LibCore/ConfigFile.h> 10#include <LibGUI/CheckBox.h> 11#include <LibGUI/ComboBox.h> 12#include <LibGUI/ConnectionToWindowServer.h> 13#include <LibGUI/ItemListModel.h> 14 15namespace GUI { 16 17namespace DisplaySettings { 18 19EffectsSettingsWidget::EffectsSettingsWidget() 20{ 21 load_from_gml(effects_settings_gml).release_value_but_fixme_should_propagate_errors(); 22 23 m_geometry_combobox = find_descendant_of_type_named<ComboBox>("geometry_combobox"); 24 m_geometry_combobox->set_only_allow_values_from_model(true); 25 m_geometry_combobox->on_change = [this](auto&, auto&) { 26 m_system_effects.set_geometry(static_cast<ShowGeometry>(m_geometry_combobox->selected_index())); 27 set_modified(true); 28 }; 29 30 if (auto result = load_settings(); result.is_error()) { 31 warnln("Failed to load [Effects] from WindowServer.ini"); 32 return; 33 } 34 35 auto& animate_menus = *find_descendant_of_type_named<GUI::CheckBox>("animate_menus_checkbox"); 36 animate_menus.set_checked(m_system_effects.animate_menus()); 37 animate_menus.on_checked = [this](bool checked) { 38 m_system_effects.effects().at(Effects::AnimateMenus) = checked; 39 set_modified(true); 40 }; 41 auto& flash_menus = *find_descendant_of_type_named<GUI::CheckBox>("flash_menus_checkbox"); 42 flash_menus.set_checked(m_system_effects.flash_menus()); 43 flash_menus.on_checked = [this](bool checked) { 44 m_system_effects.effects().at(Effects::FlashMenus) = checked; 45 set_modified(true); 46 }; 47 auto& animate_windows = *find_descendant_of_type_named<GUI::CheckBox>("animate_windows_checkbox"); 48 animate_windows.set_checked(m_system_effects.animate_windows()); 49 animate_windows.on_checked = [this](bool checked) { 50 m_system_effects.effects().at(Effects::AnimateWindows) = checked; 51 set_modified(true); 52 }; 53 auto& smooth_scrolling = *find_descendant_of_type_named<GUI::CheckBox>("smooth_scrolling_checkbox"); 54 smooth_scrolling.set_checked(m_system_effects.smooth_scrolling()); 55 smooth_scrolling.on_checked = [this](bool checked) { 56 m_system_effects.effects().at(Effects::SmoothScrolling) = checked; 57 set_modified(true); 58 }; 59 auto& tab_accents = *find_descendant_of_type_named<GUI::CheckBox>("tab_accents_checkbox"); 60 tab_accents.set_checked(m_system_effects.tab_accents()); 61 tab_accents.on_checked = [this](bool checked) { 62 m_system_effects.effects().at(Effects::TabAccents) = checked; 63 set_modified(true); 64 }; 65 auto& splitter_knurls = *find_descendant_of_type_named<GUI::CheckBox>("splitter_knurls_checkbox"); 66 splitter_knurls.set_checked(m_system_effects.splitter_knurls()); 67 splitter_knurls.on_checked = [this](bool checked) { 68 m_system_effects.effects().at(Effects::SplitterKnurls) = checked; 69 set_modified(true); 70 }; 71 auto& tooltips = *find_descendant_of_type_named<GUI::CheckBox>("tooltips_checkbox"); 72 tooltips.set_checked(m_system_effects.tooltips()); 73 tooltips.on_checked = [this](bool checked) { 74 m_system_effects.effects().at(Effects::Tooltips) = checked; 75 set_modified(true); 76 }; 77 auto& menu_shadow = *find_descendant_of_type_named<GUI::CheckBox>("menu_shadow_checkbox"); 78 menu_shadow.set_checked(m_system_effects.menu_shadow()); 79 menu_shadow.on_checked = [this](bool checked) { 80 m_system_effects.effects().at(Effects::MenuShadow) = checked; 81 set_modified(true); 82 }; 83 auto& window_shadow = *find_descendant_of_type_named<GUI::CheckBox>("window_shadow_checkbox"); 84 window_shadow.set_checked(m_system_effects.window_shadow()); 85 window_shadow.on_checked = [this](bool checked) { 86 m_system_effects.effects().at(Effects::WindowShadow) = checked; 87 set_modified(true); 88 }; 89 auto& tooltip_shadow = *find_descendant_of_type_named<GUI::CheckBox>("tooltip_shadow_checkbox"); 90 tooltip_shadow.set_checked(m_system_effects.tooltip_shadow()); 91 tooltip_shadow.on_checked = [this](bool checked) { 92 m_system_effects.effects().at(Effects::TooltipShadow) = checked; 93 set_modified(true); 94 }; 95} 96 97ErrorOr<void> EffectsSettingsWidget::load_settings() 98{ 99 auto ws_config = TRY(Core::ConfigFile::open("/etc/WindowServer.ini")); 100 Vector<bool> effects = { 101 ws_config->read_bool_entry("Effects", "AnimateMenus", true), 102 ws_config->read_bool_entry("Effects", "FlashMenus", true), 103 ws_config->read_bool_entry("Effects", "AnimateWindows", true), 104 ws_config->read_bool_entry("Effects", "SmoothScrolling", true), 105 ws_config->read_bool_entry("Effects", "TabAccents", true), 106 ws_config->read_bool_entry("Effects", "SplitterKnurls", true), 107 ws_config->read_bool_entry("Effects", "Tooltips", true), 108 ws_config->read_bool_entry("Effects", "MenuShadow", true), 109 ws_config->read_bool_entry("Effects", "WindowShadow", true), 110 ws_config->read_bool_entry("Effects", "TooltipShadow", true), 111 }; 112 auto geometry = WindowServer::ShowGeometryTools::string_to_enum(ws_config->read_entry("Effects", "ShowGeometry", "OnMoveAndResize")); 113 m_system_effects = { effects, geometry }; 114 115 static constexpr Array list = { 116 "On Move and Resize"sv, 117 "On Move only"sv, 118 "On Resize only"sv, 119 "Never"sv 120 }; 121 for (size_t i = 0; i < list.size(); ++i) 122 TRY(m_geometry_list.try_append(list[i])); 123 m_geometry_combobox->set_model(ItemListModel<DeprecatedString>::create(m_geometry_list)); 124 m_geometry_combobox->set_selected_index(m_system_effects.geometry()); 125 126 return {}; 127} 128 129void EffectsSettingsWidget::apply_settings() 130{ 131 ConnectionToWindowServer::the().async_set_system_effects(m_system_effects.effects(), m_system_effects.geometry()); 132} 133 134} 135 136}