Explorar o código

LibGfx+Userland: Make Gfx::SystemTheme propagate errors

This patch introduces error propagation to Gfx::SystemTheme to remove
instances of release_value_but_fixme_should_propagate_errors().

Userland applications that have been affected by this change have been
updated to utilise this propagation and as a result 4 such instances of
the aforementioned method have been removed.
Cygnix Proto %!s(int64=2) %!d(string=hai) anos
pai
achega
806a55eda1

+ 4 - 2
Userland/Applications/DisplaySettings/ThemePreviewWidget.cpp

@@ -19,9 +19,11 @@ ThemePreviewWidget::ThemePreviewWidget(Gfx::Palette const& palette)
     set_fixed_size(304, 201);
 }
 
-void ThemePreviewWidget::set_theme(DeprecatedString path)
+ErrorOr<void> ThemePreviewWidget::set_theme(DeprecatedString path)
 {
-    set_theme_from_file(*Core::File::open(path, Core::OpenMode::ReadOnly).release_value_but_fixme_should_propagate_errors());
+    auto config_file = TRY(Core::File::open(path, Core::OpenMode::ReadOnly));
+    TRY(set_theme_from_file(config_file));
+    return {};
 }
 
 void ThemePreviewWidget::paint_preview(GUI::PaintEvent&)

+ 1 - 1
Userland/Applications/DisplaySettings/ThemePreviewWidget.h

@@ -18,7 +18,7 @@ class ThemePreviewWidget final : public GUI::AbstractThemePreview {
     C_OBJECT(ThemePreviewWidget);
 
 public:
-    void set_theme(DeprecatedString path);
+    ErrorOr<void> set_theme(DeprecatedString path);
 
 private:
     explicit ThemePreviewWidget(Gfx::Palette const& palette);

+ 10 - 3
Userland/Applications/DisplaySettings/ThemesSettingsWidget.cpp

@@ -13,6 +13,7 @@
 #include <LibGUI/Application.h>
 #include <LibGUI/ConnectionToWindowServer.h>
 #include <LibGUI/ItemListModel.h>
+#include <LibGUI/MessageBox.h>
 #include <LibGUI/Process.h>
 
 namespace DisplaySettings {
@@ -21,7 +22,7 @@ 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();
+    m_themes = MUST(Gfx::list_installed_system_themes());
 
     size_t current_theme_index;
     auto current_theme_name = GUI::ConnectionToWindowServer::the().get_system_theme();
@@ -39,7 +40,10 @@ ThemesSettingsWidget::ThemesSettingsWidget(bool& background_settings_changed)
     m_themes_combo->set_model(*GUI::ItemListModel<DeprecatedString>::create(m_theme_names));
     m_themes_combo->on_change = [this](auto&, const GUI::ModelIndex& index) {
         m_selected_theme = &m_themes.at(index.row());
-        m_theme_preview->set_theme(m_selected_theme->path);
+        auto set_theme_result = m_theme_preview->set_theme(m_selected_theme->path);
+        if (set_theme_result.is_error()) {
+            GUI::MessageBox::show_error(window(), DeprecatedString::formatted("There was an error generating the theme preview: {}", set_theme_result.error()));
+        }
         set_modified(true);
     };
     m_themes_combo->set_selected_index(current_theme_index, GUI::AllowCallback::No);
@@ -66,7 +70,10 @@ ThemesSettingsWidget::ThemesSettingsWidget(bool& background_settings_changed)
             if (current_theme_name == theme_meta.name) {
                 m_themes_combo->set_selected_index(index, GUI::AllowCallback::No);
                 m_selected_theme = &m_themes.at(index);
-                m_theme_preview->set_theme(m_selected_theme->path);
+                auto set_theme_result = m_theme_preview->set_theme(m_selected_theme->path);
+                if (set_theme_result.is_error()) {
+                    GUI::MessageBox::show_error(window(), DeprecatedString::formatted("There was an error setting the new theme: {}", set_theme_result.error()));
+                }
             }
             ++index;
         }

+ 9 - 4
Userland/Applications/ThemeEditor/MainWidget.cpp

@@ -208,7 +208,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
         auto response = FileSystemAccessClient::Client::the().try_open_file(&window, "Select theme file", "/res/themes"sv);
         if (response.is_error())
             return;
-        load_from_file(*response.value());
+        auto load_from_file_result = load_from_file(*response.value());
+        if (load_from_file_result.is_error()) {
+            GUI::MessageBox::show_error(&window, DeprecatedString::formatted("Can't open file named {}: {}", response.value()->filename(), load_from_file_result.error()));
+            return;
+        }
     })));
 
     m_save_action = GUI::CommonActions::make_save_action([&](auto&) {
@@ -557,10 +561,10 @@ void MainWidget::show_path_picker_dialog(StringView property_display_name, GUI::
     path_input.set_text(*result);
 }
 
-void MainWidget::load_from_file(Core::File& file)
+ErrorOr<void> MainWidget::load_from_file(Core::File& file)
 {
-    auto config_file = Core::ConfigFile::open(file.filename(), file.leak_fd()).release_value_but_fixme_should_propagate_errors();
-    auto theme = Gfx::load_system_theme(config_file);
+    auto config_file = TRY(Core::ConfigFile::open(file.filename(), file.leak_fd()));
+    auto theme = TRY(Gfx::load_system_theme(config_file));
     VERIFY(theme.is_valid());
 
     auto new_palette = Gfx::Palette(Gfx::PaletteImpl::create_with_anonymous_buffer(theme));
@@ -599,6 +603,7 @@ void MainWidget::load_from_file(Core::File& file)
 
     m_last_modified_time = Time::now_monotonic();
     window()->set_modified(false);
+    return {};
 }
 
 }

+ 1 - 1
Userland/Applications/ThemeEditor/MainWidget.h

@@ -85,7 +85,7 @@ public:
     ErrorOr<void> initialize_menubar(GUI::Window&);
     GUI::Window::CloseRequestDecision request_close();
     void update_title();
-    void load_from_file(Core::File&);
+    ErrorOr<void> load_from_file(Core::File&);
 
 private:
     MainWidget();

+ 4 - 1
Userland/Applications/ThemeEditor/PreviewWidget.cpp

@@ -160,7 +160,10 @@ void PreviewWidget::drop_event(GUI::DropEvent& event)
         auto response = FileSystemAccessClient::Client::the().try_request_file(window(), urls.first().path(), Core::OpenMode::ReadOnly);
         if (response.is_error())
             return;
-        set_theme_from_file(*response.value());
+
+        auto set_theme_from_file_result = set_theme_from_file(response.release_value());
+        if (set_theme_from_file_result.is_error())
+            GUI::MessageBox::show_error(window(), DeprecatedString::formatted("Setting theme from file has failed: {}", set_theme_from_file_result.error()));
     }
 }
 

