Files
PowerToys/src/modules/Workspaces/WorkspacesLib/WorkspacesData.h
Kai Tao c487638758 Workspaces: PWA apps should not necessarily configure profile to launch. (#39971)
<!-- Enter a brief description/summary of your PR here. What does it
fix/what does it change/how was it tested (even manually, if necessary)?
-->
## Summary of the Pull Request
Workspace support for pwa is now limited, it is tight to specific
Profile launch. If you create a pwa app with a profile other than
"Default", launch will fail. Then you have to manually configure that
profile to launch.
This pr fix it by launching with shell:appsfolder\appusermodelId

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [X] **Closes:** #36384
- [ ] **Communication:** I've discussed this with core contributors
already. If work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end user facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #xxx

<!-- Provide a more detailed description of the PR, other things fixed
or any additional comments/features here -->
## Detailed Description of the Pull Request / Additional comments

<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed
- [X] Create a new workspace with a pwa app(Other than default profile)
should be no problem.
- [X] Existing workspace with a pwa(default profile and other profile)
should launch successfully without problem

1. with pt version 91.1, create a loop pwa with "Profile 1" instead of
"Default" in edge.
2. capture and launch actually launch the edge instead of loop
3. Create profile with this impl and launch
4. Launch pwa successfully

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-17 15:39:44 +08:00

158 lines
4.6 KiB
C++

#pragma once
#include <common/utils/json.h>
#include <WorkspacesLib/LaunchingStateEnum.h>
namespace WorkspacesData
{
std::wstring WorkspacesFile();
std::wstring TempWorkspacesFile();
struct WorkspacesProject
{
struct Application
{
struct Position
{
int x;
int y;
int width;
int height;
RECT toRect() const noexcept;
auto operator<=>(const Position&) const = default;
};
std::wstring id;
std::wstring name;
std::wstring title;
std::wstring path;
std::wstring packageFullName;
std::wstring appUserModelId;
std::wstring pwaAppId;
std::wstring commandLineArgs;
// empty to 1,
std::wstring version;
bool isElevated{};
bool canLaunchElevated{};
bool isMinimized{};
bool isMaximized{};
Position position{};
unsigned int monitor{};
auto operator<=>(const Application&) const = default;
};
struct Monitor
{
struct MonitorRect
{
int top;
int left;
int width;
int height;
inline bool operator==(const MonitorRect& other) const noexcept
{
return top == other.top && left == other.left && width == other.width && height == other.height;
}
};
HMONITOR monitor{};
std::wstring id;
std::wstring instanceId;
unsigned int number{};
unsigned int dpi{};
MonitorRect monitorRectDpiAware{};
MonitorRect monitorRectDpiUnaware{};
};
std::wstring id;
std::wstring name;
time_t creationTime{};
std::optional<time_t> lastLaunchedTime;
bool isShortcutNeeded{};
bool moveExistingWindows{};
std::vector<Monitor> monitors;
std::vector<Application> apps;
};
struct WorkspacesList
{
std::vector<WorkspacesProject> projects;
};
struct LaunchingAppState
{
WorkspacesData::WorkspacesProject::Application application;
HWND window{};
LaunchingState state{ LaunchingState::Waiting };
};
using LaunchingAppStateMap = std::map<WorkspacesData::WorkspacesProject::Application, LaunchingAppState>;
using LaunchingAppStateList = std::vector<std::pair<WorkspacesData::WorkspacesProject::Application, LaunchingState>>;
struct AppLaunchData
{
LaunchingAppStateMap appsStateList;
int launcherProcessID = 0;
};
namespace WorkspacesProjectJSON
{
namespace ApplicationJSON
{
namespace PositionJSON
{
json::JsonObject ToJson(const WorkspacesProject::Application::Position& position);
std::optional<WorkspacesProject::Application::Position> FromJson(const json::JsonObject& json);
}
json::JsonObject ToJson(const WorkspacesProject::Application& data);
std::optional<WorkspacesProject::Application> FromJson(const json::JsonObject& json);
}
namespace MonitorJSON
{
namespace MonitorRectJSON
{
json::JsonObject ToJson(const WorkspacesProject::Monitor::MonitorRect& data);
std::optional<WorkspacesProject::Monitor::MonitorRect> FromJson(const json::JsonObject& json);
}
json::JsonObject ToJson(const WorkspacesProject::Monitor& data);
std::optional<WorkspacesProject::Monitor> FromJson(const json::JsonObject& json);
}
json::JsonObject ToJson(const WorkspacesProject& data);
std::optional<WorkspacesProject> FromJson(const json::JsonObject& json);
}
namespace WorkspacesListJSON
{
json::JsonObject ToJson(const std::vector<WorkspacesProject>& data);
std::optional<std::vector<WorkspacesProject>> FromJson(const json::JsonObject& json);
}
namespace AppLaunchInfoJSON
{
json::JsonObject ToJson(const LaunchingAppState& data);
std::optional<LaunchingAppState> FromJson(const json::JsonObject& json);
}
namespace AppLaunchInfoListJSON
{
json::JsonObject ToJson(const LaunchingAppStateMap& data);
std::optional<LaunchingAppStateMap> FromJson(const json::JsonObject& json);
}
namespace AppLaunchDataJSON
{
json::JsonObject ToJson(const AppLaunchData& data);
}
};