Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <AK/Badge.h>
28#include <LibCore/ConfigFile.h>
29#include <LibGUI/Desktop.h>
30#include <LibGUI/WindowServerConnection.h>
31#include <string.h>
32#include <unistd.h>
33
34namespace GUI {
35
36Desktop& Desktop::the()
37{
38 static Desktop* the;
39 if (!the)
40 the = new Desktop;
41 return *the;
42}
43
44Desktop::Desktop()
45{
46}
47
48void Desktop::did_receive_screen_rect(Badge<WindowServerConnection>, const Gfx::Rect& rect)
49{
50 if (m_rect == rect)
51 return;
52 m_rect = rect;
53 if (on_rect_change)
54 on_rect_change(rect);
55}
56
57bool Desktop::set_wallpaper(const StringView& path)
58{
59 WindowServerConnection::the().post_message(Messages::WindowServer::AsyncSetWallpaper(path));
60 auto ret_val = WindowServerConnection::the().wait_for_specific_message<Messages::WindowClient::AsyncSetWallpaperFinished>()->success();
61
62 if (ret_val) {
63 RefPtr<Core::ConfigFile> config = Core::ConfigFile::get_for_app("WindowManager");
64 dbg() << "Saving wallpaper path '" << path << "' to config file at " << config->file_name();
65 config->write_entry("Background", "Wallpaper", path);
66 config->sync();
67 }
68
69 return ret_val;
70}
71
72String Desktop::wallpaper() const
73{
74 return WindowServerConnection::the().send_sync<Messages::WindowServer::GetWallpaper>()->path();
75}
76
77}