[Accessibility]Turn animations off based on Windows settings (#28128)

* FindMyMouse: switch animations on/off based on global windows settings

* Fancy Zones: enable/disable animations based on global Windows settings

* Shortcut Guide: enabling/disabling animations based on global Windows settings

* spell checker

* Making MouseUtils settings dependent on global windows settings, AnimationEffects. If the global settings is disabled the MouseUtils animation settings is disabled too, description shows the reason.

* Adding error detection, log on SystemParametersInfo call.

* Adding infobar instead of changing description of the settingsbar.

* spell checker

* moving native constant into NativeMethods class
This commit is contained in:
Laszlo Nemeth 2023-09-05 15:25:24 +02:00 committed by GitHub
parent 298a5eba2a
commit 83bb573223
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 68 additions and 5 deletions

View File

@ -619,6 +619,7 @@ gdi
gdiplus
GDISCALED
GEmoji
GETCLIENTAREAANIMATION
GETDESKWALLPAPER
GETDLGCODE
GETDPISCALEDSIZE

View File

@ -281,6 +281,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "utils", "utils", "{B39DC643
src\common\utils\logger_helper.h = src\common\utils\logger_helper.h
src\common\utils\modulesRegistry.h = src\common\utils\modulesRegistry.h
src\common\utils\MsiUtils.h = src\common\utils\MsiUtils.h
src\common\utils\MsWindowsSettings.h = src\common\utils\MsWindowsSettings.h
src\common\utils\os-detect.h = src\common\utils\os-detect.h
src\common\utils\package.h = src\common\utils\package.h
src\common\utils\ProcessWaiter.h = src\common\utils\ProcessWaiter.h

View File

@ -0,0 +1,13 @@
#pragma once
inline bool GetAnimationsEnabled()
{
BOOL enabled = 0;
BOOL fResult;
fResult = SystemParametersInfo(SPI_GETCLIENTAREAANIMATION, 0, &enabled, 0);
if (!fResult)
{
Logger::error("SystemParametersInfo SPI_GETCLIENTAREAANIMATION failed.");
}
return enabled;
}

View File

@ -7,6 +7,7 @@
#include "common/utils/game_mode.h"
#include "common/utils/process_path.h"
#include "common/utils/excluded_apps.h"
#include "common/utils/MsWindowsSettings.h"
#include <vector>
#ifdef COMPOSITION
@ -648,6 +649,8 @@ struct CompositionSpotlight : SuperSonar<CompositionSpotlight>
void SetSonarVisibility(bool visible)
{
m_batch = m_compositor.GetCommitBatch(winrt::CompositionBatchTypes::Animation);
BOOL isEnabledAnimations = GetAnimationsEnabled();
m_animation.Duration(std::chrono::milliseconds{ isEnabledAnimations ? m_fadeDuration : 1 });
m_batch.Completed([hwnd = m_hwnd](auto&&, auto&&) {
PostMessage(hwnd, WM_OPACITY_ANIMATION_COMPLETED, 0, 0);
});

View File

@ -5,6 +5,7 @@
#include "start_visible.h"
#include <common/utils/resources.h>
#include <common/utils/window.h>
#include <common/utils/MsWindowsSettings.h>
#include "shortcut_guide.h"
#include "trace.h"
@ -269,11 +270,12 @@ D2D1_RECT_F D2DOverlaySVG::get_snap_right() const
D2DOverlayWindow::D2DOverlayWindow() :
total_screen({}),
background_animation(0.3),
global_windows_shortcuts_animation(0.3),
taskbar_icon_shortcuts_animation(0.3),
D2DWindow()
{
BOOL isEnabledAnimations = GetAnimationsEnabled();
background_animation = isEnabledAnimations? 0.3f : 0.f;
global_windows_shortcuts_animation = isEnabledAnimations ? 0.3f : 0.f;
taskbar_icon_shortcuts_animation = isEnabledAnimations ? 0.3f : 0.f;
tasklist_thread = std::thread([&] {
while (running)
{

View File

@ -7,6 +7,7 @@
#include <vector>
#include <common/logger/logger.h>
#include <common/utils/MsWindowsSettings.h>
namespace
{
@ -125,6 +126,12 @@ ZonesOverlay::RenderResult ZonesOverlay::Render()
return RenderResult::AnimationEnded;
}
BOOL isEnabledAnimations = GetAnimationsEnabled();
if (!isEnabledAnimations)
{
animationAlpha = 1.f;
}
m_renderTarget->BeginDraw();
// Draw backdrop

View File

@ -3,6 +3,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Microsoft.PowerToys.Settings.UI.Controls"
xmlns:converters="using:Microsoft.PowerToys.Settings.UI.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:labs="using:CommunityToolkit.Labs.WinUI"
xmlns:localConverters="using:Microsoft.PowerToys.Settings.UI.Converters"
@ -12,6 +13,8 @@
mc:Ignorable="d">
<Page.Resources>
<localConverters:FindMyMouseActivationIntToVisibilityConverter x:Key="FindMyMouseActivationIntToVisibilityConverter" />
<converters:NegativeBoolToVisibilityConverter
x:Key="BoolToInvertedVisibilityConverter" />
</Page.Resources>
<controls:SettingsPageControl
x:Uid="MouseUtils"
@ -74,7 +77,6 @@
</labs:SettingsCard>
</labs:SettingsExpander.Items>
</labs:SettingsExpander>
<labs:SettingsExpander
x:Uid="Appearance_Behavior"
HeaderIcon="{ui:FontIcon FontFamily={StaticResource SymbolThemeFontFamily}, Glyph=&#xEB3C;}"
@ -117,11 +119,17 @@
Minimum="0"
SmallChange="10"
SpinButtonPlacementMode="Compact"
IsEnabled="{x:Bind Mode=OneWay, Path=ViewModel.IsAnimationEnabledBySystem}"
Value="{x:Bind Mode=TwoWay, Path=ViewModel.FindMyMouseAnimationDurationMs}" />
</labs:SettingsCard>
</labs:SettingsExpander.Items>
</labs:SettingsExpander>
<InfoBar
x:Uid="MouseUtils_FindMyMouse_AnimationDurationMs_Disabled"
IsClosable="False"
IsOpen="True"
Severity="Informational"
Visibility="{x:Bind Mode=OneWay, Path=ViewModel.IsAnimationEnabledBySystem, Converter={StaticResource BoolToInvertedVisibilityConverter}}" />
<labs:SettingsExpander
x:Uid="MouseUtils_FindMyMouse_ExcludedApps"
HeaderIcon="{ui:FontIcon FontFamily={StaticResource SymbolThemeFontFamily}, Glyph=&#xECE4;}"

View File

@ -2570,6 +2570,9 @@ Right-click to remove the key combination, thereby deactivating the shortcut.</v
<value>Time before the spotlight appears (ms)</value>
<comment>ms = milliseconds</comment>
</data>
<data name="MouseUtils_FindMyMouse_AnimationDurationMs_Disabled.Message" xml:space="preserve">
<value>Animations are disabled by OS. See Settings &gt; Accessibility &gt; Visual effects</value>
</data>
<data name="MouseUtils_FindMyMouse_ShakingMinimumDistance.Header" xml:space="preserve">
<value>Shake minimum distance</value>
</data>

View File

@ -22,5 +22,11 @@ namespace Microsoft.PowerToys.Settings.Utilities
[System.Runtime.InteropServices.DllImport("User32.dll")]
public static extern bool IsIconic(IntPtr handle);
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
internal static extern bool SystemParametersInfo(int uiAction, int uiParam, ref int pvParam, int fWinIni);
[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1310:Field names should not contain underscore", Justification = "Interop object")]
public const int SPI_GETCLIENTAREAANIMATION = 0x1042;
}
}

View File

@ -9,6 +9,7 @@ using global::PowerToys.GPOWrapper;
using Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Settings.UI.Library.Helpers;
using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
using Microsoft.PowerToys.Settings.Utilities;
namespace Microsoft.PowerToys.Settings.UI.ViewModels
{
@ -114,6 +115,10 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
_mousePointerCrosshairsFixedLength = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsFixedLength.Value;
_mousePointerCrosshairsAutoActivate = MousePointerCrosshairsSettingsConfig.Properties.AutoActivate.Value;
int isEnabled = 0;
NativeMethods.SystemParametersInfo(NativeMethods.SPI_GETCLIENTAREAANIMATION, 0, ref isEnabled, 0);
_isAnimationEnabledBySystem = isEnabled != 0;
// set the callback functions value to handle outgoing IPC message.
SendConfigMSG = ipcMSGCallBackFunc;
}
@ -327,6 +332,19 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
}
}
public bool IsAnimationEnabledBySystem
{
get
{
return _isAnimationEnabledBySystem;
}
set
{
_isAnimationEnabledBySystem = value;
}
}
public int FindMyMouseAnimationDurationMs
{
get
@ -970,5 +988,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
private bool _mousePointerCrosshairsIsFixedLengthEnabled;
private int _mousePointerCrosshairsFixedLength;
private bool _mousePointerCrosshairsAutoActivate;
private bool _isAnimationEnabledBySystem;
}
}