+ 5 - 2
Userland/Applications/ThemeEditor/main.cpp

@@ -56,8 +56,11 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
                 auto response = FileSystemAccessClient::Client::the().try_request_file_read_only_approved(window, path.value());
                 if (response.is_error())
                     GUI::MessageBox::show_error(window, DeprecatedString::formatted("Opening \"{}\" failed: {}", path.value(), response.error()));
-                else
-                    main_widget->load_from_file(response.release_value());
+                else {
+                    auto load_from_file_result = main_widget->load_from_file(response.release_value());
+                    if (load_from_file_result.is_error())
+                        GUI::MessageBox::show_error(window, DeprecatedString::formatted("Loading theme from file has failed: {}", load_from_file_result.error()));
+                }
             });
     }
 

+ 4 - 4
Userland/Libraries/LibGUI/AbstractThemePreview.cpp

@@ -85,16 +85,16 @@ void AbstractThemePreview::set_theme(Core::AnonymousBuffer const& theme_buffer)
     set_preview_palette(m_preview_palette);
 }
 
-void AbstractThemePreview::set_theme_from_file(Core::File& file)
+ErrorOr<void> AbstractThemePreview::set_theme_from_file(Core::File& file)
 {
-    auto config_file = Core::ConfigFile::open(file.filename(), file.leak_fd()).release_value_but_fixme_should_propagate_errors();
-    auto theme = Gfx::load_system_theme(config_file);
-    VERIFY(theme.is_valid());
+    auto config_file = TRY(Core::ConfigFile::open(file.filename(), file.leak_fd()));
+    auto theme = TRY(Gfx::load_system_theme(config_file));
 
     m_preview_palette = Gfx::Palette(Gfx::PaletteImpl::create_with_anonymous_buffer(theme));
     set_preview_palette(m_preview_palette);
     if (on_theme_load_from_file)
         on_theme_load_from_file(file.filename());
+    return {};
 }
 
 void AbstractThemePreview::paint_window(StringView title, Gfx::IntRect const& rect, Gfx::WindowTheme::WindowState state, Gfx::Bitmap const& icon, int button_count)

