diff --git a/.config/configuration.vsEnterprise.winget b/.config/configuration.vsEnterprise.winget index 4d19d37137..08c9983562 100644 --- a/.config/configuration.vsEnterprise.winget +++ b/.config/configuration.vsEnterprise.winget @@ -2,14 +2,14 @@ # Reference: https://github.com/microsoft/PowerToys/blob/main/doc/devdocs/readme.md#compiling-powertoys properties: resources: - - resource: Microsoft.Windows.Developer/DeveloperMode + - resource: Microsoft.Windows.Settings/WindowsSettings directives: description: Enable Developer Mode allowPrerelease: true # Requires elevation for the set operation securityContext: elevated settings: - Ensure: Present + DeveloperMode: true - resource: Microsoft.WinGet.DSC/WinGetPackage id: vsPackage directives: diff --git a/.config/configuration.vsProfessional.winget b/.config/configuration.vsProfessional.winget index 78fb1c13d5..4d7e4a31c3 100644 --- a/.config/configuration.vsProfessional.winget +++ b/.config/configuration.vsProfessional.winget @@ -2,14 +2,14 @@ # Reference: https://github.com/microsoft/PowerToys/blob/main/doc/devdocs/readme.md#compiling-powertoys properties: resources: - - resource: Microsoft.Windows.Developer/DeveloperMode + - resource: Microsoft.Windows.Settings/WindowsSettings directives: description: Enable Developer Mode allowPrerelease: true # Requires elevation for the set operation securityContext: elevated settings: - Ensure: Present + DeveloperMode: true - resource: Microsoft.WinGet.DSC/WinGetPackage id: vsPackage directives: diff --git a/.config/configuration.winget b/.config/configuration.winget index 456eca47f2..2016dcdc33 100644 --- a/.config/configuration.winget +++ b/.config/configuration.winget @@ -2,14 +2,14 @@ # Reference: https://github.com/microsoft/PowerToys/blob/main/doc/devdocs/readme.md#compiling-powertoys properties: resources: - - resource: Microsoft.Windows.Developer/DeveloperMode + - resource: Microsoft.Windows.Settings/WindowsSettings directives: description: Enable Developer Mode allowPrerelease: true # Requires elevation for the set operation securityContext: elevated settings: - Ensure: Present + DeveloperMode: true - resource: Microsoft.WinGet.DSC/WinGetPackage id: vsPackage directives: diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e55d081c91..5e5ea03e7e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -12,7 +12,7 @@ body: attributes: label: Microsoft PowerToys version placeholder: X.XX.X - description: Hover over system tray icon or look at Settings + description: Hover over the system tray icon or look at Settings validations: required: true @@ -20,7 +20,7 @@ body: type: dropdown attributes: label: Installation method - description: How / Where was PowerToys installed from? + description: How / where was PowerToys installed from? multiple: true options: - GitHub diff --git a/.github/ISSUE_TEMPLATE/documentation-issue.yml b/.github/ISSUE_TEMPLATE/documentation-issue.yml index 151fc5a1f7..583cf54811 100644 --- a/.github/ISSUE_TEMPLATE/documentation-issue.yml +++ b/.github/ISSUE_TEMPLATE/documentation-issue.yml @@ -6,7 +6,7 @@ labels: body: - type: textarea attributes: - label: Provide a description of requested docs changes + label: Describe the requested doc changes placeholder: Briefly describe which document needs to be corrected and why. validations: required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index d7d092dbca..a2c7db9cc5 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -13,7 +13,7 @@ body: - type: textarea attributes: label: Scenario when this would be used? - placeholder: What is the scenario this would be used? Why is this important to your workflow as a power user? + placeholder: What is the scenario this would be used in? Why is this important to your workflow as a power user? validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/translation_issue.yml b/.github/ISSUE_TEMPLATE/translation_issue.yml index ffddacb9aa..1fdefbff8b 100644 --- a/.github/ISSUE_TEMPLATE/translation_issue.yml +++ b/.github/ISSUE_TEMPLATE/translation_issue.yml @@ -14,7 +14,7 @@ body: attributes: label: Microsoft PowerToys version placeholder: 0.70.0 - description: Hover over system tray icon or look at Settings + description: Hover over the system tray icon or look at Settings validations: required: true - type: dropdown @@ -65,7 +65,7 @@ body: - type: textarea attributes: label: ❌ Actual phrase(s) - placeholder: What is there? Please include a screenshot as that is extremely helpful. + placeholder: What is there? Please include a screenshot, as that is extremely helpful. validations: required: true - type: textarea diff --git a/.github/actions/spell-check/allow/code.txt b/.github/actions/spell-check/allow/code.txt index cf4af7fa8b..d312ae7d54 100644 --- a/.github/actions/spell-check/allow/code.txt +++ b/.github/actions/spell-check/allow/code.txt @@ -29,11 +29,14 @@ RUS AYUV bak Bcl +bgcode +Deflatealgorithm exa exabyte Gbits Gbps gcode +Heatshrink Mbits MBs mkv @@ -279,3 +282,9 @@ xef xes PACKAGEVERSIONNUMBER APPXMANIFESTVERSION + +# MRU lists +CACHEWRITE +MRUCMPPROC +MRUINFO +REGSTR diff --git a/.github/actions/spell-check/allow/names.txt b/.github/actions/spell-check/allow/names.txt index 06b8572a26..6503f04b34 100644 --- a/.github/actions/spell-check/allow/names.txt +++ b/.github/actions/spell-check/allow/names.txt @@ -55,6 +55,7 @@ clayton Coplen craigloewen crutkas +Chubercik damienleroy daverayment davidegiacometti @@ -91,6 +92,7 @@ Hemmerlein hlaueriksson Horvalds Howett +hotkidfamily htcfreek Huynh Ionut @@ -98,6 +100,7 @@ jamrobot Jaswal Jaylyn jefflord +Jeremic Jordi jyuwono kai @@ -173,6 +176,7 @@ Tadele talynone Taras TBM +Teutsch tilovell Triet urnotdfs @@ -221,6 +225,7 @@ openai Quickime regedit roslyn +Skia Spotify Vanara wangyi diff --git a/.github/actions/spell-check/candidate.patterns b/.github/actions/spell-check/candidate.patterns index 13bcc3b29f..7aa9c89c91 100644 --- a/.github/actions/spell-check/candidate.patterns +++ b/.github/actions/spell-check/candidate.patterns @@ -1,6 +1,9 @@ # D2D #D?2D +# Repeated letters +\b([a-z])\g{-1}{2,}\b + # marker to ignore all code on line ^.*/\* #no-spell-check-line \*/.*$ # marker to ignore all code on line @@ -10,6 +13,9 @@ # cspell inline ^.*\b[Cc][Ss][Pp][Ee][Ll]{2}:\s*[Dd][Ii][Ss][Aa][Bb][Ll][Ee]-[Ll][Ii][Nn][Ee]\b +# copyright +Copyright (?:\([Cc]\)|)(?:[-\d, ]|and)+(?: [A-Z][a-z]+ [A-Z][a-z]+,?)+ + # patch hunk comments ^@@ -\d+(?:,\d+|) \+\d+(?:,\d+|) @@ .* # git index header @@ -18,6 +24,9 @@ index (?:[0-9a-z]{7,40},|)[0-9a-z]{7,40}\.\.[0-9a-z]{7,40} # file permissions ['"`\s][-bcdLlpsw](?:[-r][-w][-Ssx]){2}[-r][-w][-SsTtx]\+?['"`\s] +# css fonts +\bfont(?:-family|):[^;}]+ + # css url wrappings \burl\([^)]+\) @@ -29,7 +38,7 @@ index (?:[0-9a-z]{7,40},|)[0-9a-z]{7,40}\.\.[0-9a-z]{7,40} # data url in quotes ([`'"])data:(?:[^ `'"].*?|)(?:[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,}).*\g{-1} # data url -\bdata:[-a-zA-Z=;:/0-9+]*,\S* +\bdata:[-a-zA-Z=;:/0-9+_]*,\S* # https/http/file urls #(?:\b(?:https?|ftp|file)://)[-A-Za-z0-9+&@#/*%?=~_|!:,.;]+[-A-Za-z0-9+&@#/*%=~_|] @@ -68,6 +77,8 @@ magnet:[?=:\w]+ # Amazon \bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|) +# AWS ARN +arn:aws:[-/:\w]+ # AWS S3 \b\w*\.s3[^.]*\.amazonaws\.com/[-\w/&#%_?:=]* # AWS execute-api @@ -94,6 +105,8 @@ vpc-\w+ \bgoogle-analytics\.com/collect.[-0-9a-zA-Z?%=&_.~]* # Google APIs \bgoogleapis\.(?:com|dev)/[a-z]+/(?:v\d+/|)[a-z]+/[-@:./?=\w+|&]+ +# Google Artifact Registry +\.pkg\.dev(?:/[-\w]+)+(?::[-\w]+|) # Google Storage \b[-a-zA-Z0-9.]*\bstorage\d*\.googleapis\.com(?:/\S*|) # Google Calendar @@ -129,6 +142,8 @@ themes\.googleusercontent\.com/static/fonts/[^/\s"]+/v\d+/[^.]+. \bscholar\.google\.com/citations\?user=[A-Za-z0-9_]+ # Google Colab Research Drive \bcolab\.research\.google\.com/drive/[-0-9a-zA-Z_?=]* +# Google Cloud regions +(?:us|(?:north|south)america|europe|asia|australia|me|africa)-(?:north|south|east|west|central){1,2}\d+ # GitHub SHAs (api) \bapi.github\.com/repos(?:/[^/\s"]+){3}/[0-9a-f]+\b @@ -167,6 +182,12 @@ GHSA(?:-[0-9a-z]{4}){3} # GitLab commits \bgitlab\.[^/\s"]*/(?:[^/\s"]+/){2}commits?/[0-9a-f]+\b +# #includes +^\s*#include\s*(?:<.*?>|".*?") + +# #pragma lib +^\s*#pragma comment\(lib, ".*?"\) + # binance accounts\.binance\.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]* @@ -219,7 +240,7 @@ accounts\.binance\.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]* \bmedium\.com/@?[^/\s"]+/[-\w]+ # microsoft -\b(?:https?://|)(?:(?:download\.visualstudio|docs|msdn2?|research)\.microsoft|blogs\.msdn)\.com/[-_a-zA-Z0-9()=./%]* +\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|docs|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%]* # powerbi \bapp\.powerbi\.com/reportEmbed/[^"' ]* # vs devops @@ -393,7 +414,7 @@ ipfs://[0-9a-zA-Z]{3,} \bgetopts\s+(?:"[^"]+"|'[^']+') # ANSI color codes -(?:\\(?:u00|x)1[Bb]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+|)m +(?:\\(?:u00|x)1[Bb]|\\03[1-7]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+)*m # URL escaped characters %[0-9A-F][A-F](?=[A-Za-z]) @@ -429,10 +450,14 @@ sha\d+:[0-9a-f]*?[a-f]{3,}[0-9a-f]* # pki (base64) LS0tLS1CRUdJT.* +# C# includes +^\s*using [^;]+; + # uuid: \b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b # hex digits including css/html color classes: -(?:[\\0][xX]|\\u|[uU]\+|#x?|%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b +(?:[\\0][xX]|\\u\{?|[uU]\+|#x?|%23|&H)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b + # integrity integrity=(['"])(?:\s*sha\d+-[-a-zA-Z=;:/0-9+]{40,})+\g{-1} @@ -450,7 +475,10 @@ integrity=(['"])(?:\s*sha\d+-[-a-zA-Z=;:/0-9+]{40,})+\g{-1} Name\[[^\]]+\]=.* # IServiceProvider / isAThing -(?:\b|_)(?:(?:ns|)I|isA)(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b)) +(?:(?:\b|_|(?<=[a-z]))I|(?:\b|_)(?:nsI|isA))(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b)) + +# python +#\b(?i)py(?!gments|gmy|lon|ramid|ro|th)(?=[a-z]{2,}) # crypt (['"])\$2[ayb]\$.{56}\g{-1} @@ -464,17 +492,14 @@ Name\[[^\]]+\]=.* # machine learning (?) #\b(?i)ml(?=[a-z]{2,}) -# python -#\b(?i)py(?!gments|gmy|lon|ramid|ro|th)(?=[a-z]{2,}) - # scrypt / argon \$(?:scrypt|argon\d+[di]*)\$\S+ # go.sum \bh1:\S+ -# scala imports -^import (?:[\w.]|\{\w*?(?:,\s*(?:\w*|\*))+\})+ +# imports +^import\s+(?:(?:static|type)\s+|)(?:[\w.]|\{\s*\w*?(?:,\s*(?:\w*|\*))+\s*\})+ # scala modules #("[^"]+"\s*%%?\s*){2,3}"[^"]+" @@ -483,13 +508,13 @@ Name\[[^\]]+\]=.* image: [-\w./:@]+ # Docker images -^\s*FROM\s+\S+:\S+(?:\s+AS\s+\S+|) +^\s*(?i)FROM\s+\S+:\S+(?:\s+AS\s+\S+|) # `docker images` REPOSITORY TAG IMAGE ID CREATED SIZE \s*\S+/\S+\s+\S+\s+[0-9a-f]{8,}\s+\d+\s+(?:hour|day|week)s ago\s+[\d.]+[KMGT]B # Intel intrinsics -_mm_(?!dd)\w+ +_mm\d*_(?!dd)\w+ # Input to GitHub JSON content: (['"])[-a-zA-Z=;:/0-9+]*=\g{-1} @@ -523,7 +548,7 @@ content: (['"])[-a-zA-Z=;:/0-9+]*=\g{-1} # javascript replace regex \.replace\(/[^/\s"]{3,}/[gim]*\s*, # assign regex -= /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gi]?(?=\W|$) += /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gim]*(?=\W|$) # perl regex test [!=]~ (?:/.*/|m\{.*?\}|m<.*?>|m([|!/@#,;']).*?\g{-1}) @@ -537,7 +562,7 @@ perl(?:\s+-[a-zA-Z]\w*)+ #(?:\d|\bh)to(?!ken)(?=[a-z])|to(?=[adhiklpun]\() # Go regular expressions -regexp?\.MustCompile\(`[^`]*`\) +regexp?\.MustCompile\((?:`[^`]*`|".*"|'.*')\) # regex choice \(\?:[^)]+\|[^)]+\) @@ -585,7 +610,7 @@ urn:shemas-jetbrains-com # xcode # xcodeproject scenes -(?:Controller|destination|ID|id)="\w{3}-\w{2}-\w{3}" +(?:Controller|destination|(?:first|second)Item|ID|id)="\w{3}-\w{2}-\w{3}" # xcode api botches customObjectInstantitationMethod @@ -600,27 +625,33 @@ PrependWithABINamepsace \.fa-[-a-z0-9]+ # bearer auth -(['"])[Bb]ear[e][r] .*?\g{-1} +(['"])[Bb]ear[e][r] .{3,}?\g{-1} # bearer auth -\b[Bb]ear[e][r]:? [-a-zA-Z=;:/0-9+.]+ +\b[Bb]ear[e][r]:? [-a-zA-Z=;:/0-9+.]{3,} # basic auth (['"])[Bb]asic [-a-zA-Z=;:/0-9+]{3,}\g{-1} +# basic auth +: [Bb]asic [-a-zA-Z=;:/0-9+.]{3,} + # base64 encoded content #([`'"])[-a-zA-Z=;:/0-9+]{3,}=\g{-1} # base64 encoded content in xml/sgml >[-a-zA-Z=;:/0-9+]{3,}=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_]{40,} # DNS rr data -(?:\d+\s+){3}(?:[-+/=.\w]{2,}\s*){1,2} +#(?:\d+\s+){3}(?:[-+/=.\w]{2,}\s*){1,2} # encoded-word =\?[-a-zA-Z0-9"*%]+\?[BQ]\?[^?]{0,75}\?= @@ -629,7 +660,7 @@ PrependWithABINamepsace \bnumer\b(?=.*denom) # Time Zones -\b(?:Africa|Atlantic|America|Antarctica|Asia|Australia|Europe|Indian|Pacific)(?:/\w+)+ +\b(?:Africa|Atlantic|America|Antarctica|Arctic|Asia|Australia|Europe|Indian|Pacific)(?:/[-\w]+)+ # linux kernel info ^(?:bugs|flags|Features)\s+:.* @@ -669,13 +700,13 @@ systemd.*?running in system mode \([-+].*\)$ TeX/AMS # File extensions -\*\.[+\w]+, +#\*\.[+\w]+, # eslint "varsIgnorePattern": ".+" # nolint -nolint:\w+ +nolint:\s*[\w,]+ # Windows short paths [/\\][^/\\]{5,6}~\d{1,2}(?=[/\\]) @@ -683,6 +714,9 @@ nolint:\w+ # Windows Resources with accelerators \b[A-Z]&[a-z]+\b(?!;) +# signed off by +(?i)Signed-off-by: .* + # cygwin paths /cygdrive/[a-zA-Z]/(?:Program Files(?: \(.*?\)| ?)(?:/[-+.~\\/()\w ]+)*|[-+.~\\/()\w])+ @@ -715,29 +749,31 @@ W/"[^"]+" # Compiler flags (Unix, Java/Scala) # Use if you have things like `-Pdocker` and want to treat them as `docker` -#(?:^|[\t ,>"'`=(])-(?:(?:J-|)[DPWXY]|[Llf])(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}) +#(?:^|[\t ,>"'`=(#])-(?:(?:J-|)[DPWXY]|[Llf])(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}) # Compiler flags (Windows / PowerShell) # This is a subset of the more general compiler flags pattern. # It avoids matching `-Path` to prevent it from being treated as `ath` -#(?:^|[\t ,"'`=(])-(?:[DPL](?=[A-Z]{2,})|[WXYlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})) +#(?:^|[\t ,"'`=(#])-(?:[DPL](?=[A-Z]{2,})|[WXYlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})) # Compiler flags (linker) ,-B -# libraries -(?:\b|_)lib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z]) - -# WWNN/WWPN (NAA identifiers) -\b(?:0x)?10[0-9a-f]{14}\b|\b(?:0x|3)?[25][0-9a-f]{15}\b|\b(?:0x|3)?6[0-9a-f]{31}\b +# Library prefix +# e.g., `lib`+`archive`, `lib`+`raw`, `lib`+`unwind` +# (ignores some words that happen to start with `lib`) +(?:\b|_)[Ll]ib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z]) # iSCSI iqn (approximate regex) \biqn\.[0-9]{4}-[0-9]{2}(?:[\.-][a-z][a-z0-9]*)*\b +# WWNN/WWPN (NAA identifiers) +\b(?:0x)?10[0-9a-f]{14}\b|\b(?:0x|3)?[25][0-9a-f]{15}\b|\b(?:0x|3)?6[0-9a-f]{31}\b + # curl arguments \b(?:\\n|)curl(?:\.exe|)(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)* # set arguments -\b(?:bash|sh|set)(?:\s+-[abefimouxE]{1,2})*\s+-[abefimouxE]{3,}(?:\s+-[abefimouxE]+)* +\b(?:bash|sh|set)(?:\s+[-+][abefimouxE]{1,2})*\s+[-+][abefimouxE]{3,}(?:\s+[-+][abefimouxE]+)* # tar arguments \b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+ # tput arguments -- https://man7.org/linux/man-pages/man5/terminfo.5.html -- technically they can be more than 5 chars long... diff --git a/.github/actions/spell-check/excludes.txt b/.github/actions/spell-check/excludes.txt index 21d7da66b8..7ad88bde19 100644 --- a/.github/actions/spell-check/excludes.txt +++ b/.github/actions/spell-check/excludes.txt @@ -18,6 +18,7 @@ /TestFiles/ [^/]\.cur$ [^/]\.gcode$ +[^/]\.bgcode$ [^/]\.rgs$ \.a$ \.ai$ @@ -73,7 +74,9 @@ \.qm$ \.s$ \.sig$ +\.snk$ \.so$ +\.stl$ \.svgz?$ \.sys$ \.tar$ @@ -90,37 +93,41 @@ \.xz$ \.zip$ ^\.github/actions/spell-check/ +^\.github/workflows/spelling\d*\.yml$ ^\.gitmodules$ -^\Q.github/workflows/spelling2.yml\E$ ^\Q.pipelines/ESRPSigning_core.json\E$ ^\Qdoc/devdocs/localization.md\E$ -^\Qsrc/common/ManagedCommon/ColorFormatHelper.cs\E$ -^\Qsrc/common/notifications/BackgroundActivatorDLL/cpp.hint\E$ -^\Qsrc/modules/cmdpal/doc/initial-sdk-spec/list-elements-mock-002.pdn\E$ -^\Qsrc/modules/colorPicker/ColorPickerUI/Assets/ColorPicker/colorPicker.cur\E$ -^\Qsrc/modules/colorPicker/ColorPickerUI/Shaders/GridShader.cso\E$ ^\Qsrc/modules/MouseUtils/MouseJump.Common/NativeMethods/User32/UI/WindowsAndMessaging/User32.SYSTEM_METRICS_INDEX.cs\E$ -^\Qsrc/modules/MouseUtils/MouseJumpUI/MainForm.resx\E$ -^\Qsrc/modules/MouseWithoutBorders/App/Form/frmAbout.cs\E$ -^\Qsrc/modules/MouseWithoutBorders/App/Form/frmInputCallback.resx\E$ -^\Qsrc/modules/MouseWithoutBorders/App/Form/frmLogon.resx\E$ -^\Qsrc/modules/MouseWithoutBorders/App/Form/frmMatrix.resx\E$ -^\Qsrc/modules/MouseWithoutBorders/App/Form/frmMessage.resx\E$ -^\Qsrc/modules/MouseWithoutBorders/App/Form/frmMouseCursor.resx\E$ -^\Qsrc/modules/MouseWithoutBorders/App/Form/frmScreen.resx\E$ -^\Qsrc/modules/MouseWithoutBorders/ModuleInterface/generateSecurityDescriptor.h\E$ -^\Qsrc/modules/peek/Peek.Common/NativeMethods.txt\E$ -^\Qsrc/modules/previewpane/SvgPreviewHandler/SvgHTMLPreviewGenerator.cs\E$ -^\Qsrc/modules/previewpane/UnitTests-StlThumbnailProvider/HelperFiles/sample.stl\E$ -^\Qtools/project_template/ModuleTemplate/resource.h\E$ ^doc/devdocs/akaLinks\.md$ +^NOTICE\.md$ +^src/common/CalculatorEngineCommon/exprtk\.hpp$ +^src/common/ManagedCommon/ColorFormatHelper\.cs$ +^src/common/notifications/BackgroundActivatorDLL/cpp\.hint$ +^src/common/sysinternals/Eula/ +^src/modules/cmdpal/doc/initial-sdk-spec/list-elements-mock-002\.pdn$ +^src/modules/colorPicker/ColorPickerUI/Shaders/GridShader\.cso$ ^src/modules/launcher/Plugins/Microsoft\.PowerToys\.Run\.Plugin\.TimeDate/Properties/ +^src/modules/MouseUtils/MouseJumpUI/MainForm\.resx$ ^src/modules/MouseWithoutBorders/App/.*/NativeMethods\.cs$ ^src/modules/MouseWithoutBorders/App/Form/.*\.Designer\.cs$ ^src/modules/MouseWithoutBorders/App/Form/.*\.resx$ +^src/modules/MouseWithoutBorders/App/Form/frmAbout\.cs$ +^src/modules/MouseWithoutBorders/App/Form/frmInputCallback\.resx$ +^src/modules/MouseWithoutBorders/App/Form/frmLogon\.resx$ +^src/modules/MouseWithoutBorders/App/Form/frmMatrix\.resx$ +^src/modules/MouseWithoutBorders/App/Form/frmMessage\.resx$ +^src/modules/MouseWithoutBorders/App/Form/frmMouseCursor\.resx$ +^src/modules/MouseWithoutBorders/App/Form/frmScreen\.resx$ ^src/modules/MouseWithoutBorders/App/Helper/.*\.resx$ +^src/modules/MouseWithoutBorders/ModuleInterface/generateSecurityDescriptor\.h$ +^src/modules/peek/Peek.Common/NativeMethods\.txt$ +^src/modules/previewpane/SvgPreviewHandler/SvgHTMLPreviewGenerator\.cs$ ^src/modules/previewpane/UnitTests-MarkdownPreviewHandler/HelperFiles/MarkdownWithHTMLImageTag\.txt$ +^src/modules/registrypreview/RegistryPreviewUILib/Controls/HexBox/.*$ +^src/modules/ZoomIt/ZoomIt/ZoomIt\.idc$ ^src/Monaco/ -^src/common/sysinternals/Eula/ +^tools/project_template/ModuleTemplate/resource\.h$ ^tools/Verification scripts/Check preview handler registration\.ps1$ ignore$ +^src/modules/registrypreview/RegistryPreviewUILib/Controls/HexBox/.*$ +^src/common/CalculatorEngineCommon/exprtk\.hpp$ diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index ea369d57af..885a8e5aae 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -1,4 +1,4 @@ -aaaa +AAAAs abcdefghjkmnpqrstuvxyz abgr ABlocked @@ -9,23 +9,24 @@ ACCEPTFILES ACCESSDENIED ACCESSTOKEN acfs +ACIE AClient AColumn acrt ACTIVATEAPP -activationaction ACTIVATEOPTIONS -ACVS +activationaction adaptivecards ADate ADDSTRING ADDUNDORECORD ADifferent +ADMINS adml admx +advancedpaste advfirewall AFeature -AFFINETRANSFORM affordances AFX AGGREGATABLE @@ -37,18 +38,18 @@ ALLAPPS ALLCHILDREN ALLINPUT Allman +Allmodule ALLOWUNDO ALLVIEW ALPHATYPE AModifier amr ANDSCANS -animatedvisuals Animnate -ansicolor ANull AOC aocfnapldcnfbofgmbbllojgocaelgdd +AOklab APARTMENTTHREADED APeriod apicontract @@ -66,6 +67,7 @@ appref appsettings appwindow appwiz +appxpackage APSTUDIO AQS ARandom @@ -75,7 +77,9 @@ ARPINSTALLLOCATION ARPPRODUCTICON ARRAYSIZE ARROWKEYS +ARTIFACTSTAGINGDIRECTORY asf +Ashcraft AShortcut ASingle ASSOCCHANGED @@ -84,7 +88,6 @@ ASSOCSTR ASYNCWINDOWPLACEMENT ASYNCWINDOWPOS atl -atleast ATRIOX aumid Authenticode @@ -98,12 +101,11 @@ Autorun AUTOTICKS AUTOUPDATE AValid -awakeness AWAYMODE azcliversion azman -backtracer bbwe +BCIE bck BESTEFFORT bezelled @@ -129,18 +131,16 @@ Blt BLURBEHIND BLURREGION bmi -bms -BNDBk BNumber BODGY +BOklab BOOTSTRAPPERINSTALLFOLDER -bostrot BOTTOMALIGN boxmodel BPBF bpmf bpp -Breadcrumb +breadcrumb Browsable BROWSEINFO bsd @@ -155,6 +155,7 @@ builttoroam BVal BValue byapp +BYCOMMAND BYPOSITION CALCRECT CALG @@ -162,7 +163,6 @@ callbackptr calpwstr Cangjie CANRENAME -Cantarell CAPTUREBLT CAPTURECHANGED CARETBLINKING @@ -173,6 +173,7 @@ CCHFORMNAME CCom CContext CDeclaration +CDPX CElems CENTERALIGN cer @@ -185,6 +186,7 @@ CHILDACTIVATE CHILDWINDOW CHOOSEFONT cidl +CIELCh cim CImage cla @@ -214,8 +216,10 @@ CMONITORS cmph CNF coclass +CODENAME codereview Codespaces +Coen COINIT colid colorconv @@ -227,6 +231,7 @@ comctl comdlg comexp cominterop +commandnotfound commandpalette compmgmt COMPOSITIONFULL @@ -234,15 +239,19 @@ CONFIGW CONFLICTINGMODIFIERKEY CONFLICTINGMODIFIERSHORTCUT CONOUT +constexpr +contentdialog contentfiles CONTEXTHELP CONTEXTMENUHANDLER contractversion -CONTROLL CONTROLPARENT copiedcolorrepresentation +coppied +copyable COPYPEN COREWINDOW +Corpor cotaskmem COULDNOT countof @@ -259,6 +268,7 @@ CREATEWINDOWFAILED CRECT CRH critsec +cropandlock Crossdevice CSearch CSettings @@ -268,12 +278,11 @@ CStyle cswin CTest CTEXT -Ctl CTLCOLORSTATIC -currentculture CURRENTDIR CURSORINFO cursorpos +CURSORSHOWING customaction CUSTOMACTIONTEST CUSTOMFORMATPLACEHOLDER @@ -281,17 +290,18 @@ CVal cvd CVirtual CVS -cxfksword +CWMO CXSCREEN CXSMICON CXVIRTUALSCREEN -cyberrex CYSCREEN CYSMICON CYVIRTUALSCREEN cziplib Dac dacl +DAffine +DAFFINETRANSFORM datareader datatracker dataversion @@ -302,18 +312,13 @@ DBLEPSILON DBPROP DBPROPIDSET DBPROPSET -DCapture DCBA DCOM DComposition DCR -ddd DDEIf -DDevice -DDxgi Deact debugbreak -declatory decryptor Dedup Deeplink @@ -328,12 +333,9 @@ DEFAULTTONULL DEFAULTTOPRIMARY DEFERERASE DEFPUSHBUTTON -DEFT deinitialization -DELA DELETEDKEYIMAGE DELETESCANS -deletethis DEMOTYPE DENORMAL depersist @@ -342,7 +344,9 @@ DESELECTOTHERS DESIGNINFO DESKTOPABSOLUTEEDITING DESKTOPABSOLUTEPARSING +DESKTOPHORZRES desktopshorcutinstalled +DESKTOPVERTRES devblogs devdocs devmgmt @@ -352,7 +356,7 @@ devpal DFX DIALOGEX digicert -dimm +DINORMAL DISABLEASACTIONKEY DISABLENOSCROLL diskmgmt @@ -375,7 +379,6 @@ DONTVALIDATEPATH dotnet DPICHANGED DPIs -DPolicy DPSAPI DQTAT DQTYPE @@ -384,18 +387,18 @@ DRAWFRAME drawingcolor dreamsofameaningfullife drivedetectionwarning -Droid DROPFILES DSTINVERT -DSurface -DTexture +DString +DSVG +DTo DUMMYUNIONNAME -Dutil DVASPECT DVASPECTINFO DVD dvr DVTARGETDEVICE +dwflags dwl dwm dwmapi @@ -432,6 +435,7 @@ ENDSESSION ENSUREVISIBLE ENTERSIZEMOVE ENU +environmentvariables EOAC EPO epu @@ -440,15 +444,14 @@ EREOF EResize ERRORIMAGE ERRORTITLE -erwrite ESettings esrp +etd ETDT etl etw eula eurochange -eventlog eventvwr evt EWXFORCE @@ -470,6 +473,7 @@ EXPCMDFLAGS EXPCMDSTATE explr exppowertoys +exprtk exptas exsb exstyle @@ -482,11 +486,15 @@ eyetracker FANCYZONESDRAWLAYOUTTEST FANCYZONESEDITOR FARPROC +fesf fff +FFFF FILEEXPLORER +fileexploreraddons +fileexplorerpreview FILEFLAGS FILEFLAGSMASK -FILELOCKSMITH +filelocksmith FILELOCKSMITHCONTEXTMENU FILELOCKSMITHEXT FILELOCKSMITHLIBINTEROP @@ -499,10 +507,9 @@ FILESUBTYPE FILESYSPATH Filetime FILEVERSION -Filterkeyboard FILTERMODE findfast -Fira +findmymouse FIXEDFILEINFO FIXEDSYS flac @@ -519,13 +526,13 @@ FORCEMINIMIZE FORMATDLGORD formatetc FORPARSING -Fqc FRAMECHANGED frm -Froml FROMTOUCH fsanitize fsmgmt +fuzzingtesting +fxf FZE gacutil Gaeilge @@ -537,7 +544,6 @@ gdi gdiplus GDIPVER GDISCALED -GEmoji GETCLIENTAREAANIMATION GETCURSEL GETDESKWALLPAPER @@ -562,7 +568,6 @@ GPOCA gpp gpu gradians -gsl GSM gtm guiddata @@ -601,6 +606,7 @@ helptext HGFE hglobal hhk +HHmmssfff hhx Hiber Hiberboot @@ -632,12 +638,14 @@ homljgmgpmcbpjbnjpfijnhipfkiclkd HORZRES HORZSIZE Hostbackdropbrush +hostsfileeditor +Hostx +hotfixes hotkeycontrol HOTKEYF hotkeys hotlight hotspot -Hostx HPAINTBUFFER HRAWINPUT HREDRAW @@ -666,25 +674,22 @@ HWNDPARENT HWNDPREV hyjiacan IAI -IBeam icf ICONERROR ICONLOCATION -idc IDCANCEL IDD idk idl idlist IDOK +IDOn IDR IDXGI ietf IEXPLORE -iextn IFACEMETHOD IFACEMETHODIMP -IFile IGNOREUNKNOWN IGo iid @@ -710,7 +715,7 @@ INITDIALOG INITGUID INITTOLOGFONTSTRUCT INLINEPREFIX -inorder +Inlines INPC inproc INPUTHARDWARE @@ -720,7 +725,6 @@ INPUTMOUSE INPUTSINK INPUTTYPE INSTALLDESKTOPSHORTCUT -INSTALLDIR installdir INSTALLFOLDER INSTALLFOLDERTOBOOTSTRAPPERINSTALLFOLDER @@ -733,26 +737,27 @@ INSTALLSTARTMENUSHORTCUT INSTALLSTATE Inste Interlop +intput INTRESOURCE INVALIDARG invalidoperatioexception +invokecommand ipcmanager IPREVIEW +ipreviewhandlervisualssetfont +irow irprops isbi -ISearch -ISettings -isocpp +isfinite iss issecret ISSEPARATOR +issuecomment +istep ith ITHUMBNAIL IUI -IUnknown -IUse IWIC -iwr jfif jgeosdfsdsgmkedfgdfgdfgbkmhcgcflmi jjw @@ -776,16 +781,19 @@ KEYEVENTF KEYIMAGE keynum keyremaps +keyring keyvault KILLFOCUS killrunner kmph Kybd lastcodeanalysissucceeded -Lastdevice LASTEXITCODE LAYOUTRTL +LCh +lcid LCIDTo +lcl Lclean Ldone Ldr @@ -796,6 +804,7 @@ LError LEVELID LExit lhwnd +LIBFUZZER LIBID LIMITSIZE LIMITTEXT @@ -809,19 +818,19 @@ LLKH llkhf LMEM LMENU -lnks LOADFROMFILE LOBYTE localappdata -LOCALDISPLAY localpackage LOCALSYSTEM LOCATIONCHANGE +LOCKTYPE LOGFONT LOGFONTW logon LOGPIXELSX LOGPIXELSY +LOn longdate LONGNAMES lowlevel @@ -866,11 +875,9 @@ lstrcmpi lstrcpyn lstrlen LTEXT -LTk LTRREADING luid LUMA -LUQ lusrmgr LVal lvm @@ -884,6 +891,7 @@ MAKEINTRESOURCEW MAKELANGID MAKELONG MAKELPARAM +makepri MAKEWPARAM manifestdependency MAPPEDTOSAMEKEY @@ -912,14 +920,16 @@ metafile mfc Mgmt Microwaved +middleclickaction midl mii +MIIM +mikeclayton mindaro Minimizable MINIMIZEBOX MINIMIZEEND MINIMIZESTART -miniz MINMAXINFO minwindef Mip @@ -943,13 +953,14 @@ monitorinfof MOUSEACTIVATE MOUSEDATA MOUSEEVENTF +mousehighlighter MOUSEHWHEEL MOUSEINPUT +mousejump +mousepointer +mouseutils MOVESIZEEND MOVESIZESTART -MOZILLAPL -MOZPL -mpmc MRM MRT mru @@ -972,16 +983,14 @@ msixbundle MSIXCA MSLLHOOKSTRUCT Mso -msp msrc msstore -mst msvcp -msvsmon MTND MULTIPLEUSE multizone muxc +MVPs mvvm MVVMTK MWBEx @@ -1003,7 +1012,6 @@ NCMBUTTONDOWN NCMBUTTONUP NCMOUSELEAVE NCMOUSEMOVE -nconsectetur ncpa NCPAINT NCRENDERING @@ -1024,8 +1032,6 @@ newplus NEWPLUSCONTEXTMENU NEWPLUSSHELLEXTENSIONWIN newrow -newsgroups -NGQt nicksnettravels NIF NLog @@ -1045,6 +1051,7 @@ NOCOPYBITS NOCOPYSECURITYATTRIBS NOCRLF nodeca +nodiscard NODRAWCAPTION NODRAWICON NOINHERITLAYOUT @@ -1060,7 +1067,6 @@ NONANTIALIASED nonclient NONCLIENTMETRICSW NONELEVATED -NONINFRINGEMENT nonspace nonstd NOOWNERZORDER @@ -1088,18 +1094,17 @@ NOTOPMOST NOTRACK NOTSRCCOPY NOTSRCERASE -NOTXORPEN notwindows +NOTXORPEN NOZORDER NPH npmjs NResize -nsunt NTAPI ntdll +ntfs NTSTATUS NTSYSAPI -NTZm NULLCURSOR nullonfailure numberbox @@ -1117,6 +1122,8 @@ oldpath oldtheme oleaut OLECHAR +onebranch +OOBEUI openas opencode OPENFILENAME @@ -1126,7 +1133,6 @@ OPTIMIZEFORINVOKE ORPHANEDDIALOGTITLE ORSCANS oss -ostr OSVERSIONINFO OSVERSIONINFOEX OSVERSIONINFOEXW @@ -1134,14 +1140,13 @@ OSVERSIONINFOW osvi OUTOFCONTEXT Outptr +outputtype outsettings OVERLAPPEDWINDOW Oversampling OVERWRITEPROMPT -OWMt OWNDC OWNERDRAWFIXED -OWRj Packagemanager PACL PAINTSTRUCT @@ -1167,7 +1172,7 @@ pchast PCIDLIST PCTSTR PCWSTR -pdbs +PDBs PDEVMODE pdisp PDLL @@ -1200,13 +1205,13 @@ pinfo pinvoke pipename PKBDLLHOOKSTRUCT -Playbadge plib ploc ploca plocm pluginsmodel PMAGTRANSFORM +PMs PMSIHANDLE pnid PNMLINK @@ -1239,6 +1244,7 @@ ppstm ppsz pptal ppv +ppwsz prc Prefixer prependpath @@ -1253,12 +1259,14 @@ prg prgh prgms pri +primaryclickaction PRINTCLIENT printmanagement prm proactively PROCESSENTRY PROCESSKEY +processthreadsapi PROCESSTRACE procmon PRODEXT @@ -1277,6 +1285,7 @@ PSECURITY psfgao psfi PSMODULEPATH +Psr psrm psrree pstatstg @@ -1284,7 +1293,6 @@ pstm PStr pstream pstrm -pswd PSYSTEM psz ptb @@ -1295,14 +1303,12 @@ PTOKEN PToy ptstr pui -Puser PWAs pwcs PWSTR pwsz pwtd QDC -qianlifeng qit QITAB QITABENT @@ -1311,11 +1317,10 @@ Quarternary QUERYENDSESSION QUERYOPEN QUEUESYNC +quickaccent QUNS -QXZ RAII RAlt -Rappl randi Rasterization Rasterize @@ -1342,11 +1347,11 @@ REGCLS regfile REGISTERCLASSFAILED REGISTRYHEADER -registrypath REGISTRYPREVIEWEXT registryroot regkey regroot +regsvr REINSTALLMODE reloadable Relogger @@ -1371,7 +1376,6 @@ RESIZETOFIT resmimetype RESOURCEID RESTORETOMAXIMIZED -resultlist RETURNONLYFSDIRS RGBQUAD rgbs @@ -1380,25 +1384,27 @@ rgf rgh rgn rgs +rguid RIDEV RIGHTSCROLLBAR riid -ringbuffer RKey +Rns RNumber rop ROUNDSMALL ROWSETEXT rpcrt RRF -rrr rsop Rsp rstringalnum rstringalpha rstringdigit +rtb RTB RTLREADING +rtm runas rundll rungameid @@ -1417,10 +1423,9 @@ SAVEFAILED scanled schedtasks SCID -Scip -scipbe Scode SCREENFONTS +screenruler screensaver screenshots scrollviewer @@ -1429,6 +1434,7 @@ SDKDDK sdns searchterm SEARCHUI +secondaryclickaction SECONDARYDISPLAY secpol securestring @@ -1465,7 +1471,7 @@ SFGAOF SHACF SHANDLE sharepoint -sharpkeys +sharpfuzz SHCNE SHCNF SHCONTF @@ -1476,16 +1482,12 @@ SHELLDLL shellex SHELLEXECUTEINFO SHELLEXECUTEINFOW -SHELLEXTENSION SHELLICONSIZE -SHELLNEWVALUE SHFILEINFO SHFILEOPSTRUCT SHGDN SHGDNF SHGFI -SHGFIICON -SHGFILARGEICON SHIL shinfo shlwapi @@ -1495,7 +1497,6 @@ SHORTCUTMAXONEACTIONKEY SHORTCUTNOREPEATEDMODIFIER SHORTCUTONEACTIONKEY SHORTCUTSTARTWITHMODIFIER -Shortcuttool shortdate SHORTPATH shortsplit @@ -1517,9 +1518,9 @@ SICHINT SIDs siex sigdn +Signedness SIGNINGSCENARIO signtool -Signtool SINGLEKEY sipolicy SIZEBOX @@ -1535,12 +1536,14 @@ SLGP sln SMALLICON smartphone +smileys SMTO SNAPPROCESS snk snwprintf softline SOURCECLIENTAREAONLY +sourced sourcedoc SOURCEHEADER sourcesdirectory @@ -1604,11 +1607,13 @@ strret stscanf sttngs Stubless +stuttery STYLECHANGED STYLECHANGING subkeys sublang SUBMODULEUPDATE +subresource Superbar sut svchost @@ -1618,6 +1623,8 @@ svgz SVSI SWFO SWP +SWPNOSIZE +SWPNOZORDER SWRESTORE symbolrequestprod SYMCACHE @@ -1638,21 +1645,19 @@ SYSMENU SYSTEMAPPS SYSTEMMODAL SYSTEMTIME -TApplication -TApplied -targ +TARG TARGETAPPHEADER TARGETDIR targetentrypoint TARGETHEADER targetver +taskbar taskkill taskschd TCHAR TCIF TCITEM TCN -Tcollab tcs tcscat tcschr @@ -1661,16 +1666,14 @@ tcscpy tcsdup tcslen tcsrchr -TCustom tdbuild -TDefault -TDevice telephon templatenamespace +TESTONLY testprocess TEXCOORD TEXTBOXNEWLINE -TEXTEXTRACTOR +textextractor TEXTINCLUDE tfopen tgz @@ -1678,9 +1681,7 @@ themeresources THH THICKFRAME THISCOMPONENT -THotkey throughs -TIcon TILEDWINDOW TILLSON timedate @@ -1691,11 +1692,9 @@ TITLEBARINFO Titlecase tkcontrols tkconverters -TLayout tlb tlbimp tlc -TGM TNP Toolhelp toolkitconverters @@ -1710,19 +1709,14 @@ tracelogging tracerpt trackbar trafficmanager -traies transicc TRAYMOUSEMESSAGE -TResult triaging trl trx tsa -TSender -TServer +tskill tstoi -TStr -tweakme TWF tymed TYPEKEYBOARD @@ -1736,19 +1730,19 @@ UBR UCallback ucrt ucrtd -udit uefi uesc UFlags UHash UIA UIEx +uild +uitests ULONGLONG ums uncompilable UNCPRIORITY UNDNAME -unhiding UNICODETEXT uninstalls Uniquifies @@ -1762,7 +1756,6 @@ unwide unzoom UOffset UOI -Updatelayout UPDATENOW UPDATEREGISTRY updown @@ -1772,6 +1765,7 @@ urld Usb USEDEFAULT USEFILEATTRIBUTES +USEINSTALLERFORTEST USESHOWWINDOW USESTDHANDLES USRDLL @@ -1783,8 +1777,8 @@ uxtheme vabdq validmodulename valuegenerator -VARENUM variantassignment +VARTYPE vcamp VCENTER vcgtq @@ -1804,12 +1798,11 @@ VERTSIZE VFT vget vgetq -viewmodel +viewmodels VIRTKEY VIRTUALDESK VISEGRADRELAY visiblecolorformats -Visibletrue visualeffects vkey vmovl @@ -1861,13 +1854,12 @@ wekyb wft wgpocpl WHEREID -Wholegrain wic wifi -wil +wikipedia +WIL winapi winappsdk -wincolor windir WINDOWCREATED WINDOWEDGE @@ -1883,6 +1875,8 @@ WINDOWSTYLES WINDOWSTYLESICON winerror WINEVENT +winexe +winforms winget wingetcreate Winhook @@ -1938,7 +1932,6 @@ WRITEOBJECTS Wrk wrl wscui -wsf wsh wstr wsz @@ -1951,13 +1944,16 @@ Wubi WUX Wwanpp XAxis +XButton xclip xcopy +XDeployment XDocument XElement xfd XFile XIncrement +XLoc XNamespace Xoshiro XPels @@ -1971,43 +1967,19 @@ XVIRTUALSCREEN xxxxxx YAxis ycombinator -Yeet YIncrement yinle yinyue YPels YResolution YStr -YTM YVIRTUALSCREEN ZEROINIT -Zhiwei +zonability zonable zoneset Zoneszonabletester Zoomin zoomit ZOOMITX -ZXk -ZXNs -zzz -ACIE -AOklab -BCIE -BOklab -culori -Evercoder -LCh -CIELCh -CLSCTXINPROCALL -IIDI -irow -lcid -OTHERUNZOOM -OTHERZOOM -PARENTCLOSING -PARENTOPENING -ppwsz -rguid -SCROLLCHILDREN -VARTYPE \ No newline at end of file +Zorder diff --git a/.github/actions/spell-check/line_forbidden.patterns b/.github/actions/spell-check/line_forbidden.patterns index 24483dd6f5..d66198c855 100644 --- a/.github/actions/spell-check/line_forbidden.patterns +++ b/.github/actions/spell-check/line_forbidden.patterns @@ -8,6 +8,31 @@ # you might not want to check in code where you skip all the other tests. #\bfit\( +# English does not use a hyphen between adverbs and nouns +# https://twitter.com/nyttypos/status/1894815686192685239 +(?:^|\s)[A-Z]?[a-z]+ly-(?=[a-z]{3,})(?:[.,?!]?\s|$) + +# Smart quotes should match +\s’[^.?!‘’]+’[^.?!‘’]+‘[^.?!‘’]+’|\s‘[^.?!‘’]+’[^.?!‘’]+’[^.?!‘’]+’|\s”[^.?!“”]+”[^.?!“”]+“[^.?!“”]+”|\s“[^.?!“”]+”[^.?!“”]+”[^.?!“”]+” + +# Don't use `requires that` + `to be` +# https://twitter.com/nyttypos/status/1894816551435641027 +\brequires that \w+\b[^.]+to be\b + +# A fully parenthetical sentence’s period goes inside the parentheses, not outside. +# https://twitter.com/nyttypos/status/1898844061873639490 +\([A-Z][a-z]{2,}(?: [a-z]+){3,}\)\.\s + +# Complete sentences shouldn't be in the middle of another sentence as a parenthetical. +(? In formal writing and where contractions are frowned upon, use `cannot`. # > It is possible to write `can not`, but you generally find it only as part of some other construction, such as `not only . . . but also.` # - if you encounter such a case, add a pattern for that case to patterns.txt. -\b[Cc]an not\b +\b[Cc]an not\b(?! only\b) + +# Should be `chart` +(?i)\bhelm\b.*\bchard\b # Do not use `(click) here` links # For more information, see: @@ -56,19 +140,49 @@ # * https://heyoka.medium.com/dont-use-click-here-f32f445d1021 (?i)(?:>|\[)(?:(?:click |)here|this(?=\]\([^\)]+:/)|link|(?:read |)more(?!> /etc/apt/sources.list.d/something-distro.list +# ```` +\bapt-key add\b + +# Should be `nearby` +\bnear by\b + # Should probably be a person named `Nick` or the abbreviation `NIC` \bNic\b # Should be `not supposed` \bsupposed not\b +# Should be `Once this` or `On this` or even `One that`. Rarely `One, this` +[?!.] One this\b + # Should probably be `much more` \bmore much\b @@ -153,7 +307,10 @@ \bperform it's\b # Should be `opt-in` -(? below for the` +(?i)\bfind below the\b + +# Should be `then any` unless there's a comparison before the `,` +, than any\b + # Should be `did not exist` \bwere not existent\b @@ -197,9 +419,18 @@ # Should be `nonexistent` \b[Nn]o[nt][- ]existent\b +# Should be `our` +\bspending out time\b + # Should be `@brief` / `@details` / `@param` / `@return` / `@retval` (?:^\s*|(?:\*|//|/*)\s+`)[\\@](?:breif|(?:detail|detials)|(?:params(?!\.)|prama?)|ret(?:uns?)|retvl)\b +# Should be `more than` or `more, then` +\bmore then\b + +# Should be `Pipeline`/`pipeline` +(?:(?<=\b|[A-Z])p|P)ipeLine(?:\b|(?=[A-Z])) + # Should be `preexisting` [Pp]re[- ]existing @@ -215,6 +446,9 @@ # Should be `prerequisite` [Pp]re[- ]requisite +# Should be `QuickTime` +\bQuicktime\b + # Should be `recently changed` or `recent changes` [Rr]ecent changed @@ -224,14 +458,30 @@ # Should be `reentrant` [Rr]e[- ]entrant +# Should be `room for` +\brooms for (?!lease|rent|sale) + +# Should be `socioeconomic` +# https://dictionary.cambridge.org/us/dictionary/english/socioeconomic +socio-economic + # Should be `strong suit` \b(?:my|his|her|their) strong suite\b +# Should probably be `temperatures` unless actually talking about thermal drafts (things birds may fly on) +\bthermals\b + +# Should be `there are` or `they are` (or `they're`) +(?i)\btheir are\b + # Should be `understand` \bunder stand\b -# Should be `URI` or `uri` unless it refers to a person named `Uri` -#(?|".*?") +# Gaelic +Gàidhlig -# #pragma lib -^\s*#pragma comment\(lib, ".*?"\) +Ov_erwrite # languageHashTable "\w+(?:-\w+|)"\s+=\s+@\(".*"\) -# wikipedia -\b\w\w\.wikipedia\.org/wiki/[-\w%.#]+ +# Regular expression with `\b` +\\b(?=[a-z]\S*\{) -# css fonts -\bfont-family:[^;}]+ - -# .github/policies/resourceManagement.yml -pattern: '.*' +# long lorem +L"Lorem.*" # tabs in c# \$"\\t # Hexadecimal character pattern in code -\\x[0-9a-fA-F][0-9a-fA-F] +\\x[0-9a-fA-F]{4} + +fontFamily": ".*" + +D[23]D(?=[A-Z][a-z]) +(?<=[a-z])3D(?=[A-Z]) + +\.monitorId = \{ .*\} + +json::value\(L"\S+" # windows line breaks in strings -\\r\\n +\\r\\n(?=[A-Za-z]) # power shell gallery website \bpowershellgallery.com/[-_a-zA-Z0-9()=./%]* @@ -35,9 +40,22 @@ L?(["']|[-<({>]|\b)[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{10,12}(?:\g{ (?:L"[abAB]+", ){3}L"[abAB]+" -# hit-count: 1 file-count: 1 -# marker to ignore all code on line -^.*/\* #no-spell-check-line \*/.*$ +\. (?: @[-A-Za-z\d]+\b(?!\.[A-Z]),?)+ + +auto deviceId = L".*" +deviceId(?:\.id|) = L".*" + +StringComparer.OrdinalIgnoreCase\) \{.*\} + +# namespaces +\b[a-z]+:: + +"Author": ".+" + +(?:Include|Link)=".*?" + +# You could ignore `xmlns`, but it's probably better to enforce rules about them... +#\s(?:xmlns:[a-z]+(?:[A-Z][a-z]+|)=|[a-z]+(?:[A-Z][a-z]+):(?=[a-z]+=)) # UnitTests \[DataRow\(.*\)\] @@ -50,142 +68,135 @@ L?(["']|[-<({>]|\b)[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{10,12}(?:\g{ # Automatically suggested patterns -# hit-count: 3715 file-count: 992 +# hit-count: 5402 file-count: 1339 # IServiceProvider / isAThing -(?:\b|_)(?:(?:ns|)I|isA)(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b)) +(?:(?:\b|_|(?<=[a-z]))[IT]|(?:\b|_)(?:nsI|isA))(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b)) -# hit-count: 404 file-count: 42 -# base64 encoded content, possibly wrapped in mime -(?:^|[\s=;:?])[-a-zA-Z=;:/0-9+]{50,}(?:[\s=;:?]|$) +# hit-count: 2073 file-count: 842 +# #includes +^\s*#include\s*(?:<.*?>|".*?") -# hit-count: 402 file-count: 160 +# hit-count: 1639 file-count: 855 +# C# includes +^\s*using [^;]+; + +# hit-count: 1491 file-count: 693 +# microsoft +\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|docs|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%]* + +# hit-count: 398 file-count: 133 +# hex digits including css/html color classes: +(?:[\\0][xX]|\\u\{?|[uU]\+|#x?|%23|&H)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b + +# hit-count: 339 file-count: 146 # hex runs \b[0-9a-fA-F]{16,}\b -# hit-count: 337 file-count: 110 -# hex digits including css/html color classes: -(?:[\\0][xX]|\\u|[uU]\+|#x?|%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b - -# hit-count: 311 file-count: 43 -# D2D -D?2D(?!efault) - -# hit-count: 272 file-count: 75 +# hit-count: 253 file-count: 100 # GitHub SHAs (markdown) (?:\[`?[0-9a-f]+`?\]\(https:/|)/(?:www\.|)github\.com(?:/[^/\s"]+){2,}(?:/[^/\s")]+)(?:[0-9a-f]+(?:[-0-9a-zA-Z/#.]*|)\b|) -# hit-count: 146 file-count: 27 +# hit-count: 241 file-count: 37 # version suffix v# (?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_])) -# hit-count: 105 file-count: 103 +# hit-count: 141 file-count: 6 +# Contributor / Project +\[[^\]\s]+\]\(https://github\.com/[^)]+\)(?: -(?: [A-Z]\S+)+|)|\[[^\]]+\]\(https://github\.com/(?:[^/\s"]+/?){1,2}\) + +https://github.com/(?:[-\w]+/?){1,2} + +# hit-count: 131 file-count: 125 +# Repeated letters +\b([a-z])\g{-1}{2,}\b + +# hit-count: 99 file-count: 97 # w3 \bw3\.org/[-0-9a-zA-Z/#.]+ -# hit-count: 94 file-count: 6 -# Contributor -\[[^\]]+\]\(https://github\.com/[^/\s"]+/?\) - -RegExp\(([`'"]).*?\g{-1}\)|(?:escapes|regEx):\s*(?:/.*/|([`'"]).*?\g{-1})|return/.*?/ - -# hit-count: 65 file-count: 38 -# regex choice -\(\?:[^)]+\|[^)]+\) - -# hit-count: 37 file-count: 14 +# hit-count: 59 file-count: 11 # Markdown anchor links \(#\S*?[a-zA-Z]\S*?\) -# hit-count: 33 file-count: 5 -# base64 encoded pkcs -\bMII[-a-zA-Z=;:/0-9+]+ - -# hit-count: 28 file-count: 22 +# hit-count: 29 file-count: 23 # stackexchange -- https://stackexchange.com/feeds/sites \b(?:askubuntu|serverfault|stack(?:exchange|overflow)|superuser).com/(?:questions/\w+/[-\w]+|a/) -# hit-count: 14 file-count: 3 -# node packages -(["'])@[^/'" ]+/[^/'" ]+\g{-1} +# hit-count: 24 file-count: 11 +# Library prefix +# e.g., `lib`+`archive`, `lib`+`raw`, `lib`+`unwind` +# (ignores some words that happen to start with `lib`) +(?:\b|_)[Ll]ib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z]) -# hit-count: 13 file-count: 1 +# hit-count: 20 file-count: 2 # Intel intrinsics -_mm_(?!dd)\w+ +_mm\d*_(?!dd)\w+ -# hit-count: 11 file-count: 5 -# URL escaped characters -%[0-9A-F][A-F](?=[A-Za-z]) - -# hit-count: 9 file-count: 5 +# hit-count: 15 file-count: 8 # Wikipedia \ben\.wikipedia\.org/wiki/[-\w%.#]+ -# hit-count: 5 file-count: 4 +# hit-count: 14 file-count: 10 # vs devops \bvisualstudio.com(?::443|)/[-\w/?=%&.]* -# hit-count: 5 file-count: 4 -# Alternatively, if you're using check-spelling v0.0.25+, and you would like to _check_ the Non-English content for spelling errors, you can. For information on how to do so, see: -# https://docs.check-spelling.dev/Feature:-Configurable-word-characters.html#unicode -[a-zA-Z]*[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3}[a-zA-ZÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]*|[a-zA-Z]{3,}[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]|[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3,} +# hit-count: 8 file-count: 2 +# copyright +Copyright (?:\([Cc]\)|)(?:[-\d, ]|and)+(?: [A-Z][a-z]+ [A-Z][a-z]+,?)+ -# hit-count: 4 file-count: 4 -# microsoft -\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|developer|docs|learn|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%#]* +# hit-count: 8 file-count: 1 +# css fonts +\bfont(?:-family|):[^;}]+ aka\.ms/[a-zA-Z0-9]+ +# hit-count: 8 file-count: 1 +# kubernetes crd patterns +^\s*pattern: .*$ + +# hit-count: 5 file-count: 3 +# URL escaped characters +%[0-9A-F][A-F](?=[A-Za-z]) + # hit-count: 3 file-count: 3 # githubusercontent /[-a-z0-9]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]* -# hit-count: 3 file-count: 2 -# css url wrappings -\burl\([^)]+\) - -# hit-count: 3 file-count: 1 -# kubernetes crd patterns -^\s*pattern: .*$ - -# hit-count: 3 file-count: 1 -# Lorem -# Update Lorem based on your content (requires `ge` and `w` from https://github.com/jsoref/spelling; and `review` from https://github.com/check-spelling/check-spelling/wiki/Looking-for-items-locally ) -# grep '^[^#].*lorem' .github/actions/spelling/patterns.txt|perl -pne 's/.*i..\?://;s/\).*//' |tr '|' "\n"|sort -f |xargs -n1 ge|perl -pne 's/^[^:]*://'|sort -u|w|sed -e 's/ .*//'|w|review - -# Warning, while `(?i)` is very neat and fancy, if you have some binary files that aren't proper unicode, you might run into: -# ... Operation "substitution (s///)" returns its argument for non-Unicode code point 0x1C19AE (the code point will vary). -# ... You could manually change `(?i)X...` to use `[Xx]...` -# ... or you could add the files to your `excludes` file (a version after 0.0.19 should identify the file path) -(?:(?:\w|\s|[,.])*\b(?i)(?:amet|consectetur|cursus|dolor|eros|ipsum|lacus|libero|ligula|lorem|magna|neque|nulla|suscipit|tempus)\b(?:\w|\s|[,.])*) - -# hit-count: 3 file-count: 1 -# libraries -(?:\b|_)lib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z]) +# hit-count: 2 file-count: 2 +# medium +\bmedium\.com/@?[^/\s"]+/[-\w:/*.]+ # hit-count: 2 file-count: 1 # While you could try to match `http://` and `https://` by using `s?` in `https?://`, sometimes there # YouTube url \b(?:(?:www\.|)youtube\.com|youtu.be)/(?:channel/|embed/|user/|playlist\?list=|watch\?v=|v/|)[-a-zA-Z0-9?&=_%]* -# hit-count: 1 file-count: 1 -# GHSA -GHSA(?:-[0-9a-z]{4}){3} - -# hit-count: 1 file-count: 1 +# hit-count: 2 file-count: 1 # GitHub actions \buses:\s+[-\w.]+/[-\w./]+@[-\w.]+ # hit-count: 1 file-count: 1 -# medium -\bmedium\.com/@?[^/\s"]+/[-\w]+ - -# hit-count: 1 file-count: 1 -# sha-... -- uses a fancy capture -(\\?['"]|")[0-9a-f]{40,}\g{-1} +# curl arguments +\b(?:\\n|)curl(?:\.exe|)(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)* # hit-count: 1 file-count: 1 # tar arguments \b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+ +# #pragma lib +^\s*#pragma comment\(lib, ".*?"\) + +# UnitTests +\[DataRow\(.*\)\] + +# AdditionalDependencies +.*< + +# the last line of mimetype="application/x-microsoft.net.object.bytearray.base64" things in .resx files +^\s*[-a-zA-Z=;:/0-9+]*[-a-zA-Z;:/0-9+][-a-zA-Z=;:/0-9+]*=$ + +RegExp\(@?([`'"]).*?\g{-1}\)|(?:escapes|regEx):\s*(?:/.*/|([`'"]).*?\g{-1})|return/.*?/ + # Questionably acceptable forms of `in to` # Personally, I prefer `log into`, but people object # https://www.tprteaching.com/log-into-log-in-to-login/ @@ -194,13 +205,16 @@ GHSA(?:-[0-9a-z]{4}){3} # to opt in \bto opt in\b +# pass(ed|ing) in +\bpass(?:ed|ing) in\b + # acceptable duplicates # ls directory listings [-bcdlpsw](?:[-r][-w][-SsTtx]){3}[\.+*]?\s+\d+\s+\S+\s+\S+\s+[.\d]+(?:[KMGT]|)\s+ # mount \bmount\s+-t\s+(\w+)\s+\g{-1}\b # C types and repeated CSS values -\s(auto|buffalo|center|div|inherit|long|LONG|none|normal|solid|thin|transparent|very)(?: \g{-1})+\s +\s(auto|buffalo|center|div|inherit|long|LONG|none|normal|solid|thin|transparent|very)(?:\s\g{-1})+\s # C enum and struct \b(?:enum|struct)\s+(\w+)\s+\g{-1}\b # go templates @@ -232,9 +246,11 @@ _SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING # ignore long runs of a single character: \b([A-Za-z])\g{-1}{3,}\b +# hit-count: 1 file-count: 1 # Amazon -\bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|) +\bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|)[^"'\s]+ +# hit-count: 3 file-count: 3 # imgur \bimgur\.com/[^.]+ @@ -243,4 +259,4 @@ Process Process # ZoomIt menu items with accelerator keys E&xit -St&yle \ No newline at end of file +St&yle diff --git a/.github/actions/spell-check/reject.txt b/.github/actions/spell-check/reject.txt index 5cc86ef80c..48a5833d12 100644 --- a/.github/actions/spell-check/reject.txt +++ b/.github/actions/spell-check/reject.txt @@ -1,8 +1,17 @@ ^attache$ -^bellow$ +^bellows?$ benefitting occurences? ^dependan.* +^develope$ +^developement$ +^developpe +^Devers?$ +^devex +^devide +^Devinn?[ae] +^devisal +^devisor ^diables?$ ^oer$ Sorce @@ -10,4 +19,5 @@ Sorce ^Teh$ ^untill$ ^untilling$ +^venders?$ ^wether.* diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0cff106acb..04f9cfaaeb 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,10 +4,10 @@ ## PR Checklist -- [ ] **Closes:** #xxx -- [ ] **Communication:** I've discussed this with core contributors already. If work hasn't been agreed, this work might be rejected +- [ ] Closes: #xxx +- [ ] **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 +- [ ] **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 @@ -16,7 +16,7 @@ - [ ] [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 - + ## Detailed Description of the Pull Request / Additional comments diff --git a/.github/workflows/package-submissions.yml b/.github/workflows/package-submissions.yml index b03c18b78b..a2d401faa4 100644 --- a/.github/workflows/package-submissions.yml +++ b/.github/workflows/package-submissions.yml @@ -1,5 +1,4 @@ name: WinGet submission on release -# based off of https://github.com/nushell/nushell/blob/main/.github/workflows/winget-submission.yml on: workflow_dispatch: @@ -9,23 +8,31 @@ on: jobs: winget: name: Publish winget package + + # winget-create is only supported on Windows runs-on: windows-latest + + # winget-create will read the following environment variable to access the GitHub token needed for submitting a PR + # See https://aka.ms/winget-create-token + env: + WINGET_CREATE_GITHUB_TOKEN: ${{ secrets.PT_WINGET }} + + # Only submit stable releases + if: ${{ !github.event.release.prerelease }} steps: - name: Submit Microsoft.PowerToys package to Windows Package Manager Community Repository run: | + # Get installer info from GitHub release event + $assets = '${{ toJSON(github.event.release.assets) }}' | ConvertFrom-Json + $x64UserInstallerUrl = $assets | Where-Object -Property name -match 'PowerToysUserSetup.*x64' | Select -ExpandProperty browser_download_url + $x64MachineInstallerUrl = $assets | Where-Object -Property name -match 'PowerToysSetup.*x64' | Select -ExpandProperty browser_download_url + $arm64UserInstallerUrl = $assets | Where-Object -Property name -match 'PowerToysUserSetup.*arm64' | Select -ExpandProperty browser_download_url + $arm64MachineInstallerUrl = $assets | Where-Object -Property name -match 'PowerToysSetup.*arm64' | Select -ExpandProperty browser_download_url + $packageVersion = (${{ toJSON(github.event.release.tag_name) }}).Trim('v') - $wingetPackage = "Microsoft.PowerToys" - $gitToken = "${{ secrets.PT_WINGET }}" - - $github = Invoke-RestMethod -uri "https://api.github.com/repos/Microsoft/PowerToys/releases" - - $targetRelease = $github | Where-Object -Property name -match 'Release'| Select -First 1 - $installerUserX64Url = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'PowerToysUserSetup.*x64' | Select -ExpandProperty browser_download_url - $installerMachineX64Url = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'PowerToysSetup.*x64' | Select -ExpandProperty browser_download_url - $installerUserArmUrl = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'PowerToysUserSetup.*arm64' | Select -ExpandProperty browser_download_url - $installerMachineArmUrl = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'PowerToysSetup.*arm64' | Select -ExpandProperty browser_download_url - $ver = $targetRelease.tag_name -ireplace '^v' - - # getting latest wingetcreate file - iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe - .\wingetcreate.exe update $wingetPackage -s -v $ver -u "$installerUserX64Url|user" "$installerMachineX64Url|machine" "$installerUserArmUrl|user" "$installerMachineArmUrl|machine" -t $gitToken + # Update package using wingetcreate + curl.exe -JLO https://aka.ms/wingetcreate/latest + .\wingetcreate.exe update Microsoft.PowerToys ` + --version $packageVersion ` + --urls "$x64UserInstallerUrl|user" "$x64MachineInstallerUrl|machine" "$arm64UserInstallerUrl|user" "$arm64MachineInstallerUrl|machine" ` + --submit diff --git a/.github/workflows/spelling2.yml b/.github/workflows/spelling2.yml index 03bb66fff6..a88d620f24 100644 --- a/.github/workflows/spelling2.yml +++ b/.github/workflows/spelling2.yml @@ -93,7 +93,7 @@ jobs: steps: - name: check-spelling id: spelling - uses: check-spelling/check-spelling@67debf50669c7fc76fc8f5d7f996384535a72b77 # v0.0.24 + uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25 with: config: .github/actions/spell-check suppress_push_for_open_pull_request: ${{ github.actor != 'dependabot[bot]' && 1 }} @@ -105,7 +105,7 @@ jobs: report-timing: 1 warnings: bad-regex,binary-file,deprecated-feature,ignored-expect-variant,large-file,limited-references,no-newline-at-eof,noisy-file,non-alpha-in-dictionary,token-is-substring,unexpected-line-ending,whitespace-in-dictionary,minified-file,unsupported-configuration,no-files-to-check,unclosed-block-ignore-begin,unclosed-block-ignore-end experimental_apply_changes_via_bot: 1 - use_sarif: ${{ (!github.event.pull_request || (github.event.pull_request.head.repo.full_name == github.repository)) && 1 }} + use_sarif: 1 check_extra_dictionaries: "" dictionary_source_prefixes: > { @@ -113,37 +113,28 @@ jobs: } extra_dictionaries: | cspell:software-terms/softwareTerms.txt + cspell:cpp/stdlib-c.txt cspell:cpp/stdlib-cpp.txt cspell:filetypes/filetypes.txt - cspell:cpp/stdlib-c.txt - cspell:lorem-ipsum/dictionary.txt - cspell:python/python/python-lib.txt cspell:php/php.txt - cspell:fullstack/fullstack.txt - cspell:dotnet/dotnet.txt - cspell:swift/swift.txt - cspell:node/node.txt cspell:dart/dart.txt - cspell:django/django.txt - cspell:python/python/python.txt + cspell:dotnet/dotnet.txt cspell:powershell/powershell.txt - cspell:npm/npm.txt - cspell:golang/go.txt - cspell:cpp/compiler-msvc.txt cspell:csharp/csharp.txt - cspell:html/html.txt + cspell:python/python/python-lib.txt + cspell:node/node.txt + cspell:golang/go.txt + cspell:npm/npm.txt + cspell:fullstack/fullstack.txt + cspell:css/css.txt cspell:java/java.txt - cspell:aws/aws.txt cspell:typescript/typescript.txt - cspell:cpp/lang-keywords.txt + cspell:html/html.txt + cspell:r/r.txt + cspell:aws/aws.txt + cspell:cpp/compiler-msvc.txt cspell:python/common/extra.txt cspell:scala/scala.txt - cspell:shell/shell-all-words.txt - cspell:css/css.txt - cspell:r/r.txt - cspell:java/java-terms.txt - cspell:cpp/stdlib-cerrno.txt - cspell:k8s/k8s.txt comment-push: name: Report (Push) @@ -156,7 +147,7 @@ jobs: if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push' steps: - name: comment - uses: check-spelling/check-spelling@67debf50669c7fc76fc8f5d7f996384535a72b77 # v0.0.24 + uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25 with: config: .github/actions/spell-check checkout: true @@ -175,7 +166,7 @@ jobs: if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request') steps: - name: comment - uses: check-spelling/check-spelling@67debf50669c7fc76fc8f5d7f996384535a72b77 # v0.0.24 + uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25 with: config: .github/actions/spell-check checkout: true @@ -202,7 +193,7 @@ jobs: cancel-in-progress: false steps: - name: apply spelling updates - uses: check-spelling/check-spelling@67debf50669c7fc76fc8f5d7f996384535a72b77 # v0.0.24 + uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25 with: experimental_apply_changes_via_bot: ${{ github.repository_owner != 'microsoft' && 1 }} checkout: true diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json index 615b5633bf..6f8f817492 100644 --- a/.pipelines/ESRPSigning_core.json +++ b/.pipelines/ESRPSigning_core.json @@ -3,226 +3,233 @@ "UseMinimatch": false, "SignBatches": [ { - "MatchedPath": [ - "*.resources.dll", - - "WinUI3Apps\\Assets\\Settings\\Scripts\\*.ps1", + "MatchedPath": [ + "*.resources.dll", - "PowerToys.ActionRunner.exe", - "PowerToys.Update.exe", - "PowerToys.BackgroundActivatorDLL.dll", - "Notifications.dll", - "os-detection.dll", - "PowerToys.exe", - "PowerToys.FilePreviewCommon.dll", - "PowerToys.Interop.dll", - "Tools\\PowerToys.BugReportTool.exe", - "StylesReportTool\\PowerToys.StylesReportTool.exe", - "Telemetry.dll", - "PowerToys.ManagedTelemetry.dll", - "PowerToys.ManagedCommon.dll", - "PowerToys.Common.UI.dll", - "PowerToys.Settings.UI.Lib.dll", - "PowerToys.GPOWrapper.dll", - "PowerToys.GPOWrapperProjection.dll", - "PowerToys.AllExperiments.dll", + "WinUI3Apps\\Assets\\Settings\\Scripts\\*.ps1", - "PowerToys.AlwaysOnTop.exe", - "PowerToys.AlwaysOnTopModuleInterface.dll", + "PowerToys.ActionRunner.exe", + "PowerToys.Update.exe", + "PowerToys.BackgroundActivatorDLL.dll", - "PowerToys.CmdNotFoundModuleInterface.dll", - "PowerToys.CmdNotFound.dll", + "PowerToys.exe", + "PowerToys.FilePreviewCommon.dll", + "PowerToys.Interop.dll", + "Tools\\PowerToys.BugReportTool.exe", + "StylesReportTool\\PowerToys.StylesReportTool.exe", - "PowerToys.ColorPicker.dll", - "PowerToys.ColorPickerUI.dll", - "PowerToys.ColorPickerUI.exe", + "CalculatorEngineCommon.dll", + "PowerToys.ManagedTelemetry.dll", + "PowerToys.ManagedCommon.dll", + "PowerToys.ManagedCsWin32.dll", + "PowerToys.Common.UI.dll", + "PowerToys.Settings.UI.Lib.dll", + "PowerToys.GPOWrapper.dll", + "PowerToys.GPOWrapperProjection.dll", + "PowerToys.AllExperiments.dll", - "PowerToys.CropAndLockModuleInterface.dll", - "PowerToys.CropAndLock.exe", + "PowerToys.AlwaysOnTop.exe", + "PowerToys.AlwaysOnTopModuleInterface.dll", - "PowerToys.PowerOCRModuleInterface.dll", - "PowerToys.PowerOCR.dll", - "PowerToys.PowerOCR.exe", + "PowerToys.CmdNotFoundModuleInterface.dll", - "PowerToys.AdvancedPasteModuleInterface.dll", - "WinUI3Apps\\PowerToys.AdvancedPaste.exe", - "WinUI3Apps\\PowerToys.AdvancedPaste.dll", - "PowerToys.AwakeModuleInterface.dll", - "PowerToys.Awake.exe", - "PowerToys.Awake.dll", + "PowerToys.ColorPicker.dll", + "PowerToys.ColorPickerUI.dll", + "PowerToys.ColorPickerUI.exe", - "fancyzones.dll", - "PowerToys.FancyZonesEditor.exe", - "PowerToys.FancyZonesEditor.dll", - "PowerToys.FancyZonesEditorCommon.dll", - "PowerToys.FancyZonesModuleInterface.dll", - "PowerToys.FancyZones.exe", + "PowerToys.CropAndLockModuleInterface.dll", + "PowerToys.CropAndLock.exe", - "PowerToys.GcodePreviewHandler.dll", - "PowerToys.GcodePreviewHandler.exe", - "PowerToys.GcodePreviewHandlerCpp.dll", - "PowerToys.GcodeThumbnailProvider.dll", - "PowerToys.GcodeThumbnailProvider.exe", - "PowerToys.GcodeThumbnailProviderCpp.dll", - "PowerToys.ManagedTelemetry.dll", - "PowerToys.MarkdownPreviewHandler.dll", - "PowerToys.MarkdownPreviewHandler.exe", - "PowerToys.MarkdownPreviewHandlerCpp.dll", - "PowerToys.MonacoPreviewHandler.dll", - "PowerToys.MonacoPreviewHandler.exe", - "PowerToys.MonacoPreviewHandlerCpp.dll", - "PowerToys.PdfPreviewHandler.dll", - "PowerToys.PdfPreviewHandler.exe", - "PowerToys.PdfPreviewHandlerCpp.dll", - "PowerToys.PdfThumbnailProvider.dll", - "PowerToys.PdfThumbnailProvider.exe", - "PowerToys.PdfThumbnailProviderCpp.dll", - "PowerToys.powerpreview.dll", - "PowerToys.PreviewHandlerCommon.dll", - "PowerToys.QoiPreviewHandler.dll", - "PowerToys.QoiPreviewHandler.exe", - "PowerToys.QoiPreviewHandlerCpp.dll", - "PowerToys.QoiThumbnailProvider.dll", - "PowerToys.QoiThumbnailProvider.exe", - "PowerToys.QoiThumbnailProviderCpp.dll", - "PowerToys.StlThumbnailProvider.dll", - "PowerToys.StlThumbnailProvider.exe", - "PowerToys.StlThumbnailProviderCpp.dll", - "PowerToys.SvgPreviewHandler.dll", - "PowerToys.SvgPreviewHandler.exe", - "PowerToys.SvgPreviewHandlerCpp.dll", - "PowerToys.SvgThumbnailProvider.dll", - "PowerToys.SvgThumbnailProvider.exe", - "PowerToys.SvgThumbnailProviderCpp.dll", + "PowerToys.PowerOCRModuleInterface.dll", + "PowerToys.PowerOCR.dll", + "PowerToys.PowerOCR.exe", - "WinUI3Apps\\PowerToys.HostsModuleInterface.dll", - "WinUI3Apps\\PowerToys.HostsUILib.dll", - "WinUI3Apps\\PowerToys.Hosts.dll", - "WinUI3Apps\\PowerToys.Hosts.exe", + "PowerToys.AdvancedPasteModuleInterface.dll", + "WinUI3Apps\\PowerToys.AdvancedPaste.exe", + "WinUI3Apps\\PowerToys.AdvancedPaste.dll", - "WinUI3Apps\\PowerToys.FileLocksmithLib.Interop.dll", - "WinUI3Apps\\PowerToys.FileLocksmithExt.dll", - "WinUI3Apps\\PowerToys.FileLocksmithUI.exe", - "WinUI3Apps\\PowerToys.FileLocksmithUI.dll", - "WinUI3Apps\\PowerToys.FileLocksmithContextMenu.dll", - "FileLocksmithContextMenuPackage.msix", + "PowerToys.AwakeModuleInterface.dll", + "PowerToys.Awake.exe", + "PowerToys.Awake.dll", - "WinUI3Apps\\Peek.Common.dll", - "WinUI3Apps\\Peek.FilePreviewer.dll", - "WinUI3Apps\\Powertoys.Peek.UI.dll", - "WinUI3Apps\\Powertoys.Peek.UI.exe", - "WinUI3Apps\\Powertoys.Peek.dll", - "WinUI3Apps\\PowerToys.EnvironmentVariablesModuleInterface.dll", - "WinUI3Apps\\PowerToys.EnvironmentVariablesUILib.dll", - "WinUI3Apps\\PowerToys.EnvironmentVariables.dll", - "WinUI3Apps\\PowerToys.EnvironmentVariables.exe", + "PowerToys.FancyZonesEditor.exe", + "PowerToys.FancyZonesEditor.dll", + "PowerToys.FancyZonesEditorCommon.dll", + "PowerToys.FancyZonesModuleInterface.dll", + "PowerToys.FancyZones.exe", - "PowerToys.ImageResizer.exe", - "PowerToys.ImageResizer.dll", - "PowerToys.ImageResizerExt.dll", - "PowerToys.ImageResizerContextMenu.dll", - "ImageResizerContextMenuPackage.msix", + "PowerToys.GcodePreviewHandler.dll", + "PowerToys.GcodePreviewHandler.exe", + "PowerToys.GcodePreviewHandlerCpp.dll", + "PowerToys.GcodeThumbnailProvider.dll", + "PowerToys.GcodeThumbnailProvider.exe", + "PowerToys.GcodeThumbnailProviderCpp.dll", + "PowerToys.BgcodePreviewHandler.dll", + "PowerToys.BgcodePreviewHandler.exe", + "PowerToys.BgcodePreviewHandlerCpp.dll", + "PowerToys.BgcodeThumbnailProvider.dll", + "PowerToys.BgcodeThumbnailProvider.exe", + "PowerToys.BgcodeThumbnailProviderCpp.dll", + "PowerToys.ManagedTelemetry.dll", + "PowerToys.MarkdownPreviewHandler.dll", + "PowerToys.MarkdownPreviewHandler.exe", + "PowerToys.MarkdownPreviewHandlerCpp.dll", + "PowerToys.MonacoPreviewHandler.dll", + "PowerToys.MonacoPreviewHandler.exe", + "PowerToys.MonacoPreviewHandlerCpp.dll", + "PowerToys.PdfPreviewHandler.dll", + "PowerToys.PdfPreviewHandler.exe", + "PowerToys.PdfPreviewHandlerCpp.dll", + "PowerToys.PdfThumbnailProvider.dll", + "PowerToys.PdfThumbnailProvider.exe", + "PowerToys.PdfThumbnailProviderCpp.dll", + "PowerToys.powerpreview.dll", + "PowerToys.PreviewHandlerCommon.dll", + "PowerToys.QoiPreviewHandler.dll", + "PowerToys.QoiPreviewHandler.exe", + "PowerToys.QoiPreviewHandlerCpp.dll", + "PowerToys.QoiThumbnailProvider.dll", + "PowerToys.QoiThumbnailProvider.exe", + "PowerToys.QoiThumbnailProviderCpp.dll", + "PowerToys.StlThumbnailProvider.dll", + "PowerToys.StlThumbnailProvider.exe", + "PowerToys.StlThumbnailProviderCpp.dll", + "PowerToys.SvgPreviewHandler.dll", + "PowerToys.SvgPreviewHandler.exe", + "PowerToys.SvgPreviewHandlerCpp.dll", + "PowerToys.SvgThumbnailProvider.dll", + "PowerToys.SvgThumbnailProvider.exe", + "PowerToys.SvgThumbnailProviderCpp.dll", - "PowerToys.KeyboardManager.dll", - "KeyboardManagerEditor\\PowerToys.KeyboardManagerEditor.exe", - "KeyboardManagerEngine\\PowerToys.KeyboardManagerEngine.exe", - "PowerToys.KeyboardManagerEditorLibraryWrapper.dll", + "WinUI3Apps\\PowerToys.HostsModuleInterface.dll", + "WinUI3Apps\\PowerToys.HostsUILib.dll", + "WinUI3Apps\\PowerToys.Hosts.dll", + "WinUI3Apps\\PowerToys.Hosts.exe", - "PowerToys.Launcher.dll", - "PowerToys.PowerLauncher.dll", - "PowerToys.PowerLauncher.exe", - "PowerToys.PowerLauncher.Telemetry.dll", - "Wox.dll", - "Wox.Infrastructure.dll", - "Wox.Plugin.dll", - "RunPlugins\\Calculator\\Microsoft.PowerToys.Run.Plugin.Calculator.dll", - "RunPlugins\\Folder\\Microsoft.Plugin.Folder.dll", - "RunPlugins\\Indexer\\Microsoft.Plugin.Indexer.dll", - "RunPlugins\\OneNote\\Microsoft.PowerToys.Run.Plugin.OneNote.dll", - "RunPlugins\\History\\Microsoft.PowerToys.Run.Plugin.History.dll", - "RunPlugins\\PowerToys\\Microsoft.PowerToys.Run.Plugin.PowerToys.dll", - "RunPlugins\\Program\\Microsoft.Plugin.Program.dll", - "RunPlugins\\Registry\\Microsoft.PowerToys.Run.Plugin.Registry.dll", - "RunPlugins\\WindowsSettings\\Microsoft.PowerToys.Run.Plugin.WindowsSettings.dll", - "RunPlugins\\Shell\\Microsoft.Plugin.Shell.dll", - "RunPlugins\\Uri\\Microsoft.Plugin.Uri.dll", - "RunPlugins\\WindowWalker\\Microsoft.Plugin.WindowWalker.dll", - "RunPlugins\\UnitConverter\\Community.PowerToys.Run.Plugin.UnitConverter.dll", - "RunPlugins\\VSCodeWorkspaces\\Community.PowerToys.Run.Plugin.VSCodeWorkspaces.dll", - "RunPlugins\\Service\\Microsoft.PowerToys.Run.Plugin.Service.dll", - "RunPlugins\\System\\Microsoft.PowerToys.Run.Plugin.System.dll", - "RunPlugins\\TimeDate\\Microsoft.PowerToys.Run.Plugin.TimeDate.dll", - "RunPlugins\\ValueGenerator\\Community.PowerToys.Run.Plugin.ValueGenerator.dll", - "RunPlugins\\WebSearch\\Community.PowerToys.Run.Plugin.WebSearch.dll", - "RunPlugins\\WindowsTerminal\\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.dll", - - "WinUI3Apps\\PowerToys.MeasureToolModuleInterface.dll", - "WinUI3Apps\\PowerToys.MeasureToolCore.dll", - "WinUI3Apps\\PowerToys.MeasureToolUI.dll", - "WinUI3Apps\\PowerToys.MeasureToolUI.exe", + "WinUI3Apps\\PowerToys.FileLocksmithLib.Interop.dll", + "WinUI3Apps\\PowerToys.FileLocksmithExt.dll", + "WinUI3Apps\\PowerToys.FileLocksmithUI.exe", + "WinUI3Apps\\PowerToys.FileLocksmithUI.dll", + "WinUI3Apps\\PowerToys.FileLocksmithContextMenu.dll", + "FileLocksmithContextMenuPackage.msix", - "PowerToys.FindMyMouse.dll", - "PowerToys.MouseHighlighter.dll", - "PowerToys.MouseJump.dll", - "PowerToys.MouseJump.Common.dll", - "PowerToys.MousePointerCrosshairs.dll", - "PowerToys.MouseJumpUI.dll", - "PowerToys.MouseJumpUI.exe", + "WinUI3Apps\\Peek.Common.dll", + "WinUI3Apps\\Peek.FilePreviewer.dll", + "WinUI3Apps\\Powertoys.Peek.UI.dll", + "WinUI3Apps\\Powertoys.Peek.UI.exe", + "WinUI3Apps\\Powertoys.Peek.dll", - "PowerToys.MouseWithoutBorders.dll", - "PowerToys.MouseWithoutBorders.exe", - "PowerToys.MouseWithoutBordersModuleInterface.dll", - "PowerToys.MouseWithoutBordersService.dll", - "PowerToys.MouseWithoutBordersService.exe", - "PowerToys.MouseWithoutBordersHelper.dll", - "PowerToys.MouseWithoutBordersHelper.exe", + "WinUI3Apps\\PowerToys.EnvironmentVariablesModuleInterface.dll", + "WinUI3Apps\\PowerToys.EnvironmentVariablesUILib.dll", + "WinUI3Apps\\PowerToys.EnvironmentVariables.dll", + "WinUI3Apps\\PowerToys.EnvironmentVariables.exe", - "WinUI3Apps\\PowerToys.NewPlus.ShellExtension.dll", - "WinUI3Apps\\NewPlusPackage.msix", - "WinUI3Apps\\PowerToys.NewPlus.ShellExtension.win10.dll", + "PowerToys.ImageResizer.exe", + "PowerToys.ImageResizer.dll", + "PowerToys.ImageResizerExt.dll", + "PowerToys.ImageResizerContextMenu.dll", + "ImageResizerContextMenuPackage.msix", - "PowerAccent.Core.dll", - "PowerToys.PowerAccent.dll", - "PowerToys.PowerAccent.exe", - "PowerToys.PowerAccentModuleInterface.dll", - "PowerToys.PowerAccentKeyboardService.dll", + "PowerToys.KeyboardManager.dll", + "KeyboardManagerEditor\\PowerToys.KeyboardManagerEditor.exe", + "KeyboardManagerEngine\\PowerToys.KeyboardManagerEngine.exe", + "PowerToys.KeyboardManagerEditorLibraryWrapper.dll", - "WinUI3Apps\\PowerToys.PowerRenameExt.dll", - "WinUI3Apps\\PowerToys.PowerRename.exe", - "WinUI3Apps\\PowerToys.PowerRenameContextMenu.dll", - "WinUI3Apps\\PowerRenameContextMenuPackage.msix", + "PowerToys.Launcher.dll", + "PowerToys.PowerLauncher.dll", + "PowerToys.PowerLauncher.exe", + "PowerToys.PowerLauncher.Telemetry.dll", - "PowerToys.WorkspacesSnapshotTool.exe", - "PowerToys.WorkspacesLauncher.exe", - "PowerToys.WorkspacesWindowArranger.exe", - "PowerToys.WorkspacesEditor.exe", - "PowerToys.WorkspacesEditor.dll", - "PowerToys.WorkspacesLauncherUI.exe", - "PowerToys.WorkspacesLauncherUI.dll", - "PowerToys.WorkspacesModuleInterface.dll", - "PowerToys.WorkspacesCsharpLibrary.dll", + "Wox.Infrastructure.dll", + "Wox.Plugin.dll", + "RunPlugins\\Calculator\\Microsoft.PowerToys.Run.Plugin.Calculator.dll", + "RunPlugins\\Folder\\Microsoft.Plugin.Folder.dll", + "RunPlugins\\Indexer\\Microsoft.Plugin.Indexer.dll", + "RunPlugins\\OneNote\\Microsoft.PowerToys.Run.Plugin.OneNote.dll", + "RunPlugins\\History\\Microsoft.PowerToys.Run.Plugin.History.dll", + "RunPlugins\\PowerToys\\Microsoft.PowerToys.Run.Plugin.PowerToys.dll", + "RunPlugins\\Program\\Microsoft.Plugin.Program.dll", + "RunPlugins\\Registry\\Microsoft.PowerToys.Run.Plugin.Registry.dll", + "RunPlugins\\WindowsSettings\\Microsoft.PowerToys.Run.Plugin.WindowsSettings.dll", + "RunPlugins\\Shell\\Microsoft.Plugin.Shell.dll", + "RunPlugins\\Uri\\Microsoft.Plugin.Uri.dll", + "RunPlugins\\WindowWalker\\Microsoft.Plugin.WindowWalker.dll", + "RunPlugins\\UnitConverter\\Community.PowerToys.Run.Plugin.UnitConverter.dll", + "RunPlugins\\VSCodeWorkspaces\\Community.PowerToys.Run.Plugin.VSCodeWorkspaces.dll", + "RunPlugins\\Service\\Microsoft.PowerToys.Run.Plugin.Service.dll", + "RunPlugins\\System\\Microsoft.PowerToys.Run.Plugin.System.dll", + "RunPlugins\\TimeDate\\Microsoft.PowerToys.Run.Plugin.TimeDate.dll", + "RunPlugins\\ValueGenerator\\Community.PowerToys.Run.Plugin.ValueGenerator.dll", + "RunPlugins\\WebSearch\\Community.PowerToys.Run.Plugin.WebSearch.dll", + "RunPlugins\\WindowsTerminal\\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.dll", - "WinUI3Apps\\PowerToys.RegistryPreviewExt.dll", - "WinUI3Apps\\PowerToys.RegistryPreviewUILib.dll", - "WinUI3Apps\\PowerToys.RegistryPreview.dll", - "WinUI3Apps\\PowerToys.RegistryPreview.exe", + "WinUI3Apps\\PowerToys.MeasureToolModuleInterface.dll", + "WinUI3Apps\\PowerToys.MeasureToolCore.dll", + "WinUI3Apps\\PowerToys.MeasureToolUI.dll", + "WinUI3Apps\\PowerToys.MeasureToolUI.exe", - "PowerToys.ShortcutGuide.exe", - "PowerToys.ShortcutGuideModuleInterface.dll", + "PowerToys.FindMyMouse.dll", + "PowerToys.MouseHighlighter.dll", + "PowerToys.MouseJump.dll", + "PowerToys.MouseJump.Common.dll", + "PowerToys.MousePointerCrosshairs.dll", + "PowerToys.MouseJumpUI.dll", + "PowerToys.MouseJumpUI.exe", - "PowerToys.ZoomIt.exe", - "PowerToys.ZoomItModuleInterface.dll", - "PowerToys.ZoomItSettingsInterop.dll", + "PowerToys.MouseWithoutBorders.dll", + "PowerToys.MouseWithoutBorders.exe", + "PowerToys.MouseWithoutBordersModuleInterface.dll", + "PowerToys.MouseWithoutBordersService.dll", + "PowerToys.MouseWithoutBordersService.exe", + "PowerToys.MouseWithoutBordersHelper.dll", + "PowerToys.MouseWithoutBordersHelper.exe", - "WinUI3Apps\\PowerToys.Settings.dll", - "WinUI3Apps\\PowerToys.Settings.exe", + "WinUI3Apps\\PowerToys.NewPlus.ShellExtension.dll", + "WinUI3Apps\\NewPlusPackage.msix", + "WinUI3Apps\\PowerToys.NewPlus.ShellExtension.win10.dll", - "PowerToys.CmdPalModuleInterface.dll", - "CmdPalKeyboardService.dll", - "*Microsoft.CmdPal.UI_*.msix" - ], + "PowerAccent.Core.dll", + "PowerToys.PowerAccent.dll", + "PowerToys.PowerAccent.exe", + "PowerToys.PowerAccentModuleInterface.dll", + "PowerToys.PowerAccentKeyboardService.dll", + + "WinUI3Apps\\PowerToys.PowerRenameExt.dll", + "WinUI3Apps\\PowerToys.PowerRename.exe", + "WinUI3Apps\\PowerToys.PowerRenameContextMenu.dll", + "WinUI3Apps\\PowerRenameContextMenuPackage.msix", + + "PowerToys.WorkspacesSnapshotTool.exe", + "PowerToys.WorkspacesLauncher.exe", + "PowerToys.WorkspacesWindowArranger.exe", + "PowerToys.WorkspacesEditor.exe", + "PowerToys.WorkspacesEditor.dll", + "PowerToys.WorkspacesLauncherUI.exe", + "PowerToys.WorkspacesLauncherUI.dll", + "PowerToys.WorkspacesModuleInterface.dll", + "PowerToys.WorkspacesCsharpLibrary.dll", + + "WinUI3Apps\\PowerToys.RegistryPreviewExt.dll", + "WinUI3Apps\\PowerToys.RegistryPreviewUILib.dll", + "WinUI3Apps\\PowerToys.RegistryPreview.dll", + "WinUI3Apps\\PowerToys.RegistryPreview.exe", + + "PowerToys.ShortcutGuide.exe", + "PowerToys.ShortcutGuideModuleInterface.dll", + + "PowerToys.ZoomIt.exe", + "PowerToys.ZoomItModuleInterface.dll", + "PowerToys.ZoomItSettingsInterop.dll", + + "WinUI3Apps\\PowerToys.Settings.dll", + "WinUI3Apps\\PowerToys.Settings.exe", + + "PowerToys.CmdPalModuleInterface.dll", + "CmdPalKeyboardService.dll", + "*Microsoft.CmdPal.UI_*.msix" + ], "SigningInfo": { "Operations": [ { @@ -273,16 +280,16 @@ "Mono.Cecil.Pdb.dll", "Mono.Cecil.Rocks.dll", "Newtonsoft.Json.dll", - "Newtonsoft.Json.Bson.dll", + "NLog.dll", "HtmlAgilityPack.dll", "Markdig.Signed.dll", "HelixToolkit.dll", "HelixToolkit.Core.Wpf.dll", "Mages.Core.dll", - "JetBrains.Annotations.dll", + "NLog.Extensions.Logging.dll", - "getfilesiginforedist.dll", + "concrt140_app.dll", "msvcp140_1_app.dll", "msvcp140_2_app.dll", @@ -292,22 +299,8 @@ "vcomp140_app.dll", "vcruntime140_1_app.dll", "vcruntime140_app.dll", - "WinUI3Apps\\CommunityToolkit.Labs.WinUI.SettingsControls.dll", + "UnicodeInformation.dll", - "Vanara.Core.dll", - "Vanara.PInvoke.ComCtl32.dll", - "Vanara.PInvoke.Cryptography.dll", - "Vanara.PInvoke.Gdi32.dll", - "Vanara.PInvoke.Kernel32.dll", - "Vanara.PInvoke.Ole.dll", - "Vanara.PInvoke.Rpc.dll", - "Vanara.PInvoke.Security.dll", - "Vanara.PInvoke.Shared.dll", - "Vanara.PInvoke.Shell32.dll", - "Vanara.PInvoke.ShlwApi.dll", - "Vanara.PInvoke.User32.dll", - "WinUI3Apps\\clrcompression.dll", - "WinUI3Apps\\Microsoft.Graphics.Canvas.Interop.dll", "Microsoft.Web.WebView2.Core.dll", "Microsoft.Web.WebView2.WinForms.dll", "Microsoft.Web.WebView2.Wpf.dll", @@ -334,7 +327,7 @@ "Testably.Abstractions.FileSystem.Interface.dll", "WinUI3Apps\\Testably.Abstractions.FileSystem.Interface.dll", "ColorCode.Core.dll", - "ColorCode.UWP.dll", + "UnitsNet.dll", "UtfUnknown.dll", "Wpf.Ui.dll" diff --git a/.pipelines/applyXamlStyling.ps1 b/.pipelines/applyXamlStyling.ps1 index 7cb7b4a4b0..1facedc569 100644 --- a/.pipelines/applyXamlStyling.ps1 +++ b/.pipelines/applyXamlStyling.ps1 @@ -41,6 +41,9 @@ Write-Output "" Write-Output "Restoring dotnet tools..." dotnet tool restore --disable-parallel --no-cache +# Use Regex syntax +$PathExcludes = "(\\obj\\)|(\\bin\\)|(\\x64\\)|(\\Generated Files\\PowerRenameXAML\\)|(\\RegistryPreviewUILib\\Controls\\HexBox\\)" + if (-not $Passive) { # Look for unstaged changed files by default @@ -87,7 +90,7 @@ if (-not $Passive) } Write-Output "Running Git Diff: $gitDiffCommand" - $files = Invoke-Expression $gitDiffCommand | Select-String -Pattern "\.xaml$" + $files = Invoke-Expression $gitDiffCommand | Select-String -Pattern "\.xaml$" | Where-Object { $_ -notmatch $PathExcludes } if (-not $Passive -and -not $Main -and -not $Unstaged -and -not $Staged -and -not $LastCommit) { @@ -107,7 +110,7 @@ if (-not $Passive) else { Write-Output "Checking all files (passively)" - $files = Get-ChildItem -Path "$PSScriptRoot\..\src\*.xaml" -Recurse | Select-Object -ExpandProperty FullName | Where-Object { $_ -notmatch "(\\obj\\)|(\\bin\\)|(\\x64\\)|(\\Generated Files\\PowerRenameXAML\\)" } + $files = Get-ChildItem -Path "$PSScriptRoot\..\src\*.xaml" -Recurse | Select-Object -ExpandProperty FullName | Where-Object { $_ -notmatch $PathExcludes } if ($files.count -gt 0) { diff --git a/.pipelines/installPowertoys.ps1 b/.pipelines/installPowertoys.ps1 new file mode 100644 index 0000000000..26abc5271f --- /dev/null +++ b/.pipelines/installPowertoys.ps1 @@ -0,0 +1,46 @@ +param( + [Parameter()] + [ValidateSet("Machine", "PerUser")] + [string]$InstallMode = "Machine" +) + +$ProgressPreference = 'SilentlyContinue' + +# Get artifact path +$ArtifactPath = $ENV:BUILD_ARTIFACTSTAGINGDIRECTORY +if (-not $ArtifactPath) { + throw "BUILD_ARTIFACTSTAGINGDIRECTORY environment variable not set" +} + +# Since we only download PowerToysSetup-*.exe files, we can directly find it +$Installer = Get-ChildItem -Path $ArtifactPath -Filter 'PowerToys*.exe' | Select-Object -First 1 + +if (-not $Installer) { + throw "PowerToys installer not found" +} + +Write-Host "Installing PowerToys: $($Installer.Name)" + +# Install PowerToys +$Process = Start-Process -Wait -FilePath $Installer.FullName -ArgumentList "/passive", "/norestart" -PassThru -NoNewWindow + +if ($Process.ExitCode -eq 0 -or $Process.ExitCode -eq 3010) { + Write-Host "✅ PowerToys installation completed successfully" +} else { + throw "PowerToys installation failed with exit code: $($Process.ExitCode)" +} + +# Verify installation +if ($InstallMode -eq "PerUser") { + if (Test-Path "${env:LOCALAPPDATA}\PowerToys\PowerToys.exe") { + Write-Host "✅ PowerToys verified at: ${env:LOCALAPPDATA}\PowerToys\PowerToys.exe" + } else { + throw "PowerToys installation verification failed" + } +} else { + if (Test-Path "${env:ProgramFiles}\PowerToys\PowerToys.exe") { + Write-Host "✅ PowerToys verified at: ${env:ProgramFiles}\PowerToys\PowerToys.exe" + } else { + throw "PowerToys installation verification failed" + } +} diff --git a/.pipelines/v2/ci-test-with-canary-webview2.yml b/.pipelines/v2/ci-test-with-canary-webview2.yml index 01f0454186..1efb4d4abf 100644 --- a/.pipelines/v2/ci-test-with-canary-webview2.yml +++ b/.pipelines/v2/ci-test-with-canary-webview2.yml @@ -19,7 +19,7 @@ parameters: - name: enableMsBuildCaching type: boolean displayName: "Enable MSBuild Caching" - default: false + default: true - name: runTests type: boolean displayName: "Run Tests" @@ -36,7 +36,8 @@ extends: template: templates/pipeline-ci-build.yml parameters: buildPlatforms: ${{ parameters.buildPlatforms }} - enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }} + ${{ if eq(variables['System.PullRequest.IsFork'], 'False') }}: + enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }} runTests: ${{ parameters.runTests }} useVSPreview: ${{ parameters.useVSPreview }} useLatestWebView2: ${{ parameters.useLatestWebView2 }} diff --git a/.pipelines/v2/ci-using-the-latest-winappsdk.yml b/.pipelines/v2/ci-using-the-latest-winappsdk.yml index 3d628b13a9..4e642ddfd6 100644 --- a/.pipelines/v2/ci-using-the-latest-winappsdk.yml +++ b/.pipelines/v2/ci-using-the-latest-winappsdk.yml @@ -19,7 +19,7 @@ parameters: - name: enableMsBuildCaching type: boolean displayName: "Enable MSBuild Caching" - default: false + default: true - name: runTests type: boolean displayName: "Run Tests" @@ -42,7 +42,8 @@ extends: template: templates/pipeline-ci-build.yml parameters: buildPlatforms: ${{ parameters.buildPlatforms }} - enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }} + ${{ if eq(variables['System.PullRequest.IsFork'], 'False') }}: + enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }} runTests: ${{ parameters.runTests }} useVSPreview: ${{ parameters.useVSPreview }} useLatestWinAppSDK: ${{ parameters.useLatestWinAppSDK }} diff --git a/.pipelines/v2/ci.yml b/.pipelines/v2/ci.yml index 0b8daa76d6..6b0105a38a 100644 --- a/.pipelines/v2/ci.yml +++ b/.pipelines/v2/ci.yml @@ -32,7 +32,7 @@ parameters: - name: enableMsBuildCaching type: boolean displayName: "Enable MSBuild Caching" - default: false + default: true - name: runTests type: boolean displayName: "Run Tests" @@ -46,6 +46,7 @@ extends: template: templates/pipeline-ci-build.yml parameters: buildPlatforms: ${{ parameters.buildPlatforms }} - enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }} + ${{ if eq(variables['System.PullRequest.IsFork'], 'False') }}: + enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }} runTests: ${{ parameters.runTests }} useVSPreview: ${{ parameters.useVSPreview }} diff --git a/.pipelines/v2/oneFuzz.yml b/.pipelines/v2/oneFuzz.yml index 2bcbf36050..adcce3fe5d 100644 --- a/.pipelines/v2/oneFuzz.yml +++ b/.pipelines/v2/oneFuzz.yml @@ -43,6 +43,7 @@ stages: enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }} runTests: true useVSPreview: ${{ parameters.useVSPreview }} + timeoutInMinutes: 90 - stage: OneFuzz displayName: Fuzz ${{ parameters.platform }} diff --git a/.pipelines/v2/release.yml b/.pipelines/v2/release.yml index 227dd1cf71..18163e899a 100644 --- a/.pipelines/v2/release.yml +++ b/.pipelines/v2/release.yml @@ -38,6 +38,11 @@ parameters: displayName: "Build Using Visual Studio Preview" default: false + - name: enableAOT + type: boolean + displayName: "Enable AOT (Ahead-of-Time) Compilation for CmdPal" + default: true + name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr) variables: @@ -95,7 +100,7 @@ extends: useManagedIdentity: $(SigningUseManagedIdentity) clientId: $(SigningOriginalClientId) # Have msbuild use the release nuget config profile - additionalBuildOptions: /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config" + additionalBuildOptions: /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config" /p:EnableCmdPalAOT=${{ parameters.enableAOT }} beforeBuildSteps: # Sets versions for all PowerToy created DLLs - pwsh: |- diff --git a/.pipelines/v2/templates/job-build-project.yml b/.pipelines/v2/templates/job-build-project.yml index d386ec15dd..948ef951c3 100644 --- a/.pipelines/v2/templates/job-build-project.yml +++ b/.pipelines/v2/templates/job-build-project.yml @@ -53,6 +53,9 @@ parameters: - name: runTests type: boolean default: true + - name: buildTests + type: boolean + default: true - name: useVSPreview type: boolean default: false @@ -78,6 +81,12 @@ parameters: - 'src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj' - 'src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj' - 'src/modules/FileLocksmith/FileLocksmithUI/FileLocksmithUI.csproj' + - name: timeoutInMinutes + type: number + default: 240 + - name: cancelTimeoutInMinutes + type: number + default: 1 jobs: - job: ${{ parameters.jobName }} @@ -99,7 +108,7 @@ jobs: ${{ else }}: OutputBuildPlatform: ${{ platform }} variables: - MakeAppxPath: 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\MakeAppx.exe' + MakeAppxPath: 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86\MakeAppx.exe' # Azure DevOps abhors a vacuum # If these are blank, expansion will fail later on... which will result in direct substitution of the variable *names* # later on. We'll just... set them to a single space and if we need to, check IsNullOrWhiteSpace. @@ -110,7 +119,7 @@ jobs: JobOutputArtifactName: build-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.artifactStem }} NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=$(BuildPlatform) # Required for nuget to work due to self contained NODE_OPTIONS: --max_old_space_size=16384 - ${{ if eq(parameters.runTests, true) }}: + ${{ if or(eq(parameters.runTests, true), eq(parameters.buildTests, true)) }}: MSBuildMainBuildTargets: Build;Test ${{ else }}: MSBuildMainBuildTargets: Build @@ -120,8 +129,8 @@ jobs: ${{ else }}: RestoreAdditionalProjectSourcesArg: '' displayName: Build - timeoutInMinutes: 240 - cancelTimeoutInMinutes: 1 + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }} templateContext: # Required when this template is hosted in 1ES PT outputs: - output: pipelineArtifact @@ -332,6 +341,7 @@ jobs: /p:VCRTForwarders-IncludeDebugCRT=false /p:PowerToysRoot=$(Build.SourcesDirectory) /p:PublishProfile=InstallationPublishProfile.pubxml + /p:TargetFramework=net9.0-windows10.0.26100.0 /bl:$(LogOutputDirectory)\publish-${{ join('_',split(project, '/')) }}.binlog $(RestoreAdditionalProjectSourcesArg) platform: $(BuildPlatform) @@ -394,9 +404,7 @@ jobs: testAssemblyVer2: | **\KeyboardManagerEngineTest.dll **\KeyboardManagerEditorTest.dll - **\UnitTests-CommonLib.dll - **\PowerRenameUnitTests.dll - **\UnitTests-FancyZones.dll + **\*UnitTest*.dll !**\obj\** - pwsh: |- @@ -470,7 +478,7 @@ jobs: # This saves ~1GiB per architecture. We won't need these later. # Removes: - # - All .pdbs from any static libs .libs (which were only used during linking) + # - All .pdb files from any static libs .libs (which were only used during linking) - pwsh: |- $binDir = '$(Build.SourcesDirectory)' $ImportLibs = Get-ChildItem $binDir -Recurse -File -Filter '*.exp' | ForEach-Object { $_.FullName -Replace "exp$","lib" } @@ -530,7 +538,7 @@ jobs: displayName: Stage GPO files # Running the tests may result in future jobs consuming artifacts out of this build - - ${{ if eq(parameters.runTests, true) }}: + - ${{ if or(eq(parameters.runTests, true), eq(parameters.buildTests, true)) }}: - task: CopyFiles@2 displayName: Stage entire build output inputs: diff --git a/.pipelines/v2/templates/job-build-ui-tests.yml b/.pipelines/v2/templates/job-build-ui-tests.yml new file mode 100644 index 0000000000..ca99c00932 --- /dev/null +++ b/.pipelines/v2/templates/job-build-ui-tests.yml @@ -0,0 +1,132 @@ +# Minimal UI Tests Build Template +# This template only builds UI test projects and stages their test DLLs for consumption by test pipelines + +parameters: + - name: buildConfigurations + type: object + default: + - Release + - name: buildPlatforms + type: object + default: + - x64 + - name: condition + type: string + default: '' + - name: dependsOn + type: object + default: [] + - name: pool + type: object + default: [] + - name: variables + type: object + default: {} + - name: uiTestModules + type: object + default: [] + +jobs: +- job: BuildUITests + ${{ if ne(length(parameters.pool), 0) }}: + pool: ${{ parameters.pool }} + dependsOn: ${{ parameters.dependsOn }} + condition: ${{ parameters.condition }} + strategy: + matrix: + ${{ each config in parameters.buildConfigurations }}: + ${{ each platform in parameters.buildPlatforms }}: + ${{ config }}_${{ platform }}: + BuildConfiguration: ${{ config }} + BuildPlatform: ${{ platform }} + variables: + JobOutputDirectory: $(Build.ArtifactStagingDirectory) + LogOutputDirectory: $(Build.ArtifactStagingDirectory)\logs + JobOutputArtifactName: build-$(BuildPlatform)-$(BuildConfiguration) + NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=$(BuildPlatform) + ${{ insert }}: ${{ parameters.variables }} + displayName: Build UI Tests Only + timeoutInMinutes: 60 + cancelTimeoutInMinutes: 1 + templateContext: + outputs: + - output: pipelineArtifact + artifactName: $(JobOutputArtifactName) + targetPath: $(Build.ArtifactStagingDirectory) + steps: + - checkout: self + clean: true + submodules: true + persistCredentials: True + fetchTags: false + fetchDepth: 1 + + - template: steps-ensure-dotnet-version.yml + parameters: + sdk: true + version: '9.0' + + - template: .\steps-restore-nuget.yml + + - task: NuGetCommand@2 + displayName: Restore solution-level NuGet packages + inputs: + command: restore + feedsToUse: config + configPath: nuget.config + restoreSolution: PowerToys.sln + restoreDirectory: '$(Build.SourcesDirectory)\packages' + + # Build all UI test projects if no specific modules are specified + - ${{ if eq(length(parameters.uiTestModules), 0) }}: + - task: VSBuild@1 + displayName: Build UI Test Projects + inputs: + solution: '**/*UITest*.csproj' + vsVersion: 17.0 + msbuildArgs: >- + -restore + -graph + /p:RestorePackagesConfig=true + /p:BuildProjectReferences=true + /p:CIBuild=true + /bl:$(LogOutputDirectory)\build-all-uitests.binlog + $(NUGET_RESTORE_MSBUILD_ARGS) + platform: $(BuildPlatform) + configuration: $(BuildConfiguration) + msbuildArchitecture: x64 + maximumCpuCount: true + + # Build specific UI test modules + - ${{ if ne(length(parameters.uiTestModules), 0) }}: + - ${{ each module in parameters.uiTestModules }}: + - task: VSBuild@1 + displayName: 'Build UI Test Module: ${{ module }}' + inputs: + solution: '**/*${{ module }}*.csproj' + vsVersion: 17.0 + msbuildArgs: >- + -restore + -graph + /p:RestorePackagesConfig=true + /p:BuildProjectReferences=true + /p:CIBuild=true + /bl:$(LogOutputDirectory)\build-${{ module }}.binlog + $(NUGET_RESTORE_MSBUILD_ARGS) + platform: $(BuildPlatform) + configuration: $(BuildConfiguration) + msbuildArchitecture: x64 + maximumCpuCount: true + + # Stage test project outputs with directory structure + - task: CopyFiles@2 + displayName: Stage UI Test Build Outputs + inputs: + sourceFolder: '$(Build.SourcesDirectory)' + contents: '$(BuildPlatform)/$(BuildConfiguration)/**/*' + targetFolder: '$(JobOutputDirectory)\$(BuildPlatform)\$(BuildConfiguration)' + + - publish: $(JobOutputDirectory) + artifact: $(JobOutputArtifactName) + displayName: Publish UI Test artifacts + condition: always() \ No newline at end of file diff --git a/.pipelines/v2/templates/job-publish-symbols-using-symbolrequestprod-api.yml b/.pipelines/v2/templates/job-publish-symbols-using-symbolrequestprod-api.yml index 967b7ba4eb..6b214be612 100644 --- a/.pipelines/v2/templates/job-publish-symbols-using-symbolrequestprod-api.yml +++ b/.pipelines/v2/templates/job-publish-symbols-using-symbolrequestprod-api.yml @@ -68,7 +68,7 @@ jobs: pwsh: true ScriptType: InlineScript Inline: |- - $AzToken = (Get-AzAccessToken -ResourceUrl api://30471ccf-0966-45b9-a979-065dbedb24c1).Token + $AzToken = (Get-AzAccessToken -AsSecureString -ResourceUrl api://30471ccf-0966-45b9-a979-065dbedb24c1).Token | ConvertFrom-SecureString -AsPlainText Write-Host "##vso[task.setvariable variable=SymbolAccessToken;issecret=true]$AzToken" diff --git a/.pipelines/v2/templates/job-test-project.yml b/.pipelines/v2/templates/job-test-project.yml index 234f477fb6..6b52351222 100644 --- a/.pipelines/v2/templates/job-test-project.yml +++ b/.pipelines/v2/templates/job-test-project.yml @@ -11,24 +11,51 @@ parameters: - name: useLatestWebView2 type: boolean default: false + - name: useLatestOfficialBuild + type: boolean + default: true + - name: useCurrentBranchBuild + type: boolean + default: false + - name: uiTestModules + type: object + default: [] + - name: installMode + type: string + default: 'machine' + values: + - 'machine' + - 'peruser' + - name: jobSuffix + type: string + default: '' jobs: -- job: Test${{ parameters.platform }}${{ parameters.configuration }} - displayName: Test ${{ parameters.platform }} ${{ parameters.configuration }} +- job: Test${{ parameters.platform }}${{ parameters.configuration }}${{ parameters.jobSuffix }} + displayName: Test ${{ parameters.platform }} ${{ parameters.configuration }}${{ parameters.jobSuffix }} + timeoutInMinutes: 300 variables: - BuildPlatform: ${{ parameters.platform }} + ${{ if or(eq(parameters.platform, 'x64Win10'), eq(parameters.platform, 'x64Win11')) }}: + BuildPlatform: x64 + ${{ else }}: + BuildPlatform: ${{ parameters.platform }} + TestPlatform: ${{ parameters.platform }} BuildConfiguration: ${{ parameters.configuration }} SrcPath: $(Build.Repository.LocalPath) - TestArtifactsName: build-${{ parameters.platform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }} + TestArtifactsName: build-${{ variables.BuildPlatform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }} pool: ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}: ${{ if ne(parameters.platform, 'ARM64') }}: name: SHINE-INT-Testing-x64 + ${{ if eq(parameters.platform, 'x64Win11') }}: + demands: ImageOverride -equals SHINE-W11-Testing ${{ else }}: name: SHINE-INT-Testing-arm64 ${{ else }}: ${{ if ne(parameters.platform, 'ARM64') }}: name: SHINE-OSS-Testing-x64 + ${{ if eq(parameters.platform, 'x64Win11') }}: + demands: ImageOverride -equals SHINE-W11-Testing ${{ else }}: name: SHINE-OSS-Testing-arm64 steps: @@ -86,23 +113,82 @@ jobs: & '$(build.sourcesdirectory)\.pipelines\InstallWinAppDriver.ps1' displayName: Download and install WinAppDriver + - ${{ if eq(parameters.useLatestOfficialBuild, true) }}: + - task: DownloadPipelineArtifact@2 + inputs: + buildType: 'specific' + project: 'Dart' + definition: '76541' + buildVersionToDownload: 'latestFromBranch' + ${{ if eq(parameters.useCurrentBranchBuild, true) }}: + branchName: '$(Build.SourceBranch)' + ${{ else }}: + branchName: 'refs/heads/main' + artifactName: 'build-$(BuildPlatform)-Release' + targetPath: '$(Build.ArtifactStagingDirectory)' + ${{ if eq(parameters.installMode, 'peruser') }}: + patterns: | + **/PowerToysUserSetup*.exe + ${{ else }}: + patterns: | + **/PowerToysSetup*.exe + + - ${{ if eq(parameters.useLatestOfficialBuild, true) }}: + - ${{ if eq(parameters.installMode, 'peruser') }}: + - pwsh: |- + & "$(build.sourcesdirectory)\.pipelines\installPowerToys.ps1" -InstallMode "PerUser" + displayName: Install PowerToys (Per-User) + + - ${{ if eq(parameters.installMode, 'machine') }}: + - pwsh: |- + & "$(build.sourcesdirectory)\.pipelines\installPowerToys.ps1" -InstallMode "Machine" + displayName: Install PowerToys (Machine-Level) + - ${{ if ne(parameters.platform, 'arm64') }}: - task: ScreenResolutionUtility@1 inputs: displaySettings: 'optimal' - - task: VSTest@3 - displayName: Run UI Tests - inputs: - platform: '$(BuildPlatform)' - configuration: '$(BuildConfiguration)' - testSelector: 'testAssemblies' - searchFolder: '$(Pipeline.Workspace)\$(TestArtifactsName)' - vsTestVersion: 'toolsInstaller' - uiTests: true - rerunFailedTests: true - testAssemblyVer2: | - **\UITests-FancyZones.dll - **\UITests-FancyZonesEditor.dll - !**\obj\** - !**\ref\** \ No newline at end of file + - ${{ if eq(length(parameters.uiTestModules), 0) }}: + - task: VSTest@3 + displayName: Run UI Tests + inputs: + platform: '$(BuildPlatform)' + configuration: '$(BuildConfiguration)' + testSelector: 'testAssemblies' + searchFolder: '$(Pipeline.Workspace)\$(TestArtifactsName)' + vsTestVersion: 'toolsInstaller' + uiTests: true + rerunFailedTests: true + testRunTitle: 'UITests_${{ parameters.platform }}_${{ parameters.installMode }}' + # Since UITests-FancyZonesEditor.dll is generated in both UITests-FancyZonesEditor and UITests-FancyZones, removed one to avoid duplicate test runs + testAssemblyVer2: | + **\*UITest*.dll + !**\obj\** + !**\ref\** + !**\UITests-FancyZones\**\UITests-FancyZonesEditor.dll + env: + platform: '$(TestPlatform)' + useInstallerForTest: ${{ parameters.useLatestOfficialBuild }} + + - ${{ if ne(length(parameters.uiTestModules), 0) }}: + - ${{ each module in parameters.uiTestModules }}: + - task: VSTest@3 + displayName: Run UI Test - ${{ module }} + inputs: + platform: '$(BuildPlatform)' + configuration: '$(BuildConfiguration)' + testSelector: 'testAssemblies' + searchFolder: '$(Pipeline.Workspace)\$(TestArtifactsName)' + vsTestVersion: 'toolsInstaller' + uiTests: true + rerunFailedTests: true + testRunTitle: 'UITests_${{ parameters.platform }}_${{ parameters.installMode }}' + testAssemblyVer2: | + **\*${{ module }}*.dll + !**\obj\** + !**\ref\** + !**\UITests-FancyZones\**\UITests-FancyZonesEditor.dll + env: + platform: '$(TestPlatform)' + useInstallerForTest: ${{ parameters.useLatestOfficialBuild }} diff --git a/.pipelines/v2/templates/pipeline-ci-build.yml b/.pipelines/v2/templates/pipeline-ci-build.yml index 37e06ae4f2..541aff4845 100644 --- a/.pipelines/v2/templates/pipeline-ci-build.yml +++ b/.pipelines/v2/templates/pipeline-ci-build.yml @@ -3,9 +3,6 @@ variables: value: false - name: EnablePipelineCache value: true - - ${{ if eq(parameters.enableMsBuildCaching, true) }}: - - name: EnablePipelineCache - value: true parameters: - name: buildPlatforms @@ -61,15 +58,4 @@ stages: ${{ if eq(parameters.useLatestWinAppSDK, true) }}: winAppSDKVersionNumber: ${{ parameters.winAppSDKVersionNumber }} useExperimentalVersion: ${{ parameters.useExperimentalVersion }} - - - ${{ if and(eq(parameters.runTests, true), not(and(eq(platform, 'arm64'), eq(variables['System.PullRequest.IsFork'], true)))) }}: - - stage: Test_${{ platform }} - displayName: Test ${{ platform }} - dependsOn: - - Build_${{platform}} - jobs: - - template: job-test-project.yml - parameters: - platform: ${{ platform }} - configuration: Release - useLatestWebView2: ${{ parameters.useLatestWebView2 }} + timeoutInMinutes: 90 diff --git a/.pipelines/v2/templates/pipeline-ui-tests-automation.yml b/.pipelines/v2/templates/pipeline-ui-tests-automation.yml new file mode 100644 index 0000000000..f5e90e45d9 --- /dev/null +++ b/.pipelines/v2/templates/pipeline-ui-tests-automation.yml @@ -0,0 +1,173 @@ +variables: + - name: runCodesignValidationInjectionBG + value: false + - name: EnablePipelineCache + value: true + +parameters: + - name: buildPlatforms + type: object + default: + - x64 + - arm64 + - name: enableMsBuildCaching + type: boolean + default: false + - name: useVSPreview + type: boolean + default: false + - name: useLatestWebView2 + type: boolean + default: false + - name: useLatestOfficialBuild + type: boolean + default: true + - name: testBothInstallModes + type: boolean + default: true + - name: useCurrentBranchBuild + type: boolean + default: false + - name: uiTestModules + type: object + default: [] + +stages: + - ${{ each platform in parameters.buildPlatforms }}: + - ${{ if eq(parameters.useLatestOfficialBuild, false) }}: + - stage: Build_${{ platform }} + displayName: Build ${{ platform }} + dependsOn: [] + jobs: + - template: job-build-project.yml + parameters: + pool: + ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}: + name: SHINE-INT-L + ${{ else }}: + name: SHINE-OSS-L + ${{ if eq(parameters.useVSPreview, true) }}: + demands: ImageOverride -equals SHINE-VS17-Preview + buildPlatforms: + - ${{ platform }} + buildConfigurations: [Release] + enablePackageCaching: true + enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }} + runTests: false + buildTests: true + useVSPreview: ${{ parameters.useVSPreview }} + timeoutInMinutes: 90 + + - ${{ if eq(parameters.useLatestOfficialBuild, true) }}: + - stage: BuildUITests_${{ platform }} + displayName: Build UI Tests Only + dependsOn: [] + jobs: + - template: job-build-ui-tests.yml + parameters: + pool: + ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}: + name: SHINE-INT-L + ${{ else }}: + name: SHINE-OSS-L + ${{ if eq(parameters.useVSPreview, true) }}: + demands: ImageOverride -equals SHINE-VS17-Preview + buildPlatforms: + - ${{ platform }} + uiTestModules: ${{ parameters.uiTestModules }} + + - ${{ if eq(platform, 'x64') }}: + - stage: Test_x64Win10 + displayName: Test x64Win10 + ${{ if eq(parameters.useLatestOfficialBuild, true) }}: + dependsOn: + - BuildUITests_${{ platform }} + ${{ else }}: + dependsOn: + - Build_${{ platform }} + jobs: + - template: job-test-project.yml + parameters: + platform: x64Win10 + configuration: Release + useLatestWebView2: ${{ parameters.useLatestWebView2 }} + useLatestOfficialBuild: ${{ parameters.useLatestOfficialBuild }} + useCurrentBranchBuild: ${{ parameters.useCurrentBranchBuild }} + uiTestModules: ${{ parameters.uiTestModules }} + + # Additional per-user installation test (when both modes are enabled) + - ${{ if and(eq(parameters.useLatestOfficialBuild, true), eq(parameters.testBothInstallModes, true)) }}: + - template: job-test-project.yml + parameters: + platform: x64Win10 + configuration: Release + useLatestWebView2: ${{ parameters.useLatestWebView2 }} + useLatestOfficialBuild: ${{ parameters.useLatestOfficialBuild }} + useCurrentBranchBuild: ${{ parameters.useCurrentBranchBuild }} + uiTestModules: ${{ parameters.uiTestModules }} + installMode: 'peruser' + jobSuffix: '_PerUser' + + - ${{ if eq(platform, 'x64') }}: + - stage: Test_x64Win11 + displayName: Test x64Win11 + ${{ if eq(parameters.useLatestOfficialBuild, true) }}: + dependsOn: + - BuildUITests_${{ platform }} + ${{ else }}: + dependsOn: + - Build_${{ platform }} + jobs: + - template: job-test-project.yml + parameters: + platform: x64Win11 + configuration: Release + useLatestWebView2: ${{ parameters.useLatestWebView2 }} + useLatestOfficialBuild: ${{ parameters.useLatestOfficialBuild }} + useCurrentBranchBuild: ${{ parameters.useCurrentBranchBuild }} + uiTestModules: ${{ parameters.uiTestModules }} + + # Additional per-user installation test (when both modes are enabled) + - ${{ if and(eq(parameters.useLatestOfficialBuild, true), eq(parameters.testBothInstallModes, true)) }}: + - template: job-test-project.yml + parameters: + platform: x64Win11 + configuration: Release + useLatestWebView2: ${{ parameters.useLatestWebView2 }} + useLatestOfficialBuild: ${{ parameters.useLatestOfficialBuild }} + useCurrentBranchBuild: ${{ parameters.useCurrentBranchBuild }} + uiTestModules: ${{ parameters.uiTestModules }} + installMode: 'peruser' + jobSuffix: '_PerUser' + + - ${{ if ne(platform, 'x64') }}: + - stage: Test_${{ platform }} + displayName: Test ${{ platform }} + ${{ if eq(parameters.useLatestOfficialBuild, true) }}: + dependsOn: + - BuildUITests_${{ platform }} + ${{ else }}: + dependsOn: + - Build_${{ platform }} + jobs: + - template: job-test-project.yml + parameters: + platform: ${{ platform }} + configuration: Release + useLatestWebView2: ${{ parameters.useLatestWebView2 }} + useLatestOfficialBuild: ${{ parameters.useLatestOfficialBuild }} + useCurrentBranchBuild: ${{ parameters.useCurrentBranchBuild }} + uiTestModules: ${{ parameters.uiTestModules }} + + # Additional per-user installation test (when both modes are enabled) + - ${{ if and(eq(parameters.useLatestOfficialBuild, true), eq(parameters.testBothInstallModes, true)) }}: + - template: job-test-project.yml + parameters: + platform: ${{ platform }} + configuration: Release + useLatestWebView2: ${{ parameters.useLatestWebView2 }} + useLatestOfficialBuild: ${{ parameters.useLatestOfficialBuild }} + useCurrentBranchBuild: ${{ parameters.useCurrentBranchBuild }} + uiTestModules: ${{ parameters.uiTestModules }} + installMode: 'peruser' + jobSuffix: '_PerUser' \ No newline at end of file diff --git a/.pipelines/verifyDepsJsonLibraryVersions.ps1 b/.pipelines/verifyDepsJsonLibraryVersions.ps1 index e85ca1d991..6123316b5f 100644 --- a/.pipelines/verifyDepsJsonLibraryVersions.ps1 +++ b/.pipelines/verifyDepsJsonLibraryVersions.ps1 @@ -19,7 +19,7 @@ Get-ChildItem $targetDir -Recurse -Filter *.deps.json -Exclude *UITest*,MouseJum # Temporarily exclude All UI-Test, Fuzzer-Test projects because of Appium.WebDriver dependencies $depsJsonFullFileName = $_.FullName - if ($depsJsonFullFileName -like "*CmdPal*") { + if ($depsJsonFullFileName -like "*CmdPal*" -or $depsJsonFullFileName -like "*CommandPalette*") { return } @@ -92,4 +92,3 @@ if ($totalFailures -gt 0) { Write-Host -ForegroundColor Green "All " $referencedFileVersionsPerDll.keys.Count " libraries are mentioned with the same version across the dependencies.`r`n" exit 0 - diff --git a/.pipelines/verifyNoticeMdAgainstNugetPackages.ps1 b/.pipelines/verifyNoticeMdAgainstNugetPackages.ps1 index ebef8412a7..e3120836c8 100644 --- a/.pipelines/verifyNoticeMdAgainstNugetPackages.ps1 +++ b/.pipelines/verifyNoticeMdAgainstNugetPackages.ps1 @@ -72,9 +72,57 @@ $returnList = [System.Collections.Generic.HashSet[string]]($totalList) -join "`r Write-Host $returnList +# Extract the current package list from NOTICE.md +$noticePattern = "## NuGet Packages used by PowerToys\s*((?:\r?\n- .+)+)" +$noticeMatch = [regex]::Match($noticeFile, $noticePattern) + +if ($noticeMatch.Success) { + $currentNoticePackageList = $noticeMatch.Groups[1].Value.Trim() +} else { + Write-Warning "Warning: Could not find 'NuGet Packages used by PowerToys' section in NOTICE.md" + $currentNoticePackageList = "" +} + if (!$noticeFile.Trim().EndsWith($returnList.Trim())) { Write-Host -ForegroundColor Red "Notice.md does not match NuGet list." + + # Show detailed differences + $generatedPackages = $returnList -split "`r`n|`n" | Where-Object { $_.Trim() -ne "" } | Sort-Object + $noticePackages = $currentNoticePackageList -split "`r`n|`n" | Where-Object { $_.Trim() -ne "" } | ForEach-Object { $_.Trim() } | Sort-Object + + Write-Host "" + Write-Host -ForegroundColor Cyan "=== DETAILED DIFFERENCE ANALYSIS ===" + Write-Host "" + + # Find packages in proj file list but not in NOTICE.md + $missingFromNotice = $generatedPackages | Where-Object { $noticePackages -notcontains $_ } + if ($missingFromNotice.Count -gt 0) { + Write-Host -ForegroundColor Red "MissingFromNotice:" + foreach ($pkg in $missingFromNotice) { + Write-Host -ForegroundColor Red " $pkg" + } + Write-Host "" + } + + # Find packages in NOTICE.md but not in proj file list + $extraInNotice = $noticePackages | Where-Object { $generatedPackages -notcontains $_ } + if ($extraInNotice.Count -gt 0) { + Write-Host -ForegroundColor Yellow "ExtraInNotice:" + foreach ($pkg in $extraInNotice) { + Write-Host -ForegroundColor Yellow " $pkg" + } + Write-Host "" + } + + # Show counts for summary + Write-Host -ForegroundColor Cyan "Summary:" + Write-Host " Proj file list has $($generatedPackages.Count) packages" + Write-Host " NOTICE.md has $($noticePackages.Count) packages" + Write-Host " MissingFromNotice: $($missingFromNotice.Count) packages" + Write-Host " ExtraInNotice: $($extraInNotice.Count) packages" + Write-Host "" + exit 1 } diff --git a/.pipelines/versionAndSignCheck.ps1 b/.pipelines/versionAndSignCheck.ps1 index 89cfbeea1c..1bb271300d 100644 --- a/.pipelines/versionAndSignCheck.ps1 +++ b/.pipelines/versionAndSignCheck.ps1 @@ -9,6 +9,7 @@ Param( $DirPath = $targetDir; #this file is in pipeline, we need root. $items = Get-ChildItem -Path $DirPath -File -Include *.exe, *.dll, *.ttf, PTCustomActions -Recurse -Force -ErrorAction SilentlyContinue $versionExceptions = @( + "AdaptiveCards.Templating.dll", "Microsoft.Windows.ApplicationModel.DynamicDependency.Projection.dll", "Microsoft.Windows.ApplicationModel.Resources.Projection.dll", "Microsoft.Windows.ApplicationModel.WindowsAppRuntime.Projection.dll", @@ -28,6 +29,8 @@ $versionExceptions = @( "ObjectModelCsProjection.dll", "RendererCsProjection.dll") -join '|'; $nullVersionExceptions = @( + "SkiaSharp.Views.WinUI.Native.dll", + "libSkiaSharp.dll", "codicon.ttf", "e_sqlite3.dll", "getfilesiginforedist.dll", diff --git a/.vsconfig b/.vsconfig index 77ec8b0ffd..90abacd81c 100644 --- a/.vsconfig +++ b/.vsconfig @@ -9,6 +9,7 @@ "Microsoft.VisualStudio.Component.Windows10SDK.19041", "Microsoft.VisualStudio.Component.Windows10SDK.20348", "Microsoft.VisualStudio.Component.Windows10SDK.22621", + "Microsoft.VisualStudio.Component.Windows10SDK.26100", "Microsoft.VisualStudio.ComponentGroup.UWP.VC", "Microsoft.VisualStudio.Component.UWP.VC.ARM64", "Microsoft.VisualStudio.Component.VC.Runtimes.ARM64.Spectre", diff --git a/COMMUNITY.md b/COMMUNITY.md index 411aad304b..d145cafd57 100644 --- a/COMMUNITY.md +++ b/COMMUNITY.md @@ -21,7 +21,7 @@ Connor was the creator of Workspaces and helped create Command Palette (PowerToy ### [@damienleroy](https://github.com/damienleroy) - [Damien Leroy](https://www.linkedin.com/in/Damien-Leroy-b2734416a/) Damien has helped out by developing and contributing the Quick Accent utility. -### [@daverayment ](https://github.com/daverayment) - [David Rayment](https://www.linkedin.com/in/david-rayment-168b5251/) +### [@daverayment](https://github.com/daverayment) - [David Rayment](https://www.linkedin.com/in/david-rayment-168b5251/) Dave has helped improve the experience inside of Peek by adding in new features and fixing bugs. ### [@davidegiacometti](https://github.com/davidegiacometti) - [Davide Giacometti](https://www.linkedin.com/in/davidegiacometti/) @@ -181,13 +181,11 @@ ZoomIt source code was originally implemented by [Sysinternals](https://sysinter ## PowerToys core team - [@cinnamon-msft](https://github.com/cinnamon-msft) - Kayla Cinnamon - Lead -- [@nguyen-dows](https://github.com/nguyen-dows) - Christopher Nguyen - Product Manager - [@craigloewen-msft](https://github.com/craigloewen-msft) - Craig Loewen - Product Manager - [@niels9001](https://github.com/niels9001/) - Niels Laute - Product Manager -- [@zhiwei-ms](https://github.com/zhiwei-ms) - Zhiwei Yu - Product Manager -- [@dhowett](https://github.com/dhowett) - Dustin Howett - Dev lead -- [@yeelam-gordon](https://github.com/yeelam-gordon) - Gordon Lam - Dev lead -- [@jamrobot](https://github.com/jamrobot) - Jerry Xu - Dev lead +- [@dhowett](https://github.com/dhowett) - Dustin Howett - Dev Lead +- [@yeelam-gordon](https://github.com/yeelam-gordon) - Gordon Lam - Dev Lead +- [@jamrobot](https://github.com/jamrobot) - Jerry Xu - Dev Lead - [@lei9444](https://github.com/lei9444) - Leilei Zhang - Dev - [@shuaiyuanxx](https://github.com/shuaiyuanxx) - Shawn Yuan - Dev - [@moooyo](https://github.com/moooyo) - Yu Leng - Dev @@ -205,6 +203,7 @@ ZoomIt source code was originally implemented by [Sysinternals](https://sysinter - [@chatasweetie](https://github.com/chatasweetie) - Jessica Earley-Cha - Dev - [@MichaelJolley](https://github.com/MichaelJolley) - Michael Jolley - Dev - [@Jaylyn-Barbee](https://github.com/Jaylyn-Barbee) - Jaylyn Barbee - Dev +- [@zateutsch](https://github.com/zateutsch) - Zach Teutsch - Dev - [@crutkas](https://github.com/crutkas/) - Clint Rutkas - Overhead ## Former PowerToys core team members @@ -213,6 +212,7 @@ ZoomIt source code was originally implemented by [Sysinternals](https://sysinter - [@ethanfangg](https://github.com/ethanfangg) - Ethan Fang - Product Manager - [@plante-msft](https://github.com/plante-msft) - Connor Plante - Product Manager - [@joadoumie](https://github.com/joadoumie) - Jordi Adoumie - Product Manager +- [@nguyen-dows](https://github.com/nguyen-dows) - Christopher Nguyen - Product Manager - [@enricogior](https://github.com/enricogior) - Enrico Giordani - Dev Lead - [@bzoz](https://github.com/bzoz) - Bartosz Sosnowski - Dev - [@ivan100sic](https://github.com/ivan100sic) - Ivan Stošić - Dev @@ -225,4 +225,4 @@ ZoomIt source code was originally implemented by [Sysinternals](https://sysinter - [@donlaci](https://github.com/donlaci) - Laszlo Nemeth - Dev - [@SeraphimaZykova](https://github.com/SeraphimaZykova) - Seraphima Zykova - Dev - [@stefansjfw](https://github.com/stefansjfw) - Stefan Markovic - Dev -- [@jaimecbernardo](https://github.com/jaimecbernardo) - Jaime Bernardo - Dev lead +- [@jaimecbernardo](https://github.com/jaimecbernardo) - Jaime Bernardo - Dev Lead diff --git a/Cpp.Build.props b/Cpp.Build.props index 06c22b45bf..5a4538f940 100644 --- a/Cpp.Build.props +++ b/Cpp.Build.props @@ -96,8 +96,8 @@ - 10.0.22621.0 - 10.0.22621.0 + 10.0.26100.0 + 10.0.26100.0 10.0.19041.0 diff --git a/DATA_AND_PRIVACY.md b/DATA_AND_PRIVACY.md index 92711f00dd..56a2eb9eee 100644 --- a/DATA_AND_PRIVACY.md +++ b/DATA_AND_PRIVACY.md @@ -383,6 +383,18 @@ _If you want to find diagnostic data events in the source code, these two links Microsoft.PowerToys.GcodeFilePreviewError Triggered when there is an error previewing a G-code file. + + Microsoft.PowerToys.BgcodeFileHandlerLoaded + Triggered when a Binary G-code file handler is loaded. + + + Microsoft.PowerToys.BgcodeFilePreviewed + Occurs when a Binary G-code file is previewed in File Explorer. + + + Microsoft.PowerToys.BgcodeFilePreviewError + Triggered when there is an error previewing a Binary G-code file. + Microsoft.PowerToys.MarkdownFileHandlerLoaded Occurs when a Markdown file handler is loaded. diff --git a/Directory.Build.props b/Directory.Build.props index 02a848c87e..4184a8f2a3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -47,7 +47,7 @@ - + - + - - - - - + + + + + - + - - + + - + @@ -67,33 +70,36 @@ + + + - + - - - + + + - + - + - - + + - + - - - - + + + + diff --git a/NOTICE.md b/NOTICE.md index 9fb3dda87d..4dcc82579d 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -79,6 +79,43 @@ For more information, please refer to ### Calculator +#### exprtk + +We use the exprtk library (exprtk.hpp) to evaluate mathematical expressions. + +**Source**: [https://github.com/ArashPartow/exprtk](https://github.com/ArashPartow/exprtk) + +``` +MIT License + +Copyright (c) 1999-2024 Arash Partow + +https://www.partow.net/programming/exprtk/index.html + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## Utility: PowerToys Run Built-in Extensions + +### Calculator + #### Mages We use the Mages NuGet package for calculating the result of expression. @@ -807,30 +844,25 @@ DEALINGS IN THE SOFTWARE. **Source**: https://github.com/kuba--/zip -This is free and unencumbered software released into the public domain. +All Rights Reserved. -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ## Utility: Measure tool @@ -1395,6 +1427,37 @@ EXHIBIT A -Mozilla Public License. ## Utility: Registry Preview +### HexBox.WinUI + +We use HexBox.WinUI to show a preview of binary values. + +**Source**: https://github.com/hotkidfamily/HexBox.WinUI + +``` +MIT License + +Copyright (c) 2019 Filip Jeremic +Copyright (c) 2024~2025 hotkidfamily@gmail.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + ### Monaco Editor **Source**: https://github.com/Microsoft/monaco-editor @@ -1425,14 +1488,17 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` + ## NuGet Packages used by PowerToys - AdaptiveCards.ObjectModel.WinUI3 2.0.0-beta - AdaptiveCards.Rendering.WinUI3 2.1.0-beta -- AdaptiveCards.Templating 2.0.2 +- AdaptiveCards.Templating 2.0.5 - Appium.WebDriver 4.4.5 - Azure.AI.OpenAI 1.0.0-beta.17 +- CoenM.ImageSharp.ImageHash 1.3.6 - CommunityToolkit.Common 8.4.0 +- CommunityToolkit.Labs.WinUI.Controls.MarkdownTextBlock 0.1.250703-build.2173 - CommunityToolkit.Mvvm 8.4.0 - CommunityToolkit.WinUI.Animations 8.2.250402 - CommunityToolkit.WinUI.Collections 8.2.250402 @@ -1453,25 +1519,26 @@ SOFTWARE. - Mages 3.0.0 - Markdig.Signed 0.34.0 - MessagePack 3.1.3 -- Microsoft.Bcl.AsyncInterfaces 9.0.5 +- Microsoft.Bcl.AsyncInterfaces 9.0.7 +- Microsoft.Bot.AdaptiveExpressions.Core 4.23.0 - Microsoft.CodeAnalysis.NetAnalyzers 9.0.0 -- Microsoft.Data.Sqlite 9.0.5 +- Microsoft.Data.Sqlite 9.0.7 - Microsoft.Diagnostics.Tracing.TraceEvent 3.1.16 - Microsoft.DotNet.ILCompiler (A) -- Microsoft.Extensions.DependencyInjection 9.0.5 -- Microsoft.Extensions.Hosting 9.0.5 -- Microsoft.Extensions.Hosting.WindowsServices 9.0.5 -- Microsoft.Extensions.Logging 9.0.5 -- Microsoft.Extensions.Logging.Abstractions 9.0.5 +- Microsoft.Extensions.DependencyInjection 9.0.7 +- Microsoft.Extensions.Hosting 9.0.7 +- Microsoft.Extensions.Hosting.WindowsServices 9.0.7 +- Microsoft.Extensions.Logging 9.0.7 +- Microsoft.Extensions.Logging.Abstractions 9.0.7 - Microsoft.NET.ILLink.Tasks (A) - Microsoft.SemanticKernel 1.15.0 - Microsoft.Toolkit.Uwp.Notifications 7.1.2 - Microsoft.Web.WebView2 1.0.2903.40 -- Microsoft.Win32.SystemEvents 9.0.5 -- Microsoft.Windows.Compatibility 9.0.5 -- Microsoft.Windows.CsWin32 0.2.46-beta +- Microsoft.Win32.SystemEvents 9.0.7 +- Microsoft.Windows.Compatibility 9.0.7 +- Microsoft.Windows.CsWin32 0.3.183 - Microsoft.Windows.CsWinRT 2.2.0 -- Microsoft.Windows.SDK.BuildTools 10.0.22621.2428 +- Microsoft.Windows.SDK.BuildTools 10.0.26100.4188 - Microsoft.WindowsAppSDK 1.7.250513003 - Microsoft.WindowsPackageManager.ComInterop 1.10.340 - Microsoft.Xaml.Behaviors.WinUI.Managed 2.0.9 @@ -1485,27 +1552,28 @@ SOFTWARE. - ReverseMarkdown 4.1.0 - ScipBe.Common.Office.OneNote 3.0.1 - SharpCompress 0.37.2 +- SkiaSharp.Views.WinUI 2.88.9 - StreamJsonRpc 2.21.69 - StyleCop.Analyzers 1.2.0-beta.556 -- System.CodeDom 9.0.5 +- System.CodeDom 9.0.7 - System.CommandLine 2.0.0-beta4.22272.1 -- System.ComponentModel.Composition 9.0.5 -- System.Configuration.ConfigurationManager 9.0.5 -- System.Data.OleDb 9.0.5 -- System.Data.SqlClient 4.8.6 -- System.Diagnostics.EventLog 9.0.5 -- System.Diagnostics.PerformanceCounter 9.0.5 -- System.Drawing.Common 9.0.5 +- System.ComponentModel.Composition 9.0.7 +- System.Configuration.ConfigurationManager 9.0.7 +- System.Data.OleDb 9.0.7 +- System.Data.SqlClient 4.9.0 +- System.Diagnostics.EventLog 9.0.7 +- System.Diagnostics.PerformanceCounter 9.0.7 +- System.Drawing.Common 9.0.7 - System.IO.Abstractions 22.0.13 - System.IO.Abstractions.TestingHelpers 22.0.13 -- System.Management 9.0.5 +- System.Management 9.0.7 - System.Net.Http 4.3.4 - System.Private.Uri 4.3.2 - System.Reactive 6.0.1 -- System.Runtime.Caching 9.0.5 -- System.ServiceProcess.ServiceController 9.0.5 -- System.Text.Encoding.CodePages 9.0.5 -- System.Text.Json 9.0.5 +- System.Runtime.Caching 9.0.7 +- System.ServiceProcess.ServiceController 9.0.7 +- System.Text.Encoding.CodePages 9.0.7 +- System.Text.Json 9.0.7 - System.Text.RegularExpressions 4.3.1 - UnicodeInformation 2.6.0 - UnitsNet 5.56.0 @@ -1513,4 +1581,3 @@ SOFTWARE. - WinUIEx 2.2.0 - WPF-UI 3.0.5 - WyHash 1.0.5 - diff --git a/PowerToys.sln b/PowerToys.sln index b152327bd6..6908adab48 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -39,14 +39,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fancyzones", "fancyzones", EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FancyZonesLib", "src\modules\fancyzones\FancyZonesLib\FancyZonesLib.vcxproj", "{F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests", "src\modules\fancyzones\FancyZonesTests\UnitTests\UnitTests.vcxproj", "{9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FancyZones.UnitTests", "src\modules\fancyzones\FancyZonesTests\UnitTests\UnitTests.vcxproj", "{9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}" ProjectSection(ProjectDependencies) = postProject {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99} = {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99} EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{1AFB6476-670D-4E80-A464-657E01DFF482}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests-CommonLib", "src\common\UnitTests-CommonLib\UnitTests-CommonLib.vcxproj", "{1A066C63-64B3-45F8-92FE-664E1CCE8077}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common.Lib.UnitTests", "src\common\UnitTests-CommonLib\UnitTests-CommonLib.vcxproj", "{1A066C63-64B3-45F8-92FE-664E1CCE8077}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FancyZonesEditor", "src\modules\fancyzones\editor\FancyZonesEditor\FancyZonesEditor.csproj", "{5CCC8468-DEC8-4D36-99D4-5C891BEBD481}" EndProject @@ -60,11 +60,8 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameLib", "src\modules\powerrename\lib\PowerRenameLib.vcxproj", "{51920F1F-C28C-4ADF-8660-4238766796C2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameTest", "src\modules\powerrename\testapp\PowerRenameTest.vcxproj", "{A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}" - ProjectSection(ProjectDependencies) = postProject - {51920F1F-C28C-4ADF-8660-4238766796C2} = {51920F1F-C28C-4ADF-8660-4238766796C2} - EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameLibUnitTests", "src\modules\powerrename\unittests\PowerRenameLibUnitTests.vcxproj", "{2151F984-E006-4A9F-92EF-C6DDE3DC8413}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRename.UnitTests", "src\modules\powerrename\unittests\PowerRenameLibUnitTests.vcxproj", "{2151F984-E006-4A9F-92EF-C6DDE3DC8413}" ProjectSection(ProjectDependencies) = postProject {51920F1F-C28C-4ADF-8660-4238766796C2} = {51920F1F-C28C-4ADF-8660-4238766796C2} {B25AC7A5-FB9F-4789-B392-D5C85E948670} = {B25AC7A5-FB9F-4789-B392-D5C85E948670} @@ -80,7 +77,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageResizerUI", "src\modul EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageResizerExt", "src\modules\imageresizer\dll\ImageResizerExt.vcxproj", "{0B43679E-EDFA-4DA0-AD30-F4628B308B1B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageResizerUITest", "src\modules\imageresizer\tests\ImageResizerUITest.csproj", "{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageResizer.UnitTests", "src\modules\imageresizer\tests\ImageResizer.UnitTests.csproj", "{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ActionRunner", "src\ActionRunner\ActionRunner.vcxproj", "{D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}" ProjectSection(ProjectDependencies) = postProject @@ -152,13 +149,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PreviewHandlerCommon", "src EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarkdownPreviewHandler", "src\modules\previewpane\MarkdownPreviewHandler\MarkdownPreviewHandler.csproj", "{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-MarkdownPreviewHandler", "src\modules\previewpane\UnitTests-MarkdownPreviewHandler\UnitTests-MarkdownPreviewHandler.csproj", "{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.MarkdownPreviewHandler.UnitTests", "src\modules\previewpane\UnitTests-MarkdownPreviewHandler\Preview.MarkdownPreviewHandler.UnitTests.csproj", "{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SvgPreviewHandler", "src\modules\previewpane\SvgPreviewHandler\SvgPreviewHandler.csproj", "{DA425894-6E13-404F-8DCB-78584EC0557A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-SvgPreviewHandler", "src\modules\previewpane\UnitTests-SvgPreviewHandler\UnitTests-SvgPreviewHandler.csproj", "{060D75DA-2D1C-48E6-A4A1-6F0718B64661}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.SvgPreviewHandler.UnitTests", "src\modules\previewpane\UnitTests-SvgPreviewHandler\Preview.SvgPreviewHandler.UnitTests.csproj", "{060D75DA-2D1C-48E6-A4A1-6F0718B64661}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-PreviewHandlerCommon", "src\modules\previewpane\UnitTests-PreviewHandlerCommon\UnitTests-PreviewHandlerCommon.csproj", "{748417CA-F17E-487F-9411-CAFB6D3F4877}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.PreviewHandlerCommon.UnitTests", "src\modules\previewpane\UnitTests-PreviewHandlerCommon\Preview.PreviewHandlerCommon.UnitTests.csproj", "{748417CA-F17E-487F-9411-CAFB6D3F4877}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "powerpreview", "src\modules\previewpane\powerpreview\powerpreview.vcxproj", "{217DF501-135C-4E38-BFC8-99D4821032EA}" ProjectSection(ProjectDependencies) = postProject @@ -195,7 +192,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ManagedCommon", "src\common EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.Program.UnitTests", "src\modules\launcher\Plugins\Microsoft.Plugin.Program.UnitTests\Microsoft.Plugin.Program.UnitTests.csproj", "{42851751-CBC8-45A6-97F5-7A0753F7B4D1}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-SvgThumbnailProvider", "src\modules\previewpane\UnitTests-SvgThumbnailProvider\UnitTests-SvgThumbnailProvider.csproj", "{1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.SvgThumbnailProvider.UnitTests", "src\modules\previewpane\UnitTests-SvgThumbnailProvider\Preview.SvgThumbnailProvider.UnitTests.csproj", "{1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SvgThumbnailProvider", "src\modules\previewpane\SvgThumbnailProvider\SvgThumbnailProvider.csproj", "{8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}" EndProject @@ -216,11 +213,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Settings.UI.UnitTests", "sr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest\Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest.csproj", "{632BBE62-5421-49EA-835A-7FFA4F499BD6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.Folder.UnitTests", "src\modules\launcher\Plugins\Microsoft.Plugin.Folder.UnitTests\Microsoft.Plugin.Folder.UnitTests.csproj", "{4FA206A5-F69F-4193-BF8F-F6EEB496734C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTest-ColorPickerUI", "src\modules\colorPicker\UnitTest-ColorPickerUI\UnitTest-ColorPickerUI.csproj", "{090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logging", "src\logging\logging.vcxproj", "{7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spdlog", "src\logging\logging.vcxproj", "{7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.System", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.System\Microsoft.PowerToys.Run.Plugin.System.csproj", "{FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}" EndProject @@ -235,7 +228,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logger", "src\common\logger EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SettingsAPI", "src\common\SettingsAPI\SettingsAPI.vcxproj", "{6955446D-23F7-4023-9BB3-8657F904AF99}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Interop.Tests", "src\common\interop\interop-tests\Microsoft.Interop.Tests.csproj", "{58736667-1027-4AD7-BFDF-7A3A6474103A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.Interop.UnitTests", "src\common\interop\interop-tests\Common.Interop.UnitTests.csproj", "{58736667-1027-4AD7-BFDF-7A3A6474103A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "notifications", "notifications", "{D92131D6-7610-4D60-A7DB-1C169783F83B}" EndProject @@ -307,7 +300,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.UI", "src\common\Com EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PdfPreviewHandler", "src\modules\previewpane\PdfPreviewHandler\PdfPreviewHandler.csproj", "{69E1EE8D-143A-4060-9129-4658ACF14AAF}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-PdfPreviewHandler", "src\modules\previewpane\UnitTests-PdfPreviewHandler\UnitTests-PdfPreviewHandler.csproj", "{ECC20689-002A-4354-95A6-B58DF089C6FF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.PdfPreviewHandler.UnitTests", "src\modules\previewpane\UnitTests-PdfPreviewHandler\Preview.PdfPreviewHandler.UnitTests.csproj", "{ECC20689-002A-4354-95A6-B58DF089C6FF}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.Registry", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.Registry\Microsoft.PowerToys.Run.Plugin.Registry.csproj", "{4BABF3FE-3451-42FD-873F-3C332E18DCEF}" EndProject @@ -317,13 +310,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerEngine", "sr EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerEngineLibrary", "src\modules\keyboardmanager\KeyboardManagerEngineLibrary\KeyboardManagerEngineLibrary.vcxproj", "{E496B7FC-1E99-4BAB-849B-0E8367040B02}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerEngineTest", "src\modules\keyboardmanager\KeyboardManagerEngineTest\KeyboardManagerEngineTest.vcxproj", "{7F4B3A60-BC27-45A7-8000-68B0B6EA7466}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManager.Engine.UnitTests", "src\modules\keyboardmanager\KeyboardManagerEngineTest\KeyboardManagerEngineTest.vcxproj", "{7F4B3A60-BC27-45A7-8000-68B0B6EA7466}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerEditor", "src\modules\keyboardmanager\KeyboardManagerEditor\KeyboardManagerEditor.vcxproj", "{8DF78B53-200E-451F-9328-01EB907193AE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerEditorLibrary", "src\modules\keyboardmanager\KeyboardManagerEditorLibrary\KeyboardManagerEditorLibrary.vcxproj", "{23D2070D-E4AD-4ADD-85A7-083D9C76AD49}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerEditorTest", "src\modules\keyboardmanager\KeyboardManagerEditorTest\KeyboardManagerEditorTest.vcxproj", "{62173D9A-6724-4C00-A1C8-FB646480A9EC}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManager.Editor.UnitTests", "src\modules\keyboardmanager\KeyboardManagerEditorTest\KeyboardManagerEditorTest.vcxproj", "{62173D9A-6724-4C00-A1C8-FB646480A9EC}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "awake", "awake", "{127F38E0-40AA-4594-B955-5616BF206882}" EndProject @@ -347,7 +340,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plu EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PdfThumbnailProvider", "src\modules\previewpane\PdfThumbnailProvider\PdfThumbnailProvider.csproj", "{11491FD8-F921-48BF-880C-7FEA185B80A1}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-PdfThumbnailProvider", "src\modules\previewpane\UnitTests-PdfThumbnailProvider\UnitTests-PdfThumbnailProvider.csproj", "{F40C3397-1834-4530-B2D9-8F8B8456BCDF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.PdfThumbnailProvider.UnitTests", "src\modules\previewpane\UnitTests-PdfThumbnailProvider\Preview.PdfThumbnailProvider.UnitTests.csproj", "{F40C3397-1834-4530-B2D9-8F8B8456BCDF}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.WindowsTerminal", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.WindowsTerminal\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.csproj", "{A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}" EndProject @@ -361,11 +354,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MouseHighlighter", "src\mod EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GcodeThumbnailProvider", "src\modules\previewpane\GcodeThumbnailProvider\GcodeThumbnailProvider.csproj", "{809AA252-E17A-4FA2-B0A1-0450976B763F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-GcodeThumbnailProvider", "src\modules\previewpane\UnitTests-GcodeThumbnailProvider\UnitTests-GcodeThumbnailProvider.csproj", "{133281D8-1BCE-4D07-B31E-796612A9609E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.GcodeThumbnailProvider.UnitTests", "src\modules\previewpane\UnitTests-GcodeThumbnailProvider\Preview.GcodeThumbnailProvider.UnitTests.csproj", "{133281D8-1BCE-4D07-B31E-796612A9609E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GcodePreviewHandler", "src\modules\previewpane\GcodePreviewHandler\GcodePreviewHandler.csproj", "{805306FF-A562-4415-8DEF-E493BDC45918}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-GcodePreviewHandler", "src\modules\previewpane\UnitTests-GcodePreviewHandler\UnitTests-GcodePreviewHandler.csproj", "{FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.GcodePreviewHandler.UnitTests", "src\modules\previewpane\UnitTests-GcodePreviewHandler\Preview.GcodePreviewHandler.UnitTests.csproj", "{FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AlwaysOnTop", "AlwaysOnTop", "{60CD2D4F-C3B9-4897-9821-FCA5098B41CE}" EndProject @@ -379,7 +372,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MousePointerCrosshairs", "s EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StlThumbnailProvider", "src\modules\previewpane\StlThumbnailProvider\StlThumbnailProvider.csproj", "{F7C8C0F1-5431-4347-89D0-8E5354F93CF2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-StlThumbnailProvider", "src\modules\previewpane\UnitTests-StlThumbnailProvider\UnitTests-StlThumbnailProvider.csproj", "{F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.StlThumbnailProvider.UnitTests", "src\modules\previewpane\UnitTests-StlThumbnailProvider\Preview.StlThumbnailProvider.UnitTests.csproj", "{F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonacoPreviewHandler", "src\modules\previewpane\MonacoPreviewHandler\MonacoPreviewHandler.csproj", "{04B193D7-3E21-46B8-A958-89B63A8A69DE}" EndProject @@ -415,6 +408,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerOCR", "src\modules\Pow EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerOCRModuleInterface", "src\modules\PowerOCR\PowerOCRModuleInterface\PowerOCRModuleInterface.vcxproj", "{6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{B1234567-1234-1234-1234-123456789ABC}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.History", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.History\Microsoft.PowerToys.Run.Plugin.History.csproj", "{212AD910-8488-4036-BE20-326931B75FB2}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MeasureTool", "MeasureTool", "{7AC943C9-52E8-44CF-9083-744D8049667B}" @@ -436,7 +431,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HostsUILib", "src\modules\H EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hosts", "Hosts", "{F05E590D-AD46-42BE-9C25-6A63ADD2E3EA}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hosts.Tests", "src\modules\Hosts\Hosts.Tests\Hosts.Tests.csproj", "{E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HostsEditor.UnitTests", "src\modules\Hosts\Hosts.Tests\HostsEditor.UnitTests.csproj", "{E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HostsModuleInterface", "src\modules\Hosts\HostsModuleInterface\HostsModuleInterface.vcxproj", "{B41B888C-7DB8-4747-B262-4062E05A230D}" EndProject @@ -526,8 +521,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CropAndLockModuleInterface" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cmdNotFound", "cmdNotFound", "{4C0D0746-BE5B-49EE-BD5D-A7811628AE8B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-FancyZonesEditor", "src\modules\fancyzones\UnitTests-FancyZonesEditor\UnitTests-FancyZonesEditor.csproj", "{FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EnvironmentVariables", "EnvironmentVariables", "{538ED0BB-B863-4B20-98CC-BCDF7FA0B68A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnvironmentVariablesUILib", "src\modules\EnvironmentVariables\EnvironmentVariablesUILib\EnvironmentVariablesUILib.csproj", "{51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}" @@ -542,9 +535,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QoiPreviewHandlerCpp", "src EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QoiPreviewHandler", "src\modules\previewpane\QoiPreviewHandler\QoiPreviewHandler.csproj", "{6B04803D-B418-4833-A67E-B0FC966636A5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-QoiPreviewHandler", "src\modules\previewpane\UnitTests-QoiPreviewHandler\UnitTests-QoiPreviewHandler.csproj", "{3940AD4D-F748-4BE4-9083-85769CD553EF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.QoiPreviewHandler.UnitTests", "src\modules\previewpane\UnitTests-QoiPreviewHandler\Preview.QoiPreviewHandler.UnitTests.csproj", "{3940AD4D-F748-4BE4-9083-85769CD553EF}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-QoiThumbnailProvider", "src\modules\previewpane\UnitTests-QoiThumbnailProvider\UnitTests-QoiThumbnailProvider.csproj", "{F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Preview.QoiThumbnailProvider.UnitTests", "src\modules\previewpane\UnitTests-QoiThumbnailProvider\Preview.QoiThumbnailProvider.UnitTests.csproj", "{F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CmdNotFoundModuleInterface", "src\modules\cmdNotFound\CmdNotFoundModuleInterface\CmdNotFoundModuleInterface.vcxproj", "{0014D652-901F-4456-8D65-06FC5F997FB0}" EndProject @@ -560,10 +553,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RegistryPreview", "src\modu EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnvironmentVariables", "src\modules\EnvironmentVariables\EnvironmentVariables\EnvironmentVariables.csproj", "{DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UITests-FancyZones", "src\modules\fancyzones\UITests-FancyZones\UITests-FancyZones.csproj", "{FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UITests-FancyZonesEditor", "src\modules\fancyzones\UITests-FancyZonesEditor\UITests-FancyZonesEditor.csproj", "{3A9A791E-94A9-49F8-8401-C11CE288D5FB}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FancyZonesEditorCommon", "src\modules\fancyzones\FancyZonesEditorCommon\FancyZonesEditorCommon.csproj", "{C0974915-8A1D-4BF0-977B-9587D3807AB7}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DSC", "DSC", "{557C4636-D7E1-4838-A504-7D19B725EE95}" @@ -600,6 +589,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowProperties", "WindowP EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WorkspacesLib", "src\modules\Workspaces\WorkspacesLib\WorkspacesLib.vcxproj", "{B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Workspaces.Lib.UnitTests", "src\modules\Workspaces\WorkspacesLib.UnitTests\WorkspacesLibUnitTests.vcxproj", "{A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkspacesLauncherUI", "src\modules\Workspaces\WorkspacesLauncherUI\WorkspacesLauncherUI.csproj", "{9C53CC25-0623-4569-95BC-B05410675EE3}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WorkspacesModuleInterface", "src\modules\Workspaces\WorkspacesModuleInterface\WorkspacesModuleInterface.vcxproj", "{45285DF2-9742-4ECA-9AC9-58951FC26489}" @@ -678,10 +669,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.WebSea EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.WinGet", "src\modules\cmdpal\ext\Microsoft.CmdPal.Ext.WinGet\Microsoft.CmdPal.Ext.WinGet.csproj", "{E81A7D20-9862-ABDB-0AAE-9BC5B517A9F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvancedPaste.UnitTests", "src\modules\AdvancedPaste\AdvancedPaste.UnitTests\AdvancedPaste.UnitTests.csproj", "{D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvancedPaste.FuzzTests", "src\modules\AdvancedPaste\AdvancedPaste.FuzzTests\AdvancedPaste.FuzzTests.csproj", "{7F5B9557-5878-4438-A721-3E28296BA193}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ZoomIt", "ZoomIt", "{DD6E12FE-5509-4ABC-ACC2-3D6DC98A238C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZoomIt", "src\modules\ZoomIt\ZoomIt\ZoomIt.vcxproj", "{0A84F764-3A88-44CD-AA96-41BDBD48627B}" @@ -698,19 +685,104 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeyboardManagerEditorUI", " EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerEditorLibraryWrapper", "src\modules\keyboardmanager\KeyboardManagerEditorLibraryWrapper\KeyboardManagerEditorLibraryWrapper.vcxproj", "{4382A954-179A-4078-92AF-715187DFFF50}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hosts.FuzzTests", "src\modules\Hosts\Hosts.FuzzTests\Hosts.FuzzTests.csproj", "{EBED240C-8702-452D-B764-6DB9DA9179AF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HostsEditor.FuzzTests", "src\modules\Hosts\Hosts.FuzzTests\HostsEditor.FuzzTests.csproj", "{EBED240C-8702-452D-B764-6DB9DA9179AF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hosts.UITests", "src\modules\Hosts\Hosts.UITests\Hosts.UITests.csproj", "{4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HostsEditor.UITests", "src\modules\Hosts\Hosts.UITests\HostsEditor.UITests.csproj", "{4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegistryPreview.FuzzTests", "src\modules\registrypreview\RegistryPreview.FuzzTests\RegistryPreview.FuzzTests.csproj", "{5702B3CC-8575-48D5-83D8-15BB42269CD3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.System", "src\modules\cmdpal\ext\Microsoft.CmdPal.Ext.System\Microsoft.CmdPal.Ext.System.csproj", "{64B88F02-CD88-4ED8-9624-989A800230F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FancyZones.FuzzTests", "src\modules\fancyzones\FancyZones.FuzzTests\FancyZones.FuzzTests.csproj", "{0217E86E-3476-9946-DE8E-9D200CEBD47A}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CmdPalKeyboardService", "src\modules\cmdpal\CmdPalKeyboardService\CmdPalKeyboardService.vcxproj", "{5F63C743-F6CE-4DBA-A200-2B3F8A14E8C2}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRename.FuzzingTest", "src\modules\powerrename\PowerRename.FuzzingTest\PowerRename.FuzzingTest.vcxproj", "{2694E2FB-DCD5-4BFF-A418-B6C3C7CE3B8E}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRename.FuzzTests", "src\modules\powerrename\PowerRename.FuzzingTest\PowerRename.FuzzingTest.vcxproj", "{2694E2FB-DCD5-4BFF-A418-B6C3C7CE3B8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BgcodePreviewHandler", "src\modules\previewpane\BgcodePreviewHandler\BgcodePreviewHandler.csproj", "{9E0CBC06-F29A-4810-B93C-97D53863B95E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BgcodePreviewHandlerCpp", "src\modules\previewpane\BgcodePreviewHandlerCpp\BgcodePreviewHandlerCpp.vcxproj", "{F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BgcodeThumbnailProviderCpp", "src\modules\previewpane\BgcodeThumbnailProviderCpp\BgcodeThumbnailProviderCpp.vcxproj", "{47B0678C-806B-4FE1-9F50-46BA88989532}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BgcodeThumbnailProvider", "src\modules\previewpane\BgcodeThumbnailProvider\BgcodeThumbnailProvider.csproj", "{9BC1C986-1E97-4D07-A7B1-CE226C239EFA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Preview.BgcodePreviewHandler.UnitTests", "src\modules\previewpane\UnitTests-BgcodePreviewHandler\Preview.BgcodePreviewHandler.UnitTests.csproj", "{99CA1509-FB73-456E-AFAF-AB89C017BD72}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Preview.BgcodeThumbnailProvider.UnitTests", "src\modules\previewpane\UnitTests-BgcodeThumbnailProvider\Preview.BgcodeThumbnailProvider.UnitTests.csproj", "{61CBF221-9452-4934-B685-146285E080D7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MouseUtils.UITests", "src\modules\MouseUtils\MouseUtils.UITests\MouseUtils.UITests.csproj", "{4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Workspaces.Editor.UITests", "src\modules\Workspaces\WorkspacesEditorUITest\Workspaces.Editor.UITests.csproj", "{43E779F3-D83C-48B1-BA8D-1912DBD76FC9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CalculatorEngineCommon", "src\common\CalculatorEngineCommon\CalculatorEngineCommon.vcxproj", "{2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ManagedCsWin32", "src\common\ManagedCsWin32\ManagedCsWin32.csproj", "{14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerRename.UITests", "src\modules\powerrename\PowerRenameUITest\PowerRename.UITests.csproj", "{9D3F3793-EFE3-4525-8782-238015DABA62}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Core.ViewModels", "src\modules\cmdpal\Microsoft.CmdPal.Core.ViewModels\Microsoft.CmdPal.Core.ViewModels.csproj", "{24133F7F-C1D1-DE04-EFA8-F5D5467FE027}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{0E556541-6A45-42CB-AE49-EE5A9BE05E7C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{27D9CB3A-46D1-402C-9273-F88CB8AC42F7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{B9617A31-0F0A-4397-851D-BF2FBEE32D7F}" + ProjectSection(SolutionItems) = preProject + src\modules\launcher\Plugins\Microsoft.Plugin.Folder.UnitTests\Microsoft.Plugin.Folder.UnitTests.csproj = src\modules\launcher\Plugins\Microsoft.Plugin.Folder.UnitTests\Microsoft.Plugin.Folder.UnitTests.csproj + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{1C48CD47-D610-463A-A53C-AF82DD6C47E7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D9BD324E-1D80-44AA-8E7B-73EB00944434}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{8EF25507-2575-4ADE-BF7E-D23376903AB8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerOCR.UITests", "src\modules\PowerOCR\PowerOCR-UITests\PowerOCR.UITests.csproj", "{070AC093-C9F2-20AD-0BCD-F318FC2761EA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{2C318EC3-BA86-4372-B1BC-DB0F33C208B2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{BFFB607F-7C78-434B-86B9-DA4C8196A1B5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{66E1534A-1587-42B2-912F-45C994D32904}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{E885E71F-0B34-4A03-B13B-20F4E05E90BB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{264B412F-DB8B-4CF8-A74B-96998B183045}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{3527BF37-DFC5-4309-A032-29278CA21328}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{68328142-5B31-4715-BCBB-7B6345EE0971}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvancedPaste.FuzzTests", "src\modules\AdvancedPaste\AdvancedPaste.FuzzTests\AdvancedPaste.FuzzTests.csproj", "{4122388B-59E4-CDB0-0338-EA6881DF86F0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvancedPaste.UnitTests", "src\modules\AdvancedPaste\AdvancedPaste.UnitTests\AdvancedPaste.UnitTests.csproj", "{988C9FAF-5AEC-EB15-578D-FED0DF52BF55}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.UITests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.UITests\Microsoft.CmdPal.UITests.csproj", "{6748A29D-DA6A-033A-825B-752295FF6AA0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FancyZones.FuzzTests", "src\modules\fancyzones\FancyZones.FuzzTests\FancyZones.FuzzTests.csproj", "{6EABCF9A-6526-441F-932F-658B1DC3E403}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FancyZones.UITests", "src\modules\fancyzones\FancyZones.UITests\FancyZones.UITests.csproj", "{69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FancyZonesEditor.UITests", "src\modules\fancyzones\FancyZonesEditor.UITests\FancyZonesEditor.UITests.csproj", "{9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FancyZonesEditor.UnitTests", "src\modules\fancyzones\FancyZonesEditor.UnitTests\FancyZonesEditor.UnitTests.csproj", "{806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ColorPickerUI.UnitTests", "src\modules\colorPicker\ColorPickerUI.UnitTests\ColorPickerUI.UnitTests.csproj", "{F93C2817-C846-4259-84D8-B39A6B57C8DE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{8131151D-B0E9-4E18-84A5-E5F946C4480A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.Calc.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.Calc.UnitTests\Microsoft.CmdPal.Ext.Calc.UnitTests.csproj", "{E816D7AC-4688-4ECB-97CC-3D8E798F3825}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.Registry.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.Registry.UnitTests\Microsoft.CmdPal.Ext.Registry.UnitTests.csproj", "{E816D7AD-4688-4ECB-97CC-3D8E798F3826}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.System.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.System.UnitTests\Microsoft.CmdPal.Ext.System.UnitTests.csproj", "{E816D7AE-4688-4ECB-97CC-3D8E798F3827}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.TimeDate.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.TimeDate.UnitTests\Microsoft.CmdPal.Ext.TimeDate.UnitTests.csproj", "{E816D7AF-4688-4ECB-97CC-3D8E798F3828}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.WindowWalker.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.WindowWalker.UnitTests\Microsoft.CmdPal.Ext.WindowWalker.UnitTests.csproj", "{E816D7B0-4688-4ECB-97CC-3D8E798F3829}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShortcutGuide.IndexYmlGenerator", "src\modules\ShortcutGuide\ShortcutGuide.IndexYmlGenerator\ShortcutGuide.IndexYmlGenerator.csproj", "{D640B00C-9149-4C4F-8B7D-E2B8B2590A0B}" EndProject @@ -1116,22 +1188,6 @@ Global {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Release|ARM64.Build.0 = Release|ARM64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Release|x64.ActiveCfg = Release|x64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Release|x64.Build.0 = Release|x64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|ARM64.Build.0 = Debug|ARM64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|x64.ActiveCfg = Debug|x64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|x64.Build.0 = Debug|x64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|ARM64.ActiveCfg = Release|ARM64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|ARM64.Build.0 = Release|ARM64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|x64.ActiveCfg = Release|x64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|x64.Build.0 = Release|x64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|ARM64.Build.0 = Debug|ARM64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|x64.ActiveCfg = Debug|x64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|x64.Build.0 = Debug|x64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|ARM64.ActiveCfg = Release|ARM64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|ARM64.Build.0 = Release|ARM64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|x64.ActiveCfg = Release|x64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|x64.Build.0 = Release|x64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|ARM64.ActiveCfg = Debug|ARM64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|ARM64.Build.0 = Debug|ARM64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|x64.ActiveCfg = Debug|x64 @@ -2008,14 +2064,6 @@ Global {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|ARM64.Build.0 = Release|ARM64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|x64.ActiveCfg = Release|x64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|x64.Build.0 = Release|x64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|ARM64.Build.0 = Debug|ARM64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|x64.ActiveCfg = Debug|x64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|x64.Build.0 = Debug|x64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|ARM64.ActiveCfg = Release|ARM64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|ARM64.Build.0 = Release|ARM64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|x64.ActiveCfg = Release|x64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|x64.Build.0 = Release|x64 {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|ARM64.ActiveCfg = Debug|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|ARM64.Build.0 = Debug|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -2140,22 +2188,6 @@ Global {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|ARM64.Build.0 = Release|ARM64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|x64.ActiveCfg = Release|x64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|x64.Build.0 = Release|x64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|ARM64.Build.0 = Debug|ARM64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|x64.ActiveCfg = Debug|x64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|x64.Build.0 = Debug|x64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|ARM64.ActiveCfg = Release|ARM64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|ARM64.Build.0 = Release|ARM64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|x64.ActiveCfg = Release|x64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|x64.Build.0 = Release|x64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|ARM64.Build.0 = Debug|ARM64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|x64.ActiveCfg = Debug|x64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|x64.Build.0 = Debug|x64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|ARM64.ActiveCfg = Release|ARM64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|ARM64.Build.0 = Release|ARM64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|x64.ActiveCfg = Release|x64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|x64.Build.0 = Release|x64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|ARM64.Build.0 = Debug|ARM64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|x64.ActiveCfg = Debug|x64 @@ -2196,6 +2228,14 @@ Global {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|ARM64.Build.0 = Release|ARM64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x64.ActiveCfg = Release|x64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x64.Build.0 = Release|x64 + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}.Debug|ARM64.Build.0 = Debug|ARM64 + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}.Debug|x64.ActiveCfg = Debug|x64 + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}.Debug|x64.Build.0 = Debug|x64 + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}.Release|ARM64.ActiveCfg = Release|ARM64 + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}.Release|ARM64.Build.0 = Release|ARM64 + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}.Release|x64.ActiveCfg = Release|x64 + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C}.Release|x64.Build.0 = Release|x64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|ARM64.Build.0 = Debug|ARM64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x64.ActiveCfg = Debug|x64 @@ -2484,22 +2524,6 @@ Global {E81A7D20-9862-ABDB-0AAE-9BC5B517A9F9}.Release|x64.ActiveCfg = Release|x64 {E81A7D20-9862-ABDB-0AAE-9BC5B517A9F9}.Release|x64.Build.0 = Release|x64 {E81A7D20-9862-ABDB-0AAE-9BC5B517A9F9}.Release|x64.Deploy.0 = Release|x64 - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}.Debug|ARM64.Build.0 = Debug|ARM64 - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}.Debug|x64.ActiveCfg = Debug|x64 - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}.Debug|x64.Build.0 = Debug|x64 - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}.Release|ARM64.ActiveCfg = Release|ARM64 - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}.Release|ARM64.Build.0 = Release|ARM64 - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}.Release|x64.ActiveCfg = Release|x64 - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE}.Release|x64.Build.0 = Release|x64 - {7F5B9557-5878-4438-A721-3E28296BA193}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {7F5B9557-5878-4438-A721-3E28296BA193}.Debug|ARM64.Build.0 = Debug|ARM64 - {7F5B9557-5878-4438-A721-3E28296BA193}.Debug|x64.ActiveCfg = Debug|x64 - {7F5B9557-5878-4438-A721-3E28296BA193}.Debug|x64.Build.0 = Debug|x64 - {7F5B9557-5878-4438-A721-3E28296BA193}.Release|ARM64.ActiveCfg = Release|ARM64 - {7F5B9557-5878-4438-A721-3E28296BA193}.Release|ARM64.Build.0 = Release|ARM64 - {7F5B9557-5878-4438-A721-3E28296BA193}.Release|x64.ActiveCfg = Release|x64 - {7F5B9557-5878-4438-A721-3E28296BA193}.Release|x64.Build.0 = Release|x64 {0A84F764-3A88-44CD-AA96-41BDBD48627B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {0A84F764-3A88-44CD-AA96-41BDBD48627B}.Debug|ARM64.Build.0 = Debug|ARM64 {0A84F764-3A88-44CD-AA96-41BDBD48627B}.Debug|x64.ActiveCfg = Debug|x64 @@ -2614,6 +2638,214 @@ Global {2694E2FB-DCD5-4BFF-A418-B6C3C7CE3B8E}.Release|ARM64.ActiveCfg = Release|ARM64 {2694E2FB-DCD5-4BFF-A418-B6C3C7CE3B8E}.Release|x64.ActiveCfg = Release|x64 {2694E2FB-DCD5-4BFF-A418-B6C3C7CE3B8E}.Release|x64.Build.0 = Release|x64 + {9E0CBC06-F29A-4810-B93C-97D53863B95E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9E0CBC06-F29A-4810-B93C-97D53863B95E}.Debug|ARM64.Build.0 = Debug|ARM64 + {9E0CBC06-F29A-4810-B93C-97D53863B95E}.Debug|x64.ActiveCfg = Debug|x64 + {9E0CBC06-F29A-4810-B93C-97D53863B95E}.Debug|x64.Build.0 = Debug|x64 + {9E0CBC06-F29A-4810-B93C-97D53863B95E}.Release|ARM64.ActiveCfg = Release|ARM64 + {9E0CBC06-F29A-4810-B93C-97D53863B95E}.Release|ARM64.Build.0 = Release|ARM64 + {9E0CBC06-F29A-4810-B93C-97D53863B95E}.Release|x64.ActiveCfg = Release|x64 + {9E0CBC06-F29A-4810-B93C-97D53863B95E}.Release|x64.Build.0 = Release|x64 + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}.Debug|ARM64.Build.0 = Debug|ARM64 + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}.Debug|x64.ActiveCfg = Debug|x64 + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}.Debug|x64.Build.0 = Debug|x64 + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}.Release|ARM64.ActiveCfg = Release|ARM64 + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}.Release|ARM64.Build.0 = Release|ARM64 + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}.Release|x64.ActiveCfg = Release|x64 + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C}.Release|x64.Build.0 = Release|x64 + {47B0678C-806B-4FE1-9F50-46BA88989532}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {47B0678C-806B-4FE1-9F50-46BA88989532}.Debug|ARM64.Build.0 = Debug|ARM64 + {47B0678C-806B-4FE1-9F50-46BA88989532}.Debug|x64.ActiveCfg = Debug|x64 + {47B0678C-806B-4FE1-9F50-46BA88989532}.Debug|x64.Build.0 = Debug|x64 + {47B0678C-806B-4FE1-9F50-46BA88989532}.Release|ARM64.ActiveCfg = Release|ARM64 + {47B0678C-806B-4FE1-9F50-46BA88989532}.Release|ARM64.Build.0 = Release|ARM64 + {47B0678C-806B-4FE1-9F50-46BA88989532}.Release|x64.ActiveCfg = Release|x64 + {47B0678C-806B-4FE1-9F50-46BA88989532}.Release|x64.Build.0 = Release|x64 + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA}.Debug|ARM64.Build.0 = Debug|ARM64 + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA}.Debug|x64.ActiveCfg = Debug|x64 + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA}.Debug|x64.Build.0 = Debug|x64 + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA}.Release|ARM64.ActiveCfg = Release|ARM64 + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA}.Release|ARM64.Build.0 = Release|ARM64 + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA}.Release|x64.ActiveCfg = Release|x64 + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA}.Release|x64.Build.0 = Release|x64 + {99CA1509-FB73-456E-AFAF-AB89C017BD72}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {99CA1509-FB73-456E-AFAF-AB89C017BD72}.Debug|ARM64.Build.0 = Debug|ARM64 + {99CA1509-FB73-456E-AFAF-AB89C017BD72}.Debug|x64.ActiveCfg = Debug|x64 + {99CA1509-FB73-456E-AFAF-AB89C017BD72}.Debug|x64.Build.0 = Debug|x64 + {99CA1509-FB73-456E-AFAF-AB89C017BD72}.Release|ARM64.ActiveCfg = Release|ARM64 + {99CA1509-FB73-456E-AFAF-AB89C017BD72}.Release|ARM64.Build.0 = Release|ARM64 + {99CA1509-FB73-456E-AFAF-AB89C017BD72}.Release|x64.ActiveCfg = Release|x64 + {99CA1509-FB73-456E-AFAF-AB89C017BD72}.Release|x64.Build.0 = Release|x64 + {61CBF221-9452-4934-B685-146285E080D7}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {61CBF221-9452-4934-B685-146285E080D7}.Debug|ARM64.Build.0 = Debug|ARM64 + {61CBF221-9452-4934-B685-146285E080D7}.Debug|x64.ActiveCfg = Debug|x64 + {61CBF221-9452-4934-B685-146285E080D7}.Debug|x64.Build.0 = Debug|x64 + {61CBF221-9452-4934-B685-146285E080D7}.Release|ARM64.ActiveCfg = Release|ARM64 + {61CBF221-9452-4934-B685-146285E080D7}.Release|ARM64.Build.0 = Release|ARM64 + {61CBF221-9452-4934-B685-146285E080D7}.Release|x64.ActiveCfg = Release|x64 + {61CBF221-9452-4934-B685-146285E080D7}.Release|x64.Build.0 = Release|x64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}.Debug|ARM64.Build.0 = Debug|ARM64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}.Debug|x64.ActiveCfg = Debug|x64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}.Debug|x64.Build.0 = Debug|x64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}.Release|ARM64.ActiveCfg = Release|ARM64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}.Release|ARM64.Build.0 = Release|ARM64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}.Release|x64.ActiveCfg = Release|x64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1}.Release|x64.Build.0 = Release|x64 + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9}.Debug|ARM64.Build.0 = Debug|ARM64 + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9}.Debug|x64.ActiveCfg = Debug|x64 + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9}.Debug|x64.Build.0 = Debug|x64 + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9}.Release|ARM64.ActiveCfg = Release|ARM64 + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9}.Release|ARM64.Build.0 = Release|ARM64 + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9}.Release|x64.ActiveCfg = Release|x64 + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9}.Release|x64.Build.0 = Release|x64 + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}.Debug|ARM64.Build.0 = Debug|ARM64 + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}.Debug|x64.ActiveCfg = Debug|x64 + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}.Debug|x64.Build.0 = Debug|x64 + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}.Release|ARM64.ActiveCfg = Release|ARM64 + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}.Release|ARM64.Build.0 = Release|ARM64 + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}.Release|x64.ActiveCfg = Release|x64 + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6}.Release|x64.Build.0 = Release|x64 + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}.Debug|ARM64.Build.0 = Debug|ARM64 + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}.Debug|x64.ActiveCfg = Debug|x64 + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}.Debug|x64.Build.0 = Debug|x64 + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}.Release|ARM64.ActiveCfg = Release|ARM64 + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}.Release|ARM64.Build.0 = Release|ARM64 + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}.Release|x64.ActiveCfg = Release|x64 + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A}.Release|x64.Build.0 = Release|x64 + {9D3F3793-EFE3-4525-8782-238015DABA62}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9D3F3793-EFE3-4525-8782-238015DABA62}.Debug|ARM64.Build.0 = Debug|ARM64 + {9D3F3793-EFE3-4525-8782-238015DABA62}.Debug|x64.ActiveCfg = Debug|x64 + {9D3F3793-EFE3-4525-8782-238015DABA62}.Debug|x64.Build.0 = Debug|x64 + {9D3F3793-EFE3-4525-8782-238015DABA62}.Release|ARM64.ActiveCfg = Release|ARM64 + {9D3F3793-EFE3-4525-8782-238015DABA62}.Release|ARM64.Build.0 = Release|ARM64 + {9D3F3793-EFE3-4525-8782-238015DABA62}.Release|x64.ActiveCfg = Release|x64 + {9D3F3793-EFE3-4525-8782-238015DABA62}.Release|x64.Build.0 = Release|x64 + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027}.Debug|ARM64.Build.0 = Debug|ARM64 + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027}.Debug|x64.ActiveCfg = Debug|x64 + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027}.Debug|x64.Build.0 = Debug|x64 + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027}.Release|ARM64.ActiveCfg = Release|ARM64 + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027}.Release|ARM64.Build.0 = Release|ARM64 + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027}.Release|x64.ActiveCfg = Release|x64 + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027}.Release|x64.Build.0 = Release|x64 + {070AC093-C9F2-20AD-0BCD-F318FC2761EA}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {070AC093-C9F2-20AD-0BCD-F318FC2761EA}.Debug|ARM64.Build.0 = Debug|ARM64 + {070AC093-C9F2-20AD-0BCD-F318FC2761EA}.Debug|x64.ActiveCfg = Debug|x64 + {070AC093-C9F2-20AD-0BCD-F318FC2761EA}.Debug|x64.Build.0 = Debug|x64 + {070AC093-C9F2-20AD-0BCD-F318FC2761EA}.Release|ARM64.ActiveCfg = Release|ARM64 + {070AC093-C9F2-20AD-0BCD-F318FC2761EA}.Release|ARM64.Build.0 = Release|ARM64 + {070AC093-C9F2-20AD-0BCD-F318FC2761EA}.Release|x64.ActiveCfg = Release|x64 + {070AC093-C9F2-20AD-0BCD-F318FC2761EA}.Release|x64.Build.0 = Release|x64 + {4122388B-59E4-CDB0-0338-EA6881DF86F0}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4122388B-59E4-CDB0-0338-EA6881DF86F0}.Debug|ARM64.Build.0 = Debug|ARM64 + {4122388B-59E4-CDB0-0338-EA6881DF86F0}.Debug|x64.ActiveCfg = Debug|x64 + {4122388B-59E4-CDB0-0338-EA6881DF86F0}.Debug|x64.Build.0 = Debug|x64 + {4122388B-59E4-CDB0-0338-EA6881DF86F0}.Release|ARM64.ActiveCfg = Release|ARM64 + {4122388B-59E4-CDB0-0338-EA6881DF86F0}.Release|ARM64.Build.0 = Release|ARM64 + {4122388B-59E4-CDB0-0338-EA6881DF86F0}.Release|x64.ActiveCfg = Release|x64 + {4122388B-59E4-CDB0-0338-EA6881DF86F0}.Release|x64.Build.0 = Release|x64 + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55}.Debug|ARM64.Build.0 = Debug|ARM64 + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55}.Debug|x64.ActiveCfg = Debug|x64 + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55}.Debug|x64.Build.0 = Debug|x64 + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55}.Release|ARM64.ActiveCfg = Release|ARM64 + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55}.Release|ARM64.Build.0 = Release|ARM64 + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55}.Release|x64.ActiveCfg = Release|x64 + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55}.Release|x64.Build.0 = Release|x64 + {6748A29D-DA6A-033A-825B-752295FF6AA0}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {6748A29D-DA6A-033A-825B-752295FF6AA0}.Debug|ARM64.Build.0 = Debug|ARM64 + {6748A29D-DA6A-033A-825B-752295FF6AA0}.Debug|x64.ActiveCfg = Debug|x64 + {6748A29D-DA6A-033A-825B-752295FF6AA0}.Debug|x64.Build.0 = Debug|x64 + {6748A29D-DA6A-033A-825B-752295FF6AA0}.Release|ARM64.ActiveCfg = Release|ARM64 + {6748A29D-DA6A-033A-825B-752295FF6AA0}.Release|ARM64.Build.0 = Release|ARM64 + {6748A29D-DA6A-033A-825B-752295FF6AA0}.Release|x64.ActiveCfg = Release|x64 + {6748A29D-DA6A-033A-825B-752295FF6AA0}.Release|x64.Build.0 = Release|x64 + {6EABCF9A-6526-441F-932F-658B1DC3E403}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {6EABCF9A-6526-441F-932F-658B1DC3E403}.Debug|ARM64.Build.0 = Debug|ARM64 + {6EABCF9A-6526-441F-932F-658B1DC3E403}.Debug|x64.ActiveCfg = Debug|x64 + {6EABCF9A-6526-441F-932F-658B1DC3E403}.Debug|x64.Build.0 = Debug|x64 + {6EABCF9A-6526-441F-932F-658B1DC3E403}.Release|ARM64.ActiveCfg = Release|ARM64 + {6EABCF9A-6526-441F-932F-658B1DC3E403}.Release|ARM64.Build.0 = Release|ARM64 + {6EABCF9A-6526-441F-932F-658B1DC3E403}.Release|x64.ActiveCfg = Release|x64 + {6EABCF9A-6526-441F-932F-658B1DC3E403}.Release|x64.Build.0 = Release|x64 + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}.Debug|ARM64.Build.0 = Debug|ARM64 + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}.Debug|x64.ActiveCfg = Debug|x64 + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}.Debug|x64.Build.0 = Debug|x64 + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}.Release|ARM64.ActiveCfg = Release|ARM64 + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}.Release|ARM64.Build.0 = Release|ARM64 + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}.Release|x64.ActiveCfg = Release|x64 + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15}.Release|x64.Build.0 = Release|x64 + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}.Debug|ARM64.Build.0 = Debug|ARM64 + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}.Debug|x64.ActiveCfg = Debug|x64 + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}.Debug|x64.Build.0 = Debug|x64 + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}.Release|ARM64.ActiveCfg = Release|ARM64 + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}.Release|ARM64.Build.0 = Release|ARM64 + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}.Release|x64.ActiveCfg = Release|x64 + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83}.Release|x64.Build.0 = Release|x64 + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}.Debug|ARM64.Build.0 = Debug|ARM64 + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}.Debug|x64.ActiveCfg = Debug|x64 + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}.Debug|x64.Build.0 = Debug|x64 + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}.Release|ARM64.ActiveCfg = Release|ARM64 + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}.Release|ARM64.Build.0 = Release|ARM64 + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}.Release|x64.ActiveCfg = Release|x64 + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9}.Release|x64.Build.0 = Release|x64 + {F93C2817-C846-4259-84D8-B39A6B57C8DE}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F93C2817-C846-4259-84D8-B39A6B57C8DE}.Debug|ARM64.Build.0 = Debug|ARM64 + {F93C2817-C846-4259-84D8-B39A6B57C8DE}.Debug|x64.ActiveCfg = Debug|x64 + {F93C2817-C846-4259-84D8-B39A6B57C8DE}.Debug|x64.Build.0 = Debug|x64 + {F93C2817-C846-4259-84D8-B39A6B57C8DE}.Release|ARM64.ActiveCfg = Release|ARM64 + {F93C2817-C846-4259-84D8-B39A6B57C8DE}.Release|ARM64.Build.0 = Release|ARM64 + {F93C2817-C846-4259-84D8-B39A6B57C8DE}.Release|x64.ActiveCfg = Release|x64 + {F93C2817-C846-4259-84D8-B39A6B57C8DE}.Release|x64.Build.0 = Release|x64 + {E816D7AC-4688-4ECB-97CC-3D8E798F3825}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E816D7AC-4688-4ECB-97CC-3D8E798F3825}.Debug|ARM64.Build.0 = Debug|ARM64 + {E816D7AC-4688-4ECB-97CC-3D8E798F3825}.Debug|x64.ActiveCfg = Debug|x64 + {E816D7AC-4688-4ECB-97CC-3D8E798F3825}.Debug|x64.Build.0 = Debug|x64 + {E816D7AC-4688-4ECB-97CC-3D8E798F3825}.Release|ARM64.ActiveCfg = Release|ARM64 + {E816D7AC-4688-4ECB-97CC-3D8E798F3825}.Release|ARM64.Build.0 = Release|ARM64 + {E816D7AC-4688-4ECB-97CC-3D8E798F3825}.Release|x64.ActiveCfg = Release|x64 + {E816D7AC-4688-4ECB-97CC-3D8E798F3825}.Release|x64.Build.0 = Release|x64 + {E816D7AD-4688-4ECB-97CC-3D8E798F3826}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E816D7AD-4688-4ECB-97CC-3D8E798F3826}.Debug|ARM64.Build.0 = Debug|ARM64 + {E816D7AD-4688-4ECB-97CC-3D8E798F3826}.Debug|x64.ActiveCfg = Debug|x64 + {E816D7AD-4688-4ECB-97CC-3D8E798F3826}.Debug|x64.Build.0 = Debug|x64 + {E816D7AD-4688-4ECB-97CC-3D8E798F3826}.Release|ARM64.ActiveCfg = Release|ARM64 + {E816D7AD-4688-4ECB-97CC-3D8E798F3826}.Release|ARM64.Build.0 = Release|ARM64 + {E816D7AD-4688-4ECB-97CC-3D8E798F3826}.Release|x64.ActiveCfg = Release|x64 + {E816D7AD-4688-4ECB-97CC-3D8E798F3826}.Release|x64.Build.0 = Release|x64 + {E816D7AE-4688-4ECB-97CC-3D8E798F3827}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E816D7AE-4688-4ECB-97CC-3D8E798F3827}.Debug|ARM64.Build.0 = Debug|ARM64 + {E816D7AE-4688-4ECB-97CC-3D8E798F3827}.Debug|x64.ActiveCfg = Debug|x64 + {E816D7AE-4688-4ECB-97CC-3D8E798F3827}.Debug|x64.Build.0 = Debug|x64 + {E816D7AE-4688-4ECB-97CC-3D8E798F3827}.Release|ARM64.ActiveCfg = Release|ARM64 + {E816D7AE-4688-4ECB-97CC-3D8E798F3827}.Release|ARM64.Build.0 = Release|ARM64 + {E816D7AE-4688-4ECB-97CC-3D8E798F3827}.Release|x64.ActiveCfg = Release|x64 + {E816D7AE-4688-4ECB-97CC-3D8E798F3827}.Release|x64.Build.0 = Release|x64 + {E816D7AF-4688-4ECB-97CC-3D8E798F3828}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E816D7AF-4688-4ECB-97CC-3D8E798F3828}.Debug|ARM64.Build.0 = Debug|ARM64 + {E816D7AF-4688-4ECB-97CC-3D8E798F3828}.Debug|x64.ActiveCfg = Debug|x64 + {E816D7AF-4688-4ECB-97CC-3D8E798F3828}.Debug|x64.Build.0 = Debug|x64 + {E816D7AF-4688-4ECB-97CC-3D8E798F3828}.Release|ARM64.ActiveCfg = Release|ARM64 + {E816D7AF-4688-4ECB-97CC-3D8E798F3828}.Release|ARM64.Build.0 = Release|ARM64 + {E816D7AF-4688-4ECB-97CC-3D8E798F3828}.Release|x64.ActiveCfg = Release|x64 + {E816D7AF-4688-4ECB-97CC-3D8E798F3828}.Release|x64.Build.0 = Release|x64 + {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Debug|ARM64.Build.0 = Debug|ARM64 + {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Debug|x64.ActiveCfg = Debug|x64 + {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Debug|x64.Build.0 = Debug|x64 + {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|ARM64.ActiveCfg = Release|ARM64 + {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|ARM64.Build.0 = Release|ARM64 + {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|x64.ActiveCfg = Release|x64 + {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|x64.Build.0 = Release|x64 {D640B00C-9149-4C4F-8B7D-E2B8B2590A0B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D640B00C-9149-4C4F-8B7D-E2B8B2590A0B}.Debug|ARM64.Build.0 = Debug|ARM64 {D640B00C-9149-4C4F-8B7D-E2B8B2590A0B}.Debug|x64.ActiveCfg = Debug|x64 @@ -2638,26 +2870,26 @@ Global {3BB8493E-D18E-4485-A320-CB40F90F55AE} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} - {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} + {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9} = {264B412F-DB8B-4CF8-A74B-96998B183045} {1A066C63-64B3-45F8-92FE-664E1CCE8077} = {1AFB6476-670D-4E80-A464-657E01DFF482} {5CCC8468-DEC8-4D36-99D4-5C891BEBD481} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {B25AC7A5-FB9F-4789-B392-D5C85E948670} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} {51920F1F-C28C-4ADF-8660-4238766796C2} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} - {2151F984-E006-4A9F-92EF-C6DDE3DC8413} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} + {2151F984-E006-4A9F-92EF-C6DDE3DC8413} = {66E1534A-1587-42B2-912F-45C994D32904} {89F34AF7-1C34-4A72-AA6E-534BCF972BD9} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} {6C7F47CC-2151-44A3-A546-41C70025132C} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34} = {6C7F47CC-2151-44A3-A546-41C70025132C} {0B43679E-EDFA-4DA0-AD30-F4628B308B1B} = {6C7F47CC-2151-44A3-A546-41C70025132C} - {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8} = {6C7F47CC-2151-44A3-A546-41C70025132C} + {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8} = {0E556541-6A45-42CB-AE49-EE5A9BE05E7C} {17DA04DF-E393-4397-9CF0-84DABE11032E} = {1AFB6476-670D-4E80-A464-657E01DFF482} {38BDB927-829B-4C65-9CD9-93FB05D66D65} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} {8451ECDD-2EA4-4966-BB0A-7BBC40138E80} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} - {FF742965-9A80-41A5-B042-D6C7D3A21708} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} + {FF742965-9A80-41A5-B042-D6C7D3A21708} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} {4AFC9975-2456-4C70-94A4-84073C1CED93} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} {59BD9891-3837-438A-958D-ADC7F91F6F7E} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {4D971245-7A70-41D5-BAA0-DDB5684CAF51} = {4AFC9975-2456-4C70-94A4-84073C1CED93} @@ -2670,31 +2902,29 @@ Global {2F305555-C296-497E-AC20-5FA1B237996A} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {AF2349B8-E5B6-4004-9502-687C1C7730B1} = {2F305555-C296-497E-AC20-5FA1B237996A} {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB} = {2F305555-C296-497E-AC20-5FA1B237996A} - {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A} = {2F305555-C296-497E-AC20-5FA1B237996A} + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {DA425894-6E13-404F-8DCB-78584EC0557A} = {2F305555-C296-497E-AC20-5FA1B237996A} - {060D75DA-2D1C-48E6-A4A1-6F0718B64661} = {2F305555-C296-497E-AC20-5FA1B237996A} - {748417CA-F17E-487F-9411-CAFB6D3F4877} = {2F305555-C296-497E-AC20-5FA1B237996A} + {060D75DA-2D1C-48E6-A4A1-6F0718B64661} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} + {748417CA-F17E-487F-9411-CAFB6D3F4877} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {217DF501-135C-4E38-BFC8-99D4821032EA} = {2F305555-C296-497E-AC20-5FA1B237996A} {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A} = {C3081D9A-1586-441A-B5F4-ED815B3719C1} {787B8AA6-CA93-4C84-96FE-DF31110AD1C4} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {08C8C05F-0362-41BC-818C-724572DF8B06} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} {5D00D290-4016-4CFE-9E41-1E7C724509BA} = {1AFB6476-670D-4E80-A464-657E01DFF482} {4AED67B6-55FD-486F-B917-E543DEE2CB3C} = {1AFB6476-670D-4E80-A464-657E01DFF482} - {42851751-CBC8-45A6-97F5-7A0753F7B4D1} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E} = {2F305555-C296-497E-AC20-5FA1B237996A} + {42851751-CBC8-45A6-97F5-7A0753F7B4D1} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} + {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD} = {2F305555-C296-497E-AC20-5FA1B237996A} {655C9AF2-18D3-4DA6-80E4-85504A7722BA} = {1D78B84B-CA39-406C-98F4-71F7EC266CC0} {BA58206B-1493-4C75-BFEA-A85768A1E156} = {1D78B84B-CA39-406C-98F4-71F7EC266CC0} {1D78B84B-CA39-406C-98F4-71F7EC266CC0} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {03276A39-D4E9-417C-8FFD-200B0EE5E871} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {B81FB7B6-D30E-428F-908A-41422EFC1172} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {0F85E674-34AE-443D-954C-8321EB8B93B1} = {C3081D9A-1586-441A-B5F4-ED815B3719C1} - {632BBE62-5421-49EA-835A-7FFA4F499BD6} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {4FA206A5-F69F-4193-BF8F-F6EEB496734C} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1} = {1D78B84B-CA39-406C-98F4-71F7EC266CC0} + {B81FB7B6-D30E-428F-908A-41422EFC1172} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} + {0F85E674-34AE-443D-954C-8321EB8B93B1} = {E885E71F-0B34-4A03-B13B-20F4E05E90BB} + {632BBE62-5421-49EA-835A-7FFA4F499BD6} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F} = {E4E03FE0-94FD-47C7-88C5-F17D0AA549D3} {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {DA5A6FE9-0040-40CC-83CC-764AE5306590} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {DA5A6FE9-0040-40CC-83CC-764AE5306590} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} {0351ADA4-0C32-4652-9BA0-41F7B602372B} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD} = {E4E03FE0-94FD-47C7-88C5-F17D0AA549D3} {6955446D-23F7-4023-9BB3-8657F904AF99} = {1AFB6476-670D-4E80-A464-657E01DFF482} @@ -2713,46 +2943,50 @@ Global {8F62026A-294B-41C6-8839-87463613F216} = {1AFB6476-670D-4E80-A464-657E01DFF482} {C3A17DCA-217B-462C-BB0C-BE086AF80081} = {1AFB6476-670D-4E80-A464-657E01DFF482} {69E1EE8D-143A-4060-9129-4658ACF14AAF} = {2F305555-C296-497E-AC20-5FA1B237996A} - {ECC20689-002A-4354-95A6-B58DF089C6FF} = {2F305555-C296-497E-AC20-5FA1B237996A} + {ECC20689-002A-4354-95A6-B58DF089C6FF} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {4BABF3FE-3451-42FD-873F-3C332E18DCEF} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {0648DF05-5DDA-4BE1-B5F2-584926EBDB65} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {0648DF05-5DDA-4BE1-B5F2-584926EBDB65} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} {E496B7FC-1E99-4BAB-849B-0E8367040B02} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} - {7F4B3A60-BC27-45A7-8000-68B0B6EA7466} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} + {7F4B3A60-BC27-45A7-8000-68B0B6EA7466} = {D9BD324E-1D80-44AA-8E7B-73EB00944434} {8DF78B53-200E-451F-9328-01EB907193AE} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} {23D2070D-E4AD-4ADD-85A7-083D9C76AD49} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} - {62173D9A-6724-4C00-A1C8-FB646480A9EC} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} + {62173D9A-6724-4C00-A1C8-FB646480A9EC} = {D9BD324E-1D80-44AA-8E7B-73EB00944434} {127F38E0-40AA-4594-B955-5616BF206882} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {5E7360A8-D048-4ED3-8F09-0BFD64C5529A} = {127F38E0-40AA-4594-B955-5616BF206882} {D940E07F-532C-4FF3-883F-790DA014F19A} = {127F38E0-40AA-4594-B955-5616BF206882} {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {3E424AD2-19E5-4AE6-B833-F53963EB5FC1} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} + {106CBECA-0701-4FC3-838C-9DF816A19AE2} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} + {2D604C07-51FC-46BB-9EB7-75AECC7F5E81} = {106CBECA-0701-4FC3-838C-9DF816A19AE2} + {2EDB3EB4-FA92-4BFF-B2D8-566584837231} = {106CBECA-0701-4FC3-838C-9DF816A19AE2} {3E424AD2-19E5-4AE6-B833-F53963EB5FC1} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {2D604C07-51FC-46BB-9EB7-75AECC7F5E81} = {21275C57-1C20-4F07-8A56-21BFA8363BDB} {48804216-2A0E-4168-A6D8-9CD068D14227} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {FF1D7936-842A-4BBB-8BEA-E9FE796DE700} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {5043CECE-E6A7-4867-9CBE-02D27D83747A} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {11491FD8-F921-48BF-880C-7FEA185B80A1} = {2F305555-C296-497E-AC20-5FA1B237996A} - {F40C3397-1834-4530-B2D9-8F8B8456BCDF} = {2F305555-C296-497E-AC20-5FA1B237996A} + {F40C3397-1834-4530-B2D9-8F8B8456BCDF} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {4ED320BC-BA04-4D42-8D15-CBE62151F08B} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {4ED320BC-BA04-4D42-8D15-CBE62151F08B} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} {322566EF-20DC-43A6-B9F8-616AF942579A} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {E94FD11C-0591-456F-899F-EFC0CA548336} = {322566EF-20DC-43A6-B9F8-616AF942579A} {782A61BE-9D85-4081-B35C-1CCC9DCC1E88} = {322566EF-20DC-43A6-B9F8-616AF942579A} {809AA252-E17A-4FA2-B0A1-0450976B763F} = {2F305555-C296-497E-AC20-5FA1B237996A} - {133281D8-1BCE-4D07-B31E-796612A9609E} = {2F305555-C296-497E-AC20-5FA1B237996A} + {133281D8-1BCE-4D07-B31E-796612A9609E} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {805306FF-A562-4415-8DEF-E493BDC45918} = {2F305555-C296-497E-AC20-5FA1B237996A} - {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3} = {2F305555-C296-497E-AC20-5FA1B237996A} + {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {60CD2D4F-C3B9-4897-9821-FCA5098B41CE} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2} = {60CD2D4F-C3B9-4897-9821-FCA5098B41CE} {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9} = {60CD2D4F-C3B9-4897-9821-FCA5098B41CE} {9F94B303-5E21-4364-9362-64426F8DB932} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E} = {322566EF-20DC-43A6-B9F8-616AF942579A} {F7C8C0F1-5431-4347-89D0-8E5354F93CF2} = {2F305555-C296-497E-AC20-5FA1B237996A} - {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC} = {2F305555-C296-497E-AC20-5FA1B237996A} + {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {04B193D7-3E21-46B8-A958-89B63A8A69DE} = {2F305555-C296-497E-AC20-5FA1B237996A} {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {FD464B4C-2F68-4D06-91E7-4208146C41F5} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {FD464B4C-2F68-4D06-91E7-4208146C41F5} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} + {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} {020A7474-3601-4160-A159-D7B70B77B15F} = {C3081D9A-1586-441A-B5F4-ED815B3719C1} {27718999-C175-450A-861C-89F911E16A88} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} {1DBBB112-4BB1-444B-8EBB-E66555C76BA6} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} @@ -2766,6 +3000,7 @@ Global {A50C70A6-2DA0-4027-B90E-B1A40755A8A5} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {25C91A4E-BA4E-467A-85CD-8B62545BF674} = {A50C70A6-2DA0-4027-B90E-B1A40755A8A5} {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1} = {A50C70A6-2DA0-4027-B90E-B1A40755A8A5} + {B1234567-1234-1234-1234-123456789ABC} = {A50C70A6-2DA0-4027-B90E-B1A40755A8A5} {212AD910-8488-4036-BE20-326931B75FB2} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {7AC943C9-52E8-44CF-9083-744D8049667B} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A} = {7AC943C9-52E8-44CF-9083-744D8049667B} @@ -2774,7 +3009,7 @@ Global {C97D9A5D-206C-454E-997E-009E227D7F02} = {0F14491C-6369-4C45-AAA8-135814E66E6B} {31D1C81D-765F-4446-AA62-E743F6325049} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} - {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} + {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A} = {1C48CD47-D610-463A-A53C-AF82DD6C47E7} {B41B888C-7DB8-4747-B262-4062E05A230D} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} {AB82E5DD-C32D-4F28-9746-2C780846188E} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE} = {AB82E5DD-C32D-4F28-9746-2C780846188E} @@ -2803,7 +3038,7 @@ Global {A663E672-B26D-4EC0-BEAB-FE2E424AC46F} = {B6C42F16-73EB-477E-8B0D-4E6CF6C20AAC} {8A08D663-4995-40E3-B42C-3F910625F284} = {322566EF-20DC-43A6-B9F8-616AF942579A} {923DF87C-CA99-4D1C-B1D2-959174E95BFA} = {322566EF-20DC-43A6-B9F8-616AF942579A} - {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77} = {322566EF-20DC-43A6-B9F8-616AF942579A} + {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77} = {2C318EC3-BA86-4372-B1BC-DB0F33C208B2} {D962A009-834F-4EEC-AABB-430DF8F98E39} = {322566EF-20DC-43A6-B9F8-616AF942579A} {9873BA05-4C41-4819-9283-CF45D795431B} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {FC373B24-3293-453C-AAF5-CF2909DCEE6A} = {9873BA05-4C41-4819-9283-CF45D795431B} @@ -2814,12 +3049,11 @@ Global {9EBAA524-0EDA-470B-95D4-39383285CBB2} = {1AFB6476-670D-4E80-A464-657E01DFF482} {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {D095BE44-1F2E-463E-A494-121892A75EA2} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {90F9FA90-2C20-4004-96E6-F3B78151F5A5} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {90F9FA90-2C20-4004-96E6-F3B78151F5A5} = {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} {3B227528-4BA6-4CAF-B44A-A10C78A64849} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {F5E1146E-B7B3-4E11-85FD-270A500BD78C} = {3B227528-4BA6-4CAF-B44A-A10C78A64849} {3157FA75-86CF-4EE2-8F62-C43F776493C6} = {3B227528-4BA6-4CAF-B44A-A10C78A64849} {4C0D0746-BE5B-49EE-BD5D-A7811628AE8B} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {538ED0BB-B863-4B20-98CC-BCDF7FA0B68A} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA} = {538ED0BB-B863-4B20-98CC-BCDF7FA0B68A} {B9420661-B0E4-4241-ABD4-4A27A1F64250} = {538ED0BB-B863-4B20-98CC-BCDF7FA0B68A} @@ -2827,8 +3061,8 @@ Global {D949EC7D-48A9-4279-95D5-078E7FD1F048} = {2F305555-C296-497E-AC20-5FA1B237996A} {3BAF9C81-A194-4925-A035-5E24A5D1E542} = {2F305555-C296-497E-AC20-5FA1B237996A} {6B04803D-B418-4833-A67E-B0FC966636A5} = {2F305555-C296-497E-AC20-5FA1B237996A} - {3940AD4D-F748-4BE4-9083-85769CD553EF} = {2F305555-C296-497E-AC20-5FA1B237996A} - {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38} = {2F305555-C296-497E-AC20-5FA1B237996A} + {3940AD4D-F748-4BE4-9083-85769CD553EF} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} + {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} {0014D652-901F-4456-8D65-06FC5F997FB0} = {4C0D0746-BE5B-49EE-BD5D-A7811628AE8B} {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA} = {AB82E5DD-C32D-4F28-9746-2C780846188E} {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F} = {AB82E5DD-C32D-4F28-9746-2C780846188E} @@ -2836,8 +3070,6 @@ Global {02DD46D3-F761-47D9-8894-2D6DA0124650} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} {8E23E173-7127-4A5F-9F93-3049F2B68047} = {929C1324-22E8-4412-A9A8-80E85F3985A5} {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8} = {538ED0BB-B863-4B20-98CC-BCDF7FA0B68A} - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} - {3A9A791E-94A9-49F8-8401-C11CE288D5FB} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {C0974915-8A1D-4BF0-977B-9587D3807AB7} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {1D6893CB-BC0C-46A8-A76C-9728706CA51A} = {557C4636-D7E1-4838-A504-7D19B725EE95} {8ACB33D9-C95B-47D4-8363-9731EE0930A0} = {CA716AE6-FE5C-40AC-BB8F-2C87912687AC} @@ -2847,6 +3079,7 @@ Global {BE126CBB-AE12-406A-9837-A05ACFCA57A7} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} {14CB58B7-D280-4A7A-95DE-4B2DF14EA000} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {A85D4D9F-9A39-4B5D-8B5A-9F2D5C9A8B4C} = {68328142-5B31-4715-BCBB-7B6345EE0971} {9C53CC25-0623-4569-95BC-B05410675EE3} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} {45285DF2-9742-4ECA-9AC9-58951FC26489} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} {3D63307B-9D27-44FD-B033-B26F39245B85} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} @@ -2856,7 +3089,7 @@ Global {21275C57-1C20-4F07-8A56-21BFA8363BDB} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {CA631195-3E02-4796-9272-515AE0A13CDD} = {21275C57-1C20-4F07-8A56-21BFA8363BDB} {8F021B46-362B-485C-BFBA-CCF83E820CBD} = {8F62026A-294B-41C6-8839-87463613F216} - {66614C26-314C-4B91-9071-76133422CFEF} = {B6C42F16-73EB-477E-8B0D-4E6CF6C20AAC} + {66614C26-314C-4B91-9071-76133422CFEF} = {BFFB607F-7C78-434B-86B9-DA4C8196A1B5} {3846508C-77EB-4034-A702-F8BB263C4F79} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2} = {3846508C-77EB-4034-A702-F8BB263C4F79} {6CE438DF-C245-4997-A360-0A0939E4BA34} = {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2} @@ -2886,8 +3119,6 @@ Global {3A9A7297-92C4-4F16-B6F9-8D4AB652C86C} = {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2} {605E914B-7232-4789-AF46-BF5D3DDFC14E} = {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2} {E81A7D20-9862-ABDB-0AAE-9BC5B517A9F9} = {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2} - {D5E5F5EA-1B6C-4A73-88BE-304F36C9E4EE} = {9873BA05-4C41-4819-9283-CF45D795431B} - {7F5B9557-5878-4438-A721-3E28296BA193} = {9873BA05-4C41-4819-9283-CF45D795431B} {DD6E12FE-5509-4ABC-ACC2-3D6DC98A238C} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {0A84F764-3A88-44CD-AA96-41BDBD48627B} = {DD6E12FE-5509-4ABC-ACC2-3D6DC98A238C} {E4585179-2AC1-4D5F-A3FF-CFC5392F694C} = {DD6E12FE-5509-4ABC-ACC2-3D6DC98A238C} @@ -2896,12 +3127,54 @@ Global {A558C25D-2007-498E-8B6F-43405AFAE9E2} = {1AFB6476-670D-4E80-A464-657E01DFF482} {08F9155D-B6DC-46E5-9C83-AF60B655898B} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} {4382A954-179A-4078-92AF-715187DFFF50} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} - {EBED240C-8702-452D-B764-6DB9DA9179AF} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} - {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} - {5702B3CC-8575-48D5-83D8-15BB42269CD3} = {929C1324-22E8-4412-A9A8-80E85F3985A5} + {EBED240C-8702-452D-B764-6DB9DA9179AF} = {1C48CD47-D610-463A-A53C-AF82DD6C47E7} + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0} = {1C48CD47-D610-463A-A53C-AF82DD6C47E7} + {5702B3CC-8575-48D5-83D8-15BB42269CD3} = {8131151D-B0E9-4E18-84A5-E5F946C4480A} {64B88F02-CD88-4ED8-9624-989A800230F9} = {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2} - {0217E86E-3476-9946-DE8E-9D200CEBD47A} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {5F63C743-F6CE-4DBA-A200-2B3F8A14E8C2} = {3846508C-77EB-4034-A702-F8BB263C4F79} + {2694E2FB-DCD5-4BFF-A418-B6C3C7CE3B8E} = {66E1534A-1587-42B2-912F-45C994D32904} + {9E0CBC06-F29A-4810-B93C-97D53863B95E} = {2F305555-C296-497E-AC20-5FA1B237996A} + {F6088A11-1C9E-4420-AA90-CF7E78DD7F1C} = {2F305555-C296-497E-AC20-5FA1B237996A} + {47B0678C-806B-4FE1-9F50-46BA88989532} = {2F305555-C296-497E-AC20-5FA1B237996A} + {9BC1C986-1E97-4D07-A7B1-CE226C239EFA} = {2F305555-C296-497E-AC20-5FA1B237996A} + {99CA1509-FB73-456E-AFAF-AB89C017BD72} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} + {61CBF221-9452-4934-B685-146285E080D7} = {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A1} = {2C318EC3-BA86-4372-B1BC-DB0F33C208B2} + {43E779F3-D83C-48B1-BA8D-1912DBD76FC9} = {68328142-5B31-4715-BCBB-7B6345EE0971} + {2CF78CF7-8FEB-4BE1-9591-55FA25B48FC6} = {1AFB6476-670D-4E80-A464-657E01DFF482} + {14AFD976-B4D2-49D0-9E6C-AA93CC061B8A} = {1AFB6476-670D-4E80-A464-657E01DFF482} + {9D3F3793-EFE3-4525-8782-238015DABA62} = {66E1534A-1587-42B2-912F-45C994D32904} + {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {3846508C-77EB-4034-A702-F8BB263C4F79} + {24133F7F-C1D1-DE04-EFA8-F5D5467FE027} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {0E556541-6A45-42CB-AE49-EE5A9BE05E7C} = {6C7F47CC-2151-44A3-A546-41C70025132C} + {27D9CB3A-46D1-402C-9273-F88CB8AC42F7} = {9873BA05-4C41-4819-9283-CF45D795431B} + {B9617A31-0F0A-4397-851D-BF2FBEE32D7F} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} + {1C48CD47-D610-463A-A53C-AF82DD6C47E7} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} + {D9BD324E-1D80-44AA-8E7B-73EB00944434} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} + {8EF25507-2575-4ADE-BF7E-D23376903AB8} = {3846508C-77EB-4034-A702-F8BB263C4F79} + {070AC093-C9F2-20AD-0BCD-F318FC2761EA} = {B1234567-1234-1234-1234-123456789ABC} + {E816D7AC-4688-4ECB-97CC-3D8E798F3825} = {8EF25507-2575-4ADE-BF7E-D23376903AB8} + {E816D7AD-4688-4ECB-97CC-3D8E798F3826} = {8EF25507-2575-4ADE-BF7E-D23376903AB8} + {E816D7AE-4688-4ECB-97CC-3D8E798F3827} = {8EF25507-2575-4ADE-BF7E-D23376903AB8} + {E816D7AF-4688-4ECB-97CC-3D8E798F3828} = {8EF25507-2575-4ADE-BF7E-D23376903AB8} + {E816D7B0-4688-4ECB-97CC-3D8E798F3829} = {8EF25507-2575-4ADE-BF7E-D23376903AB8} + {2C318EC3-BA86-4372-B1BC-DB0F33C208B2} = {322566EF-20DC-43A6-B9F8-616AF942579A} + {BFFB607F-7C78-434B-86B9-DA4C8196A1B5} = {B6C42F16-73EB-477E-8B0D-4E6CF6C20AAC} + {66E1534A-1587-42B2-912F-45C994D32904} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} + {E885E71F-0B34-4A03-B13B-20F4E05E90BB} = {C3081D9A-1586-441A-B5F4-ED815B3719C1} + {264B412F-DB8B-4CF8-A74B-96998B183045} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} + {3527BF37-DFC5-4309-A032-29278CA21328} = {1D78B84B-CA39-406C-98F4-71F7EC266CC0} + {6B01F1CF-F4DB-48B5-BFE7-0BF576C1D704} = {2F305555-C296-497E-AC20-5FA1B237996A} + {68328142-5B31-4715-BCBB-7B6345EE0971} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {4122388B-59E4-CDB0-0338-EA6881DF86F0} = {27D9CB3A-46D1-402C-9273-F88CB8AC42F7} + {988C9FAF-5AEC-EB15-578D-FED0DF52BF55} = {27D9CB3A-46D1-402C-9273-F88CB8AC42F7} + {6748A29D-DA6A-033A-825B-752295FF6AA0} = {8EF25507-2575-4ADE-BF7E-D23376903AB8} + {6EABCF9A-6526-441F-932F-658B1DC3E403} = {264B412F-DB8B-4CF8-A74B-96998B183045} + {69D76A76-6EF6-4846-94CD-EAAF0CAC9F15} = {264B412F-DB8B-4CF8-A74B-96998B183045} + {9BAFFC28-E1EF-4C14-A101-EEBFC0A50D83} = {264B412F-DB8B-4CF8-A74B-96998B183045} + {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9} = {264B412F-DB8B-4CF8-A74B-96998B183045} + {F93C2817-C846-4259-84D8-B39A6B57C8DE} = {3527BF37-DFC5-4309-A032-29278CA21328} + {8131151D-B0E9-4E18-84A5-E5F946C4480A} = {929C1324-22E8-4412-A9A8-80E85F3985A5} {2694E2FB-DCD5-4BFF-A418-B6C3C7CE3B8E} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} {D640B00C-9149-4C4F-8B7D-E2B8B2590A0B} = {21275C57-1C20-4F07-8A56-21BFA8363BDB} {C992FD2C-83B8-4941-9FC1-09730068D8EC} = {21275C57-1C20-4F07-8A56-21BFA8363BDB} diff --git a/README.md b/README.md index 44c1a800c0..493878bbde 100644 --- a/README.md +++ b/README.md @@ -35,28 +35,28 @@ Microsoft PowerToys is a set of utilities for power users to tune and streamline Go to the [Microsoft PowerToys GitHub releases page][github-release-link] and click on `Assets` at the bottom to show the files available in the release. Please use the appropriate PowerToys installer that matches your machine's architecture and install scope. For most, it is `x64` and per-user. -[github-next-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aissue+milestone%3A%22PowerToys+0.92%22 -[github-current-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aissue+milestone%3A%22PowerToys+0.91%22 -[ptUserX64]: https://github.com/microsoft/PowerToys/releases/download/v0.91.1/PowerToysUserSetup-0.91.1-x64.exe -[ptUserArm64]: https://github.com/microsoft/PowerToys/releases/download/v0.91.1/PowerToysUserSetup-0.91.1-arm64.exe -[ptMachineX64]: https://github.com/microsoft/PowerToys/releases/download/v0.91.1/PowerToysSetup-0.91.1-x64.exe -[ptMachineArm64]: https://github.com/microsoft/PowerToys/releases/download/v0.91.1/PowerToysSetup-0.91.1-arm64.exe +[github-next-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aissue+milestone%3A%22PowerToys+0.93%22 +[github-current-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aissue+milestone%3A%22PowerToys+0.92%22 +[ptUserX64]: https://github.com/microsoft/PowerToys/releases/download/v0.92.1/PowerToysUserSetup-0.92.1-x64.exe +[ptUserArm64]: https://github.com/microsoft/PowerToys/releases/download/v0.92.1/PowerToysUserSetup-0.92.1-arm64.exe +[ptMachineX64]: https://github.com/microsoft/PowerToys/releases/download/v0.92.1/PowerToysSetup-0.92.1-x64.exe +[ptMachineArm64]: https://github.com/microsoft/PowerToys/releases/download/v0.92.1/PowerToysSetup-0.92.1-arm64.exe -| Description | Filename | sha256 hash | -|----------------|----------|-------------| -| Per user - x64 | [PowerToysUserSetup-0.91.1-x64.exe][ptUserX64] | 42EA4A3E8C79A5456476D19E72B3E2AB9393A89C4DC7442EB7EE5A1E3490D38A | -| Per user - ARM64 | [PowerToysUserSetup-0.91.1-arm64.exe][ptUserArm64] | F3F433FE04049F9197411D792AADEBF34E3BE7FE16327BD8B73D2A046ED8BAF6 | -| Machine wide - x64 | [PowerToysSetup-0.91.1-x64.exe][ptMachineX64] | EC4BC3A8625775866B0ED4577CCF83E6EC7B1A0AD267379DDBAF4FE49C7B5BDD | -| Machine wide - ARM64 | [PowerToysSetup-0.91.1-arm64.exe][ptMachineArm64] | 9CB8911008420D0E446AE3D5CE365E447FA4DF9DCF9337F3A80F933C00FC3689 | +| Description | Filename | +|----------------|----------| +| Per user - x64 | [PowerToysUserSetup-0.92.1-x64.exe][ptUserX64] | +| Per user - ARM64 | [PowerToysUserSetup-0.92.1-arm64.exe][ptUserArm64] | +| Machine wide - x64 | [PowerToysSetup-0.92.1-x64.exe][ptMachineX64] | +| Machine wide - ARM64 | [PowerToysSetup-0.92.1-arm64.exe][ptMachineArm64] | This is our preferred method. ### Via Microsoft Store -Install from the [Microsoft Store's PowerToys page][microsoft-store-link]. You must be using the [new Microsoft Store](https://blogs.windows.com/windowsExperience/2021/06/24/building-a-new-open-microsoft-store-on-windows-11/) which is available for both Windows 11 and Windows 10. +Install from the [Microsoft Store's PowerToys page][microsoft-store-link]. You must be using the [new Microsoft Store](https://blogs.windows.com/windowsExperience/2021/06/24/building-a-new-open-microsoft-store-on-windows-11/), which is available for both Windows 11 and Windows 10. ### Via WinGet -Download PowerToys from [WinGet][winget-link]. Updating PowerToys via winget will respect current PowerToys installation scope. To install PowerToys, run the following command from the command line / PowerShell: +Download PowerToys from [WinGet][winget-link]. Updating PowerToys via winget will respect the current PowerToys installation scope. To install PowerToys, run the following command from the command line / PowerShell: #### User scope installer [default] ```powershell @@ -79,13 +79,13 @@ There is a collection of [third-party plugins](./doc/thirdPartyRunPlugins.md) cr ## Contributing -This project welcomes contributions of all types. Besides coding features / bug fixes, other ways to assist include spec writing, design, documentation, and finding bugs. We are excited to work with the power user community to build a set of tools for helping you get the most out of Windows. +This project welcomes contributions of all types. Besides coding features / bug fixes, other ways to assist include spec writing, design, documentation, and finding bugs. We are excited to work with the power user community to build a set of tools for helping you get the most out of Windows. We ask that **before you start work on a feature that you would like to contribute**, please read our [Contributor's Guide](CONTRIBUTING.md). We would be happy to work with you to figure out the best approach, provide guidance and mentorship throughout feature development, and help avoid any wasted or duplicate effort. Most contributions require you to agree to a [Contributor License Agreement (CLA)][oss-CLA] declaring that you grant us the rights to use your contribution and that you have permission to do so. -For guidance on developing for PowerToys, please read the [developer docs](/doc/devdocs) for a detailed breakdown. This includes how to setup your computer to compile. +For guidance on developing for PowerToys, please read the [developer docs](./doc/devdocs) for a detailed breakdown. This includes how to setup your computer to compile. ## What's Happening @@ -93,168 +93,140 @@ For guidance on developing for PowerToys, please read the [developer docs](/doc/ Our [prioritized roadmap][roadmap] of features and utilities that the core team is focusing on. -### 0.91 - May 2025 Update +### 0.92 - June 2025 Update -In this release, we focused on new features, stability, and automation. +In this release, we focused on new features, stability, optimization improvements, and automation. **✨Highlights** - - We focused on greatly improving Command Palette's performance and fixing a large amount of bugs. Some new features we've added are: - - Added the ability for Command Palette to search any file using a fallback command. - - Added the ability to make the Command Palette global hotkey a low-level keyboard hook. - - Added open URL fallback command for the WebSearch extension, enabling users to directly open URLs in the browser from Command Palette. - - You can now define custom formats in the Date and Time plugins of PT Run and Command Palette. Thanks [@htcfreek](https://github.com/htcfreek)! - -### Advanced Paste - - - Fixed an issue where Advanced Paste failed to create the OCR engine for certain English language tags (e.g., en-CA) by initializing the OCR engine with the user profile language. Thanks [@cryolithic](https://github.com/cryolithic)! + - PowerToys settings now has a toggle for the system tray icon, giving users control over its visibility based on personal preference. Thanks [@BLM16](https://github.com/BLM16)! + - Command Palette now has Ahead-of-Time ([AOT](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot)) compatibility for all first-party extensions, improved extensibility, and core UX fixes, resulting in better performance and stability across commands. + - Color Picker now has customizable mouse button actions, enabling more personalized workflows by assigning functions to left, right, and middle clicks. Thanks [@PesBandi](https://github.com/PesBandi)! + - Bug Report Tool now has a faster and clearer reporting process, with progress indicators, improved compression, auto-cleanup of old trace logs, and inclusion of MSIX installer logs for more efficient diagnostics. + - File Explorer add-ons now have improved rendering stability, resolving issues with PDF previews, blank thumbnails, and text file crashes during file browsing. ### Color Picker - - Fixed an issue where a resource leak caused hangs or crashes by properly disposing of the Graphics object. Thanks [@dcog989](https://github.com/dcog989)! - - Fixed an issue where Color Picker exited on Backspace keypress by ensuring it only closes when focused and aligning Escape/Backspace behavior. Thanks [@PesBandi](https://github.com/PesBandi)! - - Added support for Oklab and Oklch color formats in Color Picker. Thanks [@lemonyte](https://github.com/lemonyte)! + - Added mouse button actions so you can choose what left, right, or middle click does. Thanks [@PesBandi](https://github.com/PesBandi)! -### Command Not Found +### Crop & Lock - - Updated the WinGet Command Not Found script to only enable the experimental features if they actually exist. + - Aligned window styling with current Windows theme for a cleaner look. Thanks [@sadirano](https://github.com/sadirano)! ### Command Palette - - Updated bug template to include Command Palette module. - - Fixed an issue where the toast window was not scaled for DPI, causing layout issues under display scaling. - - Fixed an issue where Up/Down keyboard navigation didn't move selection when caret was at position 0, and add continuous navigation like PT Run v1. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! - - Updated the Time and Date extension code to simplify it and improve clarity. - - Fixed an issue where capitalization in the command causes failure when trying to go to the mouse pointer, resolved by adjusting the command to lowercase. - - Added open URL fallback command for the WebSearch extension, enabling users to directly open URLs in the browser from Command Palette. Thanks [@htcfreek](https://github.com/htcfreek)! - - Added setting to enable/disable system tray icon in CmdPal and align terminology with Windows 11. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! - - Fixed an alias update issue by removing the old alias when a new one is set. - - Resolved GitHub casing conflict by migrating Exts and exts into a new ext directory, ensuring consistent structure across platforms and preventing path fragmentation. - - Fix an issue where the 'Create New Extension' command generated empty file names. - - Added the ability to make the global hotkey a low-level keyboard hook. - - Added support for JUMBO thumbnails, enabling access to high-resolution icons. - - Fixed crashes when CmdPal auto-hid itself while an MSAL dialog was opened, by preventing CmdPal from hiding if it's disabled. - - Added support for immediately selecting search text when a page is loaded. - - Fixed a bug where extension settings pages failed to reload on reopen by updating the settings form when extension settings are saved. - - Fixed an issue where the Command Palette failed to launch from the runner. - - Refactored and ported the PowerToys Run v1 calculator logic into Command Palette, added settings support, and improved fallback behavior. - - Re-added support for list item keyboard shortcuts. - - Enhanced accessibility in Command Palette by adding proper labels, refining animations, improving localization, and fixed a11y related issues. - - Ported custom format support to the Time and Date plugin, reordered and cleaned up settings, improved error messaging, and fixed edge-case crashes for more robust and user-friendly behavior. Thanks [@htcfreek](https://github.com/htcfreek)! - - Added fallback item for system command. - - Fixed a bug in Windows System Command where the key prompt incorrectly displayed "Empty" for the "Open Recycle Bin" action. Thanks [@jironemo](https://github.com/jironemo)! - - Fixed an issue where the 'more commands' list showed commands that shouldn't be visible. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! - - Fixed an issue where the details view in Command Palette displayed an oversized icon and misaligned text, aligning it with Windows Search behavior. - - Fixed a bug where empty screen content and command bar commands were cut off when using long labels, ensuring proper layout and visibility. - - Improved CmdPal’s WinGet integration by fixing version display for installed packages, enabling updates with icons, and migrating the preview winget API to a stable version. - - Fixed a bug where commands for ContentPage didn't update until after exit, by ensuring context menus are fully initialized when they change. - - Added fallback support to the TimeDate extension, enabling direct date/time queries without pre-selecting the command. - - Added import of Common.Dotnet.AotCompatibility.props across multiple CmdPal project files to enhance AOT compilation support. - - Fixed a crash in CmdPal settings caused by a null HotKey when settings.json is missing or lacks a defined hotkey. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! - - Added support for filterable, nested context menus in CmdPal, including a search box to maintain focus behavior. - - Refactored CmdPal classes to improve JSON serialization and introduced new serialization contexts for better performance and maintainability. - - Added support for ahead-of-time (AoT) compilation. - - Added retry mechanism for CmdPal launch. - - Removed some unused files from CmdPal.Common to simplify codebase and facilitate marking it as AoT-compatible. - - Fixed a bug where a race condition in the update of SearchText caused the cursor in the input box to automatically jump to the end of the line, ensuring SearchText is only updated after it has actually been changed. - - Added support for searching any file in fallback command. - - Cleaned up AoT-related code to prevent duplicate operations during testing. - - Reduced CmdPal load time by parallelizing extension startup and adding timeouts to prevent misbehaving extensions from blocking others. - - Enhanced UI behavior by dismissing the details pane when the list gets emptied, avoiding inconsistent visual states. - - Added support to unset the fallback command in CmdPal when no matching command is found, ensuring cleaner reload behavior. - - Fixed a leak in the CmdPal extension template by addressing improper ComServer use. - - Prevented CmdPal window from maximizing on title bar double-click to maintain intended window behavior. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! - - Fixed an issue where the Settings UI launched too small by making window dimensions DPI-aware and enforcing minimum width and height using WinUIEx. - - Fixed white flash and one-time animation issues in CmdPal by cloaking the window instead of hiding it. - - Fixed a bug where all extension settings were fetched on startup by lazy-loading extension settings, reducing initialization overhead. - - Added support for protecting CmdPal from crashes on Adaptive Card parse failure. - - Replaced shell:AppsFolder with URI activation in CmdPal to improve reliability. - - Added ability to open CmdPal settings from PowerToys Settings. - - Added ability for CmdPal to observe and dynamically update extension details by tracking property changes on the selected item. - - Bumped the toolkit version used in the CmdPal extension template to 0.2.0. + - Enhanced performance by resolving a regression in page loading. + - Applied consistent hotkey handling across all Command Palette commands for a smoother user experience. + - Improved graceful closing of Command Palette. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! + - Fixed consistency issue for extensions' alias with "Direct" setting and enabled localization for "Direct" and "Indirect" for better user understanding. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! + - Improved visual clarity by styling critical context items correctly. + - Automatically focused the field when only one is present on the content page. + - Improved stability and efficiency when loading file icons in SDK ThumbnailHelper.cs by removing unnecessary operations. Thanks [@OldUser101](https://github.com/OldUser101)! + - Enhanced details view with commands implementation. (See [Extension sample](./src/modules/cmdpal/ext/SamplePagesExtension/Pages/SampleListPageWithDetails.cs)) -### Image Resizer +### Command Palette extensions - - Fixed an issue where deleting an Image Resizer preset removed the wrong preset. + - Added "Copy Path" command to *App* search results for convenience. Thanks [@PesBandi](https://github.com/PesBandi)! + - Improved *Calculator* input experience by ignoring leading equal signs. Thanks [@PesBandi](https://github.com/PesBandi)! + - Corrected input handling in the *Calculator* extension to avoid showing errors for input with only leading whitespace. + - Improved *New Extension* wizard by validating names to prevent namespace errors. + - Ensured consistent context items display for the *Run* extension between fallback and top-level results. + - Fixed missing *Time & Date* commands in fallback results. Thanks [@htcfreek](https://github.com/htcfreek)! + - Fixed outdated results in the *Time & Date* extension. Thanks [@htcfreek](https://github.com/htcfreek)! + - Fixed an issue where *Web Search* always opened Microsoft Edge instead of the user's default browser on Windows 11 24H2 and later. Thanks [@RuggMatt](https://github.com/RuggMatt)! + - Improved ordering of *Windows Settings* extension search results from alphabetical to relevance-based for quicker access. + - Added "Restart Windows Explorer" command to the *Windows System Commands* provider for gracefully terminate and relaunch explorer.exe. Thanks [@jiripolasek](https://github.com/jiripolasek)! -### Keyboard Manager +### Command Palette Ahead-of-Time (AOT) readiness - - Fixed an issue where a modifier key, when set without specifying left or right, would get stuck due to incorrect key handling, by tracking the pressed keys and sending the correct key accordingly. Thanks [@mantaionut](https://github.com/mantaionut)! + - We’ve made foundational changes to prepare the Command Palette for future Ahead-of-Time (AOT) publishing. This includes replacing the calculator library with ExprTk, improving COM object handling, refining Win32 interop, and correcting trimming behavior—all to ensure compatibility, performance, and reliability under AOT constraints. All first-party extensions are now AOT-compatible. These improvements lay the groundwork for publishing Command Palette as an AOT application in the next release. + - Special thanks to [@Sergio0694](https://github.com/Sergio0694) for guidance on making COM APIs AOT-compatible, [@jtschuster](https://github.com/jtschuster) for fixing COM object handling, [@ArashPartow](https://github.com/ArashPartow) from ExprTk for integration suggestions, and [@tian-lt](https://github.com/tian-lt) from the Windows Calculator team for valuable suggestion throughout the migration journey and review. + - As part of the upcoming release, we’re also enabling AOT compatibility for key dependencies, including markdown rendering, Adaptive Cards, internal logging and telemetry library, and the core Command Palette UX. + +### FancyZones + + - Fixed DPI-scaling issues to ensure FancyZones Editor displays crisply on high-resolution monitors. Thanks [@HO-COOH](https://github.com/HO-COOH)! This inspired us a broader review across other PowerToys modules, leading to DPI display optimizations in Awake, Color Picker, PowerAccent, and more. + +### File Explorer add-ons + + - Fixed potential failures in PDF previewer and thumbnail generation, improving reliability when browsing PDF files. Thanks [@mohiuddin-khan-shiam](https://github.com/mohiuddin-khan-shiam)! + - Prevented Monaco Preview Handler crash when opening UTF-8-BOM text files. + +### Hosts File Editor + + - Added an in-app *“Learn more”* link to warning dialogs for quick guidance. Thanks [@PesBandi](https://github.com/PesBandi)! + +### Mouse Without Borders + + - Fixed firewall rule so MWB now accepts connections from IPs outside your local subnet. + - Cleaned legacy logs to reduce disk usage and noise. + +### Peek + + - Updated QOI reader so 3-channel QOI images preview correctly in Peek and File Explorer. Thanks [@mbartlett21](https://github.com/mbartlett21)! + - Added codec detection with a clear warning when a video can’t be previewed, along with a link to the Microsoft Store to download the required codec. ### PowerRename - - Enhanced PowerRename's time formatting capabilities by adding 12-hour time format patterns with AM/PM support. Thanks [@bitmap4](https://github.com/bitmap4)! + - Added support for $YY-$MM-$DD in ModificationTime and AccessTime to enable flexible date-based renaming. ### PowerToys Run - - Added support for custom formats in the "Time and Date" plugin and improves error messages for invalid input formats. Thanks [@htcfreek](https://github.com/htcfreek)! - - Fix two crashes: one for WFT on very early dates and another for calculating the week of the month on very late dates (e.g., 31.12.9999), and reorder UI settings. Thanks [@htcfreek](https://github.com/htcfreek)! - - Fix an issue where capitalization in the command causes failure when trying to go to the mouse pointer, resolved by adjusting the command to lowercase. - - Added version details to plugin error messages for 'Loading error' and 'Init error'. Thanks [@htcfreek](https://github.com/htcfreek)! - - Enhanced result model by adding support for preventing usage-based ordering, giving plugin developers greater control over sorting behavior. Thanks [@CoreyHayward](https://github.com/CoreyHayward) and [@htcfreek](https://github.com/htcfreek)! - -### Quick Accent - - - Updated the letter mapping in GetDefaultLetterKeyEPO, replacing "ǔ" with "ŭ" for the VK_U key to accurately reflect Esperanto phonetics. Thanks [@OlegKharchevkin](https://github.com/OlegKharchevkin)! - - Fixed an issue where Quick Accent did not work properly when using the on-screen keyboard. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! + - Suppressed error UI for known WPF-related crashes to reduce user confusion, while retaining diagnostic logging for analysis. This targets COMException 0xD0000701 and 0x80263001 caused by temporary DWM unavailability. ### Registry Preview - - Enhanced Registry Preview to support pasting registry keys and values without manually writing the file header, and added a new button for resetting the app. Thanks [@htcfreek](https://github.com/htcfreek)! + - Added "Extended data preview" via magnifier icon and context menu in the Data Grid, enabled easier inspection of complex registry types like REG_BINARY, REG_EXPAND_SZ, and REG_MULTI_SZ, etc. Thanks [@htcfreek](https://github.com/htcfreek)! + - Improved file-saving experience in Registry Preview by aligning with Notepad-like behavior, enhancing user prompts, error handling, and preventing crashes during unsaved or interrupted actions. Thanks [@htcfreek](https://github.com/htcfreek)! ### Settings - - Fix an issue where the Settings app randomly showed a blank icon in the taskbar by deferring icon assignment until the window is activated. - - Added the ability to maximize the "What's New" window for a more comfortable reading experience. + - Added an option to hide or show the PowerToys system tray icon. Thanks [@BLM16](https://github.com/BLM16)! + - Improved settings to show progress while a bug report package is being generated. ### Workspaces - - Fixed bugs where Steam games were not captured or launched correctly by updating window filtering and integrating Steam URL protocol handling. + - Stored Workspaces icons in user AppData to ensure profile portability and prevent loss during temporary folder cleanup. + - Enabled capture and launch of PWAs on non-default Edge or Chrome profiles, ensuring consistent behavior during creation and execution. ### Documentation - - Added QuickNotes to the third-party plugins documentation for PowerToys Run. Thanks [@ruslanlap](https://github.com/ruslanlap)! - - Added Weather and Pomodoro plugins to the PowerToys Run third-party plugin documentation. Thanks [@ruslanlap](https://github.com/ruslanlap)! - - Added the Linear plugin to PowerToys Run's third-party plugin documentation. Thanks [@vednig](https://github.com/vednig)! - - Fixed formatting issues in documentation files and updated contributor and team member information. Thanks [@DanielEScherzer](https://github.com/DanielEScherzer) and [@RokyZevon](https://github.com/RokyZevon)! + - Added SpeedTest and Dictionary Definition to the third-party plugins documentation for PowerToys Run. Thanks [@ruslanlap](https://github.com/ruslanlap)! + - Corrected sample links and typo in Command Palette documentation. Thanks [@daverayment](https://github.com/daverayment) and [@roycewilliams](https://github.com/roycewilliams)! ### Development - - Updated GitHub Action to install .NET 9 for MSStore release support. - - Updated version placeholder in bug_report.yml to prevent incorrect v0.70.0 versioning in issue reports. - - Updated GitHub Action to upgrade actions/setup-dotnet from version 3 to version 4 for MSStore release. - - Added securityContext to WinGet configuration files, allowing invocation from user context and prompting a single UAC for elevated resources in a separate process. Thanks [@mdanish-kh](https://github.com/mdanish-kh)! - - Changed log file extensions from .txt to .log to support proper file associations and tooling compatibility, and added logs for Workspace. Thanks [@benwa](https://github.com/benwa)! - - Upgraded testing framework dependencies and aligned package versions across components. - - Upgraded dependencies to fix vulnerabilities. - - Enhanced repository security by pinning GitHub Actions and Docker tags to immutable full-length commits and integrating automated dependency vulnerability scanning via Dependency Review Workflow. Thanks [@Nick2bad4u](https://github.com/Nick2bad4u)! - - Upgraded Boost dependencies to a newer version. - - Upgraded toolkit to the latest version, suppressed AoT-related warnings. - - Fixed an issue where missing signing for newly added files caused build failures. - - Update release pipeline to prevent publishing private symbols for 100 years. - - Introduced fuzzing for PowerRename to improve reliability and added setup guidance for extending fuzzing to other C++ modules. - - Added centralized pre-creation of generated folders for all .csproj projects to prevent build failures. - - Updated WinAppSDK to the latest 1.7 version. - - Upgraded Boost dependencies to the latest version for the PowerRename Fuzzing project. - - Updated the ADO area path in tsa.json to resolve TSA pipeline errors caused by a deprecated path. - - Initiated AoT support for CmdPal with foundational work in progress. - -### Tool/General + - Updated .NET libraries to 9.0.6 for performance and security. Thanks [@snickler](https://github.com/snickler)! + - Updated WinAppSDK to 1.7.2 for better stability and Windows support. + - Introduced a one-step local build script that generates a signed installer, enhancing developer productivity. + - Generated portable PDBs so cross-platform debuggers can read symbol files, improving debugging experience in VSCode and other tools. + - Simplified WinGet configuration files by using the [Microsoft.Windows.Settings](https://www.powershellgallery.com/packages/Microsoft.Windows.Settings) module to enable Developer Mode. Thanks [@mdanish-kh](https://github.com/mdanish-kh)! + - Adjusted build scripts for the latest Az.Accounts module to keep CI green. + - Streamlined release pipeline by removing hard-coded telemetry version numbers, and unified Command Palette versioning with Windows Terminal's versioning method for consistent updates. + - Enhanced the build validation step to show detailed differences between NOTICE.md and actual package dependencies and versions. + - Improved spell-checking accuracy across the repo. Thanks [@rovercoder](https://github.com/rovercoder)! + - Upgraded CI to TouchdownBuild v5 for faster pipelines. + - Added context comments to *Resources.resw* to help translators. + - Expanded fuzz testing coverage to include FancyZones. + - Integrated all unit tests into the CI pipeline, increasing from ~3,000 to ~5,000 tests. + - Enabled daily UI test automation on the main branch, now covering over 370 UI tests for end-to-end validation. + - Newly added unit tests for WorkspacesLib to improve reliability and maintainability. - - Added support for automating bug report creation by generating a pre-filled GitHub issue URL with system and diagnostic information. Thanks [@donlaci](https://github.com/donlaci)! - - Added scripts to locally build the installer, ensuring the CmdPal can also be launched in a local environment. - - Removed export PFX logic to eliminate hardcoded password usage and resolve PSScriptAnalyzer security warning. - - Added PowerShell script and CI integration to enforce consistent use of Common.Dotnet.CsWinRT.props across all C# projects under the src folder. - -### What is being planned for version 0.92 +### General -For [v0.92][github-next-release-work], we'll work on the items below: +- Updated bug report compression library (cziplib 0.3.3) for faster and more reliable package creation. Thanks [@Chubercik](https://github.com/Chubercik)! +- Included App Installer (“AppX Deployment Server”) event logs in bug reports for more thorough diagnostics. + +### What is being planned for version 0.93 + +For [v0.93][github-next-release-work], we'll work on the items below: - Continued Command Palette polish - - New UI Automation tests + - New UI automation tests - Working on installer upgrades + - Working on shortcut conflict detection - Upgrading Keyboard Manager's editor UI - - Stability / bug fixes + - Stability, bug fixes ## PowerToys Community @@ -266,7 +238,7 @@ This project has adopted the [Microsoft Open Source Code of Conduct][oss-conduct ## Privacy Statement -The application logs basic diagnostic data (telemetry). For more information on privacy and what we collect, see our [PowerToys Data and Privacy documentation](https://aka.ms/powertoys-data-and-privacy-documentation). +The application logs basic diagnostic data (telemetry). For more privacy information and what we collect, see our [PowerToys Data and Privacy documentation](https://aka.ms/powertoys-data-and-privacy-documentation). [oss-CLA]: https://cla.opensource.microsoft.com [oss-conduct-code]: CODE_OF_CONDUCT.md diff --git a/deps/cziplib b/deps/cziplib index 7a57414261..81314fff0a 160000 --- a/deps/cziplib +++ b/deps/cziplib @@ -1 +1 @@ -Subproject commit 7a57414261361ca991ff8053881343eb6bb6f205 +Subproject commit 81314fff0a882b72a9ad321e7a3311660125b56e diff --git a/doc/Fuzzing/CppFuzzingGuide.md b/doc/Fuzzing/CppFuzzingGuide.md deleted file mode 100644 index 448d60a7d4..0000000000 --- a/doc/Fuzzing/CppFuzzingGuide.md +++ /dev/null @@ -1,117 +0,0 @@ -# 🧪 C++ Project Fuzzing Test Guide - -This guide walks you through setting up a **fuzzing test** project for a C++ module using [libFuzzer](https://llvm.org/docs/LibFuzzer.html). -. - ---- - -## 🏗️ Step-by-Step Setup - -### 1. Create a New C++ Project - -- Use **Empty Project** template. -- Name it `.FuzzingTest`. - ---- - -### 2. Update Build Configuration - -- In **Configuration Manager**, Uncheck Build for both Release|ARM64, Debug|ARM64 and Debug|x64 configurations. -- Note: ARM64 is not supported in this case, so leave ARM64 configurations build disabled. ---- - -### 3. Enable ASan and libFuzzer in `.vcxproj` - -Edit the project file to enable fuzzing: - -```xml - - true - true - -``` - ---- - -### 4. Add Fuzzing Compiler Flags - -Add this to `AdditionalOptions` under the `Fuzzing` configuration: - -```xml -/fsanitize=address -/fsanitize-coverage=inline-8bit-counters -/fsanitize-coverage=edge -/fsanitize-coverage=trace-cmp -/fsanitize-coverage=trace-div -%(AdditionalOptions) -``` - ---- - -### 5. Link the Sanitizer Coverage Runtime - -In `Linker → Input → Additional Dependencies`, add: - -```text -$(VCToolsInstallDir)lib\$(Platform)\libsancov.lib -``` - ---- - -### 6. Copy Required Runtime DLL - -Add a `PostBuildEvent` to copy the ASAN DLL: - -```xml - - xcopy /y "$(VCToolsInstallDir)bin\Hostx64\x64\clang_rt.asan_dynamic-x86_64.dll" "$(OutDir)" - -``` - ---- - -### 7. Add Preprocessor Definitions - -To avoid annotation issues, add these to the `Preprocessor Definitions`: - -```text -_DISABLE_VECTOR_ANNOTATION;_DISABLE_STRING_ANNOTATION -``` - ---- - -## 🧬 Required Code - -### `LLVMFuzzerTestOneInput` Entry Point - -Every fuzzing project must expose this function: - -```cpp -extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) -{ - std::string input(reinterpret_cast(data), size); - - try - { - // Call your module with the input here. - } - catch (...) {} - - return 0; -} -``` - ---- - -## ⚙️ [Test run in the cloud](https://eng.ms/docs/cloud-ai-platform/azure-edge-platform-aep/aep-security/epsf-edge-and-platform-security-fundamentals/the-onefuzz-service/onefuzz/faq/notwindows/walkthrough) - -To submit a job to the cloud you can run with this command: - -``` -oip submit --config .\OneFuzzConfig.json --drop-path --platform windows --do-not-file-bugs --duration 1 -``` -You want to run with --do-not-file-bugs because if there is an issue with running the parser in the cloud (which is very possible), you don't want bugs to be created if there is an issue. The --duration task is the number of hours you want the task to run. I recommend just running for 1 hour to make sure things work initially. If you don't specify this parameter, it will default to 48 hours. You can find more about submitting a test job here. - -OneFuzz will send you an email when the job has started. - ---- diff --git a/doc/devdocs/UITests.md b/doc/devdocs/UITests.md index b1b91a632c..2a829d6e90 100644 --- a/doc/devdocs/UITests.md +++ b/doc/devdocs/UITests.md @@ -16,72 +16,129 @@ - Run tests in the Test Explorer (`Test > Test Explorer` or `Ctrl+E, T`). +## Running tests in pipeline + +The PowerToys UI test pipeline provides flexible options for building and testing: + +### Pipeline Options + +- **useLatestOfficialBuild**: When checked, downloads the latest official PowerToys build and installs it for testing. This skips the full solution build and only builds UI test projects. + +- **useCurrentBranchBuild**: When checked along with `useLatestOfficialBuild`, downloads the official build from the current branch instead of main. + + **Default value**: `false` (downloads from main branch) + + **When to use this**: + - **Default scenario**: The pipeline tests against the latest signed PowerToys build from the `main` branch, regardless of which branch your test code changes are from + - **Custom branch testing**: Only specify `true` when: + - Your branch has produced its own signed PowerToys build via the official build pipeline + - You want to test against that specific branch's PowerToys build instead of main + - You are testing PowerToys functionality changes that are only available in your branch's build + + **Important notes**: + - The test pipeline itself runs from your specified branch, but by default tests against the main branch's PowerToys build + - Not all branches have signed builds available - only use this if you're certain your branch has a signed build + - If enabled but no build exists for your branch, the pipeline may fail or fall back to main + +- **uiTestModules**: Specify which UI test modules to build and run. This parameter controls both the `.csproj` projects to build and the `.dll` test assemblies to execute. Examples: + - `['UITests-FancyZones']` - Only FancyZones UI tests + - `['MouseUtils.UITests']` - Only MouseUtils UI tests + - `['UITests-FancyZones', 'MouseUtils.UITests']` - Multiple specific modules + - Leave empty to build and run all UI test modules + + **Important**: The `uiTestModules` parameter values must match both the test project names (for `.csproj` selection during build) and the test assembly names (for `.dll` execution during testing). + +### Build Modes + +1. **Official Build + Selective Testing** (`useLatestOfficialBuild = true`) + - Downloads and installs official PowerToys build + - Builds only specified UI test projects + - Runs specified UI tests against installed PowerToys + - Controlled by `uiTestModules` parameter + +2. **Full Build + Testing** (`useLatestOfficialBuild = false`) + - Builds entire PowerToys solution + - Builds UI test projects (all or specific based on `uiTestModules`) + - Runs UI tests (all or specific based on `uiTestModules`) + - Uses freshly built PowerToys for testing + +> **Note**: Both modes support the `uiTestModules` parameter to control which specific UI test modules to build and run. + +### Pipeline Access +- Pipeline: https://microsoft.visualstudio.com/Dart/_build?definitionId=161438&_a=summary ## How to add the first UI tests for your modules - +- Follow the naming convention: ![{ModuleFolder}/Tests/{ModuleName}-{TestType(Fuzz/UI/Unit)}Tests](images/uitests/naming.png) - Create a new project and add the following references to the project file. Change the OutputPath to your own module's path. ``` - - Library - - false - - - - ..\..\..\..\$(Platform)\$(Configuration)\tests\KeyboardManagerUITests\ - - - - - - - + + + + + + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0} + PowerToys.Hosts.UITests + PowerToys.Hosts.UITests + false + true + enable + Library + + + false + + + $(SolutionDir)$(Platform)\$(Configuration)\tests\Hosts.UITests\ + + + + + + + + ``` - Inherit your test class from UITestBase. >Set Scope: The default scope starts from the PowerToys settings UI. If you want to start from your own module, set the constructor as shown below: >Specify Scope: ``` - [TestClass] - public class RunFancyZonesTest : UITestBase - { - public RunFancyZonesTest() - : base(PowerToysModule.FancyZone) - { - } - } + [TestClass] + public class HostModuleTests : UITestBase + { + public HostModuleTests() + : base(PowerToysModule.Hosts, WindowSize.Small_Vertical) + { + } + } ``` -- Then you can start using session to perform the UI operations. +- Then you can start performing the UI operations. **Example** ``` -using Microsoft.PowerToys.UITest; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace UITests_KeyboardManager +[TestMethod("Hosts.Basic.EmptyViewShouldWork")] +[TestCategory("Hosts File Editor #4")] +public void TestEmptyView() { - [TestClass] - public class RunKeyboardManagerUITests : UITestBase - { - [TestMethod] - public void OpenKeyboardManagerEditor() - { - // Open KeyboardManagerEditor - this.Session.Find + - diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/CommandBar.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/CommandBar.xaml.cs index f079f4b513..208024fdcc 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/CommandBar.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/CommandBar.xaml.cs @@ -3,21 +3,20 @@ // See the LICENSE file in the project root for more information. using CommunityToolkit.Mvvm.Messaging; -using Microsoft.CmdPal.UI.ViewModels; -using Microsoft.CmdPal.UI.ViewModels.Messages; +using Microsoft.CmdPal.Core.ViewModels; +using Microsoft.CmdPal.Core.ViewModels.Messages; using Microsoft.CmdPal.UI.Views; -using Microsoft.UI.Input; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Input; using Windows.System; -using Windows.UI.Core; namespace Microsoft.CmdPal.UI.Controls; public sealed partial class CommandBar : UserControl, IRecipient, + IRecipient, IRecipient, ICurrentPageAware { @@ -39,9 +38,8 @@ public sealed partial class CommandBar : UserControl, // RegisterAll isn't AOT compatible WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); WeakReferenceMessenger.Default.Register(this); - - ViewModel.PropertyChanged += ViewModel_PropertyChanged; } public void Receive(OpenContextMenuMessage message) @@ -51,12 +49,43 @@ public sealed partial class CommandBar : UserControl, return; } - var options = new FlyoutShowOptions + if (message.Element == null) { - ShowMode = FlyoutShowMode.Standard, - }; - MoreCommandsButton.Flyout.ShowAt(MoreCommandsButton, options); - UpdateUiForStackChange(); + _ = DispatcherQueue.TryEnqueue( + () => + { + ContextMenuFlyout.ShowAt( + MoreCommandsButton, + new FlyoutShowOptions() + { + ShowMode = FlyoutShowMode.Standard, + Placement = FlyoutPlacementMode.TopEdgeAlignedRight, + }); + }); + } + else + { + _ = DispatcherQueue.TryEnqueue( + () => + { + ContextMenuFlyout.ShowAt( + message.Element!, + new FlyoutShowOptions() + { + ShowMode = FlyoutShowMode.Standard, + Placement = (FlyoutPlacementMode)message.FlyoutPlacementMode!, + Position = message.Point, + }); + }); + } + } + + public void Receive(CloseContextMenuMessage message) + { + if (ContextMenuFlyout.IsOpen) + { + ContextMenuFlyout.Hide(); + } } public void Receive(TryCommandKeybindingMessage msg) @@ -74,17 +103,7 @@ public sealed partial class CommandBar : UserControl, } else if (result == ContextKeybindingResult.KeepOpen) { - if (!MoreCommandsButton.Flyout.IsOpen) - { - var options = new FlyoutShowOptions - { - ShowMode = FlyoutShowMode.Standard, - }; - MoreCommandsButton.Flyout.ShowAt(MoreCommandsButton, options); - } - - UpdateUiForStackChange(); - + WeakReferenceMessenger.Default.Send(new OpenContextMenuMessage(null, null, null, ContextMenuFilterLocation.Bottom)); msg.Handled = true; } else if (result == ContextKeybindingResult.Unhandled) @@ -121,164 +140,15 @@ public sealed partial class CommandBar : UserControl, e.Handled = true; } - private void CommandsDropdown_ItemClick(object sender, ItemClickEventArgs e) + private void MoreCommandsButton_Tapped(object sender, TappedRoutedEventArgs e) { - if (e.ClickedItem is CommandContextItemViewModel item) - { - if (ViewModel?.InvokeItem(item) == ContextKeybindingResult.Hide) - { - MoreCommandsButton.Flyout.Hide(); - } - else - { - UpdateUiForStackChange(); - } - } + WeakReferenceMessenger.Default.Send(new OpenContextMenuMessage(null, null, null, ContextMenuFilterLocation.Bottom)); } - private void CommandsDropdown_KeyDown(object sender, KeyRoutedEventArgs e) + private void ContextMenuFlyout_Opened(object sender, object e) { - if (e.Handled) - { - return; - } - - var ctrlPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down); - var altPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Menu).HasFlag(CoreVirtualKeyStates.Down); - var shiftPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down); - var winPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.LeftWindows).HasFlag(CoreVirtualKeyStates.Down) || - InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.RightWindows).HasFlag(CoreVirtualKeyStates.Down); - - var result = ViewModel?.CheckKeybinding(ctrlPressed, altPressed, shiftPressed, winPressed, e.Key); - - if (result == ContextKeybindingResult.Hide) - { - e.Handled = true; - MoreCommandsButton.Flyout.Hide(); - WeakReferenceMessenger.Default.Send(); - } - else if (result == ContextKeybindingResult.KeepOpen) - { - e.Handled = true; - } - else if (result == ContextKeybindingResult.Unhandled) - { - e.Handled = false; - } - } - - private void Flyout_Opened(object sender, object e) - { - UpdateUiForStackChange(); - } - - private void Flyout_Closing(FlyoutBase sender, FlyoutBaseClosingEventArgs args) - { - ViewModel?.ClearContextStack(); - WeakReferenceMessenger.Default.Send(); - } - - private void ViewModel_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) - { - var prop = e.PropertyName; - if (prop == nameof(ViewModel.ContextMenu)) - { - UpdateUiForStackChange(); - } - } - - private void ContextFilterBox_TextChanged(object sender, TextChangedEventArgs e) - { - ViewModel.ContextMenu?.SetSearchText(ContextFilterBox.Text); - - if (CommandsDropdown.SelectedIndex == -1) - { - CommandsDropdown.SelectedIndex = 0; - } - } - - private void ContextFilterBox_KeyDown(object sender, KeyRoutedEventArgs e) - { - var ctrlPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down); - var altPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Menu).HasFlag(CoreVirtualKeyStates.Down); - var shiftPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down); - var winPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.LeftWindows).HasFlag(CoreVirtualKeyStates.Down) || - InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.RightWindows).HasFlag(CoreVirtualKeyStates.Down); - - if (e.Key == VirtualKey.Enter) - { - if (CommandsDropdown.SelectedItem is CommandContextItemViewModel item) - { - if (ViewModel?.InvokeItem(item) == ContextKeybindingResult.Hide) - { - MoreCommandsButton.Flyout.Hide(); - WeakReferenceMessenger.Default.Send(); - } - else - { - UpdateUiForStackChange(); - } - - e.Handled = true; - } - } - else if (e.Key == VirtualKey.Escape || - (e.Key == VirtualKey.Left && altPressed)) - { - if (ViewModel.CanPopContextStack()) - { - ViewModel.PopContextStack(); - UpdateUiForStackChange(); - } - else - { - MoreCommandsButton.Flyout.Hide(); - WeakReferenceMessenger.Default.Send(); - } - - e.Handled = true; - } - - CommandsDropdown_KeyDown(sender, e); - } - - private void ContextFilterBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e) - { - if (e.Key == VirtualKey.Up) - { - // navigate previous - if (CommandsDropdown.SelectedIndex > 0) - { - CommandsDropdown.SelectedIndex--; - } - else - { - CommandsDropdown.SelectedIndex = CommandsDropdown.Items.Count - 1; - } - - e.Handled = true; - } - else if (e.Key == VirtualKey.Down) - { - // navigate next - if (CommandsDropdown.SelectedIndex < CommandsDropdown.Items.Count - 1) - { - CommandsDropdown.SelectedIndex++; - } - else - { - CommandsDropdown.SelectedIndex = 0; - } - - e.Handled = true; - } - } - - private void UpdateUiForStackChange() - { - ContextFilterBox.Text = string.Empty; - ViewModel.ContextMenu?.SetSearchText(string.Empty); - CommandsDropdown.SelectedIndex = 0; - ContextFilterBox.Focus(FocusState.Programmatic); + // We need to wait until our flyout is opened to try and toss focus + // at its search box. The control isn't in the UI tree before that + ContextControl.FocusSearchBox(); } } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContentFormControl.xaml b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContentFormControl.xaml index 48784a997f..d765237639 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContentFormControl.xaml +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContentFormControl.xaml @@ -8,7 +8,7 @@ xmlns:local="using:Microsoft.CmdPal.UI.Controls" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ui="using:CommunityToolkit.WinUI" - xmlns:viewmodels="using:Microsoft.CmdPal.UI.ViewModels" + xmlns:viewModels="using:Microsoft.CmdPal.UI.ViewModels" Background="Transparent" mc:Ignorable="d"> @@ -19,6 +19,5 @@ - diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContentFormControl.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContentFormControl.xaml.cs index 68209d750a..78805f00b2 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContentFormControl.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContentFormControl.xaml.cs @@ -5,7 +5,9 @@ using AdaptiveCards.ObjectModel.WinUI3; using AdaptiveCards.Rendering.WinUI3; using Microsoft.CmdPal.UI.ViewModels; +using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; namespace Microsoft.CmdPal.UI.Controls; @@ -16,7 +18,7 @@ public sealed partial class ContentFormControl : UserControl // LOAD-BEARING: if you don't hang onto a reference to the RenderedAdaptiveCard // then the GC might clean it up sometime, even while the card is in the UI - // tree. If this gets GC'd, then it'll revoke our Action handler, and the + // tree. If this gets GC'ed, then it'll revoke our Action handler, and the // form will do seemingly nothing. private RenderedAdaptiveCard? _renderedCard; @@ -96,11 +98,65 @@ public sealed partial class ContentFormControl : UserControl if (_renderedCard.FrameworkElement != null) { ContentGrid.Children.Add(_renderedCard.FrameworkElement); + + // Use the Loaded event to ensure we focus after the card is in the visual tree + _renderedCard.FrameworkElement.Loaded += OnFrameworkElementLoaded; } _renderedCard.Action += Rendered_Action; } + private void OnFrameworkElementLoaded(object sender, RoutedEventArgs e) + { + // Unhook the event handler to avoid multiple registrations + if (sender is FrameworkElement element) + { + element.Loaded -= OnFrameworkElementLoaded; + + if (!ViewModel?.OnlyControlOnPage ?? true) + { + return; + } + + // Focus on the first focusable element asynchronously to ensure the visual tree is fully built + element.DispatcherQueue.TryEnqueue(Microsoft.UI.Dispatching.DispatcherQueuePriority.Normal, () => + { + var focusableElement = FindFirstFocusableElement(element); + focusableElement?.Focus(FocusState.Programmatic); + }); + } + } + + private Control? FindFirstFocusableElement(DependencyObject parent) + { + var childCount = VisualTreeHelper.GetChildrenCount(parent); + + // Process children first (depth-first search) + for (var i = 0; i < childCount; i++) + { + var child = VisualTreeHelper.GetChild(parent, i); + + // If the child is a focusable control like TextBox, ComboBox, etc. + if (child is Control control && + control.IsEnabled && + control.IsTabStop && + control.Visibility == Visibility.Visible && + control.AllowFocusOnInteraction) + { + return control; + } + + // Recursively check children + var result = FindFirstFocusableElement(child); + if (result != null) + { + return result; + } + } + + return null; + } + private void Rendered_Action(RenderedAdaptiveCard sender, AdaptiveActionEventArgs args) => ViewModel?.HandleSubmit(args.Action, args.Inputs.AsJson()); } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml new file mode 100644 index 0000000000..27ac608240 --- /dev/null +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml.cs new file mode 100644 index 0000000000..8047cd52a3 --- /dev/null +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml.cs @@ -0,0 +1,289 @@ +// 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 CommunityToolkit.Mvvm.Messaging; +using Microsoft.CmdPal.Core.ViewModels; +using Microsoft.CmdPal.Core.ViewModels.Messages; +using Microsoft.UI.Input; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; +using Windows.System; +using Windows.UI.Core; + +namespace Microsoft.CmdPal.UI.Controls; + +public sealed partial class ContextMenu : UserControl, + IRecipient, + IRecipient, + IRecipient +{ + public ContextMenuViewModel ViewModel { get; } = new(); + + public ContextMenu() + { + this.InitializeComponent(); + + // RegisterAll isn't AOT compatible + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + + if (ViewModel != null) + { + ViewModel.PropertyChanged += ViewModel_PropertyChanged; + } + } + + public void Receive(OpenContextMenuMessage message) + { + UpdateUiForStackChange(); + } + + public void Receive(UpdateCommandBarMessage message) + { + UpdateUiForStackChange(); + } + + public void Receive(TryCommandKeybindingMessage msg) + { + var result = ViewModel?.CheckKeybinding(msg.Ctrl, msg.Alt, msg.Shift, msg.Win, msg.Key); + + if (result == ContextKeybindingResult.Hide) + { + msg.Handled = true; + WeakReferenceMessenger.Default.Send(); + UpdateUiForStackChange(); + } + else if (result == ContextKeybindingResult.KeepOpen) + { + UpdateUiForStackChange(); + msg.Handled = true; + } + else if (result == ContextKeybindingResult.Unhandled) + { + msg.Handled = false; + } + } + + private void CommandsDropdown_ItemClick(object sender, ItemClickEventArgs e) + { + if (e.ClickedItem is CommandContextItemViewModel item) + { + if (InvokeCommand(item) == ContextKeybindingResult.Hide) + { + WeakReferenceMessenger.Default.Send(); + } + + UpdateUiForStackChange(); + } + } + + private void CommandsDropdown_KeyDown(object sender, KeyRoutedEventArgs e) + { + if (e.Handled) + { + return; + } + + var ctrlPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down); + var altPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Menu).HasFlag(CoreVirtualKeyStates.Down); + var shiftPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down); + var winPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.LeftWindows).HasFlag(CoreVirtualKeyStates.Down) || + InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.RightWindows).HasFlag(CoreVirtualKeyStates.Down); + + var result = ViewModel?.CheckKeybinding(ctrlPressed, altPressed, shiftPressed, winPressed, e.Key); + + if (result == ContextKeybindingResult.Hide) + { + e.Handled = true; + WeakReferenceMessenger.Default.Send(); + UpdateUiForStackChange(); + } + else if (result == ContextKeybindingResult.KeepOpen) + { + e.Handled = true; + } + else if (result == ContextKeybindingResult.Unhandled) + { + e.Handled = false; + } + } + + private void ViewModel_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + var prop = e.PropertyName; + + if (prop == nameof(ContextMenuViewModel.FilteredItems)) + { + UpdateUiForStackChange(); + } + } + + private void ContextFilterBox_TextChanged(object sender, TextChangedEventArgs e) + { + ViewModel?.SetSearchText(ContextFilterBox.Text); + + if (CommandsDropdown.SelectedIndex == -1) + { + CommandsDropdown.SelectedIndex = 0; + } + } + + private void ContextFilterBox_KeyDown(object sender, KeyRoutedEventArgs e) + { + var ctrlPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down); + var altPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Menu).HasFlag(CoreVirtualKeyStates.Down); + var shiftPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down); + var winPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.LeftWindows).HasFlag(CoreVirtualKeyStates.Down) || + InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.RightWindows).HasFlag(CoreVirtualKeyStates.Down); + + if (e.Key == VirtualKey.Enter) + { + if (CommandsDropdown.SelectedItem is CommandContextItemViewModel item) + { + if (InvokeCommand(item) == ContextKeybindingResult.Hide) + { + WeakReferenceMessenger.Default.Send(); + } + + UpdateUiForStackChange(); + + e.Handled = true; + } + } + else if (e.Key == VirtualKey.Escape || + (e.Key == VirtualKey.Left && altPressed)) + { + if (ViewModel.CanPopContextStack()) + { + ViewModel.PopContextStack(); + UpdateUiForStackChange(); + } + else + { + WeakReferenceMessenger.Default.Send(); + WeakReferenceMessenger.Default.Send(); + UpdateUiForStackChange(); + } + + e.Handled = true; + } + + CommandsDropdown_KeyDown(sender, e); + } + + private void ContextFilterBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e) + { + if (e.Key == VirtualKey.Up) + { + NavigateUp(); + + e.Handled = true; + } + else if (e.Key == VirtualKey.Down) + { + NavigateDown(); + + e.Handled = true; + } + } + + private void NavigateUp() + { + var newIndex = CommandsDropdown.SelectedIndex; + + if (CommandsDropdown.SelectedIndex > 0) + { + newIndex--; + + while ( + newIndex >= 0 && + IsSeparator(CommandsDropdown.Items[newIndex]) && + newIndex != CommandsDropdown.SelectedIndex) + { + newIndex--; + } + + if (newIndex < 0) + { + newIndex = CommandsDropdown.Items.Count - 1; + + while ( + newIndex >= 0 && + IsSeparator(CommandsDropdown.Items[newIndex]) && + newIndex != CommandsDropdown.SelectedIndex) + { + newIndex--; + } + } + } + else + { + newIndex = CommandsDropdown.Items.Count - 1; + } + + CommandsDropdown.SelectedIndex = newIndex; + } + + private void NavigateDown() + { + var newIndex = CommandsDropdown.SelectedIndex; + + if (CommandsDropdown.SelectedIndex == CommandsDropdown.Items.Count - 1) + { + newIndex = 0; + } + else + { + newIndex++; + + while ( + newIndex < CommandsDropdown.Items.Count && + IsSeparator(CommandsDropdown.Items[newIndex]) && + newIndex != CommandsDropdown.SelectedIndex) + { + newIndex++; + } + + if (newIndex >= CommandsDropdown.Items.Count) + { + newIndex = 0; + + while ( + newIndex < CommandsDropdown.Items.Count && + IsSeparator(CommandsDropdown.Items[newIndex]) && + newIndex != CommandsDropdown.SelectedIndex) + { + newIndex++; + } + } + } + + CommandsDropdown.SelectedIndex = newIndex; + } + + private bool IsSeparator(object item) + { + return item is SeparatorContextItemViewModel; + } + + private void UpdateUiForStackChange() + { + ContextFilterBox.Text = string.Empty; + ViewModel?.SetSearchText(string.Empty); + CommandsDropdown.SelectedIndex = 0; + } + + /// + /// Manually focuses our search box. This needs to be called after we're actually + /// In the UI tree - if we're in a Flyout, that's not until Opened() + /// + internal void FocusSearchBox() + { + ContextFilterBox.Focus(FocusState.Programmatic); + } + + private ContextKeybindingResult InvokeCommand(CommandItemViewModel command) => ViewModel.InvokeCommand(command); +} diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/IconBox.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/IconBox.cs index 34f0683440..ba4c9d8c17 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/IconBox.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/IconBox.cs @@ -2,11 +2,13 @@ // 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.CmdPal.Core.ViewModels; using Microsoft.CmdPal.UI.Deferred; -using Microsoft.CmdPal.UI.ViewModels; using Microsoft.UI.Dispatching; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; + using Windows.Foundation; namespace Microsoft.CmdPal.UI.Controls; @@ -49,6 +51,12 @@ public partial class IconBox : ContentControl /// public event TypedEventHandler? SourceRequested; + public IconBox() + { + TabFocusNavigation = KeyboardNavigationMode.Once; + IsTabStop = false; + } + private static void OnSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is IconBox @this) diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/SearchBar.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/SearchBar.xaml.cs index c868e3dd5e..c5ace1211f 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/SearchBar.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/SearchBar.xaml.cs @@ -2,11 +2,10 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Diagnostics; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.WinUI; -using Microsoft.CmdPal.UI.ViewModels; -using Microsoft.CmdPal.UI.ViewModels.Messages; +using Microsoft.CmdPal.Core.ViewModels; +using Microsoft.CmdPal.Core.ViewModels.Messages; using Microsoft.CmdPal.UI.Views; using Microsoft.UI.Dispatching; using Microsoft.UI.Input; @@ -21,6 +20,7 @@ namespace Microsoft.CmdPal.UI.Controls; public sealed partial class SearchBar : UserControl, IRecipient, IRecipient, + IRecipient, ICurrentPageAware { private readonly DispatcherQueue _queue = DispatcherQueue.GetForCurrentThread(); @@ -31,6 +31,10 @@ public sealed partial class SearchBar : UserControl, private readonly DispatcherQueueTimer _debounceTimer = DispatcherQueue.GetForCurrentThread().CreateTimer(); private bool _isBackspaceHeld; + private bool _inSuggestion; + private string? _lastText; + private string? _deletedSuggestion; + public PageViewModel? CurrentPageViewModel { get => (PageViewModel?)GetValue(CurrentPageViewModelProperty); @@ -69,6 +73,7 @@ public sealed partial class SearchBar : UserControl, this.InitializeComponent(); WeakReferenceMessenger.Default.Register(this); WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); } public void ClearSearch() @@ -122,18 +127,9 @@ public sealed partial class SearchBar : UserControl, else if (ctrlPressed && e.Key == VirtualKey.K) { // ctrl+k - WeakReferenceMessenger.Default.Send(); + WeakReferenceMessenger.Default.Send(new OpenContextMenuMessage(null, null, null, ContextMenuFilterLocation.Bottom)); e.Handled = true; } - else if (e.Key == VirtualKey.Right) - { - if (CurrentPageViewModel != null && !string.IsNullOrEmpty(CurrentPageViewModel.TextToSuggest)) - { - FilterBox.Text = CurrentPageViewModel.TextToSuggest; - FilterBox.Select(FilterBox.Text.Length, 0); - e.Handled = true; - } - } else if (e.Key == VirtualKey.Escape) { if (string.IsNullOrEmpty(FilterBox.Text)) @@ -162,10 +158,6 @@ public sealed partial class SearchBar : UserControl, CurrentPageViewModel.Filter = FilterBox.Text; } } - else if (e.Key == VirtualKey.Left && altPressed) - { - WeakReferenceMessenger.Default.Send(new()); - } if (!e.Handled) { @@ -204,12 +196,65 @@ public sealed partial class SearchBar : UserControl, e.Handled = true; } + else if (e.Key == VirtualKey.Right) + { + if (_inSuggestion) + { + _inSuggestion = false; + _lastText = null; + DoFilterBoxUpdate(); + } + } else if (e.Key == VirtualKey.Down) { WeakReferenceMessenger.Default.Send(); e.Handled = true; } + + if (_inSuggestion) + { + if ( + e.Key == VirtualKey.Back || + e.Key == VirtualKey.Delete + ) + { + _deletedSuggestion = FilterBox.Text; + + FilterBox.Text = _lastText ?? string.Empty; + FilterBox.Select(FilterBox.Text.Length, 0); + + // Logger.LogInfo("deleting suggestion"); + _inSuggestion = false; + _lastText = null; + + e.Handled = true; + return; + } + + var ignoreLeave = + + e.Key == VirtualKey.Up || + e.Key == VirtualKey.Down || + + e.Key == VirtualKey.RightMenu || + e.Key == VirtualKey.LeftMenu || + e.Key == VirtualKey.Menu || + e.Key == VirtualKey.Shift || + e.Key == VirtualKey.RightShift || + e.Key == VirtualKey.LeftShift || + e.Key == VirtualKey.RightControl || + e.Key == VirtualKey.LeftControl || + e.Key == VirtualKey.Control; + if (ignoreLeave) + { + return; + } + + // Logger.LogInfo("leaving suggestion"); + _inSuggestion = false; + _lastText = null; + } } private void FilterBox_PreviewKeyUp(object sender, KeyRoutedEventArgs e) @@ -223,7 +268,7 @@ public sealed partial class SearchBar : UserControl, private void FilterBox_TextChanged(object sender, TextChangedEventArgs e) { - Debug.WriteLine($"FilterBox_TextChanged: {FilterBox.Text}"); + // Logger.LogInfo($"FilterBox_TextChanged: {FilterBox.Text}"); // TERRIBLE HACK TODO GH #245 // There's weird wacky bugs with debounce currently. We're trying @@ -232,23 +277,22 @@ public sealed partial class SearchBar : UserControl, // (otherwise aliases just stop working) if (FilterBox.Text.Length == 1) { - if (CurrentPageViewModel != null) - { - CurrentPageViewModel.Filter = FilterBox.Text; - } + DoFilterBoxUpdate(); return; } + if (_inSuggestion) + { + // Logger.LogInfo($"-- skipping, in suggestion --"); + return; + } + // TODO: We could encapsulate this in a Behavior if we wanted to bind to the Filter property. _debounceTimer.Debounce( () => { - // Actually plumb Filtering to the viewmodel - if (CurrentPageViewModel != null) - { - CurrentPageViewModel.Filter = FilterBox.Text; - } + DoFilterBoxUpdate(); }, //// Couldn't find a good recommendation/resource for value here. PT uses 50ms as default, so that is a reasonable default //// This seems like a useful testing site for typing times: https://keyboardtester.info/keyboard-latency-test/ @@ -258,6 +302,21 @@ public sealed partial class SearchBar : UserControl, immediate: FilterBox.Text.Length <= 1); } + private void DoFilterBoxUpdate() + { + if (_inSuggestion) + { + // Logger.LogInfo($"--- skipping ---"); + return; + } + + // Actually plumb Filtering to the view model + if (CurrentPageViewModel != null) + { + CurrentPageViewModel.Filter = FilterBox.Text; + } + } + // Used to handle the case when a ListPage's `SearchText` may have changed private void Page_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) { @@ -282,7 +341,7 @@ public sealed partial class SearchBar : UserControl, { // GH #38712: // The ListPage will notify us of the `InitialSearchText` when - // we first load the viewmodel. We can use that as an + // we first load the view model. We can use that as an // opportunity to immediately select the search text. That lets // the user start typing a new search without manually // selecting the old one. @@ -294,4 +353,96 @@ public sealed partial class SearchBar : UserControl, public void Receive(GoHomeMessage message) => ClearSearch(); public void Receive(FocusSearchBoxMessage message) => FilterBox.Focus(Microsoft.UI.Xaml.FocusState.Programmatic); + + public void Receive(UpdateSuggestionMessage message) + { + var suggestion = message.TextToSuggest; + + _queue.TryEnqueue(new(() => + { + var clearSuggestion = string.IsNullOrEmpty(suggestion); + + if (clearSuggestion && _inSuggestion) + { + // Logger.LogInfo($"Cleared suggestion \"{_lastText}\" to {suggestion}"); + _inSuggestion = false; + FilterBox.Text = _lastText ?? string.Empty; + _lastText = null; + return; + } + + if (clearSuggestion) + { + _deletedSuggestion = null; + return; + } + + if (suggestion == _deletedSuggestion) + { + return; + } + else + { + _deletedSuggestion = null; + } + + var currentText = _lastText ?? FilterBox.Text; + + _lastText = currentText; + + // if (_inSuggestion) + // { + // Logger.LogInfo($"Suggestion from \"{_lastText}\" to {suggestion}"); + // } + // else + // { + // Logger.LogInfo($"Entering suggestion from \"{_lastText}\" to {suggestion}"); + // } + _inSuggestion = true; + + var matchedChars = 0; + var suggestionStartsWithQuote = suggestion.Length > 0 && suggestion[0] == '"'; + var currentStartsWithQuote = currentText.Length > 0 && currentText[0] == '"'; + var skipCheckingFirst = suggestionStartsWithQuote && !currentStartsWithQuote; + for (int i = skipCheckingFirst ? 1 : 0, j = 0; + i < suggestion.Length && j < currentText.Length; + i++, j++) + { + if (string.Equals( + suggestion[i].ToString(), + currentText[j].ToString(), + StringComparison.OrdinalIgnoreCase)) + { + matchedChars++; + } + else + { + break; + } + } + + var first = skipCheckingFirst ? "\"" : string.Empty; + var second = currentText.AsSpan(0, matchedChars); + var third = suggestion.AsSpan(matchedChars + (skipCheckingFirst ? 1 : 0)); + + var newText = string.Concat( + first, + second, + third); + + FilterBox.Text = newText; + + var wrappedInQuotes = suggestionStartsWithQuote && suggestion.Last() == '"'; + if (wrappedInQuotes) + { + FilterBox.Select( + (skipCheckingFirst ? 1 : 0) + matchedChars, + Math.Max(0, suggestion.Length - matchedChars - 1 + (skipCheckingFirst ? -1 : 0))); + } + else + { + FilterBox.Select(matchedChars, suggestion.Length - matchedChars); + } + })); + } } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/HotkeySettingsControlHook.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/HotkeySettingsControlHook.cs index 66f482f502..6ea1c708a7 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/HotkeySettingsControlHook.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/HotkeySettingsControlHook.cs @@ -12,7 +12,7 @@ public delegate bool IsActive(); public delegate bool FilterAccessibleKeyboardEvents(int key, UIntPtr extraInfo); -public class HotkeySettingsControlHook : IDisposable +public partial class HotkeySettingsControlHook : IDisposable { private const int WmKeyDown = 0x100; private const int WmKeyUp = 0x101; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/NativeKeyboardHelper.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/NativeKeyboardHelper.cs index 9d3961f907..48b02c4412 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/NativeKeyboardHelper.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/NativeKeyboardHelper.cs @@ -5,82 +5,81 @@ using System; using System.Runtime.InteropServices; -namespace Microsoft.PowerToys.Settings.UI.Helpers +namespace Microsoft.PowerToys.Settings.UI.Helpers; + +internal static class NativeKeyboardHelper { - internal static class NativeKeyboardHelper + [StructLayout(LayoutKind.Sequential)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] + internal struct INPUT { - [StructLayout(LayoutKind.Sequential)] - [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] - internal struct INPUT - { - internal INPUTTYPE type; - internal InputUnion data; + internal INPUTTYPE type; + internal InputUnion data; - internal static int Size - { - get { return Marshal.SizeOf(typeof(INPUT)); } - } - } - - [StructLayout(LayoutKind.Explicit)] - [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] - internal struct InputUnion + internal static int Size { - [FieldOffset(0)] - internal MOUSEINPUT mi; - [FieldOffset(0)] - internal KEYBDINPUT ki; - [FieldOffset(0)] - internal HARDWAREINPUT hi; - } - - [StructLayout(LayoutKind.Sequential)] - [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] - internal struct MOUSEINPUT - { - internal int dx; - internal int dy; - internal int mouseData; - internal uint dwFlags; - internal uint time; - internal UIntPtr dwExtraInfo; - } - - [StructLayout(LayoutKind.Sequential)] - [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] - internal struct KEYBDINPUT - { - internal short wVk; - internal short wScan; - internal uint dwFlags; - internal int time; - internal UIntPtr dwExtraInfo; - } - - [StructLayout(LayoutKind.Sequential)] - [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] - internal struct HARDWAREINPUT - { - internal int uMsg; - internal short wParamL; - internal short wParamH; - } - - internal enum INPUTTYPE : uint - { - INPUT_MOUSE = 0, - INPUT_KEYBOARD = 1, - INPUT_HARDWARE = 2, - } - - [Flags] - internal enum KeyEventF - { - KeyDown = 0x0000, - ExtendedKey = 0x0001, - KeyUp = 0x0002, - Unicode = 0x0004, - Scancode = 0x0008, + get { return Marshal.SizeOf(); } } } + + [StructLayout(LayoutKind.Explicit)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] + internal struct InputUnion + { + [FieldOffset(0)] + internal MOUSEINPUT mi; + [FieldOffset(0)] + internal KEYBDINPUT ki; + [FieldOffset(0)] + internal HARDWAREINPUT hi; + } + + [StructLayout(LayoutKind.Sequential)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] + internal struct MOUSEINPUT + { + internal int dx; + internal int dy; + internal int mouseData; + internal uint dwFlags; + internal uint time; + internal UIntPtr dwExtraInfo; + } + + [StructLayout(LayoutKind.Sequential)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] + internal struct KEYBDINPUT + { + internal short wVk; + internal short wScan; + internal uint dwFlags; + internal int time; + internal UIntPtr dwExtraInfo; + } + + [StructLayout(LayoutKind.Sequential)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Matching Native Structure")] + internal struct HARDWAREINPUT + { + internal int uMsg; + internal short wParamL; + internal short wParamH; + } + + internal enum INPUTTYPE : uint + { + INPUT_MOUSE = 0, + INPUT_KEYBOARD = 1, + INPUT_HARDWARE = 2, + } + + [Flags] + internal enum KeyEventF + { + KeyDown = 0x0000, + ExtendedKey = 0x0001, + KeyUp = 0x0002, + Unicode = 0x0004, + Scancode = 0x0008, + } } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/NativeMethods.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/NativeMethods.cs index f89b11391b..38a50a0b94 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/NativeMethods.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/NativeMethods.cs @@ -7,7 +7,7 @@ using System.Text; namespace Microsoft.PowerToys.Settings.UI.Helpers; -public static class NativeMethods +public static partial class NativeMethods { private const int WS_POPUP = 1 << 31; // 0x80000000 internal const int GWL_STYLE = -16; @@ -26,11 +26,11 @@ public static class NativeMethods [DllImport("user32.dll")] internal static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl); - [DllImport("user32.dll")] - internal static extern uint SendInput(uint nInputs, NativeKeyboardHelper.INPUT[] pInputs, int cbSize); + [LibraryImport("user32.dll")] + internal static partial uint SendInput(uint nInputs, NativeKeyboardHelper.INPUT[] pInputs, int cbSize); - [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] - internal static extern short GetAsyncKeyState(int vKey); + [LibraryImport("user32.dll")] + internal static partial short GetAsyncKeyState(int vKey); [DllImport("user32.dll", SetLastError = true)] internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/ShortcutDialogContentControl.xaml b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/ShortcutDialogContentControl.xaml index 7932a27e91..56ae0bfca6 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/ShortcutDialogContentControl.xaml +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ShortcutControl/ShortcutDialogContentControl.xaml @@ -4,8 +4,8 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="using:Microsoft.CmdPal.UI.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:labToolkit="using:CommunityToolkit.Labs.WinUI.MarkdownTextBlock" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:tk7controls="using:CommunityToolkit.WinUI.UI.Controls" x:Name="ShortcutContentControl" mc:Ignorable="d"> @@ -66,7 +66,7 @@ IsTabStop="{Binding ElementName=ShortcutContentControl, Path=IsWarningAltGr, Mode=OneWay}" Severity="Warning" /> - @@ -36,7 +36,7 @@ - + - - + + - - + + diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/Tag.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/Tag.xaml.cs index ec1be70904..9f96eebd1d 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/Tag.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/Tag.xaml.cs @@ -2,8 +2,8 @@ // 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.CmdPal.Core.ViewModels; using Microsoft.CmdPal.UI.Helpers; -using Microsoft.CmdPal.UI.ViewModels; using Microsoft.CommandPalette.Extensions; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/ContentTemplateSelector.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/ContentTemplateSelector.cs index ddcf4e0de5..9f05246597 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/ContentTemplateSelector.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/ContentTemplateSelector.cs @@ -2,6 +2,7 @@ // 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.CmdPal.Core.ViewModels; using Microsoft.CmdPal.UI.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/ContextItemTemplateSelector.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/ContextItemTemplateSelector.cs index b9ff7c3439..d2af6ca6d6 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/ContextItemTemplateSelector.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/ContextItemTemplateSelector.cs @@ -2,9 +2,11 @@ // 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.CmdPal.UI.ViewModels; +using Microsoft.CmdPal.Core.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; namespace Microsoft.CmdPal.UI; @@ -14,8 +16,29 @@ internal sealed partial class ContextItemTemplateSelector : DataTemplateSelector public DataTemplate? Critical { get; set; } - protected override DataTemplate? SelectTemplateCore(object item) + public DataTemplate? Separator { get; set; } + + protected override DataTemplate? SelectTemplateCore(object item, DependencyObject dependencyObject) { - return ((CommandContextItemViewModel)item).IsCritical ? Critical : Default; + DataTemplate? dataTemplate = Default; + + if (dependencyObject is ListViewItem li) + { + li.IsEnabled = true; + + if (item is SeparatorContextItemViewModel) + { + li.IsEnabled = false; + li.AllowFocusWhenDisabled = false; + li.AllowFocusOnInteraction = false; + dataTemplate = Separator; + } + else + { + dataTemplate = ((CommandContextItemViewModel)item).IsCritical ? Critical : Default; + } + } + + return dataTemplate; } } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/DetailsDataTemplateSelector.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/DetailsDataTemplateSelector.cs index bff62bb97f..58ca7c783d 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/DetailsDataTemplateSelector.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Converters/DetailsDataTemplateSelector.cs @@ -2,7 +2,7 @@ // 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.CmdPal.UI.ViewModels; +using Microsoft.CmdPal.Core.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/BeginInvoke.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/BeginInvoke.cs index 37659cbd31..54dd49fdc0 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/BeginInvoke.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/BeginInvoke.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.PowerToys.Telemetry; using Microsoft.PowerToys.Telemetry.Events; @@ -9,6 +10,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class BeginInvoke : EventBase, IEvent { public PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalDismissedOnEsc.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalDismissedOnEsc.cs index 3e550639ad..2a6b74e0ef 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalDismissedOnEsc.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalDismissedOnEsc.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.PowerToys.Telemetry; @@ -10,6 +11,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class CmdPalDismissedOnEsc : EventBase, IEvent { public PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalDismissedOnLostFocus.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalDismissedOnLostFocus.cs index 0b760a8c36..77942dc213 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalDismissedOnLostFocus.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalDismissedOnLostFocus.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.CommandPalette.Extensions; using Microsoft.PowerToys.Telemetry; @@ -10,6 +11,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class CmdPalDismissedOnLostFocus : EventBase, IEvent { public PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalHotkeySummoned.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalHotkeySummoned.cs index 2023783151..581e15cc71 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalHotkeySummoned.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalHotkeySummoned.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.CommandPalette.Extensions; using Microsoft.PowerToys.Telemetry; @@ -10,6 +11,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class CmdPalHotkeySummoned : EventBase, IEvent { public bool Global { get; set; } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalInvokeResult.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalInvokeResult.cs index a1b30a8b96..f4f8b4d0e8 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalInvokeResult.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalInvokeResult.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.CommandPalette.Extensions; using Microsoft.PowerToys.Telemetry; @@ -10,6 +11,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class CmdPalInvokeResult : EventBase, IEvent { public string ResultKind { get; set; } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalProcessStarted.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalProcessStarted.cs index 322dd60319..9dada92d8c 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalProcessStarted.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/CmdPalProcessStarted.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.CommandPalette.Extensions; using Microsoft.PowerToys.Telemetry; @@ -10,6 +11,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class CmdPalProcessStarted : EventBase, IEvent { public PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/ColdLaunch.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/ColdLaunch.cs index 0da950d5c4..ec45f8bf54 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/ColdLaunch.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/ColdLaunch.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.PowerToys.Telemetry; using Microsoft.PowerToys.Telemetry.Events; @@ -9,6 +10,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class ColdLaunch : EventBase, IEvent { public PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/OpenPage.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/OpenPage.cs index 8ff7107104..040dd146d0 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/OpenPage.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/OpenPage.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.PowerToys.Telemetry; using Microsoft.PowerToys.Telemetry.Events; @@ -9,6 +10,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class OpenPage : EventBase, IEvent { public int PageDepth { get; set; } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/ReactivateInstance.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/ReactivateInstance.cs index c5f70d2905..e502899786 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/ReactivateInstance.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Events/ReactivateInstance.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using Microsoft.PowerToys.Telemetry; using Microsoft.PowerToys.Telemetry.Events; @@ -9,6 +10,7 @@ using Microsoft.PowerToys.Telemetry.Events; namespace Microsoft.CmdPal.UI.Events; [EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public class ReactivateInstance : EventBase, IEvent { public PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/CleanupHelper.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/CleanupHelper.xaml.cs index 3436e46481..1b8f35a4e0 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/CleanupHelper.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/CleanupHelper.xaml.cs @@ -2,16 +2,9 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Diagnostics; -using CommunityToolkit.Mvvm.Messaging; -using Microsoft.CmdPal.UI.ViewModels; -using Microsoft.CmdPal.UI.ViewModels.Messages; -using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media; -using Microsoft.UI.Xaml.Navigation; namespace Microsoft.CmdPal.UI; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/ContentPage.xaml b/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/ContentPage.xaml index 8cc1174a1b..5c128192d8 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/ContentPage.xaml +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/ContentPage.xaml @@ -9,16 +9,25 @@ xmlns:cmdpalUI="using:Microsoft.CmdPal.UI" xmlns:controls="using:CommunityToolkit.WinUI.Controls" xmlns:converters="using:CommunityToolkit.WinUI.Converters" + xmlns:coreViewModels="using:Microsoft.CmdPal.Core.ViewModels" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:labToolkit="using:CommunityToolkit.Labs.WinUI.MarkdownTextBlock" xmlns:local="using:Microsoft.CmdPal.UI" + xmlns:markdownTextBlockRns="using:CommunityToolkit.WinUI.Controls.MarkdownTextBlockRns" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:toolkit="using:CommunityToolkit.WinUI.UI.Controls" - xmlns:viewmodels="using:Microsoft.CmdPal.UI.ViewModels" + xmlns:viewModels="using:Microsoft.CmdPal.UI.ViewModels" Background="Transparent" mc:Ignorable="d"> + + + - + - + - - + - + - - + - + @@ -27,7 +28,7 @@ EmptyValue="Collapsed" NotEmptyValue="Visible" /> - + - + + + + + + + + + --> diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/ListPage.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/ListPage.xaml.cs index 8e2865caa6..3c9cebcf3e 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/ListPage.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/ExtViews/ListPage.xaml.cs @@ -5,8 +5,9 @@ using System.Diagnostics; using CommunityToolkit.Mvvm.Messaging; using ManagedCommon; +using Microsoft.CmdPal.Core.ViewModels; +using Microsoft.CmdPal.Core.ViewModels.Messages; using Microsoft.CmdPal.UI.ViewModels; -using Microsoft.CmdPal.UI.ViewModels.Messages; using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -244,7 +245,7 @@ public sealed partial class ListPage : Page, } else if (e.NewValue == null) { - Logger.LogDebug("cleared viewmodel"); + Logger.LogDebug("cleared view model"); } } } @@ -264,6 +265,13 @@ public sealed partial class ListPage : Page, { ItemsList.SelectedIndex = 0; } + + // Always reset the selected item when the top-level list page changes + // its items + if (!sender.IsNested) + { + ItemsList.SelectedIndex = 0; + } } private void ViewModel_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) @@ -294,4 +302,31 @@ public sealed partial class ListPage : Page, return null; } + + private void ItemsList_RightTapped(object sender, RightTappedRoutedEventArgs e) + { + if (e.OriginalSource is FrameworkElement element && + element.DataContext is ListItemViewModel item) + { + if (ItemsList.SelectedItem != item) + { + ItemsList.SelectedItem = item; + } + + ViewModel?.UpdateSelectedItemCommand.Execute(item); + + var pos = e.GetPosition(element); + + _ = DispatcherQueue.TryEnqueue( + () => + { + WeakReferenceMessenger.Default.Send( + new OpenContextMenuMessage( + element, + Microsoft.UI.Xaml.Controls.Primitives.FlyoutPlacementMode.BottomEdgeAlignedLeft, + pos, + ContextMenuFilterLocation.Top)); + }); + } + } } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/IconCacheProvider.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/IconCacheProvider.cs index 01c9f05f4d..b8860fa53d 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/IconCacheProvider.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/IconCacheProvider.cs @@ -2,8 +2,9 @@ // 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.CmdPal.Core.ViewModels; using Microsoft.CmdPal.UI.Controls; -using Microsoft.CmdPal.UI.ViewModels; +using Microsoft.CmdPal.UI.Helpers; namespace Microsoft.CmdPal.UI.Helpers; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/IconCacheService.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/IconCacheService.cs index acf41fee1e..3b4bc56ffd 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/IconCacheService.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/IconCacheService.cs @@ -3,7 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Diagnostics; -using Microsoft.CmdPal.UI.ViewModels; +using Microsoft.CmdPal.Core.ViewModels; using Microsoft.Terminal.UI; using Microsoft.UI.Dispatching; using Microsoft.UI.Xaml.Controls; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/TelemetryForwarder.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/TelemetryForwarder.cs new file mode 100644 index 0000000000..53756da785 --- /dev/null +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/TelemetryForwarder.cs @@ -0,0 +1,40 @@ +// 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 CommunityToolkit.Mvvm.Messaging; +using Microsoft.CmdPal.Core.ViewModels.Messages; +using Microsoft.CmdPal.UI.Events; +using Microsoft.PowerToys.Telemetry; + +namespace Microsoft.CmdPal.UI; + +/// +/// TelemetryForwarder is responsible for forwarding telemetry events from the +/// command palette core to PowerToys Telemetry. +/// This allows us to emit telemetry events as messages from the core, +/// and then handle them by logging to our PT telemetry provider. +/// +/// We may in the future want to replace this with a more generic "ITelemetryService" +/// or something similar, but this works for now. +/// +internal sealed class TelemetryForwarder : + IRecipient, + IRecipient +{ + public TelemetryForwarder() + { + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + } + + public void Receive(CmdPalInvokeResultMessage message) + { + PowerToysTelemetry.Log.WriteEvent(new CmdPalInvokeResult(message.Kind)); + } + + public void Receive(BeginInvokeMessage message) + { + PowerToysTelemetry.Log.WriteEvent(new BeginInvoke()); + } +} diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/TrayIconService.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/TrayIconService.cs index 3aae253512..496c7cf9b7 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/TrayIconService.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/TrayIconService.cs @@ -5,8 +5,8 @@ using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using CommunityToolkit.Mvvm.Messaging; +using Microsoft.CmdPal.Core.ViewModels.Messages; using Microsoft.CmdPal.UI.ViewModels; -using Microsoft.CmdPal.UI.ViewModels.Messages; using Microsoft.UI.Xaml; using Windows.Win32; using Windows.Win32.Foundation; @@ -72,7 +72,7 @@ internal sealed partial class TrayIconService _largeIcon = GetAppIconHandle(); _trayIconData = new NOTIFYICONDATAW() { - cbSize = (uint)Marshal.SizeOf(typeof(NOTIFYICONDATAW)), + cbSize = (uint)Marshal.SizeOf(), hWnd = _hwnd, uID = MY_NOTIFY_ID, uFlags = NOTIFY_ICON_DATA_FLAGS.NIF_MESSAGE | NOTIFY_ICON_DATA_FLAGS.NIF_ICON | NOTIFY_ICON_DATA_FLAGS.NIF_TIP, @@ -133,7 +133,7 @@ internal sealed partial class TrayIconService private DestroyIconSafeHandle GetAppIconHandle() { - var exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; + var exePath = Path.Combine(AppContext.BaseDirectory, "Microsoft.CmdPal.UI.exe"); DestroyIconSafeHandle largeIcon; PInvoke.ExtractIconEx(exePath, 0, out largeIcon, out _, 1); return largeIcon; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/WindowExtensions.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/WindowExtensions.cs index 406f261e6c..99ff327ea2 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/WindowExtensions.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Helpers/WindowExtensions.cs @@ -17,4 +17,19 @@ public static class WindowExtensions AppWindow appWindow = AppWindow.GetFromWindowId(windowId); appWindow.SetIcon(@"Assets\icon.ico"); } + + public static void SetVisibilityInSwitchers(this Window window, bool showInSwitchers) + { + try + { + // IsShownInSwitchers needs to change the value to apply the effect, but its state might be out-of-sync with + // the actual state of the switchers, so we need to toggle it. + window.AppWindow.IsShownInSwitchers = !showInSwitchers; + window.AppWindow.IsShownInSwitchers = showInSwitchers; + } + catch (NotImplementedException) + { + // SetShownInSwitchers failed. This can happen if the Explorer is not running. + } + } } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml b/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml index 450625cfb5..d06932fd59 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml @@ -5,7 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:pages="using:Microsoft.CmdPal.UI.Pages" - xmlns:viewmodels="using:Microsoft.CmdPal.UI.ViewModels" + xmlns:viewModels="using:Microsoft.CmdPal.UI.ViewModels" xmlns:winuiex="using:WinUIEx" Width="800" Height="480" diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs index f66ddf5445..3d2c9b8c47 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs @@ -2,16 +2,19 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics; using System.Runtime.InteropServices; using CmdPalKeyboardService; using CommunityToolkit.Mvvm.Messaging; +using ManagedCommon; using Microsoft.CmdPal.Common.Helpers; using Microsoft.CmdPal.Common.Messages; using Microsoft.CmdPal.Common.Services; +using Microsoft.CmdPal.Core.ViewModels; +using Microsoft.CmdPal.Core.ViewModels.Messages; using Microsoft.CmdPal.UI.Events; using Microsoft.CmdPal.UI.Helpers; using Microsoft.CmdPal.UI.ViewModels; -using Microsoft.CmdPal.UI.ViewModels.Messages; using Microsoft.Extensions.DependencyInjection; using Microsoft.PowerToys.Telemetry; using Microsoft.UI.Composition; @@ -42,6 +45,9 @@ public sealed partial class MainWindow : WindowEx, IRecipient, IRecipient { + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1310:Field names should not contain underscore", Justification = "Stylistically, window messages are WM_")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1306:Field names should begin with lower-case letter", Justification = "Stylistically, window messages are WM_")] + private readonly uint WM_TASKBAR_RESTART; private readonly HWND _hwnd; private readonly WNDPROC? _hotkeyWndProc; private readonly WNDPROC? _originalWndProc; @@ -57,7 +63,11 @@ public sealed partial class MainWindow : WindowEx, InitializeComponent(); _hwnd = new HWND(WinRT.Interop.WindowNative.GetWindowHandle(this).ToInt32()); - CommandPaletteHost.SetHostHwnd((ulong)_hwnd.Value); + + unsafe + { + CommandPaletteHost.SetHostHwnd((ulong)_hwnd.Value); + } _keyboardListener = new KeyboardListener(); _keyboardListener.Start(); @@ -83,6 +93,8 @@ public sealed partial class MainWindow : WindowEx, SizeChanged += WindowSizeChanged; RootShellPage.Loaded += RootShellPage_Loaded; + WM_TASKBAR_RESTART = PInvoke.RegisterWindowMessage("TaskbarCreated"); + // LOAD BEARING: If you don't stick the pointer to HotKeyPrc into a // member (and instead like, use a local), then the pointer we marshal // into the WindowLongPtr will be useless after we leave this function, @@ -96,7 +108,7 @@ public sealed partial class MainWindow : WindowEx, App.Current.Services.GetService()!.SettingsChanged += SettingsChangedHandler; // Make sure that we update the acrylic theme when the OS theme changes - RootShellPage.ActualThemeChanged += (s, e) => UpdateAcrylic(); + RootShellPage.ActualThemeChanged += (s, e) => DispatcherQueue.TryEnqueue(UpdateAcrylic); // Hardcoding event name to avoid bringing in the PowerToys.interop dependency. Event name must match CMDPAL_SHOW_EVENT from shared_constants.h NativeEventWaiter.WaitForEventLoop("Local\\PowerToysCmdPal-ShowEvent-62336fcd-8611-4023-9b30-091a6af4cc5a", () => @@ -143,9 +155,7 @@ public sealed partial class MainWindow : WindowEx, _ignoreHotKeyWhenFullScreen = settings.IgnoreShortcutWhenFullscreen; - // This will prevent our window from appearing in alt+tab or the taskbar. - // You'll _need_ to use the hotkey to summon it. - AppWindow.IsShownInSwitchers = System.Diagnostics.Debugger.IsAttached; + this.SetVisibilityInSwitchers(Debugger.IsAttached); } // We want to use DesktopAcrylicKind.Thin and custom colors as this is the default material @@ -166,6 +176,8 @@ public sealed partial class MainWindow : WindowEx, private void UpdateAcrylic() { + _acrylicController?.RemoveAllSystemBackdropTargets(); + _acrylicController = GetAcrylicConfig(Content); // Enable the system backdrop. @@ -201,10 +213,13 @@ public sealed partial class MainWindow : WindowEx, { var hwnd = new HWND(hwndValue != 0 ? hwndValue : _hwnd); + // Make sure our HWND is cloaked before any possible window manipulations + Cloak(); + // Remember, IsIconic == "minimized", which is entirely different state // from "show/hide" // If we're currently minimized, restore us first, before we reveal - // our window. Otherwise we'd just be showing a minimized window - + // our window. Otherwise, we'd just be showing a minimized window - // which would remain not visible to the user. if (PInvoke.IsIconic(hwnd)) { @@ -214,19 +229,18 @@ public sealed partial class MainWindow : WindowEx, var display = GetScreen(hwnd, target); PositionCentered(display); + // Just to be sure, SHOW our hwnd. PInvoke.ShowWindow(hwnd, SHOW_WINDOW_CMD.SW_SHOW); - // instead of showing the window, uncloak it from DWM - // This will make it visible to the user, without the animation or frames for - // loading XAML with composition - unsafe - { - BOOL value = false; - PInvoke.DwmSetWindowAttribute(_hwnd, DWMWINDOWATTRIBUTE.DWMWA_CLOAK, &value, (uint)sizeof(BOOL)); - } + // Once we're done, uncloak to avoid all animations + Uncloak(); PInvoke.SetForegroundWindow(hwnd); PInvoke.SetActiveWindow(hwnd); + + // Push our window to the top of the Z-order and make it the topmost, so that it appears above all other windows. + // We want to remove the topmost status when we hide the window (because we cloak it instead of hiding it). + PInvoke.SetWindowPos(hwnd, HWND.HWND_TOPMOST, 0, 0, 0, 0, SET_WINDOW_POS_FLAGS.SWP_NOMOVE | SET_WINDOW_POS_FLAGS.SWP_NOSIZE); } private DisplayArea GetScreen(HWND currentHwnd, MonitorBehavior target) @@ -282,28 +296,68 @@ public sealed partial class MainWindow : WindowEx, ShowHwnd(message.Hwnd, settings.SummonOn); } - public void Receive(HideWindowMessage message) => HideWindow(); + public void Receive(HideWindowMessage message) + { + // This might come in off the UI thread. Make sure to hop back. + DispatcherQueue.TryEnqueue(() => + { + HideWindow(); + }); + } public void Receive(QuitMessage message) => // This might come in on a background thread DispatcherQueue.TryEnqueue(() => Close()); - public void Receive(DismissMessage message) => - HideWindow(); + public void Receive(DismissMessage message) + { + // This might come in off the UI thread. Make sure to hop back. + DispatcherQueue.TryEnqueue(() => + { + HideWindow(); + }); + } private void HideWindow() { - // Hide our window + // Cloak our HWND to avoid all animations. + Cloak(); - // Instead of hiding the window, cloak it from DWM - // This will make it invisible to the user, such that we can show it again - // by uncloaking it, which avoids an unnecessary "flicker in" that XAML does + // Then hide our HWND, to make sure that the OS gives the FG / focus back to another app + // (there's no way for us to guess what the right hwnd might be, only the OS can do it right) + PInvoke.ShowWindow(_hwnd, SHOW_WINDOW_CMD.SW_HIDE); + + // TRICKY: show our HWND again. This will trick XAML into painting our + // HWND again, so that we avoid the "flicker" caused by a WinUI3 app + // window being first shown + // SW_SHOWNA will prevent us for trying to fight the focus back + PInvoke.ShowWindow(_hwnd, SHOW_WINDOW_CMD.SW_SHOWNA); + + // Intentionally leave the window cloaked. So our window is "visible", + // but also cloaked, so you can't see it. + } + + private void Cloak() + { unsafe { BOOL value = true; PInvoke.DwmSetWindowAttribute(_hwnd, DWMWINDOWATTRIBUTE.DWMWA_CLOAK, &value, (uint)sizeof(BOOL)); } + + // Because we're only cloaking the window, bury it at the bottom in case something can + // see it - e.g. some accessibility helper (note: this also removes the top-most status). + PInvoke.SetWindowPos(_hwnd, HWND.HWND_BOTTOM, 0, 0, 0, 0, SET_WINDOW_POS_FLAGS.SWP_NOMOVE | SET_WINDOW_POS_FLAGS.SWP_NOSIZE); + } + + private void Uncloak() + { + unsafe + { + BOOL value = false; + PInvoke.DwmSetWindowAttribute(_hwnd, DWMWINDOWATTRIBUTE.DWMWA_CLOAK, &value, (uint)sizeof(BOOL)); + } } internal void MainWindow_Closed(object sender, WindowEventArgs args) @@ -414,30 +468,42 @@ public sealed partial class MainWindow : WindowEx, return; } - if (activatedEventArgs.Kind == Microsoft.Windows.AppLifecycle.ExtendedActivationKind.Protocol) + try { - if (activatedEventArgs.Data is IProtocolActivatedEventArgs protocolArgs) + if (activatedEventArgs.Kind == ExtendedActivationKind.StartupTask) { - if (protocolArgs.Uri.ToString() is string uri) - { - // was the URI "x-cmdpal://background" ? - if (uri.StartsWith("x-cmdpal://background", StringComparison.OrdinalIgnoreCase)) - { - // we're running, we don't want to activate our window. bail - return; - } - else if (uri.StartsWith("x-cmdpal://settings", StringComparison.OrdinalIgnoreCase)) - { - WeakReferenceMessenger.Default.Send(new()); - return; - } - } - return; } + + if (activatedEventArgs.Kind == ExtendedActivationKind.Protocol) + { + if (activatedEventArgs.Data is IProtocolActivatedEventArgs protocolArgs) + { + if (protocolArgs.Uri.ToString() is string uri) + { + // was the URI "x-cmdpal://background" ? + if (uri.StartsWith("x-cmdpal://background", StringComparison.OrdinalIgnoreCase)) + { + // we're running, we don't want to activate our window. bail + return; + } + else if (uri.StartsWith("x-cmdpal://settings", StringComparison.OrdinalIgnoreCase)) + { + WeakReferenceMessenger.Default.Send(new()); + return; + } + } + } + } + } + catch (COMException ex) + { + // Accessing properties activatedEventArgs.Kind and activatedEventArgs.Data might cause COMException + // if the args are not valid or not passed correctly. + Logger.LogError("COM exception when activating the application", ex); } - Activate(); + Summon(string.Empty); } public void Summon(string commandId) => @@ -496,18 +562,27 @@ public sealed partial class MainWindow : WindowEx, if (key != null) { - var vk = key.Code; - var modifiers = - (key.Alt ? HOT_KEY_MODIFIERS.MOD_ALT : 0) | - (key.Ctrl ? HOT_KEY_MODIFIERS.MOD_CONTROL : 0) | - (key.Shift ? HOT_KEY_MODIFIERS.MOD_SHIFT : 0) | - (key.Win ? HOT_KEY_MODIFIERS.MOD_WIN : 0) - ; - - var success = PInvoke.RegisterHotKey(_hwnd, _hotkeys.Count, modifiers, (uint)vk); - if (success) + if (settings.UseLowLevelGlobalHotkey) { - _hotkeys.Add(commandHotkey); + _keyboardListener.SetHotkeyAction(key.Win, key.Ctrl, key.Shift, key.Alt, (byte)key.Code, commandHotkey.CommandId); + + _hotkeys.Add(new(globalHotkey, string.Empty)); + } + else + { + var vk = key.Code; + var modifiers = + (key.Alt ? HOT_KEY_MODIFIERS.MOD_ALT : 0) | + (key.Ctrl ? HOT_KEY_MODIFIERS.MOD_CONTROL : 0) | + (key.Shift ? HOT_KEY_MODIFIERS.MOD_SHIFT : 0) | + (key.Win ? HOT_KEY_MODIFIERS.MOD_WIN : 0) + ; + + var success = PInvoke.RegisterHotKey(_hwnd, _hotkeys.Count, modifiers, (uint)vk); + if (success) + { + _hotkeys.Add(commandHotkey); + } } } } @@ -519,6 +594,7 @@ public sealed partial class MainWindow : WindowEx, PowerToysTelemetry.Log.WriteEvent(new CmdPalHotkeySummoned(isRootHotkey)); var isVisible = this.Visible; + unsafe { // We need to check if our window is cloaked or not. A cloaked window is still @@ -548,7 +624,9 @@ public sealed partial class MainWindow : WindowEx, { // ... then manually hide our window. When debugged, we won't get the cool cloaking, // but that's the price to pay for having the HWND not light-dismiss while we're debugging. - PInvoke.ShowWindow(_hwnd, SHOW_WINDOW_CMD.SW_HIDE); + Cloak(); + this.Hide(); + return; } @@ -587,6 +665,14 @@ public sealed partial class MainWindow : WindowEx, return (LRESULT)IntPtr.Zero; } + + default: + if (uMsg == WM_TASKBAR_RESTART) + { + HotReloadSettings(); + } + + break; } return PInvoke.CallWindowProc(_originalWndProc, hwnd, uMsg, wParam, lParam); diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Microsoft.CmdPal.UI.csproj b/src/modules/cmdpal/Microsoft.CmdPal.UI/Microsoft.CmdPal.UI.csproj index 0b653d2d0a..44ef3483e2 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Microsoft.CmdPal.UI.csproj +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Microsoft.CmdPal.UI.csproj @@ -1,5 +1,6 @@  + @@ -23,7 +24,14 @@ false - + + true + false + false + true + + + true @@ -71,7 +79,7 @@ - + @@ -89,10 +97,6 @@ - - - - @@ -105,8 +109,13 @@ + + + + + @@ -118,7 +127,6 @@ - @@ -174,17 +182,6 @@ true - - - - - runtimes\win10-$(Platform)\native - - - - - PreserveNewest diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/NativeMethods.txt b/src/modules/cmdpal/Microsoft.CmdPal.UI/NativeMethods.txt index 427742f95f..a432d9a808 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/NativeMethods.txt +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/NativeMethods.txt @@ -1,12 +1,13 @@ GetPhysicallyInstalledSystemMemory GlobalMemoryStatusEx GetSystemInfo -CoCreateInstance GetForegroundWindow SetForegroundWindow GetWindowRect GetCursorPos SetWindowPos +HWND_TOPMOST +HWND_BOTTOM IsIconic RegisterHotKey UnregisterHotKey @@ -21,10 +22,6 @@ SetActiveWindow MonitorFromWindow GetMonitorInfo GetDpiForMonitor -SHCreateStreamOnFileEx -CoAllowSetForegroundWindow -SHCreateStreamOnFileEx -SHLoadIndirectString WM_HOTKEY WM_NCLBUTTONDBLCLK @@ -33,7 +30,6 @@ LoadIcon WM_USER WM_WINDOWPOSCHANGING RegisterWindowMessageW -GetModuleHandleW ExtractIconEx TRACK_POPUP_MENU_FLAGS WM_COMMAND @@ -48,3 +44,7 @@ MessageBox DwmGetWindowAttribute DwmSetWindowAttribute DWM_CLOAKED_APP + +CoWaitForMultipleObjects +INFINITE +CWMO_FLAGS \ No newline at end of file diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/LoadingPage.xaml b/src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/LoadingPage.xaml index 2d63992e8d..374b45f44f 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/LoadingPage.xaml +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/LoadingPage.xaml @@ -1,4 +1,4 @@ - + - + - +