diff options
author | Maciej <sppmacd@pm.me> | 2021-12-29 17:06:14 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-01-21 13:44:36 +0100 |
commit | 3022baddc23d80fc90abcd32ac14b51b5f718889 (patch) | |
tree | 644ad8607cac8abb9377758d78e67ea0841f0742 /Userland | |
parent | 2e8e959896aed1802b03b82eab37aa0b4c36d159 (diff) | |
download | serenity-3022baddc23d80fc90abcd32ac14b51b5f718889.zip |
Taskbar: Support arbitrary executables as QuickLaunch entries
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Services/Taskbar/QuickLaunchWidget.cpp | 40 | ||||
-rw-r--r-- | Userland/Services/Taskbar/QuickLaunchWidget.h | 15 |
2 files changed, 51 insertions, 4 deletions
diff --git a/Userland/Services/Taskbar/QuickLaunchWidget.cpp b/Userland/Services/Taskbar/QuickLaunchWidget.cpp index f18685b86f..025bc39959 100644 --- a/Userland/Services/Taskbar/QuickLaunchWidget.cpp +++ b/Userland/Services/Taskbar/QuickLaunchWidget.cpp @@ -5,13 +5,18 @@ */ #include "QuickLaunchWidget.h" +#include "LibCore/IODevice.h" +#include <AK/LexicalPath.h> #include <LibConfig/Client.h> #include <LibCore/MimeData.h> +#include <LibCore/Process.h> #include <LibCore/System.h> #include <LibGUI/BoxLayout.h> +#include <LibGUI/FileIconProvider.h> #include <LibGUI/Menu.h> #include <LibGUI/MessageBox.h> #include <serenity.h> +#include <sys/stat.h> namespace Taskbar { @@ -39,6 +44,24 @@ ErrorOr<void> QuickLaunchEntryAppFile::launch() const return {}; } +ErrorOr<void> QuickLaunchEntryExecutable::launch() const +{ + auto pid = Core::Process::spawn(m_path); + if (pid < 0) + return Error::from_syscall("Core::Process::spawn", -errno); + return {}; +} + +GUI::Icon QuickLaunchEntryExecutable::icon() const +{ + return GUI::FileIconProvider::icon_for_executable(m_path); +} + +String QuickLaunchEntryExecutable::name() const +{ + return LexicalPath { m_path }.basename(); +} + QuickLaunchWidget::QuickLaunchWidget() { set_shrink_to_fit(true); @@ -73,17 +96,26 @@ QuickLaunchWidget::~QuickLaunchWidget() OwnPtr<QuickLaunchEntry> QuickLaunchEntry::create_from_config_value(StringView value) { - if (value.ends_with(".af")) { + if (!value.starts_with("/") && value.ends_with(".af")) { auto af_path = String::formatted("{}/{}", Desktop::AppFile::APP_FILES_DIRECTORY, value); return make<QuickLaunchEntryAppFile>(Desktop::AppFile::open(af_path)); - } - return {}; + } else + return create_from_path(value); } OwnPtr<QuickLaunchEntry> QuickLaunchEntry::create_from_path(StringView path) { if (path.ends_with(".af")) return make<QuickLaunchEntryAppFile>(Desktop::AppFile::open(path)); + auto stat_or_error = Core::System::stat(path); + if (stat_or_error.is_error()) { + dbgln("Failed to stat quick launch entry file: {}", stat_or_error.release_error()); + return {}; + } + auto stat = stat_or_error.release_value(); + if (stat.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) + return make<QuickLaunchEntryExecutable>(path); + dbgln("Config value {} is not a valid quick launch entry", path); return {}; } @@ -140,7 +172,7 @@ void QuickLaunchWidget::drop_event(GUI::DropEvent& event) if (entry) { auto item_name = entry->name().replace(" ", "", true); add_or_adjust_button(item_name, entry.release_nonnull()); - Config::write_string("Taskbar", quick_launch, item_name, url.basename()); + Config::write_string("Taskbar", quick_launch, item_name, url.path()); } } } diff --git a/Userland/Services/Taskbar/QuickLaunchWidget.h b/Userland/Services/Taskbar/QuickLaunchWidget.h index fccecf88d9..c2da52b131 100644 --- a/Userland/Services/Taskbar/QuickLaunchWidget.h +++ b/Userland/Services/Taskbar/QuickLaunchWidget.h @@ -39,6 +39,21 @@ private: NonnullRefPtr<Desktop::AppFile> m_app_file; }; +class QuickLaunchEntryExecutable : public QuickLaunchEntry { +public: + explicit QuickLaunchEntryExecutable(String path) + : m_path(move(path)) + { + } + + virtual ErrorOr<void> launch() const override; + virtual GUI::Icon icon() const override; + virtual String name() const override; + +private: + String m_path; +}; + class QuickLaunchWidget : public GUI::Frame , public Config::Listener { C_OBJECT(QuickLaunchWidget); |