+ 1 - 1
Userland/Libraries/LibGUI/AbstractThemePreview.h

@@ -24,7 +24,7 @@ public:
 
     Gfx::Palette const& preview_palette() const { return m_preview_palette; }
     void set_preview_palette(Gfx::Palette const&);
-    void set_theme_from_file(Core::File&);
+    ErrorOr<void> set_theme_from_file(Core::File&);
     void set_theme(Core::AnonymousBuffer const&);
 
     void paint_window(StringView title, Gfx::IntRect const& rect, Gfx::WindowTheme::WindowState, Gfx::Bitmap const& icon, int button_count = 3);

+ 7 - 6
Userland/Libraries/LibGfx/SystemTheme.cpp

@@ -31,9 +31,9 @@ void set_system_theme(Core::AnonymousBuffer buffer)
     theme_page = theme_buffer.data<SystemTheme>();
 }
 
-Core::AnonymousBuffer load_system_theme(Core::ConfigFile const& file)
+ErrorOr<Core::AnonymousBuffer> load_system_theme(Core::ConfigFile const& file)
 {
-    auto buffer = Core::AnonymousBuffer::create_with_size(sizeof(SystemTheme)).release_value();
+    auto buffer = TRY(Core::AnonymousBuffer::create_with_size(sizeof(SystemTheme)));
 
     auto* data = buffer.data<SystemTheme>();
 
@@ -148,19 +148,20 @@ Core::AnonymousBuffer load_system_theme(Core::ConfigFile const& file)
     return buffer;
 }
 
-Core::AnonymousBuffer load_system_theme(DeprecatedString const& path)
+ErrorOr<Core::AnonymousBuffer> load_system_theme(DeprecatedString const& path)
 {
-    return load_system_theme(Core::ConfigFile::open(path).release_value_but_fixme_should_propagate_errors());
+    auto config_file = TRY(Core::ConfigFile::open(path));
+    return TRY(load_system_theme(config_file));
 }
 
