mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-29 16:36:40 +01:00
Compare commits
6 Commits
shawn/comS
...
v0.56.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b9cbc2c32 | ||
|
|
47fc7be669 | ||
|
|
b968e5733b | ||
|
|
7d2c8db43a | ||
|
|
4edb4dee10 | ||
|
|
a0bb3dedc1 |
1
.github/actions/spell-check/expect.txt
vendored
1
.github/actions/spell-check/expect.txt
vendored
@@ -1446,6 +1446,7 @@ NOREMOVE
|
||||
norename
|
||||
NOREPEAT
|
||||
NOREPOSITION
|
||||
norestart
|
||||
NORMALDISPLAY
|
||||
NORMALUSER
|
||||
Noronha
|
||||
|
||||
@@ -46,11 +46,11 @@
|
||||
Id="DotnetRuntime"
|
||||
DetectCondition="HasDotnet3122"
|
||||
DownloadUrl="https://download.visualstudio.microsoft.com/download/pr/1c14e24b-7f31-42dc-ba3c-83295a2d6f7e/41b93591162dfe556cc160ae44fbe75e/windowsdesktop-runtime-3.1.22-win-x64.exe"
|
||||
InstallCommand="/install /quiet"
|
||||
RepairCommand="/repair /passive"
|
||||
InstallCommand="/install /quiet /norestart"
|
||||
RepairCommand="/repair /passive /norestart"
|
||||
Permanent="yes"
|
||||
PerMachine="yes"
|
||||
UninstallCommand="/uninstall /quiet">
|
||||
UninstallCommand="/uninstall /quiet /norestart">
|
||||
<ExitCode Value="1638" Behavior="success"/>
|
||||
<RemotePayload
|
||||
Description="Microsoft Windows Desktop Runtime - 3.1.22 (x64)"
|
||||
@@ -65,11 +65,11 @@
|
||||
Id="DotnetRuntime6"
|
||||
DetectCondition="HasDotnet602"
|
||||
DownloadUrl="https://download.visualstudio.microsoft.com/download/pr/efa32b7a-6eec-4d97-9cdc-c7336a29a749/3df4296170397cf60884dae1be3d103b/windowsdesktop-runtime-6.0.2-win-x64.exe"
|
||||
InstallCommand="/install /quiet"
|
||||
RepairCommand="/repair /passive"
|
||||
InstallCommand="/install /quiet /norestart"
|
||||
RepairCommand="/repair /passive /norestart"
|
||||
Permanent="yes"
|
||||
PerMachine="yes"
|
||||
UninstallCommand="/uninstall /quiet">
|
||||
UninstallCommand="/uninstall /quiet /norestart">
|
||||
<ExitCode Value="1638" Behavior="success"/>
|
||||
<RemotePayload
|
||||
Description="Microsoft Windows Desktop Runtime - 6.0.2 (x64)"
|
||||
|
||||
@@ -475,6 +475,7 @@
|
||||
</Directory>
|
||||
<Directory Id="WindowsTerminalPluginFolder" Name="WindowsTerminal">
|
||||
<Directory Id="WindowsTerminalImagesFolder" Name="Images" />
|
||||
<Directory Id="WindowsTerminalLanguagesFolder" Name="Languages" />
|
||||
</Directory>
|
||||
<Directory Id="SystemPluginFolder" Name="System">
|
||||
<Directory Id="SystemImagesFolder" Name="Images" />
|
||||
@@ -1347,14 +1348,12 @@
|
||||
Directory="Resource$(var.IdSafeLanguage)TimeZonePluginFolder">
|
||||
<File Id="Launcher_TimeZone_$(var.IdSafeLanguage)_File" Source="$(var.BinX64Dir)modules\launcher\Plugins\TimeZone\$(var.Language)\Microsoft.PowerToys.Run.Plugin.TimeZone.resources.dll" />
|
||||
</Component>
|
||||
<!-- Uncomment after Plugin receives the localization files.
|
||||
<Component
|
||||
Id="Launcher_WindowsTerminal_$(var.IdSafeLanguage)_Component"
|
||||
Guid="$(var.CompGUIDPrefix)15"
|
||||
Directory="Resource$(var.IdSafeLanguage)WindowsTerminalFolder">
|
||||
<File Id="Launcher_WindowsTerminal_$(var.IdSafeLanguage)_File" Source="$(var.BinX64Dir)modules\launcher\Plugins\WindowsTerminal\$(var.Language)\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.resources.dll" />
|
||||
</Component>
|
||||
-->
|
||||
<Component
|
||||
Id="Launcher_WindowsTerminal_$(var.IdSafeLanguage)_Component"
|
||||
Guid="$(var.CompGUIDPrefix)15"
|
||||
Directory="Resource$(var.IdSafeLanguage)WindowsTerminalPluginFolder">
|
||||
<File Id="Launcher_WindowsTerminal_$(var.IdSafeLanguage)_File" Source="$(var.BinX64Dir)modules\launcher\Plugins\WindowsTerminal\$(var.Language)\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.resources.dll" />
|
||||
</Component>
|
||||
<?undef IdSafeLanguage?>
|
||||
<?undef CompGUIDPrefix?>
|
||||
<?endforeach?>
|
||||
|
||||
@@ -69,6 +69,7 @@ protected:
|
||||
DWORD m_fadeDuration = FIND_MY_MOUSE_DEFAULT_ANIMATION_DURATION_MS;
|
||||
int m_finalAlphaNumerator = FIND_MY_MOUSE_DEFAULT_OVERLAY_OPACITY;
|
||||
std::vector<std::wstring> m_excludedApps;
|
||||
int m_shakeMinimumDistance = FIND_MY_MOUSE_DEFAULT_SHAKE_MINIMUM_DISTANCE;
|
||||
static constexpr int FinalAlphaDenominator = 100;
|
||||
winrt::DispatcherQueueController m_dispatcherQueueController{ nullptr };
|
||||
|
||||
@@ -403,6 +404,11 @@ void SuperSonar<D>::DetectShake()
|
||||
maxY = max(currentY, maxY);
|
||||
}
|
||||
|
||||
if (distanceTravelled < m_shakeMinimumDistance)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Size of the rectangle the pointer moved in.
|
||||
double rectangleWidth = (double)maxX - minX;
|
||||
double rectangleHeight = (double)maxY - minY;
|
||||
@@ -423,7 +429,7 @@ void SuperSonar<D>::OnSonarMouseInput(RAWINPUT const& input)
|
||||
{
|
||||
LONG relativeX = 0;
|
||||
LONG relativeY = 0;
|
||||
if ((input.data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) == MOUSE_MOVE_ABSOLUTE)
|
||||
if ((input.data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) == MOUSE_MOVE_ABSOLUTE && (input.data.mouse.lLastX!=0 || input.data.mouse.lLastY!=0))
|
||||
{
|
||||
// Getting absolute mouse coordinates. Likely inside a VM / RDP session.
|
||||
if (m_seenAnAbsoluteMousePosition)
|
||||
@@ -736,6 +742,7 @@ public:
|
||||
m_finalAlphaNumerator = settings.overlayOpacity;
|
||||
m_sonarZoomFactor = settings.spotlightInitialZoom;
|
||||
m_excludedApps = settings.excludedApps;
|
||||
m_shakeMinimumDistance = settings.shakeMinimumDistance;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -762,6 +769,7 @@ public:
|
||||
m_finalAlphaNumerator = localSettings.overlayOpacity;
|
||||
m_sonarZoomFactor = localSettings.spotlightInitialZoom;
|
||||
m_excludedApps = localSettings.excludedApps;
|
||||
m_shakeMinimumDistance = localSettings.shakeMinimumDistance;
|
||||
UpdateMouseSnooping(); // For the shake mouse activation method
|
||||
|
||||
// Apply new settings to runtime composition objects.
|
||||
|
||||
@@ -16,6 +16,7 @@ constexpr int FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_RADIUS = 100;
|
||||
constexpr int FIND_MY_MOUSE_DEFAULT_ANIMATION_DURATION_MS = 500;
|
||||
constexpr int FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_INITIAL_ZOOM = 9;
|
||||
constexpr FindMyMouseActivationMethod FIND_MY_MOUSE_DEFAULT_ACTIVATION_METHOD = FindMyMouseActivationMethod::DoubleControlKey;
|
||||
constexpr int FIND_MY_MOUSE_DEFAULT_SHAKE_MINIMUM_DISTANCE = 1000;
|
||||
|
||||
struct FindMyMouseSettings
|
||||
{
|
||||
@@ -27,6 +28,7 @@ struct FindMyMouseSettings
|
||||
int spotlightRadius = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_RADIUS;
|
||||
int animationDurationMs = FIND_MY_MOUSE_DEFAULT_ANIMATION_DURATION_MS;
|
||||
int spotlightInitialZoom = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_INITIAL_ZOOM;
|
||||
int shakeMinimumDistance = FIND_MY_MOUSE_DEFAULT_SHAKE_MINIMUM_DISTANCE;
|
||||
std::vector<std::wstring> excludedApps;
|
||||
};
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace
|
||||
const wchar_t JSON_KEY_ANIMATION_DURATION_MS[] = L"animation_duration_ms";
|
||||
const wchar_t JSON_KEY_SPOTLIGHT_INITIAL_ZOOM[] = L"spotlight_initial_zoom";
|
||||
const wchar_t JSON_KEY_EXCLUDED_APPS[] = L"excluded_apps";
|
||||
const wchar_t JSON_KEY_SHAKING_MINIMUM_DISTANCE[] = L"shaking_minimum_distance";
|
||||
}
|
||||
|
||||
extern "C" IMAGE_DOS_HEADER __ImageBase;
|
||||
@@ -300,6 +301,16 @@ void FindMyMouse::parse_settings(PowerToysSettings::PowerToyValues& settings)
|
||||
{
|
||||
Logger::warn("Failed to initialize Excluded Apps from settings. Will use default value");
|
||||
}
|
||||
try
|
||||
{
|
||||
// Parse Shaking Minimum Distance
|
||||
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_SHAKING_MINIMUM_DISTANCE);
|
||||
findMyMouseSettings.shakeMinimumDistance = (UINT)jsonPropertiesObject.GetNamedNumber(JSON_KEY_VALUE);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Logger::warn("Failed to initialize Shaking Minimum Distance from settings. Will use default value");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1338,16 +1338,8 @@ void FancyZones::ApplyQuickLayout(int key) noexcept
|
||||
return;
|
||||
}
|
||||
|
||||
auto uuidStr = FancyZonesUtils::GuidToString(layoutId.value());
|
||||
if (!uuidStr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FancyZonesDataTypes::ZoneSetData data{ .uuid = uuidStr.value(), .type = FancyZonesDataTypes::ZoneSetLayoutType::Custom };
|
||||
|
||||
auto workArea = m_workAreaHandler.GetWorkAreaFromCursor(m_currentDesktopId);
|
||||
AppliedLayouts::instance().ApplyLayout(workArea->UniqueId(), data);
|
||||
AppliedLayouts::instance().ApplyLayout(workArea->UniqueId(), layout.value());
|
||||
AppliedLayouts::instance().SaveData();
|
||||
UpdateZoneSets();
|
||||
FlashZones();
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include <FancyZonesLib/GuidUtils.h>
|
||||
#include <FancyZonesLib/FancyZonesData/CustomLayouts.h>
|
||||
#include <FancyZonesLib/FancyZonesData/LayoutDefaults.h>
|
||||
#include <FancyZonesLib/FancyZonesData/LayoutTemplates.h>
|
||||
#include <FancyZonesLib/FancyZonesWinHookEventIDs.h>
|
||||
#include <FancyZonesLib/JsonHelpers.h>
|
||||
#include <FancyZonesLib/util.h>
|
||||
@@ -320,59 +319,9 @@ bool AppliedLayouts::IsLayoutApplied(const FancyZonesDataTypes::DeviceIdData& id
|
||||
return iter != m_layouts.end();
|
||||
}
|
||||
|
||||
bool AppliedLayouts::ApplyLayout(const FancyZonesDataTypes::DeviceIdData& deviceId, const FancyZonesDataTypes::ZoneSetData& layout)
|
||||
bool AppliedLayouts::ApplyLayout(const FancyZonesDataTypes::DeviceIdData& deviceId, Layout layout)
|
||||
{
|
||||
auto uuid = FancyZonesUtils::GuidFromString(layout.uuid);
|
||||
if (!uuid)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Layout layoutToApply {
|
||||
.uuid = uuid.value(),
|
||||
.type = layout.type,
|
||||
.showSpacing = DefaultValues::ShowSpacing,
|
||||
.spacing = DefaultValues::Spacing,
|
||||
.zoneCount = DefaultValues::ZoneCount,
|
||||
.sensitivityRadius = DefaultValues::SensitivityRadius,
|
||||
};
|
||||
|
||||
// copy layouts properties to the applied-layout
|
||||
auto customLayout = CustomLayouts::instance().GetLayout(layoutToApply.uuid);
|
||||
if (customLayout)
|
||||
{
|
||||
if (customLayout.value().type == FancyZonesDataTypes::CustomLayoutType::Grid)
|
||||
{
|
||||
auto layoutInfo = std::get<FancyZonesDataTypes::GridLayoutInfo>(customLayout.value().info);
|
||||
layoutToApply.sensitivityRadius = layoutInfo.sensitivityRadius();
|
||||
layoutToApply.showSpacing = layoutInfo.showSpacing();
|
||||
layoutToApply.spacing = layoutInfo.spacing();
|
||||
layoutToApply.zoneCount = layoutInfo.zoneCount();
|
||||
}
|
||||
else if (customLayout.value().type == FancyZonesDataTypes::CustomLayoutType::Canvas)
|
||||
{
|
||||
auto layoutInfo = std::get<FancyZonesDataTypes::CanvasLayoutInfo>(customLayout.value().info);
|
||||
layoutToApply.sensitivityRadius = layoutInfo.sensitivityRadius;
|
||||
layoutToApply.zoneCount = (int)layoutInfo.zones.size();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// check templates only if it wasn't a custom layout, since templates don't have ids yet
|
||||
auto templateLayout = LayoutTemplates::instance().GetLayout(layout.type);
|
||||
if (templateLayout)
|
||||
{
|
||||
auto layoutInfo = templateLayout.value();
|
||||
layoutToApply.sensitivityRadius = layoutInfo.sensitivityRadius;
|
||||
layoutToApply.showSpacing = layoutInfo.showSpacing;
|
||||
layoutToApply.spacing = layoutInfo.spacing;
|
||||
layoutToApply.zoneCount = layoutInfo.zoneCount;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
m_layouts[deviceId] = std::move(layoutToApply);
|
||||
|
||||
m_layouts[deviceId] = std::move(layout);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
|
||||
bool IsLayoutApplied(const FancyZonesDataTypes::DeviceIdData& id) const noexcept;
|
||||
|
||||
bool ApplyLayout(const FancyZonesDataTypes::DeviceIdData& deviceId, const FancyZonesDataTypes::ZoneSetData& layout);
|
||||
bool ApplyLayout(const FancyZonesDataTypes::DeviceIdData& deviceId, Layout layout);
|
||||
bool ApplyDefaultLayout(const FancyZonesDataTypes::DeviceIdData& deviceId);
|
||||
bool CloneLayout(const FancyZonesDataTypes::DeviceIdData& srcId, const FancyZonesDataTypes::DeviceIdData& dstId);
|
||||
|
||||
|
||||
@@ -216,7 +216,43 @@ void CustomLayouts::LoadData()
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<FancyZonesDataTypes::CustomLayoutData> CustomLayouts::GetLayout(const GUID& id) const noexcept
|
||||
std::optional<Layout> CustomLayouts::GetLayout(const GUID& id) const noexcept
|
||||
{
|
||||
auto iter = m_layouts.find(id);
|
||||
if (iter == m_layouts.end())
|
||||
{
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
FancyZonesDataTypes::CustomLayoutData customLayout = iter->second;
|
||||
Layout layout{
|
||||
.uuid = id,
|
||||
.type = FancyZonesDataTypes::ZoneSetLayoutType::Custom,
|
||||
.showSpacing = DefaultValues::ShowSpacing,
|
||||
.spacing = DefaultValues::Spacing,
|
||||
.zoneCount = DefaultValues::ZoneCount,
|
||||
.sensitivityRadius = DefaultValues::SensitivityRadius
|
||||
};
|
||||
|
||||
if (customLayout.type == FancyZonesDataTypes::CustomLayoutType::Grid)
|
||||
{
|
||||
auto layoutInfo = std::get<FancyZonesDataTypes::GridLayoutInfo>(customLayout.info);
|
||||
layout.sensitivityRadius = layoutInfo.sensitivityRadius();
|
||||
layout.showSpacing = layoutInfo.showSpacing();
|
||||
layout.spacing = layoutInfo.spacing();
|
||||
layout.zoneCount = layoutInfo.zoneCount();
|
||||
}
|
||||
else if (customLayout.type == FancyZonesDataTypes::CustomLayoutType::Canvas)
|
||||
{
|
||||
auto layoutInfo = std::get<FancyZonesDataTypes::CanvasLayoutInfo>(customLayout.info);
|
||||
layout.sensitivityRadius = layoutInfo.sensitivityRadius;
|
||||
layout.zoneCount = (int)layoutInfo.zones.size();
|
||||
}
|
||||
|
||||
return layout;
|
||||
}
|
||||
|
||||
std::optional<FancyZonesDataTypes::CustomLayoutData> CustomLayouts::GetCustomLayoutData(const GUID& id) const noexcept
|
||||
{
|
||||
auto iter = m_layouts.find(id);
|
||||
if (iter != m_layouts.end())
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
|
||||
#include <FancyZonesLib/FancyZonesData/Layout.h>
|
||||
#include <FancyZonesLib/FancyZonesDataTypes.h>
|
||||
#include <FancyZonesLib/GuidUtils.h>
|
||||
#include <FancyZonesLib/ModuleConstants.h>
|
||||
@@ -63,7 +64,8 @@ public:
|
||||
|
||||
void LoadData();
|
||||
|
||||
std::optional<FancyZonesDataTypes::CustomLayoutData> GetLayout(const GUID& id) const noexcept;
|
||||
std::optional<Layout> GetLayout(const GUID& id) const noexcept;
|
||||
std::optional<FancyZonesDataTypes::CustomLayoutData> GetCustomLayoutData(const GUID& id) const noexcept;
|
||||
const TCustomLayoutMap& GetAllLayouts() const noexcept;
|
||||
|
||||
private:
|
||||
|
||||
@@ -527,20 +527,6 @@ void WorkArea::CalculateZoneSet(OverlappingZonesAlgorithm overlappingAlgorithm)
|
||||
void WorkArea::UpdateActiveZoneSet(_In_opt_ IZoneSet* zoneSet) noexcept
|
||||
{
|
||||
m_zoneSet.copy_from(zoneSet);
|
||||
|
||||
if (m_zoneSet)
|
||||
{
|
||||
wil::unique_cotaskmem_string zoneSetId;
|
||||
if (SUCCEEDED_LOG(StringFromCLSID(m_zoneSet->Id(), &zoneSetId)))
|
||||
{
|
||||
FancyZonesDataTypes::ZoneSetData data{
|
||||
.uuid = zoneSetId.get(),
|
||||
.type = m_zoneSet->LayoutType()
|
||||
};
|
||||
|
||||
AppliedLayouts::instance().ApplyLayout(m_uniqueId, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LRESULT WorkArea::WndProc(UINT message, WPARAM wparam, LPARAM lparam) noexcept
|
||||
|
||||
@@ -875,7 +875,7 @@ bool ZoneSet::CalculateUniquePriorityGridLayout(Rect workArea, int zoneCount, in
|
||||
|
||||
bool ZoneSet::CalculateCustomLayout(Rect workArea, int spacing) noexcept
|
||||
{
|
||||
const auto zoneSetSearchResult = CustomLayouts::instance().GetLayout(m_config.Id);
|
||||
const auto zoneSetSearchResult = CustomLayouts::instance().GetCustomLayoutData(m_config.Id);
|
||||
if (!zoneSetSearchResult.has_value())
|
||||
{
|
||||
return false;
|
||||
|
||||
@@ -279,15 +279,26 @@ namespace FancyZonesUnitTests
|
||||
};
|
||||
|
||||
// test
|
||||
FancyZonesDataTypes::ZoneSetData expectedZoneSetData {
|
||||
.uuid = L"{33A2B101-06E0-437B-A61E-CDBECF502906}",
|
||||
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus
|
||||
Layout expectedLayout {
|
||||
.uuid = FancyZonesUtils::GuidFromString(L"{33A2B101-06E0-437B-A61E-CDBECF502906}").value(),
|
||||
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus,
|
||||
.showSpacing = true,
|
||||
.spacing = 10,
|
||||
.zoneCount = 15,
|
||||
.sensitivityRadius = 30
|
||||
};
|
||||
|
||||
AppliedLayouts::instance().ApplyLayout(deviceId, expectedZoneSetData);
|
||||
AppliedLayouts::instance().ApplyLayout(deviceId, expectedLayout);
|
||||
|
||||
Assert::IsFalse(AppliedLayouts::instance().GetAppliedLayoutMap().empty());
|
||||
Assert::IsTrue(AppliedLayouts::instance().GetDeviceLayout(deviceId).has_value());
|
||||
|
||||
auto actual = AppliedLayouts::instance().GetAppliedLayoutMap().find(deviceId)->second;
|
||||
Assert::IsTrue(expectedLayout.type == actual.type);
|
||||
Assert::AreEqual(expectedLayout.showSpacing, actual.showSpacing);
|
||||
Assert::AreEqual(expectedLayout.spacing, actual.spacing);
|
||||
Assert::AreEqual(expectedLayout.zoneCount, actual.zoneCount);
|
||||
Assert::AreEqual(expectedLayout.sensitivityRadius, actual.sensitivityRadius);
|
||||
}
|
||||
|
||||
TEST_METHOD (ApplyLayoutReplace)
|
||||
@@ -322,19 +333,27 @@ namespace FancyZonesUnitTests
|
||||
AppliedLayouts::instance().LoadData();
|
||||
|
||||
// test
|
||||
FancyZonesDataTypes::ZoneSetData expectedZoneSetData {
|
||||
.uuid = L"{33A2B101-06E0-437B-A61E-CDBECF502906}",
|
||||
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus
|
||||
Layout expectedLayout{
|
||||
.uuid = FancyZonesUtils::GuidFromString(L"{33A2B101-06E0-437B-A61E-CDBECF502906}").value(),
|
||||
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus,
|
||||
.showSpacing = true,
|
||||
.spacing = 10,
|
||||
.zoneCount = 15,
|
||||
.sensitivityRadius = 30
|
||||
};
|
||||
|
||||
AppliedLayouts::instance().ApplyLayout(deviceId, expectedZoneSetData);
|
||||
AppliedLayouts::instance().ApplyLayout(deviceId, expectedLayout);
|
||||
|
||||
Assert::AreEqual((size_t)1, AppliedLayouts::instance().GetAppliedLayoutMap().size());
|
||||
Assert::IsTrue(AppliedLayouts::instance().GetDeviceLayout(deviceId).has_value());
|
||||
|
||||
auto actual = AppliedLayouts::instance().GetAppliedLayoutMap().find(deviceId)->second;
|
||||
Assert::AreEqual(expectedZoneSetData.uuid.c_str(), FancyZonesUtils::GuidToString(actual.uuid).value().c_str());
|
||||
Assert::IsTrue(expectedZoneSetData.type == actual.type);
|
||||
Assert::AreEqual(FancyZonesUtils::GuidToString(expectedLayout.uuid).value().c_str(), FancyZonesUtils::GuidToString(actual.uuid).value().c_str());
|
||||
Assert::IsTrue(expectedLayout.type == actual.type);
|
||||
Assert::AreEqual(expectedLayout.showSpacing, actual.showSpacing);
|
||||
Assert::AreEqual(expectedLayout.spacing, actual.spacing);
|
||||
Assert::AreEqual(expectedLayout.zoneCount, actual.zoneCount);
|
||||
Assert::AreEqual(expectedLayout.sensitivityRadius, actual.sensitivityRadius);
|
||||
}
|
||||
|
||||
TEST_METHOD (ApplyDefaultLayout)
|
||||
|
||||
@@ -92,11 +92,22 @@ namespace Microsoft.PowerToys.PreviewHandler.Monaco
|
||||
|
||||
_webView2Environment = webView2EnvironmentAwaiter.GetResult();
|
||||
var vsCodeLangSet = FileHandler.GetLanguage(Path.GetExtension(filePath));
|
||||
var fileContent = new StreamReader(new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)).ReadToEnd();
|
||||
string fileContent;
|
||||
using (StreamReader fileReader = new StreamReader(new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
|
||||
{
|
||||
fileContent = fileReader.ReadToEnd();
|
||||
fileReader.Close();
|
||||
}
|
||||
var base64FileCode = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(fileContent));
|
||||
|
||||
string html;
|
||||
|
||||
// prepping index html to load in
|
||||
var html = new StreamReader(new FileStream(Settings.AssemblyDirectory + "\\index.html", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)).ReadToEnd();
|
||||
using(StreamReader htmlFileReader = new StreamReader(new FileStream(Settings.AssemblyDirectory + "\\index.html", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
|
||||
{
|
||||
html = htmlFileReader.ReadToEnd();
|
||||
htmlFileReader.Close();
|
||||
}
|
||||
|
||||
html = html.Replace("[[PT_LANG]]", vsCodeLangSet, StringComparison.InvariantCulture);
|
||||
html = html.Replace("[[PT_WRAP]]", _settings.Wrap ? "1" : "0", StringComparison.InvariantCulture);
|
||||
|
||||
@@ -35,6 +35,9 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
||||
[JsonPropertyName("excluded_apps")]
|
||||
public StringProperty ExcludedApps { get; set; }
|
||||
|
||||
[JsonPropertyName("shaking_minimum_distance")]
|
||||
public IntProperty ShakingMinimumDistance { get; set; }
|
||||
|
||||
public FindMyMouseProperties()
|
||||
{
|
||||
ActivationMethod = new IntProperty(0);
|
||||
@@ -46,6 +49,7 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
||||
AnimationDurationMs = new IntProperty(500);
|
||||
SpotlightInitialZoom = new IntProperty(9);
|
||||
ExcludedApps = new StringProperty();
|
||||
ShakingMinimumDistance = new IntProperty(1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
|
||||
_findMyMouseAnimationDurationMs = FindMyMouseSettingsConfig.Properties.AnimationDurationMs.Value;
|
||||
_findMyMouseSpotlightInitialZoom = FindMyMouseSettingsConfig.Properties.SpotlightInitialZoom.Value;
|
||||
_findMyMouseExcludedApps = FindMyMouseSettingsConfig.Properties.ExcludedApps.Value;
|
||||
_findMyMouseShakingMinimumDistance = FindMyMouseSettingsConfig.Properties.ShakingMinimumDistance.Value;
|
||||
|
||||
if (mouseHighlighterSettingsRepository == null)
|
||||
{
|
||||
@@ -285,6 +286,24 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public int FindMyMouseShakingMinimumDistance
|
||||
{
|
||||
get
|
||||
{
|
||||
return _findMyMouseShakingMinimumDistance;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (value != _findMyMouseShakingMinimumDistance)
|
||||
{
|
||||
_findMyMouseShakingMinimumDistance = value;
|
||||
FindMyMouseSettingsConfig.Properties.ShakingMinimumDistance.Value = value;
|
||||
NotifyFindMyMousePropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void NotifyFindMyMousePropertyChanged([CallerMemberName] string propertyName = null)
|
||||
{
|
||||
OnPropertyChanged(propertyName);
|
||||
@@ -633,6 +652,7 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
|
||||
private int _findMyMouseAnimationDurationMs;
|
||||
private int _findMyMouseSpotlightInitialZoom;
|
||||
private string _findMyMouseExcludedApps;
|
||||
private int _findMyMouseShakingMinimumDistance;
|
||||
|
||||
private bool _isMouseHighlighterEnabled;
|
||||
private string _highlighterLeftButtonClickColor;
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
// Copyright (c) Microsoft Corporation
|
||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System;
|
||||
using Windows.UI.Xaml;
|
||||
using Windows.UI.Xaml.Data;
|
||||
|
||||
namespace Microsoft.PowerToys.Settings.UI.Converters
|
||||
{
|
||||
public sealed class FindMyMouseActivationShakeMouseIntToVisibilityConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, string language)
|
||||
{
|
||||
var activationShake = (int)value;
|
||||
|
||||
// Assumes 1 is the index for the shake mouse option in the activation method combo box
|
||||
if (activationShake == 1)
|
||||
{
|
||||
return Visibility.Visible;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Visibility.Collapsed;
|
||||
}
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,6 +125,7 @@
|
||||
</Compile>
|
||||
<Compile Include="Controls\SettingsPageControl\PageLink.cs" />
|
||||
<Compile Include="Converters\AwakeModeToIntConverter.cs" />
|
||||
<Compile Include="Converters\FindMyMouseActivationShakeMouseIntToVisibilityConverter.cs" />
|
||||
<Compile Include="Converters\ImageResizerFitToStringConverter.cs" />
|
||||
<Compile Include="Converters\ImageResizerUnitToStringConverter.cs" />
|
||||
<Compile Include="Converters\UpdateStateToBoolConverter.cs" />
|
||||
|
||||
@@ -1825,6 +1825,12 @@ From there, simply click on one of the supported files in the File Explorer and
|
||||
<value>Time before the spotlight appears (ms)</value>
|
||||
<comment>ms = milliseconds</comment>
|
||||
</data>
|
||||
<data name="MouseUtils_FindMyMouse_ShakingMinimumDistance.Header" xml:space="preserve">
|
||||
<value>Shake minimum distance</value>
|
||||
</data>
|
||||
<data name="MouseUtils_FindMyMouse_ShakingMinimumDistance.Description" xml:space="preserve">
|
||||
<value>The minimum distance for mouse shaking activation, for adjusting sensitivity</value>
|
||||
</data>
|
||||
<data name="MouseUtils_MouseHighlighter.Header" xml:space="preserve">
|
||||
<value>Mouse Highlighter</value>
|
||||
<comment>Refers to the utility name</comment>
|
||||
|
||||
@@ -7,8 +7,11 @@
|
||||
mc:Ignorable="d"
|
||||
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
|
||||
xmlns:controls="using:Microsoft.PowerToys.Settings.UI.Controls"
|
||||
xmlns:localConverters="using:Microsoft.PowerToys.Settings.UI.Converters"
|
||||
AutomationProperties.LandmarkType="Main">
|
||||
|
||||
<Page.Resources>
|
||||
<localConverters:FindMyMouseActivationShakeMouseIntToVisibilityConverter x:Key="FindMyMouseActivationShakeMouseIntToVisibilityConverter"/>
|
||||
</Page.Resources>
|
||||
<controls:SettingsPageControl x:Uid="MouseUtils"
|
||||
ModuleImageSource="ms-appx:///Assets/Modules/MouseUtils.png">
|
||||
<controls:SettingsPageControl.ModuleContent>
|
||||
@@ -22,24 +25,46 @@
|
||||
<ToggleSwitch IsOn="{x:Bind ViewModel.IsFindMyMouseEnabled, Mode=TwoWay}" x:Uid="ToggleSwitch"/>
|
||||
</controls:Setting.ActionContent>
|
||||
</controls:Setting>
|
||||
<controls:Setting x:Uid="MouseUtils_FindMyMouse_ActivationMethod" IsEnabled="{x:Bind Mode=OneWay, Path=ViewModel.IsFindMyMouseEnabled}">
|
||||
<controls:Setting.ActionContent>
|
||||
<ComboBox SelectedIndex="{x:Bind Path=ViewModel.FindMyMouseActivationMethod, Mode=TwoWay}" MinWidth="{StaticResource SettingActionControlMinWidth}">
|
||||
<ComboBoxItem x:Uid="MouseUtils_FindMyMouse_ActivationDoubleControlPress" />
|
||||
<ComboBoxItem x:Uid="MouseUtils_FindMyMouse_ActivationShakeMouse" />
|
||||
</ComboBox>
|
||||
</controls:Setting.ActionContent>
|
||||
</controls:Setting>
|
||||
<controls:SettingExpander IsEnabled="{x:Bind ViewModel.IsFindMyMouseEnabled, Mode=OneWay}" IsExpanded="True" >
|
||||
<controls:SettingExpander.Header>
|
||||
<controls:Setting x:Uid="MouseUtils_FindMyMouse_ActivationMethod" Icon="" IsEnabled="{x:Bind Mode=OneWay, Path=ViewModel.IsFindMyMouseEnabled}">
|
||||
<controls:Setting.ActionContent>
|
||||
<ComboBox SelectedIndex="{x:Bind Path=ViewModel.FindMyMouseActivationMethod, Mode=TwoWay}" MinWidth="{StaticResource SettingActionControlMinWidth}">
|
||||
<ComboBoxItem x:Uid="MouseUtils_FindMyMouse_ActivationDoubleControlPress" />
|
||||
<ComboBoxItem x:Uid="MouseUtils_FindMyMouse_ActivationShakeMouse" />
|
||||
</ComboBox>
|
||||
</controls:Setting.ActionContent>
|
||||
</controls:Setting>
|
||||
</controls:SettingExpander.Header>
|
||||
<controls:SettingExpander.Content>
|
||||
<StackPanel>
|
||||
<controls:Setting x:Uid="MouseUtils_FindMyMouse_ShakingMinimumDistance" Style="{StaticResource ExpanderContentSettingStyle}" Visibility="{x:Bind Mode=OneWay, Path=ViewModel.FindMyMouseActivationMethod, Converter={StaticResource FindMyMouseActivationShakeMouseIntToVisibilityConverter}}">
|
||||
<controls:Setting.ActionContent>
|
||||
<muxc:NumberBox
|
||||
Minimum="0"
|
||||
Maximum="1000000"
|
||||
Value="{x:Bind Mode=TwoWay, Path=ViewModel.FindMyMouseShakingMinimumDistance}"
|
||||
MinWidth="{StaticResource SettingActionControlMinWidth}"
|
||||
SpinButtonPlacementMode="Compact"
|
||||
HorizontalAlignment="Left"
|
||||
SmallChange="100"
|
||||
LargeChange="1000"
|
||||
/>
|
||||
</controls:Setting.ActionContent>
|
||||
</controls:Setting>
|
||||
<CheckBox x:Uid="MouseUtils_Prevent_Activation_On_Game_Mode"
|
||||
IsChecked="{x:Bind ViewModel.FindMyMouseDoNotActivateOnGameMode, Mode=TwoWay}"
|
||||
Margin="{StaticResource ExpanderSettingMargin}"
|
||||
IsEnabled="{x:Bind ViewModel.IsFindMyMouseEnabled, Mode=OneWay}" />
|
||||
</StackPanel>
|
||||
</controls:SettingExpander.Content>
|
||||
</controls:SettingExpander>
|
||||
<controls:SettingExpander IsEnabled="{x:Bind ViewModel.IsFindMyMouseEnabled, Mode=OneWay}" IsExpanded="False" >
|
||||
<controls:SettingExpander.Header>
|
||||
<controls:Setting x:Uid="ShortcutGuide_Appearance_Behavior" Icon="" />
|
||||
</controls:SettingExpander.Header>
|
||||
<controls:SettingExpander.Content>
|
||||
<StackPanel>
|
||||
<CheckBox x:Uid="MouseUtils_Prevent_Activation_On_Game_Mode"
|
||||
IsChecked="{x:Bind ViewModel.FindMyMouseDoNotActivateOnGameMode, Mode=TwoWay}"
|
||||
Margin="{StaticResource ExpanderSettingMargin}"
|
||||
IsEnabled="{x:Bind ViewModel.IsFindMyMouseEnabled, Mode=OneWay}" />
|
||||
<controls:Setting x:Uid="MouseUtils_FindMyMouse_OverlayOpacity" IsEnabled="{x:Bind Mode=OneWay, Path=ViewModel.IsFindMyMouseEnabled}" Style="{StaticResource ExpanderContentSettingStyle}">
|
||||
<controls:Setting.ActionContent>
|
||||
<Slider Minimum="1"
|
||||
|
||||
Reference in New Issue
Block a user