Serenity Operating System
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}