Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include "ClockWidget.h"
10#include "WindowList.h"
11#include <AK/NonnullRefPtr.h>
12#include <LibConfig/Listener.h>
13#include <LibDesktop/AppFile.h>
14#include <LibGUI/Widget.h>
15#include <LibGUI/Window.h>
16#include <LibGfx/ShareableBitmap.h>
17#include <Services/Taskbar/QuickLaunchWidget.h>
18#include <Services/WindowServer/ScreenLayout.h>
19
20class TaskbarWindow final : public GUI::Window
21 , public Config::Listener {
22 C_OBJECT(TaskbarWindow);
23
24public:
25 static ErrorOr<NonnullRefPtr<TaskbarWindow>> create();
26 virtual ~TaskbarWindow() override = default;
27
28 static int taskbar_height() { return 27; }
29 static int taskbar_icon_size() { return 16; }
30
31 virtual void config_string_did_change(DeprecatedString const&, DeprecatedString const&, DeprecatedString const&, DeprecatedString const&) override;
32 virtual void add_system_menu(NonnullRefPtr<GUI::Menu> system_menu);
33
34private:
35 explicit TaskbarWindow();
36 static void show_desktop_button_clicked(unsigned);
37 static void toggle_show_desktop();
38 void on_screen_rects_change(Vector<Gfx::IntRect, 4> const&, size_t);
39 NonnullRefPtr<GUI::Button> create_button(WindowIdentifier const&);
40 void add_window_button(::Window&, WindowIdentifier const&);
41 void remove_window_button(::Window&, bool);
42 void update_window_button(::Window&, bool);
43
44 ErrorOr<void> populate_taskbar();
45 ErrorOr<void> load_assistant();
46
47 virtual void event(Core::Event&) override;
48 virtual void wm_event(GUI::WMEvent&) override;
49 virtual void screen_rects_change_event(GUI::ScreenRectsChangeEvent&) override;
50
51 void update_applet_area();
52
53 bool is_window_on_current_workspace(::Window&) const;
54 void workspace_change_event(unsigned, unsigned);
55
56 void set_start_button_font(Gfx::Font const&);
57
58 RefPtr<GUI::Menu> m_system_menu;
59 RefPtr<GUI::Widget> m_task_button_container;
60 RefPtr<Gfx::Bitmap> m_default_icon;
61
62 Gfx::IntSize m_applet_area_size;
63 RefPtr<GUI::Frame> m_applet_area_container;
64 RefPtr<GUI::Button> m_start_button;
65 RefPtr<GUI::Button> m_show_desktop_button;
66 RefPtr<Taskbar::QuickLaunchWidget> m_quick_launch;
67 RefPtr<Taskbar::ClockWidget> m_clock_widget;
68
69 RefPtr<Desktop::AppFile> m_assistant_app_file;
70
71 unsigned m_current_workspace_row { 0 };
72 unsigned m_current_workspace_column { 0 };
73};