From a0e7a4b9a8931f293a857adb1d4b2cdae79977f8 Mon Sep 17 00:00:00 2001 From: James Puleo Date: Sun, 13 Feb 2022 13:00:57 -0500 Subject: WindowServer+Userland: Pass wallpapers as `Gfx::Bitmap` instead of path The WindowServer _really_ does not need to know the filesystem path to it's wallpaper, and allows setting arbitrary wallpapers (those outside of `/res/wallpapers`). The GUI::Desktop will keep track of the path to the wallpaper (if any), and save it to config if desired (to be persisted). This avoids the need to `unveil` paths to the wallpaper, fixing #11158 --- Userland/Libraries/LibGUI/Desktop.cpp | 31 ++++++++++++++++++++----------- Userland/Libraries/LibGUI/Desktop.h | 6 ++++-- 2 files changed, 24 insertions(+), 13 deletions(-) (limited to 'Userland/Libraries') diff --git a/Userland/Libraries/LibGUI/Desktop.cpp b/Userland/Libraries/LibGUI/Desktop.cpp index 9c5f500db5..7c42ea8a12 100644 --- a/Userland/Libraries/LibGUI/Desktop.cpp +++ b/Userland/Libraries/LibGUI/Desktop.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -53,22 +54,30 @@ void Desktop::set_wallpaper_mode(StringView mode) WindowServerConnection::the().async_set_wallpaper_mode(mode); } -bool Desktop::set_wallpaper(StringView path, bool save_config) +String Desktop::wallpaper_path() const { - WindowServerConnection::the().async_set_wallpaper(path); + return Config::read_string("WindowManager", "Background", "Wallpaper"); +} + +RefPtr Desktop::wallpaper_bitmap() const +{ + return WindowServerConnection::the().get_wallpaper().bitmap(); +} + +bool Desktop::set_wallpaper(RefPtr wallpaper_bitmap, Optional path) +{ + if (m_is_setting_desktop_wallpaper) + return false; + + TemporaryChange is_setting_desktop_wallpaper_change(m_is_setting_desktop_wallpaper, true); + WindowServerConnection::the().async_set_wallpaper(wallpaper_bitmap ? wallpaper_bitmap->to_shareable_bitmap() : Gfx::ShareableBitmap {}); auto ret_val = WindowServerConnection::the().wait_for_specific_message()->success(); - if (ret_val && save_config) { - dbgln("Saving wallpaper path '{}' to ConfigServer", path); - Config::write_string("WindowManager", "Background", "Wallpaper", path); + if (ret_val && path.has_value()) { + dbgln("Saving wallpaper path '{}' to ConfigServer", *path); + Config::write_string("WindowManager", "Background", "Wallpaper", *path); } return ret_val; } - -String Desktop::wallpaper() const -{ - return WindowServerConnection::the().get_wallpaper(); -} - } diff --git a/Userland/Libraries/LibGUI/Desktop.h b/Userland/Libraries/LibGUI/Desktop.h index c29ec616b1..a80f10f4b3 100644 --- a/Userland/Libraries/LibGUI/Desktop.h +++ b/Userland/Libraries/LibGUI/Desktop.h @@ -29,8 +29,9 @@ public: void set_wallpaper_mode(StringView mode); - String wallpaper() const; - bool set_wallpaper(StringView path, bool save_config = true); + String wallpaper_path() const; + RefPtr wallpaper_bitmap() const; + bool set_wallpaper(RefPtr wallpaper_bitmap, Optional path); Gfx::IntRect rect() const { return m_bounding_rect; } const Vector& rects() const { return m_rects; } @@ -56,6 +57,7 @@ private: unsigned m_workspace_rows { 1 }; unsigned m_workspace_columns { 1 }; Vector> m_receive_rects_callbacks; + bool m_is_setting_desktop_wallpaper { false }; }; } -- cgit v1.2.3