diff --git a/Userland/Services/Taskbar/CMakeLists.txt b/Userland/Services/Taskbar/CMakeLists.txt index dd04d7584d..5f3770d0f5 100644 --- a/Userland/Services/Taskbar/CMakeLists.txt +++ b/Userland/Services/Taskbar/CMakeLists.txt @@ -14,5 +14,5 @@ set(SOURCES ) serenity_bin(Taskbar) -target_link_libraries(Taskbar LibGUI LibDesktop) +target_link_libraries(Taskbar LibGUI LibDesktop LibConfig) serenity_install_headers(Services/Taskbar) diff --git a/Userland/Services/Taskbar/TaskbarWindow.cpp b/Userland/Services/Taskbar/TaskbarWindow.cpp index e2a5555039..071db6ee18 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.cpp +++ b/Userland/Services/Taskbar/TaskbarWindow.cpp @@ -26,6 +26,9 @@ #include #include +constexpr const char* quick_launch = "QuickLaunch"; +constexpr int quick_launch_button_size = 24; + class TaskbarWidget final : public GUI::Widget { C_OBJECT(TaskbarWidget); @@ -108,16 +111,42 @@ void TaskbarWindow::show_desktop_button_clicked(unsigned) GUI::WindowManagerServerConnection::the().async_toggle_show_desktop(); } +void TaskbarWindow::config_key_was_removed(String const& domain, String const& group, String const& key) +{ + if (domain == "Taskbar" && group == quick_launch) { + auto button = m_quick_launch_bar->find_child_of_type_named(key); + if (button) + m_quick_launch_bar->remove_child(*button); + } +} + +void TaskbarWindow::config_string_did_change(String const& domain, String const& group, String const& key, String const& value) +{ + if (domain == "Taskbar" && group == quick_launch) { + auto af_path = String::formatted("{}/{}", Desktop::AppFile::APP_FILES_DIRECTORY, value); + auto af = Desktop::AppFile::open(af_path); + if (!af->is_valid()) + return; + + auto button = m_quick_launch_bar->find_child_of_type_named(key); + if (button) { + set_quick_launch_button_data(*button, key, af); + } else { + auto& new_button = m_quick_launch_bar->add(); + set_quick_launch_button_data(new_button, key, af); + } + } +} + void TaskbarWindow::create_quick_launch_bar() { - auto& quick_launch_bar = main_widget()->add(); - quick_launch_bar.set_shrink_to_fit(true); - quick_launch_bar.set_layout(); - quick_launch_bar.layout()->set_spacing(0); - quick_launch_bar.set_frame_thickness(0); + m_quick_launch_bar = main_widget()->add(); + m_quick_launch_bar->set_shrink_to_fit(true); + m_quick_launch_bar->set_layout(); + m_quick_launch_bar->layout()->set_spacing(0); + m_quick_launch_bar->set_frame_thickness(0); auto config = Core::ConfigFile::open_for_app("Taskbar"); - constexpr const char* quick_launch = "QuickLaunch"; // FIXME: Core::ConfigFile does not keep the order of the entries. for (auto& name : config->keys(quick_launch)) { @@ -126,36 +155,41 @@ void TaskbarWindow::create_quick_launch_bar() auto af = Desktop::AppFile::open(af_path); if (!af->is_valid()) continue; - auto app_executable = af->executable(); - auto app_run_in_terminal = af->run_in_terminal(); - const int button_size = 24; - auto& button = quick_launch_bar.add(); - button.set_fixed_size(button_size, button_size); - button.set_button_style(Gfx::ButtonStyle::Coolbar); - button.set_icon(af->icon().bitmap_for_size(16)); - button.set_tooltip(af->name()); - button.on_click = [app_executable, app_run_in_terminal](auto) { - pid_t pid = fork(); - if (pid < 0) { - perror("fork"); - } else if (pid == 0) { - if (chdir(Core::StandardPaths::home_directory().characters()) < 0) { - perror("chdir"); - exit(1); - } - if (app_run_in_terminal) - execl("/bin/Terminal", "Terminal", "-e", app_executable.characters(), nullptr); - else - execl(app_executable.characters(), app_executable.characters(), nullptr); - perror("execl"); - VERIFY_NOT_REACHED(); - } else { - if (disown(pid) < 0) - perror("disown"); - } - }; + auto& button = m_quick_launch_bar->add(); + set_quick_launch_button_data(button, name, af); } - quick_launch_bar.set_fixed_height(24); + m_quick_launch_bar->set_fixed_height(24); +} + +void TaskbarWindow::set_quick_launch_button_data(GUI::Button& button, String const& button_name, NonnullRefPtr app_file) +{ + auto app_executable = app_file->executable(); + auto app_run_in_terminal = app_file->run_in_terminal(); + button.set_fixed_size(quick_launch_button_size, quick_launch_button_size); + button.set_button_style(Gfx::ButtonStyle::Coolbar); + button.set_icon(app_file->icon().bitmap_for_size(16)); + button.set_tooltip(app_file->name()); + button.set_name(button_name); + button.on_click = [app_executable, app_run_in_terminal](auto) { + pid_t pid = fork(); + if (pid < 0) { + perror("fork"); + } else if (pid == 0) { + if (chdir(Core::StandardPaths::home_directory().characters()) < 0) { + perror("chdir"); + exit(1); + } + if (app_run_in_terminal) + execl("/bin/Terminal", "Terminal", "-e", app_executable.characters(), nullptr); + else + execl(app_executable.characters(), app_executable.characters(), nullptr); + perror("execl"); + VERIFY_NOT_REACHED(); + } else { + if (disown(pid) < 0) + perror("disown"); + } + }; } void TaskbarWindow::on_screen_rects_change(const Vector& rects, size_t main_screen_index) diff --git a/Userland/Services/Taskbar/TaskbarWindow.h b/Userland/Services/Taskbar/TaskbarWindow.h index 424241f6ad..dd71950453 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.h +++ b/Userland/Services/Taskbar/TaskbarWindow.h @@ -7,11 +7,15 @@ #pragma once #include "WindowList.h" +#include #include #include #include +#include +#include -class TaskbarWindow final : public GUI::Window { +class TaskbarWindow final : public GUI::Window + , public Config::Listener { C_OBJECT(TaskbarWindow); public: @@ -20,10 +24,14 @@ public: static int taskbar_height() { return 27; } static int taskbar_icon_size() { return 16; } + virtual void config_key_was_removed(String const&, String const&, String const&) override; + virtual void config_string_did_change(String const&, String const&, String const&, String const&) override; + private: explicit TaskbarWindow(NonnullRefPtr start_menu); static void show_desktop_button_clicked(unsigned); void create_quick_launch_bar(); + void set_quick_launch_button_data(GUI::Button&, String const&, NonnullRefPtr); void on_screen_rects_change(const Vector&, size_t); NonnullRefPtr create_button(const WindowIdentifier&); void add_window_button(::Window&, const WindowIdentifier&); @@ -45,6 +53,7 @@ private: NonnullRefPtr m_start_menu; RefPtr m_task_button_container; RefPtr m_default_icon; + RefPtr m_quick_launch_bar; Gfx::IntSize m_applet_area_size; RefPtr m_applet_area_container; diff --git a/Userland/Services/Taskbar/main.cpp b/Userland/Services/Taskbar/main.cpp index 780f415b09..5199d2586d 100644 --- a/Userland/Services/Taskbar/main.cpp +++ b/Userland/Services/Taskbar/main.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -37,8 +38,9 @@ int main(int argc, char** argv) perror("pledge"); return 1; } - auto app = GUI::Application::construct(argc, argv); + Config::pledge_domains("Taskbar"); + Config::monitor_domain("Taskbar"); app->event_loop().register_signal(SIGCHLD, [](int) { // Wait all available children while (waitpid(-1, nullptr, WNOHANG) > 0)