-Vector<SystemThemeMetaData> list_installed_system_themes()
+ErrorOr<Vector<SystemThemeMetaData>> list_installed_system_themes()
 {
     Vector<SystemThemeMetaData> system_themes;
     Core::DirIterator dt("/res/themes", Core::DirIterator::SkipDots);
     while (dt.has_next()) {
         auto theme_name = dt.next_path();
         auto theme_path = DeprecatedString::formatted("/res/themes/{}", theme_name);
-        system_themes.append({ LexicalPath::title(theme_name), theme_path });
+        TRY(system_themes.try_append({ LexicalPath::title(theme_name), theme_path }));
     }
     quick_sort(system_themes, [](auto& a, auto& b) { return a.name < b.name; });
     return system_themes;

+ 3 - 3
Userland/Libraries/LibGfx/SystemTheme.h

@@ -271,15 +271,15 @@ struct SystemTheme {
 
 Core::AnonymousBuffer& current_system_theme_buffer();
 void set_system_theme(Core::AnonymousBuffer);
-Core::AnonymousBuffer load_system_theme(Core::ConfigFile const&);
-Core::AnonymousBuffer load_system_theme(DeprecatedString const& path);
+ErrorOr<Core::AnonymousBuffer> load_system_theme(Core::ConfigFile const&);
+ErrorOr<Core::AnonymousBuffer> load_system_theme(DeprecatedString const& path);
 
 struct SystemThemeMetaData {
     DeprecatedString name;
     DeprecatedString path;
 };
 
-Vector<SystemThemeMetaData> list_installed_system_themes();
+ErrorOr<Vector<SystemThemeMetaData>> list_installed_system_themes();
 
 }
 

+ 1 - 1
Userland/Services/Taskbar/main.cpp

@@ -227,7 +227,7 @@ ErrorOr<NonnullRefPtr<GUI::Menu>> build_system_menu(GUI::Window& window)
     g_themes_menu = &system_menu->add_submenu("&Themes");
     g_themes_menu->set_icon(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/themes.png"sv).release_value_but_fixme_should_propagate_errors());
 
-    g_themes = Gfx::list_installed_system_themes();
+    g_themes = TRY(Gfx::list_installed_system_themes());
     auto current_theme_name = GUI::ConnectionToWindowServer::the().get_system_theme();
 
     {

+ 6 - 4
Userland/Services/WindowServer/WindowManager.cpp

@@ -2064,9 +2064,12 @@ void WindowManager::invalidate_after_theme_or_font_change()
 
 bool WindowManager::update_theme(DeprecatedString theme_path, DeprecatedString theme_name, bool keep_desktop_background)
 {
-    auto new_theme = Gfx::load_system_theme(theme_path);
-    if (!new_theme.is_valid())
+    auto error_or_new_theme = Gfx::load_system_theme(theme_path);
+    if (error_or_new_theme.is_error()) {
+        dbgln("WindowManager: Updating theme failed, error {}", error_or_new_theme.error());
         return false;
+    }
+    auto new_theme = error_or_new_theme.release_value();
     m_theme_overridden = false;
     Gfx::set_system_theme(new_theme);
     m_palette = Gfx::PaletteImpl::create_with_anonymous_buffer(new_theme);
@@ -2101,8 +2104,7 @@ void WindowManager::clear_theme_override()
 {
     m_theme_overridden = false;
     auto previous_theme_name = m_config->read_entry("Theme", "Name");
-    auto previous_theme = Gfx::load_system_theme(DeprecatedString::formatted("/res/themes/{}.ini", previous_theme_name));
-    VERIFY(previous_theme.is_valid());
+    auto previous_theme = MUST(Gfx::load_system_theme(DeprecatedString::formatted("/res/themes/{}.ini", previous_theme_name)));
     Gfx::set_system_theme(previous_theme);
     m_palette = Gfx::PaletteImpl::create_with_anonymous_buffer(previous_theme);
     invalidate_after_theme_or_font_change();

+ 1 - 2
Userland/Services/WindowServer/main.cpp

@@ -44,8 +44,7 @@ ErrorOr<int> serenity_main(Main::Arguments)
     auto wm_config = TRY(Core::ConfigFile::open("/etc/WindowServer.ini"));
     auto theme_name = wm_config->read_entry("Theme", "Name", "Default");
 
-    auto theme = Gfx::load_system_theme(DeprecatedString::formatted("/res/themes/{}.ini", theme_name));
-    VERIFY(theme.is_valid());
+    auto theme = TRY(Gfx::load_system_theme(DeprecatedString::formatted("/res/themes/{}.ini", theme_name)));
     Gfx::set_system_theme(theme);
     auto palette = Gfx::PaletteImpl::create_with_anonymous_buffer(theme);
 

+ 7 - 4
Userland/Utilities/headless-browser.cpp

@@ -771,10 +771,13 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
 
     auto page_client = HeadlessBrowserPageClient::create();
 
-    if (!resources_folder.is_empty())
-        page_client->setup_palette(Gfx::load_system_theme(LexicalPath::join(resources_folder, "themes/Default.ini"sv).string()));
-    else
-        page_client->setup_palette(Gfx::load_system_theme("/res/themes/Default.ini"));
+    if (!resources_folder.is_empty()) {
+        auto system_theme = TRY(Gfx::load_system_theme(LexicalPath::join(resources_folder, "themes/Default.ini"sv).string()));
+        page_client->setup_palette(system_theme);
+    } else {
+        auto system_theme = TRY(Gfx::load_system_theme("/res/themes/Default.ini"));
+        page_client->setup_palette(system_theme);
+    }
 
     dbgln("Loading {}", url);
     page_client->load(AK::URL(url));