fix: Launch apps with XDG_ACTIVATION_TOKEN in ozone/wayland (#43579)

* fix: Launch apps with XDG_ACTIVATION_TOKEN in ozone/wayland

Ensure apps are launched with the activation token received from
xdg_activation_v1 protocol.

Co-authored-by: Orko Garai <orko@igalia.com>

* add focus_launched_process option

Co-authored-by: Orko Garai <orko@igalia.com>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Orko Garai <orko@igalia.com>
This commit is contained in:
trop[bot] 2024-09-05 15:00:15 -05:00 committed by GitHub
parent bf10a437bc
commit 1d3200d7da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -23,6 +23,7 @@
#include "base/posix/eintr_wrapper.h"
#include "base/process/kill.h"
#include "base/process/launch.h"
#include "base/run_loop.h"
#include "base/strings/escape.h"
#include "base/strings/string_util.h"
#include "base/threading/thread_restrictions.h"
@ -270,8 +271,21 @@ std::string GetErrorDescription(int error_code) {
bool XDGUtil(const std::vector<std::string>& argv,
const base::FilePath& working_directory,
const bool wait_for_exit,
const bool focus_launched_process,
platform_util::OpenCallback callback) {
base::LaunchOptions options;
if (focus_launched_process) {
base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
base::RepeatingClosure quit_loop = run_loop.QuitClosure();
base::nix::CreateLaunchOptionsWithXdgActivation(base::BindOnce(
[](base::RepeatingClosure quit_loop, base::LaunchOptions* options_out,
base::LaunchOptions options) {
*options_out = std::move(options);
std::move(quit_loop).Run();
},
std::move(quit_loop), &options));
run_loop.Run();
}
options.current_directory = working_directory;
options.allow_new_privs = true;
// xdg-open can fall back on mailcap which eventually might plumb through
@ -303,11 +317,12 @@ bool XDGOpen(const base::FilePath& working_directory,
const bool wait_for_exit,
platform_util::OpenCallback callback) {
return XDGUtil({"xdg-open", path}, working_directory, wait_for_exit,
std::move(callback));
/*focus_launched_process=*/true, std::move(callback));
}
bool XDGEmail(const std::string& email, const bool wait_for_exit) {
return XDGUtil({"xdg-email", email}, base::FilePath(), wait_for_exit,
/*focus_launched_process=*/true,
platform_util::OpenCallback());
}
@ -376,7 +391,8 @@ bool MoveItemToTrash(const base::FilePath& full_path, bool delete_on_fail) {
argv = {"gio", "trash", filename};
}
return XDGUtil(argv, base::FilePath(), true, platform_util::OpenCallback());
return XDGUtil(argv, base::FilePath(), true, /*focus_launched_process=*/false,
platform_util::OpenCallback());
}
namespace internal {