From bba53441ef3592a6315a93a23e27a4da156a6a41 Mon Sep 17 00:00:00 2001 From: Hugh Davenport Date: Fri, 5 Jan 2024 17:24:11 +1300 Subject: [PATCH] Assistant: Enable escalation of commands that need it Ideal for applications such as PartitionEditor. Previously an error about how it needs to run as root was displayed which differed from the behaviour when clicking from the system menus. Use the new AppFile::spawn_with_escalation to perform the escalation --- Userland/Applications/Assistant/Providers.cpp | 22 +++++++++---------- Userland/Applications/Assistant/Providers.h | 13 ++++++----- Userland/Applications/Assistant/main.cpp | 6 ++--- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Userland/Applications/Assistant/Providers.cpp b/Userland/Applications/Assistant/Providers.cpp index 11c5e85c4d..d80ba65314 100644 --- a/Userland/Applications/Assistant/Providers.cpp +++ b/Userland/Applications/Assistant/Providers.cpp @@ -11,11 +11,11 @@ #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -29,7 +29,7 @@ namespace Assistant { -void AppResult::activate() const +void AppResult::activate(GUI::Window& window) const { if (chdir(Core::StandardPaths::home_directory().characters()) < 0) { perror("chdir"); @@ -37,29 +37,29 @@ void AppResult::activate() const } auto arguments_list = m_arguments.split_view(' '); - m_app_file->spawn(arguments_list.span()); + m_app_file->spawn_with_escalation_or_show_error(window, arguments_list.span()); } -void CalculatorResult::activate() const +void CalculatorResult::activate(GUI::Window& window) const { + (void)window; GUI::Clipboard::the().set_plain_text(title()); } -void FileResult::activate() const +void FileResult::activate(GUI::Window& window) const { + (void)window; Desktop::Launcher::open(URL::create_with_file_scheme(title())); } -void TerminalResult::activate() const +void TerminalResult::activate(GUI::Window& window) const { - // FIXME: This should be a GUI::Process::spawn_or_show_error(), however this is a - // Assistant::Result object, which does not have access to the application's GUI::Window* pointer - // (which spawn_or_show_error() needs in case it has to open a error message box). - (void)Core::Process::spawn("/bin/Terminal"sv, Array { "-k", "-e", title().characters() }); + GUI::Process::spawn_or_show_error(&window, "/bin/Terminal"sv, Array { "-k", "-e", title().characters() }); } -void URLResult::activate() const +void URLResult::activate(GUI::Window& window) const { + (void)window; Desktop::Launcher::open(URL::create_with_url_or_path(title())); } diff --git a/Userland/Applications/Assistant/Providers.h b/Userland/Applications/Assistant/Providers.h index b4450bcd7d..a20afc5db4 100644 --- a/Userland/Applications/Assistant/Providers.h +++ b/Userland/Applications/Assistant/Providers.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -23,7 +24,7 @@ class Result : public RefCounted { public: virtual ~Result() = default; - virtual void activate() const = 0; + virtual void activate(GUI::Window&) const = 0; virtual Gfx::Bitmap const* bitmap() const = 0; @@ -61,7 +62,7 @@ public: { } ~AppResult() override = default; - void activate() const override; + void activate(GUI::Window&) const override; virtual Gfx::Bitmap const* bitmap() const override { return m_bitmap; } @@ -79,7 +80,7 @@ public: { } ~CalculatorResult() override = default; - void activate() const override; + void activate(GUI::Window&) const override; virtual Gfx::Bitmap const* bitmap() const override { return m_bitmap; } @@ -94,7 +95,7 @@ public: { } ~FileResult() override = default; - void activate() const override; + void activate(GUI::Window&) const override; virtual Gfx::Bitmap const* bitmap() const override; }; @@ -107,7 +108,7 @@ public: { } ~TerminalResult() override = default; - void activate() const override; + void activate(GUI::Window&) const override; virtual Gfx::Bitmap const* bitmap() const override { return m_bitmap; } @@ -123,7 +124,7 @@ public: { } ~URLResult() override = default; - void activate() const override; + void activate(GUI::Window&) const override; virtual Gfx::Bitmap const* bitmap() const override { return m_bitmap; } diff --git a/Userland/Applications/Assistant/main.cpp b/Userland/Applications/Assistant/main.cpp index fc5da293c4..a80e3df33e 100644 --- a/Userland/Applications/Assistant/main.cpp +++ b/Userland/Applications/Assistant/main.cpp @@ -205,7 +205,7 @@ ErrorOr serenity_main(Main::Arguments arguments) if (!app_state.selected_index.has_value()) return; lockfile.release(); - app_state.results[app_state.selected_index.value()]->activate(); + app_state.results[app_state.selected_index.value()]->activate(window); GUI::Application::the()->quit(); }; text_box.on_up_pressed = [&]() { @@ -251,8 +251,8 @@ ErrorOr serenity_main(Main::Arguments arguments) match.set_icon(result->bitmap()); match.set_text(String::from_byte_string(result->title()).release_value_but_fixme_should_propagate_errors()); match.set_tooltip(result->tooltip()); - match.on_click = [&result](auto) { - result->activate(); + match.on_click = [&](auto) { + result->activate(window); GUI::Application::the()->quit(); }; }