diff --git a/Userland/Services/Taskbar/TaskbarWindow.cpp b/Userland/Services/Taskbar/TaskbarWindow.cpp index 85aba4d7e5..cb106c681e 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.cpp +++ b/Userland/Services/Taskbar/TaskbarWindow.cpp @@ -2,6 +2,7 @@ * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2021, Spencer Dixon * Copyright (c) 2023, David Ganz + * Copyright (c) 2024, Wellington Santos * * SPDX-License-Identifier: BSD-2-Clause */ @@ -14,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +39,20 @@ class TaskbarWidget final : public GUI::Widget { public: virtual ~TaskbarWidget() override = default; + static ErrorOr> create(); + +protected: + virtual void context_menu_event(GUI::ContextMenuEvent& event) override + { + size_t visible_windows_count = 0; + WindowList::the().for_each_window([&](auto& window) { + if (!window.is_minimized()) + visible_windows_count += 1; + }); + m_show_desktop_action->set_text(visible_windows_count >= 1 ? "Show Desktop" : "Show open Windows"); + m_context_menu->popup(event.screen_position()); + } + private: TaskbarWidget() = default; @@ -54,8 +71,44 @@ private: static_cast(button)->update_taskbar_rect(); }); } + + ErrorOr create_context_menu(); + + RefPtr m_context_menu; + RefPtr m_show_desktop_action; }; +ErrorOr> TaskbarWidget::create() +{ + auto widget = TaskbarWidget::construct(); + TRY(widget->create_context_menu()); + return widget; +} + +ErrorOr TaskbarWidget::create_context_menu() +{ + m_context_menu = GUI::Menu::construct(); + + m_show_desktop_action = GUI::Action::create("Show Desktop", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/desktop.png"sv)), [](auto&) { + GUI::ConnectionToWindowManagerServer::the().async_toggle_show_desktop(); + }); + + auto open_settings_action = GUI::Action::create("&Settings", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/settings.png"sv)), [this](auto&) { + GUI::Process::spawn_or_show_error(window(), "/bin/Settings"sv); + }); + + auto open_system_monitor_action = GUI::Action::create("System &Monitor", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/app-system-monitor.png"sv)), [this](auto&) { + GUI::Process::spawn_or_show_error(window(), "/bin/SystemMonitor"sv); + }); + + m_context_menu->add_action(*open_system_monitor_action); + m_context_menu->add_action(*open_settings_action); + m_context_menu->add_separator(); + m_context_menu->add_action(*m_show_desktop_action); + + return {}; +} + ErrorOr> TaskbarWindow::create() { auto window = TRY(AK::adopt_nonnull_ref_or_enomem(new (nothrow) TaskbarWindow())); @@ -74,7 +127,9 @@ TaskbarWindow::TaskbarWindow() ErrorOr TaskbarWindow::populate_taskbar() { - auto main_widget = set_main_widget(); + auto main_widget = TRY(TaskbarWidget::create()); + set_main_widget(main_widget); + main_widget->set_layout(GUI::Margins { 2, 3, 0, 3 }); m_quick_launch = TRY(Taskbar::QuickLaunchWidget::create());