From 737b9f39c3ec944a4a47f55a1ec3e59540e98cf9 Mon Sep 17 00:00:00 2001 From: donlaci Date: Wed, 25 Sep 2024 14:00:26 +0200 Subject: [PATCH] [Workspaces] launch same apps sequentially --- .../WorkspacesLauncher/AppLauncher.cpp | 24 ++++++++++++------ .../WorkspacesLauncher/AppLauncher.h | 2 +- .../WorkspacesLauncher/Launcher.cpp | 13 +++++++--- .../Workspaces/WorkspacesLauncher/Launcher.h | 3 ++- .../WorkspacesLib/LaunchingStatus.cpp | 25 +++++++++++++++++++ .../WorkspacesLib/LaunchingStatus.h | 2 ++ 6 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/modules/Workspaces/WorkspacesLauncher/AppLauncher.cpp b/src/modules/Workspaces/WorkspacesLauncher/AppLauncher.cpp index f9aed31fe66f..5a1c837fdf28 100644 --- a/src/modules/Workspaces/WorkspacesLauncher/AppLauncher.cpp +++ b/src/modules/Workspaces/WorkspacesLauncher/AppLauncher.cpp @@ -182,28 +182,36 @@ namespace AppLauncher return launched; } - bool Launch(WorkspacesData::WorkspacesProject& project, LaunchingStatus& launchingStatus, ErrorList& launchErrors) + bool Launch(WorkspacesData::WorkspacesProject& project, LaunchingStatus& launchingStatus, ErrorList& launchErrors, bool* needAdditionalLaunch) { bool launchedSuccessfully{ true }; auto installedApps = Utils::Apps::GetAppsList(); UpdatePackagedApps(project.apps, installedApps); + *needAdditionalLaunch = false ; + // Launch apps for (auto& app : project.apps) { - if (!Launch(app, launchErrors)) + if (launchingStatus.ExistsSameAppLaunched(app)) { - Logger::error(L"Failed to launch {}", app.name); - launchingStatus.Update(app, LaunchingState::Failed); - launchedSuccessfully = false; + *needAdditionalLaunch = true; } - else + else if (launchingStatus.GetStatus(app) == LaunchingState::Waiting) { - launchingStatus.Update(app, LaunchingState::Launched); + if (!Launch(app, launchErrors)) + { + Logger::error(L"Failed to launch {}", app.name); + launchingStatus.Update(app, LaunchingState::Failed); + launchedSuccessfully = false; + } + else + { + launchingStatus.Update(app, LaunchingState::Launched); + } } } - return launchedSuccessfully; } } \ No newline at end of file diff --git a/src/modules/Workspaces/WorkspacesLauncher/AppLauncher.h b/src/modules/Workspaces/WorkspacesLauncher/AppLauncher.h index 0827afc4c93c..2ff49b6caa76 100644 --- a/src/modules/Workspaces/WorkspacesLauncher/AppLauncher.h +++ b/src/modules/Workspaces/WorkspacesLauncher/AppLauncher.h @@ -12,5 +12,5 @@ namespace AppLauncher Result LaunchApp(const std::wstring& appPath, const std::wstring& commandLineArgs, bool elevated); - bool Launch(WorkspacesData::WorkspacesProject& project, LaunchingStatus& launchingStatus, ErrorList& launchErrors); + bool Launch(WorkspacesData::WorkspacesProject& project, LaunchingStatus& launchingStatus, ErrorList& launchErrors, bool* needAdditionalLaunch); } diff --git a/src/modules/Workspaces/WorkspacesLauncher/Launcher.cpp b/src/modules/Workspaces/WorkspacesLauncher/Launcher.cpp index b660d0d939c5..b22a6f1101fe 100644 --- a/src/modules/Workspaces/WorkspacesLauncher/Launcher.cpp +++ b/src/modules/Workspaces/WorkspacesLauncher/Launcher.cpp @@ -20,6 +20,7 @@ Launcher::Launcher(const WorkspacesData::WorkspacesProject& project, m_windowArrangerHelper(std::make_unique(std::bind(&Launcher::handleWindowArrangerMessage, this, std::placeholders::_1))), m_launchingStatus(m_project, std::bind(&LauncherUIHelper::UpdateLaunchStatus, m_uiHelper.get(), std::placeholders::_1)) { + m_needAdditionalLaunch = false; m_uiHelper->LaunchUI(); m_uiHelper->UpdateLaunchStatus(m_launchingStatus.Get()); @@ -89,17 +90,19 @@ Launcher::~Launcher() Trace::Workspaces::Launch(m_launchedSuccessfully, m_project, m_invokePoint, duration.count(), differentSetup, m_launchErrors); } -void Launcher::Launch() +bool Launcher::Launch() { Logger::info(L"Launch Workspace {} : {}", m_project.name, m_project.id); - m_launchedSuccessfully = AppLauncher::Launch(m_project, m_launchingStatus, m_launchErrors); + bool needAdditionalLaunch; + m_launchedSuccessfully = AppLauncher::Launch(m_project, m_launchingStatus, m_launchErrors, &needAdditionalLaunch); + return needAdditionalLaunch; } void Launcher::handleWindowArrangerMessage(const std::wstring& msg) { if (msg == L"ready") { - Launch(); + m_needAdditionalLaunch = Launch(); } else { @@ -109,6 +112,10 @@ void Launcher::handleWindowArrangerMessage(const std::wstring& msg) if (data.has_value()) { m_launchingStatus.Update(data.value().application, data.value().state); + if (m_needAdditionalLaunch) + { + m_needAdditionalLaunch = Launch(); + } } else { diff --git a/src/modules/Workspaces/WorkspacesLauncher/Launcher.h b/src/modules/Workspaces/WorkspacesLauncher/Launcher.h index 36f17329d27c..15ac5cbf1c52 100644 --- a/src/modules/Workspaces/WorkspacesLauncher/Launcher.h +++ b/src/modules/Workspaces/WorkspacesLauncher/Launcher.h @@ -14,7 +14,7 @@ class Launcher Launcher(const WorkspacesData::WorkspacesProject& project, std::vector& workspaces, InvokePoint invokePoint); ~Launcher(); - void Launch(); + bool Launch(); private: WorkspacesData::WorkspacesProject m_project; @@ -26,6 +26,7 @@ class Launcher LaunchingStatus m_launchingStatus; bool m_launchedSuccessfully{}; std::vector> m_launchErrors{}; + bool m_needAdditionalLaunch; void handleWindowArrangerMessage(const std::wstring& msg); }; diff --git a/src/modules/Workspaces/WorkspacesLib/LaunchingStatus.cpp b/src/modules/Workspaces/WorkspacesLib/LaunchingStatus.cpp index 5c438f5cf046..2d90391f7a96 100644 --- a/src/modules/Workspaces/WorkspacesLib/LaunchingStatus.cpp +++ b/src/modules/Workspaces/WorkspacesLib/LaunchingStatus.cpp @@ -64,3 +64,28 @@ void LaunchingStatus::Update(const WorkspacesData::WorkspacesProject::Applicatio m_updateCallback(m_appsState); } } + +LaunchingState LaunchingStatus::GetStatus(const WorkspacesData::WorkspacesProject::Application& app) +{ + std::shared_lock lock(m_mutex); + if (!m_appsState.contains(app)) + { + Logger::error(L"Error getting state: app {} is not tracked in the project", app.name); + return LaunchingState::Failed; + } + return m_appsState[app].state; +} + +bool LaunchingStatus::ExistsSameAppLaunched(const WorkspacesData::WorkspacesProject::Application& appToFind) +{ + std::shared_lock lock(m_mutex); + for (const auto& [app, data] : m_appsState) + { + if ((data.state == LaunchingState::Launched) && (app.path == appToFind.path)) + { + return true; + } + } + + return false; +} diff --git a/src/modules/Workspaces/WorkspacesLib/LaunchingStatus.h b/src/modules/Workspaces/WorkspacesLib/LaunchingStatus.h index eec0b1b0f62d..6b09f03c5605 100644 --- a/src/modules/Workspaces/WorkspacesLib/LaunchingStatus.h +++ b/src/modules/Workspaces/WorkspacesLib/LaunchingStatus.h @@ -16,6 +16,8 @@ class LaunchingStatus const WorkspacesData::LaunchingAppStateMap& Get() noexcept; void Update(const WorkspacesData::WorkspacesProject::Application& app, LaunchingState state); + LaunchingState GetStatus(const WorkspacesData::WorkspacesProject::Application& app); + bool ExistsSameAppLaunched(const WorkspacesData::WorkspacesProject::Application& app); private: WorkspacesData::LaunchingAppStateMap m_appsState;