diff options
author | James Puleo <james@jame.xyz> | 2022-02-13 13:00:57 -0500 |
---|---|---|
committer | Ali Mohammad Pur <Ali.mpfard@gmail.com> | 2022-02-14 16:38:42 +0330 |
commit | a0e7a4b9a8931f293a857adb1d4b2cdae79977f8 (patch) | |
tree | d386c69b2508af77472a1d67c160d7853ec36600 /Userland/Libraries | |
parent | f53854598752745553c9185740330ea447d4b7c3 (diff) | |
download | serenity-a0e7a4b9a8931f293a857adb1d4b2cdae79977f8.zip |
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
Diffstat (limited to 'Userland/Libraries')
-rw-r--r-- | Userland/Libraries/LibGUI/Desktop.cpp | 31 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/Desktop.h | 6 |
2 files changed, 24 insertions, 13 deletions
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 <AK/Badge.h> +#include <AK/TemporaryChange.h> #include <LibGUI/Desktop.h> #include <LibGUI/WindowServerConnection.h> #include <string.h> @@ -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<Gfx::Bitmap> Desktop::wallpaper_bitmap() const +{ + return WindowServerConnection::the().get_wallpaper().bitmap(); +} + +bool Desktop::set_wallpaper(RefPtr<Gfx::Bitmap> wallpaper_bitmap, Optional<String> 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<Messages::WindowClient::SetWallpaperFinished>()->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<Gfx::Bitmap> wallpaper_bitmap() const; + bool set_wallpaper(RefPtr<Gfx::Bitmap> wallpaper_bitmap, Optional<String> path); Gfx::IntRect rect() const { return m_bounding_rect; } const Vector<Gfx::IntRect, 4>& rects() const { return m_rects; } @@ -56,6 +57,7 @@ private: unsigned m_workspace_rows { 1 }; unsigned m_workspace_columns { 1 }; Vector<Function<void(Desktop&)>> m_receive_rects_callbacks; + bool m_is_setting_desktop_wallpaper { false }; }; } |