зеркало из https://github.com/electron/electron.git
fix: Launch apps with XDG_ACTIVATION_TOKEN in ozone/wayland (#43480)
* fix: Launch apps with XDG_ACTIVATION_TOKEN in ozone/wayland Ensure apps are launched with the activation token received from xdg_activation_v1 protocol. * add focus_launched_process option
This commit is contained in:
Родитель
6aae1264dd
Коммит
69df09dc90
|
@ -23,6 +23,7 @@
|
||||||
#include "base/posix/eintr_wrapper.h"
|
#include "base/posix/eintr_wrapper.h"
|
||||||
#include "base/process/kill.h"
|
#include "base/process/kill.h"
|
||||||
#include "base/process/launch.h"
|
#include "base/process/launch.h"
|
||||||
|
#include "base/run_loop.h"
|
||||||
#include "base/strings/escape.h"
|
#include "base/strings/escape.h"
|
||||||
#include "base/strings/string_util.h"
|
#include "base/strings/string_util.h"
|
||||||
#include "base/threading/thread_restrictions.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,
|
bool XDGUtil(const std::vector<std::string>& argv,
|
||||||
const base::FilePath& working_directory,
|
const base::FilePath& working_directory,
|
||||||
const bool wait_for_exit,
|
const bool wait_for_exit,
|
||||||
|
const bool focus_launched_process,
|
||||||
platform_util::OpenCallback callback) {
|
platform_util::OpenCallback callback) {
|
||||||
base::LaunchOptions options;
|
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.current_directory = working_directory;
|
||||||
options.allow_new_privs = true;
|
options.allow_new_privs = true;
|
||||||
// xdg-open can fall back on mailcap which eventually might plumb through
|
// 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,
|
const bool wait_for_exit,
|
||||||
platform_util::OpenCallback callback) {
|
platform_util::OpenCallback callback) {
|
||||||
return XDGUtil({"xdg-open", path}, working_directory, wait_for_exit,
|
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) {
|
bool XDGEmail(const std::string& email, const bool wait_for_exit) {
|
||||||
return XDGUtil({"xdg-email", email}, base::FilePath(), wait_for_exit,
|
return XDGUtil({"xdg-email", email}, base::FilePath(), wait_for_exit,
|
||||||
|
/*focus_launched_process=*/true,
|
||||||
platform_util::OpenCallback());
|
platform_util::OpenCallback());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +391,8 @@ bool MoveItemToTrash(const base::FilePath& full_path, bool delete_on_fail) {
|
||||||
argv = {"gio", "trash", filename};
|
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 {
|
namespace internal {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче