mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-15 11:17:53 +01:00
[Find My Mouse] Adding transparency support for spotlight (#41701)
<!-- 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 ### Feature Separate the find my mouse's spotlight area with the backdrop, so that we could support the frequent ask - We should leave the circle transparent in find my mouse ### Engineering: 1. Modernize the framework - From UWP composition to WASDK composition api <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #15512 - [ ] **Communication:** I've discussed this with core contributors already. If the 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] Data migration: Should nota break existing experience when upgrade - [x] Should be able to configure the background and spotlight opacity - [x] Should be able to work with different settings https://github.com/user-attachments/assets/6f311c03-fa79-41d3-94bb-589d853295f4 --------- Co-authored-by: Niels Laute <niels.laute@live.nl>
This commit is contained in:
5
.github/actions/spell-check/expect.txt
vendored
5
.github/actions/spell-check/expect.txt
vendored
@@ -918,6 +918,7 @@ LWA
|
|||||||
lwin
|
lwin
|
||||||
LZero
|
LZero
|
||||||
MAGTRANSFORM
|
MAGTRANSFORM
|
||||||
|
MAJORMINOR
|
||||||
MAKEINTRESOURCE
|
MAKEINTRESOURCE
|
||||||
MAKEINTRESOURCEA
|
MAKEINTRESOURCEA
|
||||||
MAKEINTRESOURCEW
|
MAKEINTRESOURCEW
|
||||||
@@ -996,6 +997,9 @@ mousepointercrosshairs
|
|||||||
mouseutils
|
mouseutils
|
||||||
MOVESIZEEND
|
MOVESIZEEND
|
||||||
MOVESIZESTART
|
MOVESIZESTART
|
||||||
|
muxx
|
||||||
|
muxxc
|
||||||
|
muxxh
|
||||||
MRM
|
MRM
|
||||||
MRT
|
MRT
|
||||||
mru
|
mru
|
||||||
@@ -1807,6 +1811,7 @@ ULONGLONG
|
|||||||
ums
|
ums
|
||||||
uncompilable
|
uncompilable
|
||||||
UNCPRIORITY
|
UNCPRIORITY
|
||||||
|
undefining
|
||||||
UNDNAME
|
UNDNAME
|
||||||
UNICODETEXT
|
UNICODETEXT
|
||||||
unins
|
unins
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
<_PropertySheetDisplayName>PowerToys.Root.Props</_PropertySheetDisplayName>
|
<_PropertySheetDisplayName>PowerToys.Root.Props</_PropertySheetDisplayName>
|
||||||
<ForceImportBeforeCppProps>$(MsbuildThisFileDirectory)\Cpp.Build.props</ForceImportBeforeCppProps>
|
<ForceImportBeforeCppProps>$(MsbuildThisFileDirectory)\Cpp.Build.props</ForceImportBeforeCppProps>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="'$(MSBuildProjectExtension)' == '.csproj'">
|
<ItemGroup Condition="'$(MSBuildProjectExtension)' == '.csproj'">
|
||||||
<PackageReference Include="StyleCop.Analyzers">
|
<PackageReference Include="StyleCop.Analyzers">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
|||||||
@@ -3,4 +3,9 @@
|
|||||||
|
|
||||||
<Import Project="$(MSBuildCachePackageRoot)\build\$(MSBuildCachePackageName).targets" Condition="'$(MSBuildCacheEnabled)' == 'true'" />
|
<Import Project="$(MSBuildCachePackageRoot)\build\$(MSBuildCachePackageName).targets" Condition="'$(MSBuildCacheEnabled)' == 'true'" />
|
||||||
<Import Project="$(MSBuildCacheSharedCompilationPackageRoot)\build\Microsoft.MSBuildCache.SharedCompilation.targets" Condition="'$(MSBuildCacheEnabled)' == 'true'" />
|
<Import Project="$(MSBuildCacheSharedCompilationPackageRoot)\build\Microsoft.MSBuildCache.SharedCompilation.targets" Condition="'$(MSBuildCacheEnabled)' == 'true'" />
|
||||||
|
|
||||||
|
<!-- Override ManifestTool to the x64 host tool under WindowsSdkDir for all projects once the SDK path is known. -->
|
||||||
|
<PropertyGroup Label="ManifestToolOverride">
|
||||||
|
<ManifestTool Condition="Exists('$(WindowsSdkDir)bin\x64\mt.exe')">$(WindowsSdkDir)bin\x64\mt.exe</ManifestTool>
|
||||||
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.8" />
|
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.8" />
|
||||||
<!-- Including Microsoft.Bcl.AsyncInterfaces to force version, since it's used by Microsoft.SemanticKernel. -->
|
<!-- Including Microsoft.Bcl.AsyncInterfaces to force version, since it's used by Microsoft.SemanticKernel. -->
|
||||||
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.8" />
|
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.8" />
|
||||||
|
<PackageVersion Include="Microsoft.Windows.CppWinRT" Version="2.0.240111.5" />
|
||||||
<PackageVersion Include="Microsoft.Diagnostics.Tracing.TraceEvent" Version="3.1.16" />
|
<PackageVersion Include="Microsoft.Diagnostics.Tracing.TraceEvent" Version="3.1.16" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.8" />
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.8" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.8" />
|
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.8" />
|
||||||
|
|||||||
@@ -8,21 +8,28 @@
|
|||||||
#include "common/utils/process_path.h"
|
#include "common/utils/process_path.h"
|
||||||
#include "common/utils/excluded_apps.h"
|
#include "common/utils/excluded_apps.h"
|
||||||
#include "common/utils/MsWindowsSettings.h"
|
#include "common/utils/MsWindowsSettings.h"
|
||||||
|
#include <winrt/Windows.Graphics.h>
|
||||||
|
|
||||||
|
#include <winrt/Microsoft.UI.Composition.Interop.h>
|
||||||
|
#include <winrt/Microsoft.UI.Dispatching.h>
|
||||||
|
#include <winrt/Microsoft.UI.Xaml.h>
|
||||||
|
#include <winrt/Microsoft.UI.Xaml.Controls.h>
|
||||||
|
#include <winrt/Microsoft.UI.Xaml.Media.h>
|
||||||
|
#include <winrt/Microsoft.UI.Xaml.Hosting.h>
|
||||||
|
#include <winrt/Microsoft.UI.Interop.h>
|
||||||
|
#include <winrt/Microsoft.UI.Content.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#ifdef COMPOSITION
|
|
||||||
namespace winrt
|
namespace winrt
|
||||||
{
|
{
|
||||||
using namespace winrt::Windows::System;
|
using namespace winrt::Windows::System;
|
||||||
using namespace winrt::Windows::UI::Composition;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ABI
|
namespace muxc = winrt::Microsoft::UI::Composition;
|
||||||
{
|
namespace muxx = winrt::Microsoft::UI::Xaml;
|
||||||
using namespace ABI::Windows::System;
|
namespace muxxc = winrt::Microsoft::UI::Xaml::Controls;
|
||||||
using namespace ABI::Windows::UI::Composition::Desktop;
|
namespace muxxh = winrt::Microsoft::UI::Xaml::Hosting;
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#pragma region Super_Sonar_Base_Code
|
#pragma region Super_Sonar_Base_Code
|
||||||
|
|
||||||
@@ -70,11 +77,11 @@ protected:
|
|||||||
int m_sonarRadius = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_RADIUS;
|
int m_sonarRadius = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_RADIUS;
|
||||||
int m_sonarZoomFactor = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_INITIAL_ZOOM;
|
int m_sonarZoomFactor = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_INITIAL_ZOOM;
|
||||||
DWORD m_fadeDuration = FIND_MY_MOUSE_DEFAULT_ANIMATION_DURATION_MS;
|
DWORD m_fadeDuration = FIND_MY_MOUSE_DEFAULT_ANIMATION_DURATION_MS;
|
||||||
int m_finalAlphaNumerator = FIND_MY_MOUSE_DEFAULT_OVERLAY_OPACITY;
|
int m_finalAlphaNumerator = 100; // legacy (root now always animates to 1.0; kept for GDI fallback compatibility)
|
||||||
std::vector<std::wstring> m_excludedApps;
|
std::vector<std::wstring> m_excludedApps;
|
||||||
int m_shakeMinimumDistance = FIND_MY_MOUSE_DEFAULT_SHAKE_MINIMUM_DISTANCE;
|
int m_shakeMinimumDistance = FIND_MY_MOUSE_DEFAULT_SHAKE_MINIMUM_DISTANCE;
|
||||||
static constexpr int FinalAlphaDenominator = 100;
|
static constexpr int FinalAlphaDenominator = 100;
|
||||||
winrt::DispatcherQueueController m_dispatcherQueueController{ nullptr };
|
winrt::Microsoft::UI::Dispatching::DispatcherQueueController m_dispatcherQueueController{ nullptr };
|
||||||
|
|
||||||
// Don't consider movements started past these milliseconds to detect shaking.
|
// Don't consider movements started past these milliseconds to detect shaking.
|
||||||
int m_shakeIntervalMs = FIND_MY_MOUSE_DEFAULT_SHAKE_INTERVAL_MS;
|
int m_shakeIntervalMs = FIND_MY_MOUSE_DEFAULT_SHAKE_INTERVAL_MS;
|
||||||
@@ -82,7 +89,6 @@ protected:
|
|||||||
int m_shakeFactor = FIND_MY_MOUSE_DEFAULT_SHAKE_FACTOR;
|
int m_shakeFactor = FIND_MY_MOUSE_DEFAULT_SHAKE_FACTOR;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Save the mouse movement that occurred in any direction.
|
// Save the mouse movement that occurred in any direction.
|
||||||
struct PointerRecentMovement
|
struct PointerRecentMovement
|
||||||
{
|
{
|
||||||
@@ -159,7 +165,6 @@ bool SuperSonar<D>::Initialize(HINSTANCE hinst)
|
|||||||
SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
||||||
|
|
||||||
WNDCLASS wc{};
|
WNDCLASS wc{};
|
||||||
|
|
||||||
if (!GetClassInfoW(hinst, className, &wc))
|
if (!GetClassInfoW(hinst, className, &wc))
|
||||||
{
|
{
|
||||||
wc.lpfnWndProc = s_WndProc;
|
wc.lpfnWndProc = s_WndProc;
|
||||||
@@ -171,14 +176,28 @@ bool SuperSonar<D>::Initialize(HINSTANCE hinst)
|
|||||||
|
|
||||||
if (!RegisterClassW(&wc))
|
if (!RegisterClassW(&wc))
|
||||||
{
|
{
|
||||||
|
Logger::error("RegisterClassW failed. GetLastError={}", GetLastError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// else: class already registered
|
||||||
|
|
||||||
m_hwndOwner = CreateWindow(L"static", nullptr, WS_POPUP, 0, 0, 0, 0, nullptr, nullptr, hinst, nullptr);
|
m_hwndOwner = CreateWindow(L"static", nullptr, WS_POPUP, 0, 0, 0, 0, nullptr, nullptr, hinst, nullptr);
|
||||||
|
if (!m_hwndOwner)
|
||||||
|
{
|
||||||
|
Logger::error("Failed to create owner window. GetLastError={}", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
DWORD exStyle = WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOOLWINDOW | Shim()->GetExtendedStyle();
|
DWORD exStyle = WS_EX_TOOLWINDOW | Shim()->GetExtendedStyle();
|
||||||
return CreateWindowExW(exStyle, className, windowTitle, WS_POPUP, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, m_hwndOwner, nullptr, hinst, this) != nullptr;
|
HWND created = CreateWindowExW(exStyle, className, windowTitle, WS_POPUP, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, m_hwndOwner, nullptr, hinst, this);
|
||||||
|
if (!created)
|
||||||
|
{
|
||||||
|
Logger::error("CreateWindowExW failed. GetLastError={}", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename D>
|
template<typename D>
|
||||||
@@ -226,7 +245,8 @@ LRESULT SuperSonar<D>::BaseWndProc(UINT message, WPARAM wParam, LPARAM lParam) n
|
|||||||
switch (message)
|
switch (message)
|
||||||
{
|
{
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
if(!OnSonarCreate()) return -1;
|
if (!OnSonarCreate())
|
||||||
|
return -1;
|
||||||
UpdateMouseSnooping();
|
UpdateMouseSnooping();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -314,8 +334,7 @@ void SuperSonar<D>::OnSonarKeyboardInput(RAWINPUT const& input)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_activationMethod != FindMyMouseActivationMethod::DoubleRightControlKey && m_activationMethod != FindMyMouseActivationMethod::DoubleLeftControlKey)
|
if ((m_activationMethod != FindMyMouseActivationMethod::DoubleRightControlKey && m_activationMethod != FindMyMouseActivationMethod::DoubleLeftControlKey) || input.data.keyboard.VKey != VK_CONTROL)
|
||||||
|| input.data.keyboard.VKey != VK_CONTROL)
|
|
||||||
{
|
{
|
||||||
StopSonar();
|
StopSonar();
|
||||||
return;
|
return;
|
||||||
@@ -326,8 +345,7 @@ void SuperSonar<D>::OnSonarKeyboardInput(RAWINPUT const& input)
|
|||||||
bool leftCtrlPressed = (input.data.keyboard.Flags & RI_KEY_E0) == 0;
|
bool leftCtrlPressed = (input.data.keyboard.Flags & RI_KEY_E0) == 0;
|
||||||
bool rightCtrlPressed = (input.data.keyboard.Flags & RI_KEY_E0) != 0;
|
bool rightCtrlPressed = (input.data.keyboard.Flags & RI_KEY_E0) != 0;
|
||||||
|
|
||||||
if ((m_activationMethod == FindMyMouseActivationMethod::DoubleRightControlKey && !rightCtrlPressed)
|
if ((m_activationMethod == FindMyMouseActivationMethod::DoubleRightControlKey && !rightCtrlPressed) || (m_activationMethod == FindMyMouseActivationMethod::DoubleLeftControlKey && !leftCtrlPressed))
|
||||||
|| (m_activationMethod == FindMyMouseActivationMethod::DoubleLeftControlKey && !leftCtrlPressed))
|
|
||||||
{
|
{
|
||||||
StopSonar();
|
StopSonar();
|
||||||
return;
|
return;
|
||||||
@@ -376,7 +394,6 @@ void SuperSonar<D>::OnSonarKeyboardInput(RAWINPUT const& input)
|
|||||||
GetCursorPos(&m_lastKeyPos);
|
GetCursorPos(&m_lastKeyPos);
|
||||||
UpdateMouseSnooping();
|
UpdateMouseSnooping();
|
||||||
}
|
}
|
||||||
Logger::info("Detecting double left control click with {} ms interval.", doubleClickInterval);
|
|
||||||
m_lastKeyTime = now;
|
m_lastKeyTime = now;
|
||||||
m_lastKeyPos = ptCursor;
|
m_lastKeyPos = ptCursor;
|
||||||
}
|
}
|
||||||
@@ -406,10 +423,9 @@ void SuperSonar<D>::DetectShake()
|
|||||||
// Prune the story of movements for those movements that started too long ago.
|
// Prune the story of movements for those movements that started too long ago.
|
||||||
std::erase_if(m_movementHistory, [shakeStartTick](const PointerRecentMovement& movement) { return movement.tick < shakeStartTick; });
|
std::erase_if(m_movementHistory, [shakeStartTick](const PointerRecentMovement& movement) { return movement.tick < shakeStartTick; });
|
||||||
|
|
||||||
|
|
||||||
double distanceTravelled = 0;
|
double distanceTravelled = 0;
|
||||||
LONGLONG currentX=0, minX=0, maxX=0;
|
LONGLONG currentX = 0, minX = 0, maxX = 0;
|
||||||
LONGLONG currentY=0, minY=0, maxY=0;
|
LONGLONG currentY = 0, minY = 0, maxY = 0;
|
||||||
|
|
||||||
for (const PointerRecentMovement& movement : m_movementHistory)
|
for (const PointerRecentMovement& movement : m_movementHistory)
|
||||||
{
|
{
|
||||||
@@ -428,16 +444,15 @@ void SuperSonar<D>::DetectShake()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Size of the rectangle that the pointer moved in.
|
// Size of the rectangle that the pointer moved in.
|
||||||
double rectangleWidth = static_cast<double>(maxX) - minX;
|
double rectangleWidth = static_cast<double>(maxX) - minX;
|
||||||
double rectangleHeight = static_cast<double>(maxY) - minY;
|
double rectangleHeight = static_cast<double>(maxY) - minY;
|
||||||
|
|
||||||
double diagonal = sqrt(rectangleWidth * rectangleWidth + rectangleHeight * rectangleHeight);
|
double diagonal = sqrt(rectangleWidth * rectangleWidth + rectangleHeight * rectangleHeight);
|
||||||
if (diagonal > 0 && distanceTravelled / diagonal > (m_shakeFactor/100.f))
|
if (diagonal > 0 && distanceTravelled / diagonal > (m_shakeFactor / 100.f))
|
||||||
{
|
{
|
||||||
m_movementHistory.clear();
|
m_movementHistory.clear();
|
||||||
StartSonar();
|
StartSonar();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename D>
|
template<typename D>
|
||||||
@@ -453,7 +468,7 @@ void SuperSonar<D>::OnSonarMouseInput(RAWINPUT const& input)
|
|||||||
{
|
{
|
||||||
LONG relativeX = 0;
|
LONG relativeX = 0;
|
||||||
LONG relativeY = 0;
|
LONG relativeY = 0;
|
||||||
if ((input.data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) == MOUSE_MOVE_ABSOLUTE && (input.data.mouse.lLastX!=0 || input.data.mouse.lLastY!=0))
|
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.
|
// Getting absolute mouse coordinates. Likely inside a VM / RDP session.
|
||||||
if (m_seenAnAbsoluteMousePosition)
|
if (m_seenAnAbsoluteMousePosition)
|
||||||
@@ -482,7 +497,7 @@ void SuperSonar<D>::OnSonarMouseInput(RAWINPUT const& input)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_movementHistory.push_back({ .diff = { .x=relativeX, .y=relativeY }, .tick = GetTickCount64() });
|
m_movementHistory.push_back({ .diff = { .x = relativeX, .y = relativeY }, .tick = GetTickCount64() });
|
||||||
// Mouse movement changed directions. Take the opportunity do detect shake.
|
// Mouse movement changed directions. Take the opportunity do detect shake.
|
||||||
DetectShake();
|
DetectShake();
|
||||||
}
|
}
|
||||||
@@ -491,7 +506,6 @@ void SuperSonar<D>::OnSonarMouseInput(RAWINPUT const& input)
|
|||||||
{
|
{
|
||||||
m_movementHistory.push_back({ .diff = { .x = relativeX, .y = relativeY }, .tick = GetTickCount64() });
|
m_movementHistory.push_back({ .diff = { .x = relativeX, .y = relativeY }, .tick = GetTickCount64() });
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input.data.mouse.usButtonFlags)
|
if (input.data.mouse.usButtonFlags)
|
||||||
@@ -518,7 +532,6 @@ void SuperSonar<D>::StartSonar()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger::info("Focusing the sonar on the mouse cursor.");
|
|
||||||
Trace::MousePointerFocused();
|
Trace::MousePointerFocused();
|
||||||
// Cover the entire virtual screen.
|
// Cover the entire virtual screen.
|
||||||
// HACK: Draw with 1 pixel off. Otherwise, Windows glitches the task bar transparency when a transparent window fill the whole screen.
|
// HACK: Draw with 1 pixel off. Otherwise, Windows glitches the task bar transparency when a transparent window fill the whole screen.
|
||||||
@@ -633,12 +646,26 @@ struct CompositionSpotlight : SuperSonar<CompositionSpotlight>
|
|||||||
|
|
||||||
DWORD GetExtendedStyle()
|
DWORD GetExtendedStyle()
|
||||||
{
|
{
|
||||||
return WS_EX_NOREDIRECTIONBITMAP;
|
// Remove WS_EX_NOREDIRECTIONBITMAP for Composition/XAML to allow DWM redirection.
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AfterMoveSonar()
|
void AfterMoveSonar()
|
||||||
{
|
{
|
||||||
m_spotlight.Offset({ static_cast<float>(m_sonarPos.x), static_cast<float>(m_sonarPos.y), 0.0f });
|
const float scale = static_cast<float>(m_surface.XamlRoot().RasterizationScale());
|
||||||
|
// Move gradient center
|
||||||
|
if (m_spotlightMaskGradient)
|
||||||
|
{
|
||||||
|
m_spotlightMaskGradient.EllipseCenter({ static_cast<float>(m_sonarPos.x) / scale,
|
||||||
|
static_cast<float>(m_sonarPos.y) / scale });
|
||||||
|
}
|
||||||
|
// Move spotlight visual (color fill) below masked backdrop
|
||||||
|
if (m_spotlight)
|
||||||
|
{
|
||||||
|
m_spotlight.Offset({ static_cast<float>(m_sonarPos.x) / scale,
|
||||||
|
static_cast<float>(m_sonarPos.y) / scale,
|
||||||
|
0.0f });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT WndProc(UINT message, WPARAM wParam, LPARAM lParam) noexcept
|
LRESULT WndProc(UINT message, WPARAM wParam, LPARAM lParam) noexcept
|
||||||
@@ -646,24 +673,29 @@ struct CompositionSpotlight : SuperSonar<CompositionSpotlight>
|
|||||||
switch (message)
|
switch (message)
|
||||||
{
|
{
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
return OnCompositionCreate() && BaseWndProc(message, wParam, lParam);
|
if (!OnCompositionCreate())
|
||||||
|
return -1;
|
||||||
|
return BaseWndProc(message, wParam, lParam);
|
||||||
|
|
||||||
case WM_OPACITY_ANIMATION_COMPLETED:
|
case WM_OPACITY_ANIMATION_COMPLETED:
|
||||||
OnOpacityAnimationCompleted();
|
OnOpacityAnimationCompleted();
|
||||||
break;
|
break;
|
||||||
|
case WM_SIZE:
|
||||||
|
UpdateIslandSize();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return BaseWndProc(message, wParam, lParam);
|
return BaseWndProc(message, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSonarVisibility(bool visible)
|
void SetSonarVisibility(bool visible)
|
||||||
{
|
{
|
||||||
m_batch = m_compositor.GetCommitBatch(winrt::CompositionBatchTypes::Animation);
|
m_batch = m_compositor.GetCommitBatch(muxc::CompositionBatchTypes::Animation);
|
||||||
BOOL isEnabledAnimations = GetAnimationsEnabled();
|
BOOL isEnabledAnimations = GetAnimationsEnabled();
|
||||||
m_animation.Duration(std::chrono::milliseconds{ isEnabledAnimations ? m_fadeDuration : 1 });
|
m_animation.Duration(std::chrono::milliseconds{ isEnabledAnimations ? m_fadeDuration : 1 });
|
||||||
m_batch.Completed([hwnd = m_hwnd](auto&&, auto&&) {
|
m_batch.Completed([hwnd = m_hwnd](auto&&, auto&&) {
|
||||||
PostMessage(hwnd, WM_OPACITY_ANIMATION_COMPLETED, 0, 0);
|
PostMessage(hwnd, WM_OPACITY_ANIMATION_COMPLETED, 0, 0);
|
||||||
});
|
});
|
||||||
m_root.Opacity(visible ? static_cast<float>(m_finalAlphaNumerator) / FinalAlphaDenominator : 0.0f);
|
m_root.Opacity(visible ? 1.0f : 0.0f);
|
||||||
if (visible)
|
if (visible)
|
||||||
{
|
{
|
||||||
ShowWindow(m_hwnd, SW_SHOWNOACTIVATE);
|
ShowWindow(m_hwnd, SW_SHOWNOACTIVATE);
|
||||||
@@ -679,54 +711,138 @@ private:
|
|||||||
bool OnCompositionCreate()
|
bool OnCompositionCreate()
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// We need a dispatcher queue.
|
// Creating composition resources
|
||||||
DispatcherQueueOptions options = {
|
// Ensure a DispatcherQueue bound to this thread (required by WinAppSDK composition/XAML)
|
||||||
sizeof(options),
|
if (!m_dispatcherQueueController)
|
||||||
DQTYPE_THREAD_CURRENT,
|
{
|
||||||
DQTAT_COM_ASTA,
|
// Ensure COM is initialized
|
||||||
};
|
try
|
||||||
ABI::IDispatcherQueueController* controller;
|
{
|
||||||
winrt::check_hresult(CreateDispatcherQueueController(options, &controller));
|
winrt::init_apartment(winrt::apartment_type::single_threaded);
|
||||||
*winrt::put_abi(m_dispatcherQueueController) = controller;
|
// COM STA initialized
|
||||||
|
}
|
||||||
|
catch (const winrt::hresult_error& e)
|
||||||
|
{
|
||||||
|
Logger::error("Failed to initialize COM apartment: {}", winrt::to_string(e.message()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Create the compositor for our window.
|
try
|
||||||
m_compositor = winrt::Compositor();
|
{
|
||||||
ABI::IDesktopWindowTarget* target;
|
m_dispatcherQueueController =
|
||||||
winrt::check_hresult(m_compositor.as<ABI::ICompositorDesktopInterop>()->CreateDesktopWindowTarget(m_hwnd, false, &target));
|
winrt::Microsoft::UI::Dispatching::DispatcherQueueController::CreateOnCurrentThread();
|
||||||
*winrt::put_abi(m_target) = target;
|
// DispatcherQueueController created
|
||||||
|
}
|
||||||
|
catch (const winrt::hresult_error& e)
|
||||||
|
{
|
||||||
|
Logger::error("Failed to create DispatcherQueueController: {}", winrt::to_string(e.message()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Our composition tree:
|
// 1) Create a XAML island and attach it to this HWND
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m_island = winrt::Microsoft::UI::Xaml::Hosting::DesktopWindowXamlSource{};
|
||||||
|
auto windowId = winrt::Microsoft::UI::GetWindowIdFromWindow(m_hwnd);
|
||||||
|
m_island.Initialize(windowId);
|
||||||
|
// Xaml source initialized
|
||||||
|
}
|
||||||
|
catch (const winrt::hresult_error& e)
|
||||||
|
{
|
||||||
|
Logger::error("Failed to create XAML island: {}", winrt::to_string(e.message()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateIslandSize();
|
||||||
|
// Island size set
|
||||||
|
|
||||||
|
// 2) Create a XAML container to host the Composition child visual
|
||||||
|
m_surface = winrt::Microsoft::UI::Xaml::Controls::Grid{};
|
||||||
|
|
||||||
|
// A transparent background keeps hit-testing consistent vs. null brush
|
||||||
|
m_surface.Background(winrt::Microsoft::UI::Xaml::Media::SolidColorBrush{
|
||||||
|
winrt::Microsoft::UI::Colors::Transparent() });
|
||||||
|
m_surface.HorizontalAlignment(muxx::HorizontalAlignment::Stretch);
|
||||||
|
m_surface.VerticalAlignment(muxx::VerticalAlignment::Stretch);
|
||||||
|
|
||||||
|
m_island.Content(m_surface);
|
||||||
|
|
||||||
|
// 3) Get the compositor from the XAML visual tree (pure MUXC path)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto elementVisual =
|
||||||
|
winrt::Microsoft::UI::Xaml::Hosting::ElementCompositionPreview::GetElementVisual(m_surface);
|
||||||
|
m_compositor = elementVisual.Compositor();
|
||||||
|
// Compositor acquired
|
||||||
|
}
|
||||||
|
catch (const winrt::hresult_error& e)
|
||||||
|
{
|
||||||
|
Logger::error("Failed to get compositor: {}", winrt::to_string(e.message()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4) Build the composition tree
|
||||||
//
|
//
|
||||||
// [root] ContainerVisual
|
// [root] ContainerVisual (fills host)
|
||||||
// \ LayerVisual
|
// \ LayerVisual
|
||||||
// \[gray backdrop]
|
// \ [backdrop dim * radial gradient mask (hole)]
|
||||||
// [spotlight]
|
|
||||||
m_root = m_compositor.CreateContainerVisual();
|
m_root = m_compositor.CreateContainerVisual();
|
||||||
m_root.RelativeSizeAdjustment({ 1.0f, 1.0f }); // fill the parent
|
m_root.RelativeSizeAdjustment({ 1.0f, 1.0f });
|
||||||
m_root.Opacity(0.0f);
|
m_root.Opacity(0.0f);
|
||||||
m_target.Root(m_root);
|
|
||||||
|
// Insert our root as a hand-in Visual under the XAML element
|
||||||
|
winrt::Microsoft::UI::Xaml::Hosting::ElementCompositionPreview::SetElementChildVisual(m_surface, m_root);
|
||||||
|
|
||||||
auto layer = m_compositor.CreateLayerVisual();
|
auto layer = m_compositor.CreateLayerVisual();
|
||||||
layer.RelativeSizeAdjustment({ 1.0f, 1.0f }); // fill the parent
|
layer.RelativeSizeAdjustment({ 1.0f, 1.0f });
|
||||||
m_root.Children().InsertAtTop(layer);
|
m_root.Children().InsertAtTop(layer);
|
||||||
|
|
||||||
m_backdrop = m_compositor.CreateSpriteVisual();
|
const float scale = static_cast<float>(m_surface.XamlRoot().RasterizationScale());
|
||||||
m_backdrop.RelativeSizeAdjustment({ 1.0f, 1.0f }); // fill the parent
|
const float rDip = m_sonarRadiusFloat / scale;
|
||||||
m_backdrop.Brush(m_compositor.CreateColorBrush(m_backgroundColor));
|
const float zoom = static_cast<float>(m_sonarZoomFactor);
|
||||||
layer.Children().InsertAtTop(m_backdrop);
|
|
||||||
|
|
||||||
m_circleGeometry = m_compositor.CreateEllipseGeometry(); // radius set via expression animation
|
// Spotlight shape (below backdrop, visible through hole)
|
||||||
|
m_circleGeometry = m_compositor.CreateEllipseGeometry();
|
||||||
m_circleShape = m_compositor.CreateSpriteShape(m_circleGeometry);
|
m_circleShape = m_compositor.CreateSpriteShape(m_circleGeometry);
|
||||||
m_circleShape.FillBrush(m_compositor.CreateColorBrush(m_spotlightColor));
|
m_circleShape.FillBrush(m_compositor.CreateColorBrush(m_spotlightColor));
|
||||||
m_circleShape.Offset({ m_sonarRadiusFloat * m_sonarZoomFactor, m_sonarRadiusFloat * m_sonarZoomFactor });
|
m_circleShape.Offset({ rDip * zoom, rDip * zoom });
|
||||||
m_spotlight = m_compositor.CreateShapeVisual();
|
m_spotlight = m_compositor.CreateShapeVisual();
|
||||||
m_spotlight.Size({ m_sonarRadiusFloat * 2 * m_sonarZoomFactor, m_sonarRadiusFloat * 2 * m_sonarZoomFactor });
|
m_spotlight.Size({ rDip * 2 * zoom, rDip * 2 * zoom });
|
||||||
m_spotlight.AnchorPoint({ 0.5f, 0.5f });
|
m_spotlight.AnchorPoint({ 0.5f, 0.5f });
|
||||||
m_spotlight.Shapes().Append(m_circleShape);
|
m_spotlight.Shapes().Append(m_circleShape);
|
||||||
|
|
||||||
layer.Children().InsertAtTop(m_spotlight);
|
layer.Children().InsertAtTop(m_spotlight);
|
||||||
|
|
||||||
// Implicitly animate the alpha.
|
// Dim color (source)
|
||||||
|
m_dimColorBrush = m_compositor.CreateColorBrush(m_backgroundColor);
|
||||||
|
// Radial gradient mask (center transparent, outer opaque)
|
||||||
|
m_spotlightMaskGradient = m_compositor.CreateRadialGradientBrush();
|
||||||
|
m_spotlightMaskGradient.MappingMode(muxc::CompositionMappingMode::Absolute);
|
||||||
|
m_maskStopCenter = m_compositor.CreateColorGradientStop();
|
||||||
|
m_maskStopCenter.Offset(0.0f);
|
||||||
|
m_maskStopCenter.Color(winrt::Windows::UI::ColorHelper::FromArgb(0, 0, 0, 0));
|
||||||
|
m_maskStopInner = m_compositor.CreateColorGradientStop();
|
||||||
|
m_maskStopInner.Offset(0.995f);
|
||||||
|
m_maskStopInner.Color(winrt::Windows::UI::ColorHelper::FromArgb(0, 0, 0, 0));
|
||||||
|
m_maskStopOuter = m_compositor.CreateColorGradientStop();
|
||||||
|
m_maskStopOuter.Offset(1.0f);
|
||||||
|
m_maskStopOuter.Color(winrt::Windows::UI::ColorHelper::FromArgb(255, 255, 255, 255));
|
||||||
|
m_spotlightMaskGradient.ColorStops().Append(m_maskStopCenter);
|
||||||
|
m_spotlightMaskGradient.ColorStops().Append(m_maskStopInner);
|
||||||
|
m_spotlightMaskGradient.ColorStops().Append(m_maskStopOuter);
|
||||||
|
m_spotlightMaskGradient.EllipseCenter({ rDip * zoom, rDip * zoom });
|
||||||
|
m_spotlightMaskGradient.EllipseRadius({ rDip * zoom, rDip * zoom });
|
||||||
|
|
||||||
|
m_maskBrush = m_compositor.CreateMaskBrush();
|
||||||
|
m_maskBrush.Source(m_dimColorBrush);
|
||||||
|
m_maskBrush.Mask(m_spotlightMaskGradient);
|
||||||
|
|
||||||
|
m_backdrop = m_compositor.CreateSpriteVisual();
|
||||||
|
m_backdrop.RelativeSizeAdjustment({ 1.0f, 1.0f });
|
||||||
|
m_backdrop.Brush(m_maskBrush);
|
||||||
|
layer.Children().InsertAtTop(m_backdrop);
|
||||||
|
|
||||||
|
// 5) Implicit opacity animation on the root
|
||||||
m_animation = m_compositor.CreateScalarKeyFrameAnimation();
|
m_animation = m_compositor.CreateScalarKeyFrameAnimation();
|
||||||
m_animation.Target(L"Opacity");
|
m_animation.Target(L"Opacity");
|
||||||
m_animation.InsertExpressionKeyFrame(1.0f, L"this.FinalValue");
|
m_animation.InsertExpressionKeyFrame(1.0f, L"this.FinalValue");
|
||||||
@@ -735,20 +851,31 @@ private:
|
|||||||
collection.Insert(L"Opacity", m_animation);
|
collection.Insert(L"Opacity", m_animation);
|
||||||
m_root.ImplicitAnimations(collection);
|
m_root.ImplicitAnimations(collection);
|
||||||
|
|
||||||
// Radius of spotlight shrinks as opacity increases.
|
// 6) Spotlight radius shrinks as opacity increases (expression animation)
|
||||||
// At opacity zero, it is m_sonarRadius * SonarZoomFactor.
|
|
||||||
// At maximum opacity, it is m_sonarRadius.
|
|
||||||
auto radiusExpression = m_compositor.CreateExpressionAnimation();
|
auto radiusExpression = m_compositor.CreateExpressionAnimation();
|
||||||
radiusExpression.SetReferenceParameter(L"Root", m_root);
|
radiusExpression.SetReferenceParameter(L"Root", m_root);
|
||||||
wchar_t expressionText[256];
|
|
||||||
winrt::check_hresult(StringCchPrintfW(expressionText, ARRAYSIZE(expressionText), L"Lerp(Vector2(%d, %d), Vector2(%d, %d), Root.Opacity * %d / %d)", m_sonarRadius * m_sonarZoomFactor, m_sonarRadius * m_sonarZoomFactor, m_sonarRadius, m_sonarRadius, FinalAlphaDenominator, m_finalAlphaNumerator));
|
|
||||||
radiusExpression.Expression(expressionText);
|
|
||||||
m_circleGeometry.StartAnimation(L"Radius", radiusExpression);
|
|
||||||
|
|
||||||
|
wchar_t expressionText[256];
|
||||||
|
winrt::check_hresult(StringCchPrintfW(
|
||||||
|
expressionText, ARRAYSIZE(expressionText), L"Lerp(Vector2(%d, %d), Vector2(%d, %d), Root.Opacity)", m_sonarRadius * m_sonarZoomFactor, m_sonarRadius * m_sonarZoomFactor, m_sonarRadius, m_sonarRadius));
|
||||||
|
|
||||||
|
radiusExpression.Expression(expressionText);
|
||||||
|
m_spotlightMaskGradient.StartAnimation(L"EllipseRadius", radiusExpression);
|
||||||
|
// Also animate spotlight geometry radius for visual consistency
|
||||||
|
if (m_circleGeometry)
|
||||||
|
{
|
||||||
|
auto radiusExpression2 = m_compositor.CreateExpressionAnimation();
|
||||||
|
radiusExpression2.SetReferenceParameter(L"Root", m_root);
|
||||||
|
radiusExpression2.Expression(expressionText);
|
||||||
|
m_circleGeometry.StartAnimation(L"Radius", radiusExpression2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Composition created successfully
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (const winrt::hresult_error& e)
|
||||||
{
|
{
|
||||||
|
Logger::error("Failed to create FindMyMouse visual: {}", winrt::to_string(e.message()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,11 +887,27 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateIslandSize()
|
||||||
|
{
|
||||||
|
if (!m_island)
|
||||||
|
return;
|
||||||
|
|
||||||
|
RECT rc{};
|
||||||
|
if (!GetClientRect(m_hwnd, &rc))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const int width = rc.right - rc.left;
|
||||||
|
const int height = rc.bottom - rc.top;
|
||||||
|
|
||||||
|
auto bridge = m_island.SiteBridge();
|
||||||
|
bridge.MoveAndResize(winrt::Windows::Graphics::RectInt32{ 0, 0, width, height });
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void ApplySettings(const FindMyMouseSettings& settings, bool applyToRuntimeObjects) {
|
void ApplySettings(const FindMyMouseSettings& settings, bool applyToRuntimeObjects)
|
||||||
|
{
|
||||||
if (!applyToRuntimeObjects)
|
if (!applyToRuntimeObjects)
|
||||||
{
|
{
|
||||||
// Runtime objects not created yet. Just update fields.
|
|
||||||
m_sonarRadius = settings.spotlightRadius;
|
m_sonarRadius = settings.spotlightRadius;
|
||||||
m_sonarRadiusFloat = static_cast<float>(m_sonarRadius);
|
m_sonarRadiusFloat = static_cast<float>(m_sonarRadius);
|
||||||
m_backgroundColor = settings.backgroundColor;
|
m_backgroundColor = settings.backgroundColor;
|
||||||
@@ -773,7 +916,6 @@ public:
|
|||||||
m_includeWinKey = settings.includeWinKey;
|
m_includeWinKey = settings.includeWinKey;
|
||||||
m_doNotActivateOnGameMode = settings.doNotActivateOnGameMode;
|
m_doNotActivateOnGameMode = settings.doNotActivateOnGameMode;
|
||||||
m_fadeDuration = settings.animationDurationMs > 0 ? settings.animationDurationMs : 1;
|
m_fadeDuration = settings.animationDurationMs > 0 ? settings.animationDurationMs : 1;
|
||||||
m_finalAlphaNumerator = settings.overlayOpacity;
|
|
||||||
m_sonarZoomFactor = settings.spotlightInitialZoom;
|
m_sonarZoomFactor = settings.spotlightInitialZoom;
|
||||||
m_excludedApps = settings.excludedApps;
|
m_excludedApps = settings.excludedApps;
|
||||||
m_shakeMinimumDistance = settings.shakeMinimumDistance;
|
m_shakeMinimumDistance = settings.shakeMinimumDistance;
|
||||||
@@ -782,11 +924,9 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Runtime objects already created. Should update in the owner thread.
|
|
||||||
if (m_dispatcherQueueController == nullptr)
|
if (m_dispatcherQueueController == nullptr)
|
||||||
{
|
{
|
||||||
Logger::warn("Tried accessing the dispatch queue controller before it was initialized.");
|
Logger::warn("Tried accessing the dispatch queue controller before it was initialized.");
|
||||||
// No dispatcher Queue Controller? Means initialization still hasn't run, so settings will be applied then.
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto dispatcherQueue = m_dispatcherQueueController.DispatcherQueue();
|
auto dispatcherQueue = m_dispatcherQueueController.DispatcherQueue();
|
||||||
@@ -794,7 +934,6 @@ public:
|
|||||||
bool enqueueSucceeded = dispatcherQueue.TryEnqueue([=]() {
|
bool enqueueSucceeded = dispatcherQueue.TryEnqueue([=]() {
|
||||||
if (!m_destroyed)
|
if (!m_destroyed)
|
||||||
{
|
{
|
||||||
// Runtime objects not created yet. Just update fields.
|
|
||||||
m_sonarRadius = localSettings.spotlightRadius;
|
m_sonarRadius = localSettings.spotlightRadius;
|
||||||
m_sonarRadiusFloat = static_cast<float>(m_sonarRadius);
|
m_sonarRadiusFloat = static_cast<float>(m_sonarRadius);
|
||||||
m_backgroundColor = localSettings.backgroundColor;
|
m_backgroundColor = localSettings.backgroundColor;
|
||||||
@@ -803,7 +942,6 @@ public:
|
|||||||
m_includeWinKey = localSettings.includeWinKey;
|
m_includeWinKey = localSettings.includeWinKey;
|
||||||
m_doNotActivateOnGameMode = localSettings.doNotActivateOnGameMode;
|
m_doNotActivateOnGameMode = localSettings.doNotActivateOnGameMode;
|
||||||
m_fadeDuration = localSettings.animationDurationMs > 0 ? localSettings.animationDurationMs : 1;
|
m_fadeDuration = localSettings.animationDurationMs > 0 ? localSettings.animationDurationMs : 1;
|
||||||
m_finalAlphaNumerator = localSettings.overlayOpacity;
|
|
||||||
m_sonarZoomFactor = localSettings.spotlightInitialZoom;
|
m_sonarZoomFactor = localSettings.spotlightInitialZoom;
|
||||||
m_excludedApps = localSettings.excludedApps;
|
m_excludedApps = localSettings.excludedApps;
|
||||||
m_shakeMinimumDistance = localSettings.shakeMinimumDistance;
|
m_shakeMinimumDistance = localSettings.shakeMinimumDistance;
|
||||||
@@ -812,20 +950,41 @@ public:
|
|||||||
UpdateMouseSnooping(); // For the shake mouse activation method
|
UpdateMouseSnooping(); // For the shake mouse activation method
|
||||||
|
|
||||||
// Apply new settings to runtime composition objects.
|
// Apply new settings to runtime composition objects.
|
||||||
m_backdrop.Brush().as<winrt::CompositionColorBrush>().Color(m_backgroundColor);
|
if (m_dimColorBrush)
|
||||||
m_circleShape.FillBrush().as<winrt::CompositionColorBrush>().Color(m_spotlightColor);
|
{
|
||||||
m_circleShape.Offset({ m_sonarRadiusFloat * m_sonarZoomFactor, m_sonarRadiusFloat * m_sonarZoomFactor });
|
m_dimColorBrush.Color(m_backgroundColor);
|
||||||
m_spotlight.Size({ m_sonarRadiusFloat * 2 * m_sonarZoomFactor, m_sonarRadiusFloat * 2 * m_sonarZoomFactor });
|
}
|
||||||
m_animation.Duration(std::chrono::milliseconds{ m_fadeDuration });
|
if (m_circleShape)
|
||||||
m_circleGeometry.StopAnimation(L"Radius");
|
{
|
||||||
|
if (auto brush = m_circleShape.FillBrush().try_as<muxc::CompositionColorBrush>())
|
||||||
// Update animation
|
{
|
||||||
|
brush.Color(m_spotlightColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const float scale = static_cast<float>(m_surface.XamlRoot().RasterizationScale());
|
||||||
|
const float rDip = m_sonarRadiusFloat / scale;
|
||||||
|
const float zoom = static_cast<float>(m_sonarZoomFactor);
|
||||||
|
m_spotlightMaskGradient.StopAnimation(L"EllipseRadius");
|
||||||
|
m_spotlightMaskGradient.EllipseCenter({ rDip * zoom, rDip * zoom });
|
||||||
|
if (m_spotlight)
|
||||||
|
{
|
||||||
|
m_spotlight.Size({ rDip * 2 * zoom, rDip * 2 * zoom });
|
||||||
|
m_circleShape.Offset({ rDip * zoom, rDip * zoom });
|
||||||
|
}
|
||||||
auto radiusExpression = m_compositor.CreateExpressionAnimation();
|
auto radiusExpression = m_compositor.CreateExpressionAnimation();
|
||||||
radiusExpression.SetReferenceParameter(L"Root", m_root);
|
radiusExpression.SetReferenceParameter(L"Root", m_root);
|
||||||
wchar_t expressionText[256];
|
wchar_t expressionText[256];
|
||||||
winrt::check_hresult(StringCchPrintfW(expressionText, ARRAYSIZE(expressionText), L"Lerp(Vector2(%d, %d), Vector2(%d, %d), Root.Opacity * %d / %d)", m_sonarRadius * m_sonarZoomFactor, m_sonarRadius * m_sonarZoomFactor, m_sonarRadius, m_sonarRadius, FinalAlphaDenominator, m_finalAlphaNumerator));
|
winrt::check_hresult(StringCchPrintfW(expressionText, ARRAYSIZE(expressionText), L"Lerp(Vector2(%d, %d), Vector2(%d, %d), Root.Opacity)", m_sonarRadius * m_sonarZoomFactor, m_sonarRadius * m_sonarZoomFactor, m_sonarRadius, m_sonarRadius));
|
||||||
radiusExpression.Expression(expressionText);
|
radiusExpression.Expression(expressionText);
|
||||||
m_circleGeometry.StartAnimation(L"Radius", radiusExpression);
|
m_spotlightMaskGradient.StartAnimation(L"EllipseRadius", radiusExpression);
|
||||||
|
if (m_circleGeometry)
|
||||||
|
{
|
||||||
|
m_circleGeometry.StopAnimation(L"Radius");
|
||||||
|
auto radiusExpression2 = m_compositor.CreateExpressionAnimation();
|
||||||
|
radiusExpression2.SetReferenceParameter(L"Root", m_root);
|
||||||
|
radiusExpression2.Expression(expressionText);
|
||||||
|
m_circleGeometry.StartAnimation(L"Radius", radiusExpression2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (!enqueueSucceeded)
|
if (!enqueueSucceeded)
|
||||||
@@ -836,17 +995,27 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
winrt::Compositor m_compositor{ nullptr };
|
muxc::Compositor m_compositor{ nullptr };
|
||||||
winrt::Desktop::DesktopWindowTarget m_target{ nullptr };
|
muxxh::DesktopWindowXamlSource m_island{ nullptr };
|
||||||
winrt::ContainerVisual m_root{ nullptr };
|
muxxc::Grid m_surface{ nullptr };
|
||||||
winrt::CompositionEllipseGeometry m_circleGeometry{ nullptr };
|
|
||||||
winrt::ShapeVisual m_spotlight{ nullptr };
|
muxc::ContainerVisual m_root{ nullptr };
|
||||||
winrt::CompositionCommitBatch m_batch{ nullptr };
|
muxc::CompositionCommitBatch m_batch{ nullptr };
|
||||||
winrt::SpriteVisual m_backdrop{ nullptr };
|
muxc::SpriteVisual m_backdrop{ nullptr };
|
||||||
winrt::CompositionSpriteShape m_circleShape{ nullptr };
|
// Spotlight shape visuals
|
||||||
|
muxc::CompositionEllipseGeometry m_circleGeometry{ nullptr };
|
||||||
|
muxc::ShapeVisual m_spotlight{ nullptr };
|
||||||
|
muxc::CompositionSpriteShape m_circleShape{ nullptr };
|
||||||
|
// Radial gradient mask components
|
||||||
|
muxc::CompositionMaskBrush m_maskBrush{ nullptr };
|
||||||
|
muxc::CompositionColorBrush m_dimColorBrush{ nullptr };
|
||||||
|
muxc::CompositionRadialGradientBrush m_spotlightMaskGradient{ nullptr };
|
||||||
|
muxc::CompositionColorGradientStop m_maskStopCenter{ nullptr };
|
||||||
|
muxc::CompositionColorGradientStop m_maskStopInner{ nullptr };
|
||||||
|
muxc::CompositionColorGradientStop m_maskStopOuter{ nullptr };
|
||||||
winrt::Windows::UI::Color m_backgroundColor = FIND_MY_MOUSE_DEFAULT_BACKGROUND_COLOR;
|
winrt::Windows::UI::Color m_backgroundColor = FIND_MY_MOUSE_DEFAULT_BACKGROUND_COLOR;
|
||||||
winrt::Windows::UI::Color m_spotlightColor = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_COLOR;
|
winrt::Windows::UI::Color m_spotlightColor = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_COLOR;
|
||||||
winrt::ScalarKeyFrameAnimation m_animation{ nullptr };
|
muxc::ScalarKeyFrameAnimation m_animation{ nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename D>
|
template<typename D>
|
||||||
@@ -1047,7 +1216,6 @@ struct GdiCrosshairs : GdiSonar<GdiCrosshairs>
|
|||||||
|
|
||||||
#pragma endregion Super_Sonar_Base_Code
|
#pragma endregion Super_Sonar_Base_Code
|
||||||
|
|
||||||
|
|
||||||
#pragma region Super_Sonar_API
|
#pragma region Super_Sonar_API
|
||||||
|
|
||||||
CompositionSpotlight* m_sonar = nullptr;
|
CompositionSpotlight* m_sonar = nullptr;
|
||||||
@@ -1055,7 +1223,6 @@ void FindMyMouseApplySettings(const FindMyMouseSettings& settings)
|
|||||||
{
|
{
|
||||||
if (m_sonar != nullptr)
|
if (m_sonar != nullptr)
|
||||||
{
|
{
|
||||||
Logger::info("Applying settings.");
|
|
||||||
m_sonar->ApplySettings(settings, true);
|
m_sonar->ApplySettings(settings, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1064,7 +1231,6 @@ void FindMyMouseDisable()
|
|||||||
{
|
{
|
||||||
if (m_sonar != nullptr)
|
if (m_sonar != nullptr)
|
||||||
{
|
{
|
||||||
Logger::info("Terminating a sonar instance.");
|
|
||||||
m_sonar->Terminate();
|
m_sonar->Terminate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1077,7 +1243,6 @@ bool FindMyMouseIsEnabled()
|
|||||||
// Based on SuperSonar's original wWinMain.
|
// Based on SuperSonar's original wWinMain.
|
||||||
int FindMyMouseMain(HINSTANCE hinst, const FindMyMouseSettings& settings)
|
int FindMyMouseMain(HINSTANCE hinst, const FindMyMouseSettings& settings)
|
||||||
{
|
{
|
||||||
Logger::info("Starting a sonar instance.");
|
|
||||||
if (m_sonar != nullptr)
|
if (m_sonar != nullptr)
|
||||||
{
|
{
|
||||||
Logger::error("A sonar instance was still working when trying to start a new one.");
|
Logger::error("A sonar instance was still working when trying to start a new one.");
|
||||||
@@ -1092,7 +1257,6 @@ int FindMyMouseMain(HINSTANCE hinst, const FindMyMouseSettings& settings)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
m_sonar = &sonar;
|
m_sonar = &sonar;
|
||||||
Logger::info("Initialized the sonar instance.");
|
|
||||||
|
|
||||||
InitializeWinhookEventIds();
|
InitializeWinhookEventIds();
|
||||||
|
|
||||||
@@ -1105,7 +1269,6 @@ int FindMyMouseMain(HINSTANCE hinst, const FindMyMouseSettings& settings)
|
|||||||
DispatchMessage(&msg);
|
DispatchMessage(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger::info("Sonar message loop ended.");
|
|
||||||
m_sonar = nullptr;
|
m_sonar = nullptr;
|
||||||
|
|
||||||
return (int)msg.wParam;
|
return (int)msg.wParam;
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ enum struct FindMyMouseActivationMethod : int
|
|||||||
};
|
};
|
||||||
|
|
||||||
constexpr bool FIND_MY_MOUSE_DEFAULT_DO_NOT_ACTIVATE_ON_GAME_MODE = true;
|
constexpr bool FIND_MY_MOUSE_DEFAULT_DO_NOT_ACTIVATE_ON_GAME_MODE = true;
|
||||||
|
// Default colors now include full alpha. Opacity is encoded directly in color alpha (legacy overlay_opacity migrated into A channel)
|
||||||
const winrt::Windows::UI::Color FIND_MY_MOUSE_DEFAULT_BACKGROUND_COLOR = winrt::Windows::UI::ColorHelper::FromArgb(255, 0, 0, 0);
|
const winrt::Windows::UI::Color FIND_MY_MOUSE_DEFAULT_BACKGROUND_COLOR = winrt::Windows::UI::ColorHelper::FromArgb(255, 0, 0, 0);
|
||||||
const winrt::Windows::UI::Color FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_COLOR = winrt::Windows::UI::ColorHelper::FromArgb(255, 255, 255, 255);
|
const winrt::Windows::UI::Color FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_COLOR = winrt::Windows::UI::ColorHelper::FromArgb(255, 255, 255, 255);
|
||||||
constexpr int FIND_MY_MOUSE_DEFAULT_OVERLAY_OPACITY = 50;
|
|
||||||
constexpr int FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_RADIUS = 100;
|
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_ANIMATION_DURATION_MS = 500;
|
||||||
constexpr int FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_INITIAL_ZOOM = 9;
|
constexpr int FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_INITIAL_ZOOM = 9;
|
||||||
@@ -30,7 +30,6 @@ struct FindMyMouseSettings
|
|||||||
bool doNotActivateOnGameMode = FIND_MY_MOUSE_DEFAULT_DO_NOT_ACTIVATE_ON_GAME_MODE;
|
bool doNotActivateOnGameMode = FIND_MY_MOUSE_DEFAULT_DO_NOT_ACTIVATE_ON_GAME_MODE;
|
||||||
winrt::Windows::UI::Color backgroundColor = FIND_MY_MOUSE_DEFAULT_BACKGROUND_COLOR;
|
winrt::Windows::UI::Color backgroundColor = FIND_MY_MOUSE_DEFAULT_BACKGROUND_COLOR;
|
||||||
winrt::Windows::UI::Color spotlightColor = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_COLOR;
|
winrt::Windows::UI::Color spotlightColor = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_COLOR;
|
||||||
int overlayOpacity = FIND_MY_MOUSE_DEFAULT_OVERLAY_OPACITY;
|
|
||||||
int spotlightRadius = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_RADIUS;
|
int spotlightRadius = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_RADIUS;
|
||||||
int animationDurationMs = FIND_MY_MOUSE_DEFAULT_ANIMATION_DURATION_MS;
|
int animationDurationMs = FIND_MY_MOUSE_DEFAULT_ANIMATION_DURATION_MS;
|
||||||
int spotlightInitialZoom = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_INITIAL_ZOOM;
|
int spotlightInitialZoom = FIND_MY_MOUSE_DEFAULT_SPOTLIGHT_INITIAL_ZOOM;
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.props" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.props')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.props" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.props')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.props" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.props')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.props" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.props')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.props" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.props')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.props" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.props')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.props" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.props')" />
|
||||||
<Import Project="..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props')" />
|
<Import Project="..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props')" />
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<VCProjectVersion>15.0</VCProjectVersion>
|
<VCProjectVersion>15.0</VCProjectVersion>
|
||||||
@@ -7,6 +14,14 @@
|
|||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>FindMyMouse</RootNamespace>
|
<RootNamespace>FindMyMouse</RootNamespace>
|
||||||
<ProjectName>FindMyMouse</ProjectName>
|
<ProjectName>FindMyMouse</ProjectName>
|
||||||
|
<CppWinRTOptimized>true</CppWinRTOptimized>
|
||||||
|
<CppWinRTEnableComponentProjection>false</CppWinRTEnableComponentProjection>
|
||||||
|
<CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>
|
||||||
|
<WindowsAppSdkBootstrapInitialize>false</WindowsAppSdkBootstrapInitialize>
|
||||||
|
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
|
||||||
|
<WindowsAppSDKVerifyTransitiveDependencies>false</WindowsAppSDKVerifyTransitiveDependencies>
|
||||||
|
<!-- Force NuGet to treat this project strictly as packages.config style -->
|
||||||
|
<RestoreProjectStyle>packages.config</RestoreProjectStyle>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||||
@@ -30,6 +45,7 @@
|
|||||||
<ImportGroup Label="PropertySheets">
|
<ImportGroup Label="PropertySheets">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutDir>..\..\..\..\$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>..\..\..\..\$(Platform)\$(Configuration)\</OutDir>
|
||||||
@@ -79,7 +95,8 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)src\;$(SolutionDir)src\modules;$(SolutionDir)src\common\Telemetry;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<!-- Add Generated Files folder so #include <winrt/...> finds projected headers -->
|
||||||
|
<AdditionalIncludeDirectories>$(GeneratedFilesDir);$(SolutionDir)src\;$(SolutionDir)src\modules;$(SolutionDir)src\common\Telemetry;$(MSBuildThisFileDirectory)..\..\..\..\src\;$(MSBuildThisFileDirectory)..\..\..\..\src\modules;$(MSBuildThisFileDirectory)..\..\..\..\src\common\Telemetry;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -98,6 +115,7 @@
|
|||||||
<ClCompile Include="trace.cpp" />
|
<ClCompile Include="trace.cpp" />
|
||||||
<ClCompile Include="WinHookEventIDs.cpp" />
|
<ClCompile Include="WinHookEventIDs.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\..\common\logger\logger.vcxproj">
|
<ProjectReference Include="..\..\..\common\logger\logger.vcxproj">
|
||||||
<Project>{d9b8fc84-322a-4f9f-bbb9-20915c47ddfd}</Project>
|
<Project>{d9b8fc84-322a-4f9f-bbb9-20915c47ddfd}</Project>
|
||||||
@@ -112,16 +130,56 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<!-- Deduplicate WindowsAppRuntimeAutoInitializer.cpp (added twice via transitive imports causing LNK4042). Remove all then add exactly once. -->
|
||||||
|
<ItemGroup Condition="'$(PkgMicrosoft_WindowsAppSDK)'!=''">
|
||||||
|
<!-- Remove any transitive inclusion first -->
|
||||||
|
<ClCompile Remove="$(PkgMicrosoft_WindowsAppSDK)\include\WindowsAppRuntimeAutoInitializer.cpp" />
|
||||||
|
<!-- Re-add once, but disable PCH because the SDK file doesn't include our pch.h -->
|
||||||
|
<ClCompile Include="$(PkgMicrosoft_WindowsAppSDK)\include\WindowsAppRuntimeAutoInitializer.cpp">
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<Target Name="RemoveManagedWebView2CoreFromNativeOutDir" AfterTargets="Build">
|
||||||
|
<ItemGroup>
|
||||||
|
<_ToDelete Include="$(OutDir)Microsoft.Web.WebView2.Core.dll" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Delete Files="@(_ToDelete)" Condition="Exists('%(Identity)')" />
|
||||||
|
</Target>
|
||||||
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<Import Project="..\..\..\..\deps\spdlog.props" />
|
<Import Project="..\..\..\..\deps\spdlog.props" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<Import Project="..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets')" />
|
||||||
<Import Project="..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets')" />
|
<Import Project="..\..\..\..\packages\Microsoft.Web.WebView2.1.0.2903.40\build\native\Microsoft.Web.WebView2.targets" Condition="Exists('..\..\..\..\packages\Microsoft.Web.WebView2.1.0.2903.40\build\native\Microsoft.Web.WebView2.targets')" />
|
||||||
</ImportGroup>
|
<Import Project="..\..\..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.Windows.SDK.BuildTools.10.0.26100.4188\build\Microsoft.Windows.SDK.BuildTools.targets" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.SDK.BuildTools.10.0.26100.4188\build\Microsoft.Windows.SDK.BuildTools.targets')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.targets" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.targets')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.targets" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.targets')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.targets" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.targets')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.targets" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.targets')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.targets" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.targets')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.targets" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.targets')" />
|
||||||
|
<Import Project="..\..\..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.targets" Condition="Exists('..\..\..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.targets')" />
|
||||||
|
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Error Condition="!Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props'))" />
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.Windows.CppWinRT.2.0.240111.5\\build\\native\\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.Windows.CppWinRT.2.0.240111.5\\build\\native\\Microsoft.Windows.CppWinRT.props'))" />
|
||||||
<Error Condition="!Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets'))" />
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.Windows.CppWinRT.2.0.240111.5\\build\\native\\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.Windows.CppWinRT.2.0.240111.5\\build\\native\\Microsoft.Windows.CppWinRT.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.Web.WebView2.1.0.2903.40\\build\\native\\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.Web.WebView2.1.0.2903.40\\build\\native\\Microsoft.Web.WebView2.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.1.8.250907003\\build\\native\\Microsoft.WindowsAppSDK.props')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.1.8.250907003\\build\\native\\Microsoft.WindowsAppSDK.props'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.1.8.250907003\\build\\native\\Microsoft.WindowsAppSDK.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.1.8.250907003\\build\\native\\Microsoft.WindowsAppSDK.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Base.1.8.250831001\\build\\native\\Microsoft.WindowsAppSDK.Base.props')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Base.1.8.250831001\\build\\native\\Microsoft.WindowsAppSDK.Base.props'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Base.1.8.250831001\\build\\native\\Microsoft.WindowsAppSDK.Base.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Base.1.8.250831001\\build\\native\\Microsoft.WindowsAppSDK.Base.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\\build\\native\\Microsoft.WindowsAppSDK.Foundation.props')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\\build\\native\\Microsoft.WindowsAppSDK.Foundation.props'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\\build\\native\\Microsoft.WindowsAppSDK.Foundation.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\\build\\native\\Microsoft.WindowsAppSDK.Foundation.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\\build\\native\\Microsoft.WindowsAppSDK.WinUI.props')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\\build\\native\\Microsoft.WindowsAppSDK.WinUI.props'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\\build\\native\\Microsoft.WindowsAppSDK.WinUI.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\\build\\native\\Microsoft.WindowsAppSDK.WinUI.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\\build\\native\\Microsoft.WindowsAppSDK.Runtime.props')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\\build\\native\\Microsoft.WindowsAppSDK.Runtime.props'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\\build\\native\\Microsoft.WindowsAppSDK.Runtime.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\\build\\native\\Microsoft.WindowsAppSDK.Runtime.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\\build\\Microsoft.WindowsAppSDK.DWrite.props')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\\build\\Microsoft.WindowsAppSDK.DWrite.props'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\\build\\Microsoft.WindowsAppSDK.DWrite.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\\build\\Microsoft.WindowsAppSDK.DWrite.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\\build\\native\\Microsoft.WindowsAppSDK.InteractiveExperiences.props')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\\build\\native\\Microsoft.WindowsAppSDK.InteractiveExperiences.props'))" />
|
||||||
|
<Error Condition="!Exists('..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\\build\\native\\Microsoft.WindowsAppSDK.InteractiveExperiences.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\\..\\..\\..\\packages\\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\\build\\native\\Microsoft.WindowsAppSDK.InteractiveExperiences.targets'))" />
|
||||||
</Target>
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -18,7 +18,7 @@ namespace
|
|||||||
const wchar_t JSON_KEY_DO_NOT_ACTIVATE_ON_GAME_MODE[] = L"do_not_activate_on_game_mode";
|
const wchar_t JSON_KEY_DO_NOT_ACTIVATE_ON_GAME_MODE[] = L"do_not_activate_on_game_mode";
|
||||||
const wchar_t JSON_KEY_BACKGROUND_COLOR[] = L"background_color";
|
const wchar_t JSON_KEY_BACKGROUND_COLOR[] = L"background_color";
|
||||||
const wchar_t JSON_KEY_SPOTLIGHT_COLOR[] = L"spotlight_color";
|
const wchar_t JSON_KEY_SPOTLIGHT_COLOR[] = L"spotlight_color";
|
||||||
const wchar_t JSON_KEY_OVERLAY_OPACITY[] = L"overlay_opacity";
|
const wchar_t JSON_KEY_OVERLAY_OPACITY[] = L"overlay_opacity"; // legacy only (migrated into color alpha)
|
||||||
const wchar_t JSON_KEY_SPOTLIGHT_RADIUS[] = L"spotlight_radius";
|
const wchar_t JSON_KEY_SPOTLIGHT_RADIUS[] = L"spotlight_radius";
|
||||||
const wchar_t JSON_KEY_ANIMATION_DURATION_MS[] = L"animation_duration_ms";
|
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_SPOTLIGHT_INITIAL_ZOOM[] = L"spotlight_initial_zoom";
|
||||||
@@ -204,6 +204,22 @@ void FindMyMouse::init_settings()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline static uint8_t LegacyOpacityToAlpha(int overlayOpacityPercent)
|
||||||
|
{
|
||||||
|
if (overlayOpacityPercent < 0)
|
||||||
|
{
|
||||||
|
return 255; // fallback: fully opaque
|
||||||
|
}
|
||||||
|
|
||||||
|
if (overlayOpacityPercent > 100)
|
||||||
|
{
|
||||||
|
overlayOpacityPercent = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Round to nearest integer (0<>255)
|
||||||
|
return static_cast<uint8_t>((overlayOpacityPercent * 255 + 50) / 100);
|
||||||
|
}
|
||||||
|
|
||||||
void FindMyMouse::parse_settings(PowerToysSettings::PowerToyValues& settings)
|
void FindMyMouse::parse_settings(PowerToysSettings::PowerToyValues& settings)
|
||||||
{
|
{
|
||||||
auto settingsObject = settings.get_raw_json();
|
auto settingsObject = settings.get_raw_json();
|
||||||
@@ -224,14 +240,13 @@ void FindMyMouse::parse_settings(PowerToysSettings::PowerToyValues& settings)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
findMyMouseSettings.activationMethod = static_cast<FindMyMouseActivationMethod>(value);
|
findMyMouseSettings.activationMethod = static_cast<FindMyMouseActivationMethod>(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Invalid Activation Method value");
|
throw std::runtime_error("Invalid Activation Method value");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
@@ -255,19 +270,49 @@ void FindMyMouse::parse_settings(PowerToysSettings::PowerToyValues& settings)
|
|||||||
{
|
{
|
||||||
Logger::warn("Failed to get 'do not activate on game mode' setting");
|
Logger::warn("Failed to get 'do not activate on game mode' setting");
|
||||||
}
|
}
|
||||||
|
// Colors + legacy overlay opacity migration
|
||||||
|
// Desired behavior:
|
||||||
|
// - Old schema: colors stored as RGB (no alpha) + separate overlay_opacity (0-100). We should migrate by applying that opacity as alpha.
|
||||||
|
// - New schema: colors stored as ARGB (alpha embedded). Ignore overlay_opacity even if still present.
|
||||||
|
int legacyOverlayOpacity = -1;
|
||||||
|
bool backgroundColorHadExplicitAlpha = false;
|
||||||
|
bool spotlightColorHadExplicitAlpha = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Parse background color
|
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_OVERLAY_OPACITY);
|
||||||
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_BACKGROUND_COLOR);
|
int value = static_cast<int>(jsonPropertiesObject.GetNamedNumber(JSON_KEY_VALUE));
|
||||||
auto backgroundColor = (std::wstring)jsonPropertiesObject.GetNamedString(JSON_KEY_VALUE);
|
if (value >= 0 && value <= 100)
|
||||||
uint8_t r, g, b;
|
|
||||||
if (!checkValidRGB(backgroundColor, &r, &g, &b))
|
|
||||||
{
|
{
|
||||||
Logger::error("Background color RGB value is invalid. Will use default value");
|
legacyOverlayOpacity = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
// overlay_opacity may not exist anymore
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_BACKGROUND_COLOR);
|
||||||
|
auto backgroundColorStr = (std::wstring)jsonPropertiesObject.GetNamedString(JSON_KEY_VALUE);
|
||||||
|
uint8_t a = 255, r, g, b;
|
||||||
|
bool parsed = false;
|
||||||
|
if (checkValidARGB(backgroundColorStr, &a, &r, &g, &b))
|
||||||
|
{
|
||||||
|
parsed = true;
|
||||||
|
backgroundColorHadExplicitAlpha = true; // New schema with alpha present
|
||||||
|
}
|
||||||
|
else if (checkValidRGB(backgroundColorStr, &r, &g, &b))
|
||||||
|
{
|
||||||
|
a = LegacyOpacityToAlpha(legacyOverlayOpacity);
|
||||||
|
parsed = true; // Old schema (no alpha component)
|
||||||
|
}
|
||||||
|
if (parsed)
|
||||||
|
{
|
||||||
|
findMyMouseSettings.backgroundColor = winrt::Windows::UI::ColorHelper::FromArgb(a, r, g, b);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
findMyMouseSettings.backgroundColor = winrt::Windows::UI::ColorHelper::FromArgb(255, r, g, b);
|
Logger::error("Background color value is invalid. Will use default");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
@@ -276,17 +321,27 @@ void FindMyMouse::parse_settings(PowerToysSettings::PowerToyValues& settings)
|
|||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Parse spotlight color
|
|
||||||
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_SPOTLIGHT_COLOR);
|
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_SPOTLIGHT_COLOR);
|
||||||
auto spotlightColor = (std::wstring)jsonPropertiesObject.GetNamedString(JSON_KEY_VALUE);
|
auto spotlightColorStr = (std::wstring)jsonPropertiesObject.GetNamedString(JSON_KEY_VALUE);
|
||||||
uint8_t r, g, b;
|
uint8_t a = 255, r, g, b;
|
||||||
if (!checkValidRGB(spotlightColor, &r, &g, &b))
|
bool parsed = false;
|
||||||
|
if (checkValidARGB(spotlightColorStr, &a, &r, &g, &b))
|
||||||
{
|
{
|
||||||
Logger::error("Spotlight color RGB value is invalid. Will use default value");
|
parsed = true;
|
||||||
|
spotlightColorHadExplicitAlpha = true;
|
||||||
|
}
|
||||||
|
else if (checkValidRGB(spotlightColorStr, &r, &g, &b))
|
||||||
|
{
|
||||||
|
a = LegacyOpacityToAlpha(legacyOverlayOpacity);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (parsed)
|
||||||
|
{
|
||||||
|
findMyMouseSettings.spotlightColor = winrt::Windows::UI::ColorHelper::FromArgb(a, r, g, b);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
findMyMouseSettings.spotlightColor = winrt::Windows::UI::ColorHelper::FromArgb(255, r, g, b);
|
Logger::error("Spotlight color value is invalid. Will use default");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
@@ -294,24 +349,6 @@ void FindMyMouse::parse_settings(PowerToysSettings::PowerToyValues& settings)
|
|||||||
Logger::warn("Failed to initialize spotlight color from settings. Will use default value");
|
Logger::warn("Failed to initialize spotlight color from settings. Will use default value");
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
|
||||||
// Parse Overlay Opacity
|
|
||||||
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_OVERLAY_OPACITY);
|
|
||||||
int value = static_cast<int>(jsonPropertiesObject.GetNamedNumber(JSON_KEY_VALUE));
|
|
||||||
if (value >= 0)
|
|
||||||
{
|
|
||||||
findMyMouseSettings.overlayOpacity = value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw std::runtime_error("Invalid Overlay Opacity value");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
Logger::warn("Failed to initialize Overlay Opacity from settings. Will use default value");
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
// Parse Spotlight Radius
|
// Parse Spotlight Radius
|
||||||
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_SPOTLIGHT_RADIUS);
|
auto jsonPropertiesObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES).GetNamedObject(JSON_KEY_SPOTLIGHT_RADIUS);
|
||||||
@@ -492,7 +529,6 @@ void FindMyMouse::parse_settings(PowerToysSettings::PowerToyValues& settings)
|
|||||||
m_findMyMouseSettings = findMyMouseSettings;
|
m_findMyMouseSettings = findMyMouseSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create()
|
extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create()
|
||||||
{
|
{
|
||||||
return new FindMyMouse();
|
return new FindMyMouse();
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="Microsoft.Windows.CppWinRT" version="2.0.240111.5" targetFramework="native" />
|
<package id="Microsoft.Windows.CppWinRT" version="2.0.240111.5" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK" version="1.8.250907003" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.Base" version="1.8.250831001" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.Foundation" version="1.8.250906002" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.WinUI" version="1.8.250906003" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.Runtime" version="1.8.250907003" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.DWrite" version="1.8.25090401" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.InteractiveExperiences" version="1.8.250906004" targetFramework="native" />
|
||||||
|
<package id="Microsoft.Web.WebView2" version="1.0.2903.40" targetFramework="native" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -5,15 +5,22 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <strsafe.h>
|
#include <strsafe.h>
|
||||||
#include <hIdUsage.h>
|
#include <hIdUsage.h>
|
||||||
|
// Required for IUnknown and DECLARE_INTERFACE_* used by interop headers
|
||||||
|
#include <Unknwn.h>
|
||||||
|
|
||||||
#ifdef COMPOSITION
|
#ifdef COMPOSITION
|
||||||
#include <windows.ui.composition.interop.h>
|
|
||||||
#include <DispatcherQueue.h>
|
#include <DispatcherQueue.h>
|
||||||
#include <winrt/Windows.System.h>
|
#include <winrt/Windows.System.h>
|
||||||
#include <winrt/Windows.Foundation.h>
|
#include <winrt/Windows.Foundation.h>
|
||||||
#include <winrt/Windows.UI.Composition.Desktop.h>
|
#include <winrt/Microsoft.UI.Composition.h>
|
||||||
|
#include <winrt/Microsoft.UI.h>
|
||||||
|
#include <winrt/Windows.UI.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <winrt/Windows.Foundation.Collections.h>
|
#include <winrt/Windows.Foundation.Collections.h>
|
||||||
#include <common/SettingsAPI/settings_helpers.h>
|
#include <common/SettingsAPI/settings_helpers.h>
|
||||||
#include <common/logger/logger.h>
|
#include <common/logger/logger.h>
|
||||||
|
|
||||||
|
#ifdef GetCurrentTime
|
||||||
|
#undef GetCurrentTime
|
||||||
|
#endif
|
||||||
@@ -335,6 +335,7 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR l
|
|||||||
GdiplusStartup(&gpToken, &gpStartupInput, NULL);
|
GdiplusStartup(&gpToken, &gpStartupInput, NULL);
|
||||||
|
|
||||||
winrt::init_apartment();
|
winrt::init_apartment();
|
||||||
|
|
||||||
const wchar_t* securityDescriptor =
|
const wchar_t* securityDescriptor =
|
||||||
L"O:BA" // Owner: Builtin (local) administrator
|
L"O:BA" // Owner: Builtin (local) administrator
|
||||||
L"G:BA" // Group: Builtin (local) administrator
|
L"G:BA" // Group: Builtin (local) administrator
|
||||||
@@ -526,5 +527,6 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR l
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stop_tray_icon();
|
stop_tray_icon();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,4 +2,15 @@
|
|||||||
<packages>
|
<packages>
|
||||||
<package id="Microsoft.Windows.CppWinRT" version="2.0.240111.5" targetFramework="native" />
|
<package id="Microsoft.Windows.CppWinRT" version="2.0.240111.5" targetFramework="native" />
|
||||||
<package id="Microsoft.Windows.ImplementationLibrary" version="1.0.231216.1" targetFramework="native" />
|
<package id="Microsoft.Windows.ImplementationLibrary" version="1.0.231216.1" targetFramework="native" />
|
||||||
|
<!-- Windows App SDK and all transitive dependencies -->
|
||||||
|
<package id="Microsoft.WindowsAppSDK" version="1.8.250907003" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.Base" version="1.8.250831001" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.Foundation" version="1.8.250906002" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.WinUI" version="1.8.250906003" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.Runtime" version="1.8.250907003" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.DWrite" version="1.8.25090401" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.InteractiveExperiences" version="1.8.250906004" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.Widgets" version="1.8.250904007" targetFramework="native" />
|
||||||
|
<package id="Microsoft.WindowsAppSDK.AI" version="1.8.37" targetFramework="native" />
|
||||||
|
<package id="Microsoft.Web.WebView2" version="1.0.2903.40" targetFramework="native" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props" Condition="Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props')" />
|
|
||||||
<Target Name="GenerateResourceFiles" BeforeTargets="PrepareForBuild">
|
<Target Name="GenerateResourceFiles" BeforeTargets="PrepareForBuild">
|
||||||
<Exec Command="powershell -NonInteractive -executionpolicy Unrestricted $(SolutionDir)tools\build\convert-resx-to-rc.ps1 $(MSBuildThisFileDirectory) resource.base.h resource.h runner.base.rc runner.rc" />
|
<Exec Command="powershell -NonInteractive -executionpolicy Unrestricted $(SolutionDir)\tools\build\convert-resx-to-rc.ps1 $(MSBuildThisFileDirectory) resource.base.h resource.h runner.base.rc runner.rc" />
|
||||||
</Target>
|
</Target>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<NoWarn>81010002</NoWarn>
|
<NoWarn>81010002</NoWarn>
|
||||||
@@ -15,10 +14,20 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<Import Project="..\..\deps\expected.props" />
|
<Import Project="..\..\deps\expected.props" />
|
||||||
|
<Import Project="..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.props" Condition="Exists('..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.props')" />
|
||||||
|
<Import Project="..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.props" Condition="Exists('..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.props')" />
|
||||||
|
<Import Project="..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.props" Condition="Exists('..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.props')" />
|
||||||
|
<Import Project="..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.props" Condition="Exists('..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.props')" />
|
||||||
|
<Import Project="..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.props" Condition="Exists('..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.props')" />
|
||||||
|
<Import Project="..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.props" Condition="Exists('..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.props')" />
|
||||||
|
<Import Project="..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.props" Condition="Exists('..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.props')" />
|
||||||
|
<Import Project="..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props" Condition="Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props')" />
|
||||||
<ImportGroup Label="Shared" />
|
<ImportGroup Label="Shared" />
|
||||||
<PropertyGroup Label="Configuration">
|
<PropertyGroup Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<PlatformToolset>v143</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WindowsPackageType>None</WindowsPackageType>
|
||||||
|
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
@@ -131,15 +140,38 @@
|
|||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<Import Project="..\..\deps\spdlog.props" />
|
<Import Project="..\..\deps\spdlog.props" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
<Import Project="..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets')" />
|
<Import Project="$(SolutionDir)packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.targets')" />
|
||||||
<Import Project="..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets" Condition="Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" />
|
<Import Project="$(SolutionDir)packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)packages\Microsoft.Web.WebView2.1.0.2903.40\build\native\Microsoft.Web.WebView2.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.Web.WebView2.1.0.2903.40\build\native\Microsoft.Web.WebView2.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.props'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.1.8.250907003\build\native\Microsoft.WindowsAppSDK.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.props'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.Base.1.8.250831001\build\native\Microsoft.WindowsAppSDK.Base.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.props'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.Foundation.1.8.250906002\build\native\Microsoft.WindowsAppSDK.Foundation.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.props'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.WinUI.1.8.250906003\build\native\Microsoft.WindowsAppSDK.WinUI.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.props'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.Runtime.1.8.250907003\build\native\Microsoft.WindowsAppSDK.Runtime.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.props'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.DWrite.1.8.25090401\build\Microsoft.WindowsAppSDK.DWrite.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.props'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.1.8.250906004\build\native\Microsoft.WindowsAppSDK.InteractiveExperiences.targets'))" />
|
||||||
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props'))" />
|
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.props'))" />
|
||||||
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets'))" />
|
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.240111.5\build\native\Microsoft.Windows.CppWinRT.targets'))" />
|
||||||
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" />
|
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.231216.1\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" />
|
||||||
|
<Error Condition="!Exists('..\..\packages\Microsoft.Web.WebView2.1.0.2903.40\build\native\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Web.WebView2.1.0.2903.40\build\native\Microsoft.Web.WebView2.targets'))" />
|
||||||
</Target>
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -31,9 +31,6 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
|||||||
[JsonPropertyName("spotlight_color")]
|
[JsonPropertyName("spotlight_color")]
|
||||||
public StringProperty SpotlightColor { get; set; }
|
public StringProperty SpotlightColor { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("overlay_opacity")]
|
|
||||||
public IntProperty OverlayOpacity { get; set; }
|
|
||||||
|
|
||||||
[JsonPropertyName("spotlight_radius")]
|
[JsonPropertyName("spotlight_radius")]
|
||||||
public IntProperty SpotlightRadius { get; set; }
|
public IntProperty SpotlightRadius { get; set; }
|
||||||
|
|
||||||
@@ -61,9 +58,8 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
|||||||
IncludeWinKey = new BoolProperty(false);
|
IncludeWinKey = new BoolProperty(false);
|
||||||
ActivationShortcut = DefaultActivationShortcut;
|
ActivationShortcut = DefaultActivationShortcut;
|
||||||
DoNotActivateOnGameMode = new BoolProperty(true);
|
DoNotActivateOnGameMode = new BoolProperty(true);
|
||||||
BackgroundColor = new StringProperty("#000000");
|
BackgroundColor = new StringProperty("#FF000000"); // ARGB (#AARRGGBB)
|
||||||
SpotlightColor = new StringProperty("#FFFFFF");
|
SpotlightColor = new StringProperty("#FFFFFFFF");
|
||||||
OverlayOpacity = new IntProperty(50);
|
|
||||||
SpotlightRadius = new IntProperty(100);
|
SpotlightRadius = new IntProperty(100);
|
||||||
AnimationDurationMs = new IntProperty(500);
|
AnimationDurationMs = new IntProperty(500);
|
||||||
SpotlightInitialZoom = new IntProperty(9);
|
SpotlightInitialZoom = new IntProperty(9);
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
<UserControl
|
|
||||||
x:Class="Microsoft.PowerToys.Settings.UI.Controls.AlphaColorPickerButton"
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
d:DesignHeight="300"
|
|
||||||
d:DesignWidth="400"
|
|
||||||
mc:Ignorable="d">
|
|
||||||
|
|
||||||
<Grid>
|
|
||||||
<!--TODO(stefan): ToDisplayName is no longer available in ColorHelper
|
|
||||||
<DropDownButton Padding="4,4,8,4" AutomationProperties.FullDescription="{x:Bind clr:ColorHelper.ToDisplayName(SelectedColor), Mode=OneWay }">
|
|
||||||
-->
|
|
||||||
<DropDownButton Padding="4,4,8,4">
|
|
||||||
<Border
|
|
||||||
x:Name="ColorPreviewBorder"
|
|
||||||
Width="48"
|
|
||||||
Height="24"
|
|
||||||
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
|
|
||||||
BorderThickness="1"
|
|
||||||
CornerRadius="{ThemeResource ControlCornerRadius}">
|
|
||||||
<Border.Background>
|
|
||||||
<SolidColorBrush Color="{x:Bind SelectedColor, Mode=OneWay}" />
|
|
||||||
</Border.Background>
|
|
||||||
</Border>
|
|
||||||
<DropDownButton.Flyout>
|
|
||||||
<Flyout ShouldConstrainToRootBounds="False">
|
|
||||||
<ColorPicker
|
|
||||||
IsAlphaEnabled="True"
|
|
||||||
IsAlphaSliderVisible="True"
|
|
||||||
IsAlphaTextInputVisible="True"
|
|
||||||
IsColorChannelTextInputVisible="True"
|
|
||||||
IsColorSliderVisible="True"
|
|
||||||
IsHexInputVisible="True"
|
|
||||||
Color="{x:Bind SelectedColor, Mode=TwoWay}" />
|
|
||||||
</Flyout>
|
|
||||||
</DropDownButton.Flyout>
|
|
||||||
</DropDownButton>
|
|
||||||
</Grid>
|
|
||||||
</UserControl>
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
// 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 Microsoft.UI.Xaml;
|
|
||||||
using Microsoft.UI.Xaml.Controls;
|
|
||||||
using Windows.UI;
|
|
||||||
|
|
||||||
namespace Microsoft.PowerToys.Settings.UI.Controls
|
|
||||||
{
|
|
||||||
public sealed partial class AlphaColorPickerButton : UserControl
|
|
||||||
{
|
|
||||||
private Color _selectedColor;
|
|
||||||
|
|
||||||
public Color SelectedColor
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _selectedColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_selectedColor != value)
|
|
||||||
{
|
|
||||||
_selectedColor = value;
|
|
||||||
SetValue(SelectedColorProperty, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(AlphaColorPickerButton), new PropertyMetadata(null));
|
|
||||||
|
|
||||||
public AlphaColorPickerButton()
|
|
||||||
{
|
|
||||||
this.InitializeComponent();
|
|
||||||
IsEnabledChanged -= AlphaColorPickerButton_IsEnabledChanged;
|
|
||||||
SetEnabledState();
|
|
||||||
IsEnabledChanged += AlphaColorPickerButton_IsEnabledChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AlphaColorPickerButton_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
|
|
||||||
{
|
|
||||||
SetEnabledState();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetEnabledState()
|
|
||||||
{
|
|
||||||
if (this.IsEnabled)
|
|
||||||
{
|
|
||||||
ColorPreviewBorder.Opacity = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ColorPreviewBorder.Opacity = 0.2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -27,9 +27,9 @@
|
|||||||
<DropDownButton.Flyout>
|
<DropDownButton.Flyout>
|
||||||
<Flyout ShouldConstrainToRootBounds="False">
|
<Flyout ShouldConstrainToRootBounds="False">
|
||||||
<ColorPicker
|
<ColorPicker
|
||||||
IsAlphaEnabled="False"
|
IsAlphaEnabled="{x:Bind IsAlphaEnabled, Mode=OneWay}"
|
||||||
IsAlphaSliderVisible="False"
|
IsAlphaSliderVisible="{x:Bind IsAlphaEnabled, Mode=OneWay}"
|
||||||
IsAlphaTextInputVisible="False"
|
IsAlphaTextInputVisible="{x:Bind IsAlphaEnabled, Mode=OneWay}"
|
||||||
IsColorChannelTextInputVisible="True"
|
IsColorChannelTextInputVisible="True"
|
||||||
IsColorSliderVisible="True"
|
IsColorSliderVisible="True"
|
||||||
IsHexInputVisible="True"
|
IsHexInputVisible="True"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
using Microsoft.UI;
|
||||||
using Microsoft.UI.Xaml;
|
using Microsoft.UI.Xaml;
|
||||||
using Microsoft.UI.Xaml.Controls;
|
using Microsoft.UI.Xaml.Controls;
|
||||||
using Windows.UI;
|
using Windows.UI;
|
||||||
@@ -29,7 +30,15 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(ColorPickerButton), new PropertyMetadata(null));
|
public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register(nameof(SelectedColor), typeof(Color), typeof(ColorPickerButton), new PropertyMetadata(null));
|
||||||
|
|
||||||
|
public static readonly DependencyProperty IsAlphaEnabledProperty = DependencyProperty.Register(nameof(IsAlphaEnabled), typeof(bool), typeof(ColorPickerButton), new PropertyMetadata(defaultValue: false));
|
||||||
|
|
||||||
|
public bool IsAlphaEnabled
|
||||||
|
{
|
||||||
|
get => (bool)GetValue(IsAlphaEnabledProperty);
|
||||||
|
set => SetValue(IsAlphaEnabledProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
public ColorPickerButton()
|
public ColorPickerButton()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -117,19 +117,12 @@
|
|||||||
IsEnabled="{x:Bind ViewModel.IsFindMyMouseEnabled, Mode=OneWay}"
|
IsEnabled="{x:Bind ViewModel.IsFindMyMouseEnabled, Mode=OneWay}"
|
||||||
IsExpanded="False">
|
IsExpanded="False">
|
||||||
<tkcontrols:SettingsExpander.Items>
|
<tkcontrols:SettingsExpander.Items>
|
||||||
<tkcontrols:SettingsCard Name="MouseUtilsFindMyMouseOverlayOpacity" x:Uid="MouseUtils_FindMyMouse_OverlayOpacity">
|
<!-- Overlay opacity removed; alpha now encoded in colors -->
|
||||||
<Slider
|
|
||||||
MinWidth="{StaticResource SettingActionControlMinWidth}"
|
|
||||||
AutomationProperties.AutomationId="MouseUtils_FindMyMouseOverlayOpacityId"
|
|
||||||
Maximum="100"
|
|
||||||
Minimum="1"
|
|
||||||
Value="{x:Bind ViewModel.FindMyMouseOverlayOpacity, Mode=TwoWay}" />
|
|
||||||
</tkcontrols:SettingsCard>
|
|
||||||
<tkcontrols:SettingsCard Name="MouseUtilsFindMyMouseBackgroundColor" x:Uid="MouseUtils_FindMyMouse_BackgroundColor">
|
<tkcontrols:SettingsCard Name="MouseUtilsFindMyMouseBackgroundColor" x:Uid="MouseUtils_FindMyMouse_BackgroundColor">
|
||||||
<controls:ColorPickerButton AutomationProperties.AutomationId="MouseUtils_FindMyMouseBackgroundColorId" SelectedColor="{x:Bind Path=ViewModel.FindMyMouseBackgroundColor, Mode=TwoWay}" />
|
<controls:ColorPickerButton IsAlphaEnabled="True" SelectedColor="{x:Bind Path=ViewModel.FindMyMouseBackgroundColor, Mode=TwoWay}" />
|
||||||
</tkcontrols:SettingsCard>
|
</tkcontrols:SettingsCard>
|
||||||
<tkcontrols:SettingsCard Name="MouseUtilsFindMyMouseSpotlightColor" x:Uid="MouseUtils_FindMyMouse_SpotlightColor">
|
<tkcontrols:SettingsCard Name="MouseUtilsFindMyMouseSpotlightColor" x:Uid="MouseUtils_FindMyMouse_SpotlightColor">
|
||||||
<controls:ColorPickerButton AutomationProperties.AutomationId="MouseUtils_FindMyMouseSpotlightColorId" SelectedColor="{x:Bind Path=ViewModel.FindMyMouseSpotlightColor, Mode=TwoWay}" />
|
<controls:ColorPickerButton IsAlphaEnabled="True" SelectedColor="{x:Bind Path=ViewModel.FindMyMouseSpotlightColor, Mode=TwoWay}" />
|
||||||
</tkcontrols:SettingsCard>
|
</tkcontrols:SettingsCard>
|
||||||
<tkcontrols:SettingsCard Name="MouseUtilsFindMyMouseSpotlightRadius" x:Uid="MouseUtils_FindMyMouse_SpotlightRadius">
|
<tkcontrols:SettingsCard Name="MouseUtilsFindMyMouseSpotlightRadius" x:Uid="MouseUtils_FindMyMouse_SpotlightRadius">
|
||||||
<NumberBox
|
<NumberBox
|
||||||
@@ -230,13 +223,13 @@
|
|||||||
IsEnabled="{x:Bind ViewModel.IsMouseHighlighterEnabled, Mode=OneWay}">
|
IsEnabled="{x:Bind ViewModel.IsMouseHighlighterEnabled, Mode=OneWay}">
|
||||||
<tkcontrols:SettingsExpander.Items>
|
<tkcontrols:SettingsExpander.Items>
|
||||||
<tkcontrols:SettingsCard x:Uid="MouseUtils_MouseHighlighter_PrimaryButtonClickColor" IsEnabled="{x:Bind ViewModel.IsSpotlightModeEnabled, Mode=OneWay, Converter={StaticResource BoolNegationConverter}}">
|
<tkcontrols:SettingsCard x:Uid="MouseUtils_MouseHighlighter_PrimaryButtonClickColor" IsEnabled="{x:Bind ViewModel.IsSpotlightModeEnabled, Mode=OneWay, Converter={StaticResource BoolNegationConverter}}">
|
||||||
<controls:AlphaColorPickerButton SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterLeftButtonClickColor, Mode=TwoWay}" />
|
<controls:ColorPickerButton IsAlphaEnabled="True" SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterLeftButtonClickColor, Mode=TwoWay}" />
|
||||||
</tkcontrols:SettingsCard>
|
</tkcontrols:SettingsCard>
|
||||||
<tkcontrols:SettingsCard x:Uid="MouseUtils_MouseHighlighter_SecondaryButtonClickColor" IsEnabled="{x:Bind ViewModel.IsSpotlightModeEnabled, Mode=OneWay, Converter={StaticResource BoolNegationConverter}}">
|
<tkcontrols:SettingsCard x:Uid="MouseUtils_MouseHighlighter_SecondaryButtonClickColor" IsEnabled="{x:Bind ViewModel.IsSpotlightModeEnabled, Mode=OneWay, Converter={StaticResource BoolNegationConverter}}">
|
||||||
<controls:AlphaColorPickerButton SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterRightButtonClickColor, Mode=TwoWay}" />
|
<controls:ColorPickerButton IsAlphaEnabled="True" SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterRightButtonClickColor, Mode=TwoWay}" />
|
||||||
</tkcontrols:SettingsCard>
|
</tkcontrols:SettingsCard>
|
||||||
<tkcontrols:SettingsCard Name="MouseUtilsMouseHighlighterAlwaysColor" x:Uid="MouseUtils_MouseHighlighter_AlwaysColor">
|
<tkcontrols:SettingsCard Name="MouseUtilsMouseHighlighterAlwaysColor" x:Uid="MouseUtils_MouseHighlighter_AlwaysColor">
|
||||||
<controls:AlphaColorPickerButton SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterAlwaysColor, Mode=TwoWay}" />
|
<controls:ColorPickerButton IsAlphaEnabled="True" SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterAlwaysColor, Mode=TwoWay}" />
|
||||||
</tkcontrols:SettingsCard>
|
</tkcontrols:SettingsCard>
|
||||||
<tkcontrols:SettingsCard x:Uid="HighlightMode">
|
<tkcontrols:SettingsCard x:Uid="HighlightMode">
|
||||||
<ComboBox
|
<ComboBox
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
string spotlightColor = FindMyMouseSettingsConfig.Properties.SpotlightColor.Value;
|
string spotlightColor = FindMyMouseSettingsConfig.Properties.SpotlightColor.Value;
|
||||||
_findMyMouseSpotlightColor = !string.IsNullOrEmpty(spotlightColor) ? spotlightColor : "#FFFFFF";
|
_findMyMouseSpotlightColor = !string.IsNullOrEmpty(spotlightColor) ? spotlightColor : "#FFFFFF";
|
||||||
|
|
||||||
_findMyMouseOverlayOpacity = FindMyMouseSettingsConfig.Properties.OverlayOpacity.Value;
|
|
||||||
_findMyMouseSpotlightRadius = FindMyMouseSettingsConfig.Properties.SpotlightRadius.Value;
|
_findMyMouseSpotlightRadius = FindMyMouseSettingsConfig.Properties.SpotlightRadius.Value;
|
||||||
_findMyMouseAnimationDurationMs = FindMyMouseSettingsConfig.Properties.AnimationDurationMs.Value;
|
_findMyMouseAnimationDurationMs = FindMyMouseSettingsConfig.Properties.AnimationDurationMs.Value;
|
||||||
_findMyMouseSpotlightInitialZoom = FindMyMouseSettingsConfig.Properties.SpotlightInitialZoom.Value;
|
_findMyMouseSpotlightInitialZoom = FindMyMouseSettingsConfig.Properties.SpotlightInitialZoom.Value;
|
||||||
@@ -279,7 +278,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
value = (value != null) ? SettingsUtilities.ToRGBHex(value) : "#000000";
|
value = (value != null) ? SettingsUtilities.ToARGBHex(value) : "#FF000000";
|
||||||
if (!value.Equals(_findMyMouseBackgroundColor, StringComparison.OrdinalIgnoreCase))
|
if (!value.Equals(_findMyMouseBackgroundColor, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
_findMyMouseBackgroundColor = value;
|
_findMyMouseBackgroundColor = value;
|
||||||
@@ -298,7 +297,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
value = (value != null) ? SettingsUtilities.ToRGBHex(value) : "#FFFFFF";
|
value = (value != null) ? SettingsUtilities.ToARGBHex(value) : "#FFFFFFFF";
|
||||||
if (!value.Equals(_findMyMouseSpotlightColor, StringComparison.OrdinalIgnoreCase))
|
if (!value.Equals(_findMyMouseSpotlightColor, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
_findMyMouseSpotlightColor = value;
|
_findMyMouseSpotlightColor = value;
|
||||||
@@ -308,24 +307,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int FindMyMouseOverlayOpacity
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _findMyMouseOverlayOpacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value != _findMyMouseOverlayOpacity)
|
|
||||||
{
|
|
||||||
_findMyMouseOverlayOpacity = value;
|
|
||||||
FindMyMouseSettingsConfig.Properties.OverlayOpacity.Value = value;
|
|
||||||
NotifyFindMyMousePropertyChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int FindMyMouseSpotlightRadius
|
public int FindMyMouseSpotlightRadius
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -978,7 +959,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
private bool _findMyMouseDoNotActivateOnGameMode;
|
private bool _findMyMouseDoNotActivateOnGameMode;
|
||||||
private string _findMyMouseBackgroundColor;
|
private string _findMyMouseBackgroundColor;
|
||||||
private string _findMyMouseSpotlightColor;
|
private string _findMyMouseSpotlightColor;
|
||||||
private int _findMyMouseOverlayOpacity;
|
|
||||||
private int _findMyMouseSpotlightRadius;
|
private int _findMyMouseSpotlightRadius;
|
||||||
private int _findMyMouseAnimationDurationMs;
|
private int _findMyMouseAnimationDurationMs;
|
||||||
private int _findMyMouseSpotlightInitialZoom;
|
private int _findMyMouseSpotlightInitialZoom;
|
||||||
|
|||||||
Reference in New Issue
Block a user