[Shortcut Guide] Move into separate process (#11359)
14
src/modules/ShortcutGuide/ShortcutGuide/LocProject.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"Projects": [
|
||||
{
|
||||
"LanguageSet": "Azure_Languages",
|
||||
"LocItems": [
|
||||
{
|
||||
"SourceFile": "src\\modules\\ShortcutGuide\\ShortcutGuide\\Resources.resx",
|
||||
"CopyOption": "LangIDOnName",
|
||||
"OutputPath": "src\\modules\\ShortcutGuide\\ShortcutGuide"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
16
src/modules/ShortcutGuide/ShortcutGuide/PropertySheet.props
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Label="PropertySheets" />
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<!--
|
||||
To customize common C++/WinRT project properties:
|
||||
* right-click the project node
|
||||
* expand the Common Properties item
|
||||
* select the C++/WinRT property page
|
||||
|
||||
For more advanced scenarios, and complete documentation, please see:
|
||||
https://github.com/Microsoft/cppwinrt/tree/master/nuget
|
||||
-->
|
||||
<PropertyGroup />
|
||||
<ItemDefinitionGroup />
|
||||
</Project>
|
||||
171
src/modules/ShortcutGuide/ShortcutGuide/Resources.resx
Normal file
@@ -0,0 +1,171 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Setting_Description_Overlay_Opacity" xml:space="preserve">
|
||||
<value>Opacity of the Shortcut Guide's overlay background (%)</value>
|
||||
</data>
|
||||
<data name="Setting_Description_Theme" xml:space="preserve">
|
||||
<value>Choose Shortcut Guide overlay color</value>
|
||||
</data>
|
||||
<data name="Setting_Description_Theme_Light" xml:space="preserve">
|
||||
<value>Light</value>
|
||||
</data>
|
||||
<data name="Setting_Description_Theme_Dark" xml:space="preserve">
|
||||
<value>Dark</value>
|
||||
</data>
|
||||
<data name="Setting_Description_Theme_System" xml:space="preserve">
|
||||
<value>System default app mode</value>
|
||||
</data>
|
||||
<data name="Settings_Description" xml:space="preserve">
|
||||
<value>Shows a help overlay with Windows shortcuts when the Windows key is pressed.</value>
|
||||
</data>
|
||||
<data name="Shortcut_Guide" xml:space="preserve">
|
||||
<value>Shortcut Guide</value>
|
||||
</data>
|
||||
<data name="No_Action" xml:space="preserve">
|
||||
<value>No action</value>
|
||||
</data>
|
||||
<data name="Restore" xml:space="preserve">
|
||||
<value>Restore</value>
|
||||
</data>
|
||||
<data name="Snap_Right" xml:space="preserve">
|
||||
<value>Snap right</value>
|
||||
</data>
|
||||
<data name="Snap_Left" xml:space="preserve">
|
||||
<value>Snap left</value>
|
||||
</data>
|
||||
<data name="Snap_Upper_Right" xml:space="preserve">
|
||||
<value>Snap upper right</value>
|
||||
</data>
|
||||
<data name="Snap_Upper_Left" xml:space="preserve">
|
||||
<value>Snap upper left</value>
|
||||
</data>
|
||||
<data name="Snap_Lower_Right" xml:space="preserve">
|
||||
<value>Snap lower right</value>
|
||||
</data>
|
||||
<data name="Snap_Lower_Left" xml:space="preserve">
|
||||
<value>Snap lower left</value>
|
||||
</data>
|
||||
<data name="Minimize" xml:space="preserve">
|
||||
<value>Minimize</value>
|
||||
</data>
|
||||
<data name="Maximize" xml:space="preserve">
|
||||
<value>Maximize</value>
|
||||
</data>
|
||||
</root>
|
||||
BIN
src/modules/ShortcutGuide/ShortcutGuide/Shortcut-Guide.ico
Normal file
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,54 @@
|
||||
#include <windows.h>
|
||||
#include "Generated Files/resource.h"
|
||||
#include "../../../../common/version/version.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
#include "winres.h"
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_ICON1 ICON "Shortcut-Guide.ico"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION FILE_VERSION
|
||||
PRODUCTVERSION PRODUCT_VERSION
|
||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS VS_FF_DEBUG
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_DLL
|
||||
FILESUBTYPE VFT2_UNKNOWN
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", COMPANY_NAME
|
||||
VALUE "FileDescription", FILE_DESCRIPTION
|
||||
VALUE "FileVersion", FILE_VERSION_STRING
|
||||
VALUE "InternalName", INTERNAL_NAME
|
||||
VALUE "LegalCopyright", COPYRIGHT_NOTE
|
||||
VALUE "OriginalFilename", ORIGINAL_FILENAME
|
||||
VALUE "ProductName", PRODUCT_NAME
|
||||
VALUE "ProductVersion", PRODUCT_VERSION_STRING
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
</assembly>
|
||||
189
src/modules/ShortcutGuide/ShortcutGuide/ShortcutGuide.vcxproj
Normal file
@@ -0,0 +1,189 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.props" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.props')" />
|
||||
<Target Name="GenerateResourceFiles" BeforeTargets="PrepareForBuild">
|
||||
<Exec Command="powershell -NonInteractive -executionpolicy Unrestricted $(SolutionDir)tools\build\convert-resx-to-rc.ps1 $(MSBuildThisFileDirectory) resource.base.h resource.h ShortcutGuide.base.rc ShortcutGuide.rc" />
|
||||
</Target>
|
||||
<PropertyGroup Label="Globals">
|
||||
<CppWinRTOptimized>true</CppWinRTOptimized>
|
||||
<CppWinRTRootNamespaceAutoMerge>true</CppWinRTRootNamespaceAutoMerge>
|
||||
<CppWinRTGenerateWindowsMetadata>true</CppWinRTGenerateWindowsMetadata>
|
||||
<MinimalCoreWin>true</MinimalCoreWin>
|
||||
<VCProjectVersion>15.0</VCProjectVersion>
|
||||
<ProjectGuid>{2edb3eb4-fa92-4bff-b2d8-566584837231}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>ShortcutGuide</RootNamespace>
|
||||
<WindowsTargetPlatformMinVersion>10.0.17134.0</WindowsTargetPlatformMinVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="PropertySheet.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<TargetName>PowerToys.$(MSBuildProjectName)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\modules\ShortcutGuide\$(ProjectName)\</OutDir>
|
||||
<IntDir>$(SolutionDir)$(Platform)\$(Configuration)\obj\ShortcutGuide\$(ProjectName)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>;..\..\..\common\inc;..\..\..\common\Telemetry;..\..\..\;..\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>ole32.lib;Shell32.lib;OleAut32.lib;Dbghelp.lib;Dwmapi.lib;Dcomp.lib;Shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="animation.h" />
|
||||
<ClInclude Include="d2d_svg.h" />
|
||||
<ClInclude Include="d2d_text.h" />
|
||||
<ClInclude Include="d2d_window.h" />
|
||||
<ClInclude Include="Generated Files\resource.h" />
|
||||
<ClInclude Include="native_event_waiter.h" />
|
||||
<ClInclude Include="overlay_window.h" />
|
||||
<ClInclude Include="pch.h" />
|
||||
<ClInclude Include="resource.base.h" />
|
||||
<ClInclude Include="ShortcutGuideSettings.h" />
|
||||
<ClInclude Include="ShortcutGuideConstants.h" />
|
||||
<ClInclude Include="shortcut_guide.h" />
|
||||
<ClInclude Include="start_visible.h" />
|
||||
<ClInclude Include="target_state.h" />
|
||||
<ClInclude Include="tasklist_positions.h" />
|
||||
<ClInclude Include="trace.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="animation.cpp" />
|
||||
<ClCompile Include="d2d_svg.cpp" />
|
||||
<ClCompile Include="d2d_text.cpp" />
|
||||
<ClCompile Include="d2d_window.cpp" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="native_event_waiter.cpp" />
|
||||
<ClCompile Include="overlay_window.cpp" />
|
||||
<ClCompile Include="pch.cpp">
|
||||
<PrecompiledHeader Condition="'$(CIBuild)'!='true'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="shortcut_guide.cpp" />
|
||||
<ClCompile Include="start_visible.cpp" />
|
||||
<ClCompile Include="target_state.cpp" />
|
||||
<ClCompile Include="tasklist_positions.cpp" />
|
||||
<ClCompile Include="trace.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
<None Include="PropertySheet.props" />
|
||||
<CopyFileToFolders Include="svgs\0.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\1.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\2.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\3.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\4.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\5.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\6.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\7.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\8.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\9.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\no_active_window.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\overlay.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\overlay_portrait.svg">
|
||||
<FileType>Document</FileType>
|
||||
<DestinationFolders>$(OutDir)\svgs</DestinationFolders>
|
||||
</CopyFileToFolders>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\common\Display\Display.vcxproj">
|
||||
<Project>{caba8dfb-823b-4bf2-93ac-3f31984150d9}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\common\logger\logger.vcxproj">
|
||||
<Project>{d9b8fc84-322a-4f9f-bbb9-20915c47ddfd}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\common\Themes\Themes.vcxproj">
|
||||
<Project>{98537082-0fdb-40de-abd8-0dc5a4269bab}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources.resx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Generated Files\ShortcutGuide.rc" />
|
||||
<None Include="ShortcutGuide.base.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="Shortcut-Guide.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="ShortcutGuide.exe.manifest" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<Import Project="..\..\..\..\deps\spdlog.props" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
<Import Project="..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.targets')" />
|
||||
</ImportGroup>
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.props'))" />
|
||||
<Error Condition="!Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
@@ -0,0 +1,180 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="svgs">
|
||||
<UniqueIdentifier>{800507f8-718d-48d1-aa56-96c040795b8a}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Generated Files">
|
||||
<UniqueIdentifier>{cb917ac7-30da-494b-81f1-cbe4415e91f4}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="pch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="animation.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="d2d_svg.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="d2d_text.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="d2d_window.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="native_event_waiter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="overlay_window.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="shortcut_guide.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ShortcutGuideConstants.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="start_visible.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="target_state.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="tasklist_positions.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="trace.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="resource.base.h">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Generated Files\resource.h">
|
||||
<Filter>Generated Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ShortcutGuideSettings.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="pch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="main.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="animation.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="d2d_svg.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="d2d_text.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="d2d_window.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="native_event_waiter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="overlay_window.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="shortcut_guide.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="start_visible.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="target_state.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="tasklist_positions.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="trace.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="PropertySheet.props" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="ShortcutGuide.base.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<CopyFileToFolders Include="svgs\0.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\1.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\2.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\3.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\4.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\5.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\6.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\7.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\8.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\9.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\no_active_window.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\overlay.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
<CopyFileToFolders Include="svgs\overlay_portrait.svg">
|
||||
<Filter>svgs</Filter>
|
||||
</CopyFileToFolders>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources.resx">
|
||||
<Filter>Resource Files</Filter>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Generated Files\ShortcutGuide.rc">
|
||||
<Filter>Generated Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="Shortcut-Guide.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Image>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="ShortcutGuide.exe.manifest" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
namespace ShortcutGuideConstants
|
||||
{
|
||||
// Name of the powertoy module.
|
||||
inline const std::wstring ModuleKey = L"Shortcut Guide";
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
struct ShortcutGuideSettings
|
||||
{
|
||||
std::wstring hotkey = L"shift+win+/";
|
||||
int overlayOpacity = 90;
|
||||
std::wstring theme = L"system";
|
||||
std::wstring disabledApps = L"";
|
||||
};
|
||||
51
src/modules/ShortcutGuide/ShortcutGuide/animation.cpp
Normal file
@@ -0,0 +1,51 @@
|
||||
#include "pch.h"
|
||||
#include "animation.h"
|
||||
|
||||
Animation::Animation(double duration, double start, double stop) :
|
||||
duration(duration), start_value(start), end_value(stop), start(std::chrono::high_resolution_clock::now()) {}
|
||||
|
||||
void Animation::reset()
|
||||
{
|
||||
start = std::chrono::high_resolution_clock::now();
|
||||
}
|
||||
void Animation::reset(double duration)
|
||||
{
|
||||
this->duration = duration;
|
||||
reset();
|
||||
}
|
||||
void Animation::reset(double duration, double start, double stop)
|
||||
{
|
||||
start_value = start;
|
||||
end_value = stop;
|
||||
reset(duration);
|
||||
}
|
||||
|
||||
static double ease_out_expo(double t)
|
||||
{
|
||||
return 1 - pow(2, -8 * t);
|
||||
}
|
||||
|
||||
double Animation::apply_animation_function(double t, AnimFunctions apply_function)
|
||||
{
|
||||
switch (apply_function)
|
||||
{
|
||||
case EASE_OUT_EXPO:
|
||||
return ease_out_expo(t);
|
||||
case LINEAR:
|
||||
default:
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
double Animation::value(AnimFunctions apply_function) const
|
||||
{
|
||||
auto anim_duration = std::chrono::high_resolution_clock::now() - start;
|
||||
double t = std::chrono::duration<double>(anim_duration).count() / duration;
|
||||
if (t >= 1)
|
||||
return end_value;
|
||||
return start_value + (end_value - start_value) * apply_animation_function(t, apply_function);
|
||||
}
|
||||
bool Animation::done() const
|
||||
{
|
||||
return std::chrono::high_resolution_clock::now() - start >= std::chrono::duration<double>(duration);
|
||||
}
|
||||
34
src/modules/ShortcutGuide/ShortcutGuide/animation.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
#include <chrono>
|
||||
|
||||
/*
|
||||
Usage:
|
||||
When creating animation constructor takes one parameter - how long
|
||||
should the animation take in seconds.
|
||||
|
||||
Call reset() when starting animation.
|
||||
|
||||
When rendering, call value() to get value from 0 to 1 - depending on animation
|
||||
progress.
|
||||
*/
|
||||
class Animation
|
||||
{
|
||||
public:
|
||||
enum AnimFunctions
|
||||
{
|
||||
LINEAR = 0,
|
||||
EASE_OUT_EXPO
|
||||
};
|
||||
|
||||
Animation(double duration = 1, double start = 0, double stop = 1);
|
||||
void reset();
|
||||
void reset(double duration);
|
||||
void reset(double duration, double start, double stop);
|
||||
double value(AnimFunctions apply_function) const;
|
||||
bool done() const;
|
||||
|
||||
private:
|
||||
static double apply_animation_function(double t, AnimFunctions apply_function);
|
||||
std::chrono::high_resolution_clock::time_point start;
|
||||
double start_value, end_value, duration;
|
||||
};
|
||||
120
src/modules/ShortcutGuide/ShortcutGuide/d2d_svg.cpp
Normal file
@@ -0,0 +1,120 @@
|
||||
#include "pch.h"
|
||||
#include "d2d_svg.h"
|
||||
|
||||
D2DSVG& D2DSVG::load(const std::wstring& filename, ID2D1DeviceContext5* d2d_dc)
|
||||
{
|
||||
svg = nullptr;
|
||||
winrt::com_ptr<IStream> svg_stream;
|
||||
auto h = SHCreateStreamOnFileEx(filename.c_str(),
|
||||
STGM_READ,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
FALSE,
|
||||
nullptr,
|
||||
svg_stream.put());
|
||||
winrt::check_hresult(h);
|
||||
|
||||
auto h1 = d2d_dc->CreateSvgDocument(
|
||||
svg_stream.get(),
|
||||
D2D1::SizeF(1, 1),
|
||||
svg.put());
|
||||
|
||||
winrt::check_hresult(h1);
|
||||
|
||||
winrt::com_ptr<ID2D1SvgElement> root;
|
||||
svg->GetRoot(root.put());
|
||||
float tmp;
|
||||
winrt::check_hresult(root->GetAttributeValue(L"width", &tmp));
|
||||
svg_width = (int)tmp;
|
||||
winrt::check_hresult(root->GetAttributeValue(L"height", &tmp));
|
||||
svg_height = (int)tmp;
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DSVG& D2DSVG::resize(int x, int y, int width, int height, float fill, float max_scale)
|
||||
{
|
||||
// Center
|
||||
transform = D2D1::Matrix3x2F::Identity();
|
||||
transform = transform * D2D1::Matrix3x2F::Translation((width - svg_width) / 2.0f, (height - svg_height) / 2.0f);
|
||||
float h_scale = fill * height / svg_height;
|
||||
float v_scale = fill * width / svg_width;
|
||||
used_scale = std::min(h_scale, v_scale);
|
||||
if (max_scale > 0)
|
||||
{
|
||||
used_scale = std::min(used_scale, max_scale);
|
||||
}
|
||||
transform = transform * D2D1::Matrix3x2F::Scale(used_scale, used_scale, D2D1::Point2F(width / 2.0f, height / 2.0f));
|
||||
transform = transform * D2D1::Matrix3x2F::Translation((float)x, (float)y);
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DSVG& D2DSVG::recolor(uint32_t oldcolor, uint32_t newcolor)
|
||||
{
|
||||
auto new_color = D2D1::ColorF(newcolor & 0xFFFFFF, 1);
|
||||
auto old_color = D2D1::ColorF(oldcolor & 0xFFFFFF, 1);
|
||||
std::function<void(ID2D1SvgElement * element)> recurse = [&](ID2D1SvgElement* element) {
|
||||
if (!element)
|
||||
return;
|
||||
if (element->IsAttributeSpecified(L"fill"))
|
||||
{
|
||||
D2D1_COLOR_F elem_fill;
|
||||
winrt::com_ptr<ID2D1SvgPaint> paint;
|
||||
element->GetAttributeValue(L"fill", paint.put());
|
||||
paint->GetColor(&elem_fill);
|
||||
if (elem_fill.r == old_color.r && elem_fill.g == old_color.g && elem_fill.b == old_color.b)
|
||||
{
|
||||
winrt::check_hresult(element->SetAttributeValue(L"fill", new_color));
|
||||
}
|
||||
}
|
||||
winrt::com_ptr<ID2D1SvgElement> sub;
|
||||
element->GetFirstChild(sub.put());
|
||||
while (sub)
|
||||
{
|
||||
recurse(sub.get());
|
||||
winrt::com_ptr<ID2D1SvgElement> next;
|
||||
element->GetNextChild(sub.get(), next.put());
|
||||
sub = next;
|
||||
}
|
||||
};
|
||||
winrt::com_ptr<ID2D1SvgElement> root;
|
||||
svg->GetRoot(root.put());
|
||||
recurse(root.get());
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DSVG& D2DSVG::render(ID2D1DeviceContext5* d2d_dc)
|
||||
{
|
||||
D2D1_MATRIX_3X2_F current;
|
||||
d2d_dc->GetTransform(¤t);
|
||||
d2d_dc->SetTransform(transform * current);
|
||||
d2d_dc->DrawSvgDocument(svg.get());
|
||||
d2d_dc->SetTransform(current);
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DSVG& D2DSVG::toggle_element(const wchar_t* id, bool visible)
|
||||
{
|
||||
winrt::com_ptr<ID2D1SvgElement> element;
|
||||
if (svg->FindElementById(id, element.put()) != S_OK)
|
||||
return *this;
|
||||
if (!element)
|
||||
return *this;
|
||||
element->SetAttributeValue(L"display", visible ? D2D1_SVG_DISPLAY::D2D1_SVG_DISPLAY_INLINE : D2D1_SVG_DISPLAY::D2D1_SVG_DISPLAY_NONE);
|
||||
return *this;
|
||||
}
|
||||
|
||||
winrt::com_ptr<ID2D1SvgElement> D2DSVG::find_element(const std::wstring& id)
|
||||
{
|
||||
winrt::com_ptr<ID2D1SvgElement> element;
|
||||
winrt::check_hresult(svg->FindElementById(id.c_str(), element.put()));
|
||||
return element;
|
||||
}
|
||||
|
||||
D2D1_RECT_F D2DSVG::rescale(D2D1_RECT_F rect)
|
||||
{
|
||||
D2D1_RECT_F result;
|
||||
auto src = reinterpret_cast<D2D1_POINT_2F*>(&rect);
|
||||
auto dst = reinterpret_cast<D2D1_POINT_2F*>(&result);
|
||||
dst[0] = src[0] * transform;
|
||||
dst[1] = src[1] * transform;
|
||||
return result;
|
||||
}
|
||||
26
src/modules/ShortcutGuide/ShortcutGuide/d2d_svg.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
#include <d2d1_3.h>
|
||||
#include <d2d1_3helper.h>
|
||||
#include <winrt/base.h>
|
||||
#include <string>
|
||||
|
||||
class D2DSVG
|
||||
{
|
||||
public:
|
||||
D2DSVG& load(const std::wstring& filename, ID2D1DeviceContext5* d2d_dc);
|
||||
D2DSVG& resize(int x, int y, int width, int height, float fill, float max_scale = -1.0f);
|
||||
D2DSVG& render(ID2D1DeviceContext5* d2d_dc);
|
||||
D2DSVG& recolor(uint32_t oldcolor, uint32_t newcolor);
|
||||
float get_scale() const { return used_scale; }
|
||||
int width() const { return svg_width; }
|
||||
int height() const { return svg_height; }
|
||||
D2DSVG& toggle_element(const wchar_t* id, bool visible);
|
||||
winrt::com_ptr<ID2D1SvgElement> find_element(const std::wstring& id);
|
||||
D2D1_RECT_F rescale(D2D1_RECT_F rect);
|
||||
|
||||
protected:
|
||||
float used_scale = 1.0f;
|
||||
winrt::com_ptr<ID2D1SvgDocument> svg;
|
||||
int svg_width = -1, svg_height = -1;
|
||||
D2D1::Matrix3x2F transform;
|
||||
};
|
||||
54
src/modules/ShortcutGuide/ShortcutGuide/d2d_text.cpp
Normal file
@@ -0,0 +1,54 @@
|
||||
#include "pch.h"
|
||||
#include "d2d_text.h"
|
||||
|
||||
D2DText::D2DText(float text_size, float scale)
|
||||
{
|
||||
winrt::check_hresult(DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(factory), reinterpret_cast<IUnknown**>(factory.put_void())));
|
||||
resize(text_size, scale);
|
||||
winrt::check_hresult(format->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER));
|
||||
winrt::check_hresult(format->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER));
|
||||
}
|
||||
|
||||
D2DText& D2DText::resize(float text_size, float scale)
|
||||
{
|
||||
format = nullptr;
|
||||
winrt::check_hresult(factory->CreateTextFormat(L"Segoe UI",
|
||||
nullptr,
|
||||
DWRITE_FONT_WEIGHT_NORMAL,
|
||||
DWRITE_FONT_STYLE_NORMAL,
|
||||
DWRITE_FONT_STRETCH_NORMAL,
|
||||
text_size * scale,
|
||||
L"en-us",
|
||||
format.put()));
|
||||
winrt::check_hresult(format->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER));
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DText& D2DText::set_alignment_left()
|
||||
{
|
||||
winrt::check_hresult(format->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING));
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DText& D2DText::set_alignment_center()
|
||||
{
|
||||
winrt::check_hresult(format->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER));
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DText& D2DText::set_alignment_right()
|
||||
{
|
||||
winrt::check_hresult(format->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_TRAILING));
|
||||
return *this;
|
||||
}
|
||||
|
||||
void D2DText::write(ID2D1DeviceContext5* d2d_dc, D2D1_COLOR_F color, D2D1_RECT_F rect, std::wstring text)
|
||||
{
|
||||
winrt::com_ptr<ID2D1SolidColorBrush> brush;
|
||||
d2d_dc->CreateSolidColorBrush(color, brush.put());
|
||||
d2d_dc->DrawText(text.c_str(),
|
||||
(UINT32)text.length(),
|
||||
format.get(),
|
||||
rect,
|
||||
brush.get());
|
||||
}
|
||||
18
src/modules/ShortcutGuide/ShortcutGuide/d2d_text.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#pragma once
|
||||
#include <winrt/base.h>
|
||||
#include <dwrite.h>
|
||||
|
||||
class D2DText
|
||||
{
|
||||
public:
|
||||
D2DText(float text_size = 15.0f, float scale = 1.0f);
|
||||
D2DText& resize(float text_size, float scale);
|
||||
D2DText& set_alignment_left();
|
||||
D2DText& set_alignment_center();
|
||||
D2DText& set_alignment_right();
|
||||
void write(ID2D1DeviceContext5* d2d_dc, D2D1_COLOR_F color, D2D1_RECT_F rect, std::wstring text);
|
||||
|
||||
private:
|
||||
winrt::com_ptr<IDWriteFactory> factory;
|
||||
winrt::com_ptr<IDWriteTextFormat> format;
|
||||
};
|
||||
211
src/modules/ShortcutGuide/ShortcutGuide/d2d_window.cpp
Normal file
@@ -0,0 +1,211 @@
|
||||
#include "pch.h"
|
||||
#include "d2d_window.h"
|
||||
|
||||
#include <common/utils/resources.h>
|
||||
|
||||
D2DWindow::D2DWindow()
|
||||
{
|
||||
static const WCHAR* class_name = L"PToyD2DPopup";
|
||||
WNDCLASS wc = {};
|
||||
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
|
||||
wc.hInstance = reinterpret_cast<HINSTANCE>(&__ImageBase);
|
||||
wc.lpszClassName = class_name;
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wc.lpfnWndProc = d2d_window_proc;
|
||||
RegisterClass(&wc);
|
||||
hwnd = CreateWindowExW(WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_EX_NOREDIRECTIONBITMAP | WS_EX_LAYERED,
|
||||
wc.lpszClassName,
|
||||
L"PToyD2DPopup",
|
||||
WS_POPUP | WS_VISIBLE,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
nullptr,
|
||||
nullptr,
|
||||
wc.hInstance,
|
||||
this);
|
||||
WINRT_VERIFY(hwnd);
|
||||
}
|
||||
|
||||
void D2DWindow::show(UINT x, UINT y, UINT width, UINT height)
|
||||
{
|
||||
if (!initialized)
|
||||
{
|
||||
base_init();
|
||||
}
|
||||
base_resize(width, height);
|
||||
render_empty();
|
||||
hidden = false;
|
||||
on_show();
|
||||
SetWindowPos(hwnd, HWND_TOPMOST, x, y, width, height, 0);
|
||||
ShowWindow(hwnd, SW_SHOWNORMAL);
|
||||
SetForegroundWindow(hwnd);
|
||||
UpdateWindow(hwnd);
|
||||
}
|
||||
|
||||
void D2DWindow::hide()
|
||||
{
|
||||
hidden = true;
|
||||
ShowWindow(hwnd, SW_HIDE);
|
||||
on_hide();
|
||||
}
|
||||
|
||||
void D2DWindow::initialize()
|
||||
{
|
||||
base_init();
|
||||
}
|
||||
|
||||
void D2DWindow::base_init()
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
// D2D1Factory is independent from the device, no need to recreate it if we need to recreate the device.
|
||||
if (!d2d_factory)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
D2D1_FACTORY_OPTIONS options = { D2D1_DEBUG_LEVEL_INFORMATION };
|
||||
#else
|
||||
D2D1_FACTORY_OPTIONS options = {};
|
||||
#endif
|
||||
winrt::check_hresult(D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED,
|
||||
__uuidof(d2d_factory),
|
||||
&options,
|
||||
d2d_factory.put_void()));
|
||||
}
|
||||
// For all other stuff - assign nullptr first to release the object, to reset the com_ptr.
|
||||
d2d_dc = nullptr;
|
||||
d2d_device = nullptr;
|
||||
dxgi_factory = nullptr;
|
||||
dxgi_device = nullptr;
|
||||
d3d_device = nullptr;
|
||||
winrt::check_hresult(D3D11CreateDevice(nullptr,
|
||||
D3D_DRIVER_TYPE_HARDWARE,
|
||||
nullptr,
|
||||
D3D11_CREATE_DEVICE_BGRA_SUPPORT,
|
||||
nullptr,
|
||||
0,
|
||||
D3D11_SDK_VERSION,
|
||||
d3d_device.put(),
|
||||
nullptr,
|
||||
nullptr));
|
||||
winrt::check_hresult(d3d_device->QueryInterface(__uuidof(dxgi_device), dxgi_device.put_void()));
|
||||
winrt::check_hresult(CreateDXGIFactory2(0, __uuidof(dxgi_factory), dxgi_factory.put_void()));
|
||||
winrt::check_hresult(d2d_factory->CreateDevice(dxgi_device.get(), d2d_device.put()));
|
||||
winrt::check_hresult(d2d_device->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, d2d_dc.put()));
|
||||
init();
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
void D2DWindow::base_resize(UINT width, UINT height)
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
if (!initialized)
|
||||
{
|
||||
return;
|
||||
}
|
||||
window_width = width;
|
||||
window_height = height;
|
||||
if (window_width == 0 || window_height == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
DXGI_SWAP_CHAIN_DESC1 sc_description = {};
|
||||
sc_description.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
sc_description.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||
sc_description.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
|
||||
sc_description.BufferCount = 2;
|
||||
sc_description.SampleDesc.Count = 1;
|
||||
sc_description.AlphaMode = DXGI_ALPHA_MODE_PREMULTIPLIED;
|
||||
sc_description.Width = window_width;
|
||||
sc_description.Height = window_height;
|
||||
dxgi_swap_chain = nullptr;
|
||||
winrt::check_hresult(dxgi_factory->CreateSwapChainForComposition(dxgi_device.get(),
|
||||
&sc_description,
|
||||
nullptr,
|
||||
dxgi_swap_chain.put()));
|
||||
composition_device = nullptr;
|
||||
winrt::check_hresult(DCompositionCreateDevice(dxgi_device.get(),
|
||||
__uuidof(composition_device),
|
||||
composition_device.put_void()));
|
||||
|
||||
composition_target = nullptr;
|
||||
winrt::check_hresult(composition_device->CreateTargetForHwnd(hwnd, true, composition_target.put()));
|
||||
|
||||
composition_visual = nullptr;
|
||||
winrt::check_hresult(composition_device->CreateVisual(composition_visual.put()));
|
||||
winrt::check_hresult(composition_visual->SetContent(dxgi_swap_chain.get()));
|
||||
winrt::check_hresult(composition_target->SetRoot(composition_visual.get()));
|
||||
|
||||
dxgi_surface = nullptr;
|
||||
winrt::check_hresult(dxgi_swap_chain->GetBuffer(0, __uuidof(dxgi_surface), dxgi_surface.put_void()));
|
||||
D2D1_BITMAP_PROPERTIES1 properties = {};
|
||||
properties.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
|
||||
properties.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
properties.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
|
||||
|
||||
d2d_bitmap = nullptr;
|
||||
winrt::check_hresult(d2d_dc->CreateBitmapFromDxgiSurface(dxgi_surface.get(),
|
||||
properties,
|
||||
d2d_bitmap.put()));
|
||||
d2d_dc->SetTarget(d2d_bitmap.get());
|
||||
resize();
|
||||
}
|
||||
|
||||
void D2DWindow::base_render()
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
if (!initialized || !d2d_dc || !d2d_bitmap)
|
||||
return;
|
||||
d2d_dc->BeginDraw();
|
||||
render(d2d_dc.get());
|
||||
winrt::check_hresult(d2d_dc->EndDraw());
|
||||
winrt::check_hresult(dxgi_swap_chain->Present(1, 0));
|
||||
winrt::check_hresult(composition_device->Commit());
|
||||
}
|
||||
|
||||
void D2DWindow::render_empty()
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
if (!initialized || !d2d_dc || !d2d_bitmap)
|
||||
return;
|
||||
d2d_dc->BeginDraw();
|
||||
d2d_dc->Clear();
|
||||
winrt::check_hresult(d2d_dc->EndDraw());
|
||||
winrt::check_hresult(dxgi_swap_chain->Present(1, 0));
|
||||
winrt::check_hresult(composition_device->Commit());
|
||||
}
|
||||
|
||||
D2DWindow::~D2DWindow()
|
||||
{
|
||||
ShowWindow(hwnd, SW_HIDE);
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
|
||||
D2DWindow* D2DWindow::this_from_hwnd(HWND window)
|
||||
{
|
||||
return reinterpret_cast<D2DWindow*>(GetWindowLongPtr(window, GWLP_USERDATA));
|
||||
}
|
||||
|
||||
LRESULT __stdcall D2DWindow::d2d_window_proc(HWND window, UINT message, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
auto self = this_from_hwnd(window);
|
||||
switch (message)
|
||||
{
|
||||
case WM_NCCREATE:
|
||||
{
|
||||
auto create_struct = reinterpret_cast<CREATESTRUCT*>(lparam);
|
||||
SetWindowLongPtr(window, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(create_struct->lpCreateParams));
|
||||
return TRUE;
|
||||
}
|
||||
case WM_MOVE:
|
||||
case WM_SIZE:
|
||||
self->base_resize((unsigned)lparam & 0xFFFF, (unsigned)lparam >> 16);
|
||||
[[fallthrough]];
|
||||
case WM_PAINT:
|
||||
self->base_render();
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return DefWindowProc(window, message, wparam, lparam);
|
||||
}
|
||||
}
|
||||
65
src/modules/ShortcutGuide/ShortcutGuide/d2d_window.h
Normal file
@@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
#include <winrt/base.h>
|
||||
#include <Windows.h>
|
||||
#include <dxgi1_3.h>
|
||||
#include <d3d11_2.h>
|
||||
#include <d2d1_3.h>
|
||||
#include <d2d1_3helper.h>
|
||||
#include <d2d1helper.h>
|
||||
#include <dcomp.h>
|
||||
#include <dwmapi.h>
|
||||
#include <string>
|
||||
#include "d2d_svg.h"
|
||||
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
|
||||
class D2DWindow
|
||||
{
|
||||
public:
|
||||
D2DWindow();
|
||||
void show(UINT x, UINT y, UINT width, UINT height);
|
||||
void hide();
|
||||
void initialize();
|
||||
virtual ~D2DWindow();
|
||||
|
||||
protected:
|
||||
// Implement this:
|
||||
|
||||
// Initialization - called when D2D device needs to be created.
|
||||
// When called all D2DWindow members will be initialized, including d2d_dc
|
||||
virtual void init() = 0;
|
||||
// resize - when called, window_width and window_height will have current window size
|
||||
virtual void resize() = 0;
|
||||
// render - called on WM_PAIT, BeginPaint/EndPaint is handled by D2DWindow
|
||||
virtual void render(ID2D1DeviceContext5* d2d_dc) = 0;
|
||||
// on_show, on_hide - called when the window is about to be shown or about to be hidden
|
||||
virtual void on_show() = 0;
|
||||
virtual void on_hide() = 0;
|
||||
|
||||
static LRESULT __stdcall d2d_window_proc(HWND window, UINT message, WPARAM wparam, LPARAM lparam);
|
||||
static D2DWindow* this_from_hwnd(HWND window);
|
||||
|
||||
void base_init();
|
||||
void base_resize(UINT width, UINT height);
|
||||
void base_render();
|
||||
void render_empty();
|
||||
|
||||
std::recursive_mutex mutex;
|
||||
bool hidden = true;
|
||||
bool initialized = false;
|
||||
HWND hwnd;
|
||||
UINT window_width, window_height;
|
||||
winrt::com_ptr<ID3D11Device> d3d_device;
|
||||
winrt::com_ptr<IDXGIDevice> dxgi_device;
|
||||
winrt::com_ptr<IDXGIFactory2> dxgi_factory;
|
||||
winrt::com_ptr<IDXGISwapChain1> dxgi_swap_chain;
|
||||
winrt::com_ptr<IDCompositionDevice> composition_device;
|
||||
winrt::com_ptr<IDCompositionTarget> composition_target;
|
||||
winrt::com_ptr<IDCompositionVisual> composition_visual;
|
||||
winrt::com_ptr<IDXGISurface2> dxgi_surface;
|
||||
winrt::com_ptr<ID2D1Bitmap1> d2d_bitmap;
|
||||
winrt::com_ptr<ID2D1Factory6> d2d_factory;
|
||||
winrt::com_ptr<ID2D1Device5> d2d_device;
|
||||
winrt::com_ptr<ID2D1DeviceContext5> d2d_dc;
|
||||
};
|
||||
129
src/modules/ShortcutGuide/ShortcutGuide/main.cpp
Normal file
@@ -0,0 +1,129 @@
|
||||
#include "pch.h"
|
||||
#include <Windows.h>
|
||||
#include <common/utils/window.h>
|
||||
#include <common/SettingsAPI/settings_helpers.h>
|
||||
#include <common/utils/ProcessWaiter.h>
|
||||
#include <common/utils/winapi_error.h>
|
||||
#include <common/utils/UnhandledExceptionHandler_x64.h>
|
||||
#include <common/utils/logger_helper.h>
|
||||
#include <common/utils/EventWaiter.h>
|
||||
|
||||
#include "shortcut_guide.h"
|
||||
#include "target_state.h"
|
||||
#include "ShortcutGuideConstants.h"
|
||||
#include "trace.h"
|
||||
|
||||
const std::wstring instanceMutexName = L"Local\\PowerToys_ShortcutGuide_InstanceMutex";
|
||||
|
||||
// set current path to the executable path
|
||||
bool SetCurrentPath()
|
||||
{
|
||||
TCHAR buffer[MAX_PATH] = { 0 };
|
||||
if (!GetModuleFileName(NULL, buffer, MAX_PATH))
|
||||
{
|
||||
Logger::error(L"Failed to get module path. {}", get_last_error_or_default(GetLastError()));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!PathRemoveFileSpec(buffer))
|
||||
{
|
||||
Logger::error(L"Failed to remove file from module path. {}", get_last_error_or_default(GetLastError()));
|
||||
return false;
|
||||
}
|
||||
|
||||
std::error_code err;
|
||||
std::filesystem::current_path(buffer, err);
|
||||
if (err.value())
|
||||
{
|
||||
Logger::error("Failed to set current path. {}", err.message());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ PWSTR lpCmdLine, _In_ int nCmdShow)
|
||||
{
|
||||
winrt::init_apartment();
|
||||
LoggerHelpers::init_logger(ShortcutGuideConstants::ModuleKey, L"ShortcutGuide", LogSettings::shortcutGuideLoggerName);
|
||||
InitUnhandledExceptionHandler_x64();
|
||||
Logger::trace("Starting Shortcut Guide");
|
||||
|
||||
if (!SetCurrentPath())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Trace::RegisterProvider();
|
||||
if (std::wstring(lpCmdLine).find(L' ') != std::wstring::npos)
|
||||
{
|
||||
Logger::trace("Sending settings telemetry");
|
||||
auto settings = OverlayWindow::GetSettings();
|
||||
Trace::SendSettings(settings);
|
||||
Trace::UnregisterProvider();
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto mutex = CreateMutex(nullptr, true, instanceMutexName.c_str());
|
||||
if (mutex == nullptr)
|
||||
{
|
||||
Logger::error(L"Failed to create mutex. {}", get_last_error_or_default(GetLastError()));
|
||||
}
|
||||
|
||||
if (GetLastError() == ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
Logger::warn(L"Shortcut Guide instance is already running");
|
||||
Trace::UnregisterProvider();
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::wstring pid = std::wstring(lpCmdLine);
|
||||
if (!pid.empty())
|
||||
{
|
||||
auto mainThreadId = GetCurrentThreadId();
|
||||
ProcessWaiter::OnProcessTerminate(pid, [mainThreadId](int err) {
|
||||
if (err != ERROR_SUCCESS)
|
||||
{
|
||||
Logger::error(L"Failed to wait for parent process exit. {}", get_last_error_or_default(err));
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger::trace(L"PowerToys runner exited.");
|
||||
}
|
||||
|
||||
Logger::trace(L"Exiting Shortcut Guide");
|
||||
PostThreadMessage(mainThreadId, WM_QUIT, 0, 0);
|
||||
});
|
||||
}
|
||||
|
||||
auto hwnd = GetForegroundWindow();
|
||||
auto window = OverlayWindow(hwnd);
|
||||
EventWaiter exitEventWaiter;
|
||||
if (window.IsDisabled())
|
||||
{
|
||||
Logger::trace("SG is disabled for the current foreground app. Exiting SG");
|
||||
Trace::UnregisterProvider();
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto mainThreadId = GetCurrentThreadId();
|
||||
exitEventWaiter = EventWaiter(CommonSharedConstants::SHORTCUT_GUIDE_EXIT_EVENT, [mainThreadId, &window](int err) {
|
||||
if (err != ERROR_SUCCESS)
|
||||
{
|
||||
Logger::error(L"Failed to wait for {} event. {}", CommonSharedConstants::SHORTCUT_GUIDE_EXIT_EVENT, get_last_error_or_default(err));
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger::trace(L"{} event was signaled", CommonSharedConstants::SHORTCUT_GUIDE_EXIT_EVENT);
|
||||
}
|
||||
|
||||
window.CloseWindow(HideWindowType::THE_SHORTCUT_PRESSED, mainThreadId);
|
||||
});
|
||||
}
|
||||
|
||||
window.ShowWindow();
|
||||
run_message_loop();
|
||||
Trace::UnregisterProvider();
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#include "pch.h"
|
||||
#include "native_event_waiter.h"
|
||||
|
||||
void NativeEventWaiter::run()
|
||||
{
|
||||
while (!aborting)
|
||||
{
|
||||
auto result = WaitForSingleObject(event_handle, timeout);
|
||||
if (!aborting && result == WAIT_OBJECT_0)
|
||||
{
|
||||
action();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NativeEventWaiter::NativeEventWaiter(const std::wstring& event_name, std::function<void()> action)
|
||||
{
|
||||
event_handle = CreateEventW(NULL, FALSE, FALSE, event_name.c_str());
|
||||
this->action = action;
|
||||
running_thread = std::thread([&]() { run(); });
|
||||
}
|
||||
|
||||
NativeEventWaiter::~NativeEventWaiter()
|
||||
{
|
||||
aborting = true;
|
||||
SetEvent(event_handle);
|
||||
running_thread.join();
|
||||
CloseHandle(event_handle);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
#include "pch.h"
|
||||
#include "common/interop/shared_constants.h"
|
||||
|
||||
class NativeEventWaiter
|
||||
{
|
||||
static const int timeout = 1000;
|
||||
|
||||
HANDLE event_handle = nullptr;
|
||||
std::function<void()> action = nullptr;
|
||||
std::atomic<bool> aborting = false;
|
||||
|
||||
void run();
|
||||
std::thread running_thread;
|
||||
|
||||
public:
|
||||
NativeEventWaiter(const std::wstring& event_name, std::function<void()> action);
|
||||
~NativeEventWaiter();
|
||||
};
|
||||
869
src/modules/ShortcutGuide/ShortcutGuide/overlay_window.cpp
Normal file
@@ -0,0 +1,869 @@
|
||||
#include "pch.h"
|
||||
#include "overlay_window.h"
|
||||
#include <common/display/monitors.h>
|
||||
#include "tasklist_positions.h"
|
||||
#include "start_visible.h"
|
||||
#include <common/utils/resources.h>
|
||||
#include <common/utils/window.h>
|
||||
|
||||
#include "shortcut_guide.h"
|
||||
#include "trace.h"
|
||||
#include "Generated Files/resource.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
// Gets position of given window.
|
||||
std::optional<RECT> get_window_pos(HWND hwnd)
|
||||
{
|
||||
RECT window;
|
||||
if (DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &window, sizeof(window)) == S_OK)
|
||||
{
|
||||
return window;
|
||||
}
|
||||
else
|
||||
{
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
enum WindowState
|
||||
{
|
||||
UNKNOWN,
|
||||
MINIMIZED,
|
||||
MAXIMIZED,
|
||||
SNAPPED_TOP_LEFT,
|
||||
SNAPPED_LEFT,
|
||||
SNAPPED_BOTTOM_LEFT,
|
||||
SNAPPED_TOP_RIGHT,
|
||||
SNAPPED_RIGHT,
|
||||
SNAPPED_BOTTOM_RIGHT,
|
||||
RESTORED
|
||||
};
|
||||
|
||||
inline WindowState get_window_state(HWND hwnd)
|
||||
{
|
||||
WINDOWPLACEMENT placement;
|
||||
placement.length = sizeof(WINDOWPLACEMENT);
|
||||
|
||||
if (GetWindowPlacement(hwnd, &placement) == 0)
|
||||
{
|
||||
return UNKNOWN;
|
||||
}
|
||||
|
||||
if (placement.showCmd == SW_MINIMIZE || placement.showCmd == SW_SHOWMINIMIZED || IsIconic(hwnd))
|
||||
{
|
||||
return MINIMIZED;
|
||||
}
|
||||
|
||||
if (placement.showCmd == SW_MAXIMIZE || placement.showCmd == SW_SHOWMAXIMIZED)
|
||||
{
|
||||
return MAXIMIZED;
|
||||
}
|
||||
|
||||
auto rectp = get_window_pos(hwnd);
|
||||
if (!rectp)
|
||||
{
|
||||
return UNKNOWN;
|
||||
}
|
||||
|
||||
auto rect = *rectp;
|
||||
MONITORINFO monitor;
|
||||
monitor.cbSize = sizeof(MONITORINFO);
|
||||
auto h_monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
|
||||
GetMonitorInfo(h_monitor, &monitor);
|
||||
bool top_left = monitor.rcWork.top == rect.top && monitor.rcWork.left == rect.left;
|
||||
bool bottom_left = monitor.rcWork.bottom == rect.bottom && monitor.rcWork.left == rect.left;
|
||||
bool top_right = monitor.rcWork.top == rect.top && monitor.rcWork.right == rect.right;
|
||||
bool bottom_right = monitor.rcWork.bottom == rect.bottom && monitor.rcWork.right == rect.right;
|
||||
|
||||
if (top_left && bottom_left)
|
||||
return SNAPPED_LEFT;
|
||||
if (top_left)
|
||||
return SNAPPED_TOP_LEFT;
|
||||
if (bottom_left)
|
||||
return SNAPPED_BOTTOM_LEFT;
|
||||
if (top_right && bottom_right)
|
||||
return SNAPPED_RIGHT;
|
||||
if (top_right)
|
||||
return SNAPPED_TOP_RIGHT;
|
||||
if (bottom_right)
|
||||
return SNAPPED_BOTTOM_RIGHT;
|
||||
|
||||
return RESTORED;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
D2DOverlaySVG& D2DOverlaySVG::load(const std::wstring& filename, ID2D1DeviceContext5* d2d_dc)
|
||||
{
|
||||
D2DSVG::load(filename, d2d_dc);
|
||||
window_group = nullptr;
|
||||
thumbnail_top_left = {};
|
||||
thumbnail_bottom_right = {};
|
||||
thumbnail_scaled_rect = {};
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DOverlaySVG& D2DOverlaySVG::resize(int x, int y, int width, int height, float fill, float max_scale)
|
||||
{
|
||||
D2DSVG::resize(x, y, width, height, fill, max_scale);
|
||||
if (thumbnail_bottom_right.x != 0 && thumbnail_bottom_right.y != 0)
|
||||
{
|
||||
auto scaled_top_left = transform.TransformPoint(thumbnail_top_left);
|
||||
auto scanled_bottom_right = transform.TransformPoint(thumbnail_bottom_right);
|
||||
thumbnail_scaled_rect.left = (int)scaled_top_left.x;
|
||||
thumbnail_scaled_rect.top = (int)scaled_top_left.y;
|
||||
thumbnail_scaled_rect.right = (int)scanled_bottom_right.x;
|
||||
thumbnail_scaled_rect.bottom = (int)scanled_bottom_right.y;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DOverlaySVG& D2DOverlaySVG::find_thumbnail(const std::wstring& id)
|
||||
{
|
||||
winrt::com_ptr<ID2D1SvgElement> thumbnail_box;
|
||||
winrt::check_hresult(svg->FindElementById(id.c_str(), thumbnail_box.put()));
|
||||
winrt::check_hresult(thumbnail_box->GetAttributeValue(L"x", &thumbnail_top_left.x));
|
||||
winrt::check_hresult(thumbnail_box->GetAttributeValue(L"y", &thumbnail_top_left.y));
|
||||
winrt::check_hresult(thumbnail_box->GetAttributeValue(L"width", &thumbnail_bottom_right.x));
|
||||
thumbnail_bottom_right.x += thumbnail_top_left.x;
|
||||
winrt::check_hresult(thumbnail_box->GetAttributeValue(L"height", &thumbnail_bottom_right.y));
|
||||
thumbnail_bottom_right.y += thumbnail_top_left.y;
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2DOverlaySVG& D2DOverlaySVG::find_window_group(const std::wstring& id)
|
||||
{
|
||||
window_group = nullptr;
|
||||
winrt::check_hresult(svg->FindElementById(id.c_str(), window_group.put()));
|
||||
return *this;
|
||||
}
|
||||
|
||||
ScaleResult D2DOverlaySVG::get_thumbnail_rect_and_scale(int x_offset, int y_offset, int window_cx, int window_cy, float fill)
|
||||
{
|
||||
if (thumbnail_bottom_right.x == 0 && thumbnail_bottom_right.y == 0)
|
||||
{
|
||||
return {};
|
||||
}
|
||||
int thumbnail_scaled_rect_width = thumbnail_scaled_rect.right - thumbnail_scaled_rect.left;
|
||||
int thumbnail_scaled_rect_heigh = thumbnail_scaled_rect.bottom - thumbnail_scaled_rect.top;
|
||||
if (thumbnail_scaled_rect_heigh == 0 || thumbnail_scaled_rect_width == 0 ||
|
||||
window_cx == 0 || window_cy == 0)
|
||||
{
|
||||
return {};
|
||||
}
|
||||
float scale_h = fill * thumbnail_scaled_rect_width / window_cx;
|
||||
float scale_v = fill * thumbnail_scaled_rect_heigh / window_cy;
|
||||
float use_scale = std::min(scale_h, scale_v);
|
||||
RECT thumb_rect;
|
||||
thumb_rect.left = thumbnail_scaled_rect.left + (int)(thumbnail_scaled_rect_width - use_scale * window_cx) / 2 + x_offset;
|
||||
thumb_rect.right = thumbnail_scaled_rect.right - (int)(thumbnail_scaled_rect_width - use_scale * window_cx) / 2 + x_offset;
|
||||
thumb_rect.top = thumbnail_scaled_rect.top + (int)(thumbnail_scaled_rect_heigh - use_scale * window_cy) / 2 + y_offset;
|
||||
thumb_rect.bottom = thumbnail_scaled_rect.bottom - (int)(thumbnail_scaled_rect_heigh - use_scale * window_cy) / 2 + y_offset;
|
||||
ScaleResult result;
|
||||
result.scale = use_scale;
|
||||
result.rect = thumb_rect;
|
||||
return result;
|
||||
}
|
||||
|
||||
winrt::com_ptr<ID2D1SvgElement> D2DOverlaySVG::find_element(const std::wstring& id)
|
||||
{
|
||||
winrt::com_ptr<ID2D1SvgElement> element;
|
||||
winrt::check_hresult(svg->FindElementById(id.c_str(), element.put()));
|
||||
return element;
|
||||
}
|
||||
|
||||
D2DOverlaySVG& D2DOverlaySVG::toggle_window_group(bool active)
|
||||
{
|
||||
if (window_group)
|
||||
{
|
||||
window_group->SetAttributeValue(L"fill-opacity", active ? 1.0f : 0.3f);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
D2D1_RECT_F D2DOverlaySVG::get_maximize_label() const
|
||||
{
|
||||
D2D1_RECT_F result;
|
||||
auto height = (float)(thumbnail_scaled_rect.bottom - thumbnail_scaled_rect.top);
|
||||
auto width = (float)(thumbnail_scaled_rect.right - thumbnail_scaled_rect.left);
|
||||
if (width >= height)
|
||||
{
|
||||
result.top = thumbnail_scaled_rect.bottom + height * 0.210f;
|
||||
result.bottom = thumbnail_scaled_rect.bottom + height * 0.310f;
|
||||
result.left = thumbnail_scaled_rect.left + width * 0.009f;
|
||||
result.right = thumbnail_scaled_rect.right + width * 0.009f;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.top = thumbnail_scaled_rect.top + height * 0.323f;
|
||||
result.bottom = thumbnail_scaled_rect.top + height * 0.398f;
|
||||
result.left = (float)thumbnail_scaled_rect.right;
|
||||
result.right = thumbnail_scaled_rect.right + width * 1.45f;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
D2D1_RECT_F D2DOverlaySVG::get_minimize_label() const
|
||||
{
|
||||
D2D1_RECT_F result;
|
||||
auto height = (float)(thumbnail_scaled_rect.bottom - thumbnail_scaled_rect.top);
|
||||
auto width = (float)(thumbnail_scaled_rect.right - thumbnail_scaled_rect.left);
|
||||
if (width >= height)
|
||||
{
|
||||
result.top = thumbnail_scaled_rect.bottom + height * 0.8f;
|
||||
result.bottom = thumbnail_scaled_rect.bottom + height * 0.9f;
|
||||
result.left = thumbnail_scaled_rect.left + width * 0.009f;
|
||||
result.right = thumbnail_scaled_rect.right + width * 0.009f;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.top = thumbnail_scaled_rect.top + height * 0.725f;
|
||||
result.bottom = thumbnail_scaled_rect.top + height * 0.800f;
|
||||
result.left = (float)thumbnail_scaled_rect.right;
|
||||
result.right = thumbnail_scaled_rect.right + width * 1.45f;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
D2D1_RECT_F D2DOverlaySVG::get_snap_left() const
|
||||
{
|
||||
D2D1_RECT_F result;
|
||||
auto height = (float)(thumbnail_scaled_rect.bottom - thumbnail_scaled_rect.top);
|
||||
auto width = (float)(thumbnail_scaled_rect.right - thumbnail_scaled_rect.left);
|
||||
if (width >= height)
|
||||
{
|
||||
result.top = thumbnail_scaled_rect.bottom + height * 0.5f;
|
||||
result.bottom = thumbnail_scaled_rect.bottom + height * 0.6f;
|
||||
result.left = thumbnail_scaled_rect.left + width * 0.009f;
|
||||
result.right = thumbnail_scaled_rect.left + width * 0.339f;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.top = thumbnail_scaled_rect.top + height * 0.523f;
|
||||
result.bottom = thumbnail_scaled_rect.top + height * 0.598f;
|
||||
result.left = (float)thumbnail_scaled_rect.right;
|
||||
result.right = thumbnail_scaled_rect.right + width * 0.450f;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
D2D1_RECT_F D2DOverlaySVG::get_snap_right() const
|
||||
{
|
||||
D2D1_RECT_F result;
|
||||
auto height = (float)(thumbnail_scaled_rect.bottom - thumbnail_scaled_rect.top);
|
||||
auto width = (float)(thumbnail_scaled_rect.right - thumbnail_scaled_rect.left);
|
||||
if (width >= height)
|
||||
{
|
||||
result.top = thumbnail_scaled_rect.bottom + height * 0.5f;
|
||||
result.bottom = thumbnail_scaled_rect.bottom + height * 0.6f;
|
||||
result.left = thumbnail_scaled_rect.left + width * 0.679f;
|
||||
result.right = thumbnail_scaled_rect.right + width * 1.009f;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.top = thumbnail_scaled_rect.top + height * 0.523f;
|
||||
result.bottom = thumbnail_scaled_rect.top + height * 0.598f;
|
||||
result.left = (float)thumbnail_scaled_rect.right + width;
|
||||
result.right = thumbnail_scaled_rect.right + width * 1.45f;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
D2DOverlayWindow::D2DOverlayWindow() :
|
||||
total_screen({}), animation(0.3), D2DWindow()
|
||||
{
|
||||
tasklist_thread = std::thread([&] {
|
||||
while (running)
|
||||
{
|
||||
// Removing <std::mutex> causes C3538 on std::unique_lock lock(mutex); in show(..)
|
||||
std::unique_lock<std::mutex> lock(tasklist_cv_mutex);
|
||||
tasklist_cv.wait(lock, [&] { return !running || tasklist_update; });
|
||||
if (!running)
|
||||
return;
|
||||
lock.unlock();
|
||||
while (running && tasklist_update)
|
||||
{
|
||||
std::vector<TasklistButton> buttons;
|
||||
if (tasklist.update_buttons(buttons))
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
tasklist_buttons.swap(buttons);
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::show(HWND active_window, bool snappable)
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
hidden = false;
|
||||
tasklist_buttons.clear();
|
||||
this->active_window = active_window;
|
||||
this->active_window_snappable = snappable;
|
||||
auto old_bck = colors.start_color_menu;
|
||||
auto colors_updated = colors.update();
|
||||
auto new_light_mode = (theme_setting == Light) || (theme_setting == System && colors.light_mode);
|
||||
if (initialized && (colors_updated || light_mode != new_light_mode))
|
||||
{
|
||||
// update background colors
|
||||
landscape.recolor(old_bck, colors.start_color_menu);
|
||||
portrait.recolor(old_bck, colors.start_color_menu);
|
||||
for (auto& arrow : arrows)
|
||||
{
|
||||
arrow.recolor(old_bck, colors.start_color_menu);
|
||||
}
|
||||
light_mode = new_light_mode;
|
||||
if (light_mode)
|
||||
{
|
||||
landscape.recolor(0xDDDDDD, 0x222222);
|
||||
portrait.recolor(0xDDDDDD, 0x222222);
|
||||
for (auto& arrow : arrows)
|
||||
{
|
||||
arrow.recolor(0xDDDDDD, 0x222222);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
landscape.recolor(0x222222, 0xDDDDDD);
|
||||
portrait.recolor(0x222222, 0xDDDDDD);
|
||||
for (auto& arrow : arrows)
|
||||
{
|
||||
arrow.recolor(0x222222, 0xDDDDDD);
|
||||
}
|
||||
}
|
||||
}
|
||||
monitors = MonitorInfo::GetMonitors(true);
|
||||
// calculate the rect covering all the screens
|
||||
total_screen = ScreenSize(monitors[0].rect);
|
||||
for (auto& monitor : monitors)
|
||||
{
|
||||
total_screen.rect.left = std::min(total_screen.rect.left, monitor.rect.left);
|
||||
total_screen.rect.top = std::min(total_screen.rect.top, monitor.rect.top);
|
||||
total_screen.rect.right = std::max(total_screen.rect.right, monitor.rect.right);
|
||||
total_screen.rect.bottom = std::max(total_screen.rect.bottom, monitor.rect.bottom);
|
||||
}
|
||||
// make sure top-right corner of all the monitor rects is (0,0)
|
||||
monitor_dx = -total_screen.left();
|
||||
monitor_dy = -total_screen.top();
|
||||
total_screen.rect.left += monitor_dx;
|
||||
total_screen.rect.right += monitor_dx;
|
||||
total_screen.rect.top += monitor_dy;
|
||||
total_screen.rect.bottom += monitor_dy;
|
||||
tasklist.update();
|
||||
if (active_window)
|
||||
{
|
||||
// Ignore errors, if this fails we will just not show the thumbnail
|
||||
DwmRegisterThumbnail(hwnd, active_window, &thumbnail);
|
||||
}
|
||||
animation.reset();
|
||||
auto primary_screen = MonitorInfo::GetPrimaryMonitor();
|
||||
shown_start_time = std::chrono::steady_clock::now();
|
||||
lock.unlock();
|
||||
D2DWindow::show(primary_screen.left(), primary_screen.top(), primary_screen.width(), primary_screen.height());
|
||||
// Check if taskbar is auto-hidden. If so, don't display the number arrows
|
||||
APPBARDATA param = {};
|
||||
param.cbSize = sizeof(APPBARDATA);
|
||||
if ((UINT)SHAppBarMessage(ABM_GETSTATE, ¶m) != ABS_AUTOHIDE)
|
||||
{
|
||||
tasklist_cv_mutex.lock();
|
||||
tasklist_update = true;
|
||||
tasklist_cv_mutex.unlock();
|
||||
tasklist_cv.notify_one();
|
||||
}
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::on_show()
|
||||
{
|
||||
// show override does everything
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::on_hide()
|
||||
{
|
||||
Logger::trace("D2DOverlayWindow::on_hide()");
|
||||
tasklist_cv_mutex.lock();
|
||||
tasklist_update = false;
|
||||
tasklist_cv_mutex.unlock();
|
||||
tasklist_cv.notify_one();
|
||||
if (thumbnail)
|
||||
{
|
||||
DwmUnregisterThumbnail(thumbnail);
|
||||
}
|
||||
std::chrono::steady_clock::time_point shown_end_time = std::chrono::steady_clock::now();
|
||||
// Trace the event only if the overlay window was visible.
|
||||
if (shown_start_time.time_since_epoch().count() > 0)
|
||||
{
|
||||
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(shown_end_time - shown_start_time).count();
|
||||
Logger::trace(L"Duration: {}. Close Type: {}", duration, windowCloseType);
|
||||
Trace::SendGuideSession(duration, windowCloseType.c_str());
|
||||
shown_start_time = {};
|
||||
}
|
||||
}
|
||||
|
||||
D2DOverlayWindow::~D2DOverlayWindow()
|
||||
{
|
||||
tasklist_cv_mutex.lock();
|
||||
running = false;
|
||||
tasklist_cv_mutex.unlock();
|
||||
tasklist_cv.notify_one();
|
||||
tasklist_thread.join();
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::apply_overlay_opacity(float opacity)
|
||||
{
|
||||
if (opacity <= 0.0f)
|
||||
{
|
||||
opacity = 0.0f;
|
||||
}
|
||||
if (opacity >= 1.0f)
|
||||
{
|
||||
opacity = 1.0f;
|
||||
}
|
||||
overlay_opacity = opacity;
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::set_theme(const std::wstring& theme)
|
||||
{
|
||||
if (theme == L"light")
|
||||
{
|
||||
theme_setting = Light;
|
||||
}
|
||||
else if (theme == L"dark")
|
||||
{
|
||||
theme_setting = Dark;
|
||||
}
|
||||
else
|
||||
{
|
||||
theme_setting = System;
|
||||
}
|
||||
}
|
||||
|
||||
/* Hide the window but do not call on_hide(). Use this to quickly hide the window when needed.
|
||||
Note, that a proper hide should be made after this before showing the window again.
|
||||
*/
|
||||
void D2DOverlayWindow::quick_hide()
|
||||
{
|
||||
ShowWindow(hwnd, SW_HIDE);
|
||||
if (thumbnail)
|
||||
{
|
||||
DwmUnregisterThumbnail(thumbnail);
|
||||
}
|
||||
}
|
||||
|
||||
HWND D2DOverlayWindow::get_window_handle()
|
||||
{
|
||||
return hwnd;
|
||||
}
|
||||
|
||||
float D2DOverlayWindow::get_overlay_opacity()
|
||||
{
|
||||
return overlay_opacity;
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::init()
|
||||
{
|
||||
colors.update();
|
||||
landscape.load(L"svgs\\overlay.svg", d2d_dc.get())
|
||||
.find_thumbnail(L"path-1")
|
||||
.find_window_group(L"Group-1")
|
||||
.recolor(0x000000, colors.start_color_menu);
|
||||
portrait.load(L"svgs\\overlay_portrait.svg", d2d_dc.get())
|
||||
.find_thumbnail(L"path-1")
|
||||
.find_window_group(L"Group-1")
|
||||
.recolor(0x000000, colors.start_color_menu);
|
||||
no_active.load(L"svgs\\no_active_window.svg", d2d_dc.get());
|
||||
arrows.resize(10);
|
||||
for (unsigned i = 0; i < arrows.size(); ++i)
|
||||
{
|
||||
arrows[i].load(L"svgs\\" + std::to_wstring((i + 1) % 10) + L".svg", d2d_dc.get()).recolor(0x000000, colors.start_color_menu);
|
||||
}
|
||||
light_mode = (theme_setting == Light) || (theme_setting == System && colors.light_mode);
|
||||
if (!light_mode)
|
||||
{
|
||||
landscape.recolor(0x222222, 0xDDDDDD);
|
||||
portrait.recolor(0x222222, 0xDDDDDD);
|
||||
for (auto& arrow : arrows)
|
||||
{
|
||||
arrow.recolor(0x222222, 0xDDDDDD);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::resize()
|
||||
{
|
||||
window_rect = *get_window_pos(hwnd);
|
||||
float no_active_scale, font;
|
||||
if (window_width >= window_height)
|
||||
{ // portrait is broke right now
|
||||
use_overlay = &landscape;
|
||||
no_active_scale = 0.3f;
|
||||
font = 15.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
use_overlay = &portrait;
|
||||
no_active_scale = 0.5f;
|
||||
font = 16.0f;
|
||||
}
|
||||
use_overlay->resize(0, 0, window_width, window_height, 0.8f);
|
||||
auto thumb_no_active_rect = use_overlay->get_thumbnail_rect_and_scale(0, 0, no_active.width(), no_active.height(), no_active_scale).rect;
|
||||
no_active.resize(thumb_no_active_rect.left,
|
||||
thumb_no_active_rect.top,
|
||||
thumb_no_active_rect.right - thumb_no_active_rect.left,
|
||||
thumb_no_active_rect.bottom - thumb_no_active_rect.top,
|
||||
1.0f);
|
||||
text.resize(font, use_overlay->get_scale());
|
||||
}
|
||||
|
||||
void render_arrow(D2DSVG& arrow, TasklistButton& button, RECT window, float max_scale, ID2D1DeviceContext5* d2d_dc)
|
||||
{
|
||||
int dx = 0, dy = 0;
|
||||
// Calculate taskbar orientation
|
||||
arrow.toggle_element(L"left", false);
|
||||
arrow.toggle_element(L"right", false);
|
||||
arrow.toggle_element(L"top", false);
|
||||
arrow.toggle_element(L"bottom", false);
|
||||
if (button.x <= window.left)
|
||||
{ // taskbar on left
|
||||
dx = 1;
|
||||
arrow.toggle_element(L"left", true);
|
||||
}
|
||||
if (button.x >= window.right)
|
||||
{ // taskbar on right
|
||||
dx = -1;
|
||||
arrow.toggle_element(L"right", true);
|
||||
}
|
||||
if (button.y <= window.top)
|
||||
{ // taskbar on top
|
||||
dy = 1;
|
||||
arrow.toggle_element(L"top", true);
|
||||
}
|
||||
if (button.y >= window.bottom)
|
||||
{ // taskbar on bottom
|
||||
dy = -1;
|
||||
arrow.toggle_element(L"bottom", true);
|
||||
}
|
||||
double arrow_ratio = (double)arrow.height() / arrow.width();
|
||||
if (dy != 0)
|
||||
{
|
||||
// assume button is 25% wider than taller, +10% to make room for each of the arrows that are hidden
|
||||
auto render_arrow_width = (int)(button.height * 1.25f * 1.2f);
|
||||
auto render_arrow_height = (int)(render_arrow_width * arrow_ratio);
|
||||
arrow.resize(button.x + (button.width - render_arrow_width) / 2,
|
||||
dy == -1 ? button.y - render_arrow_height : 0,
|
||||
render_arrow_width,
|
||||
render_arrow_height,
|
||||
0.95f,
|
||||
max_scale)
|
||||
.render(d2d_dc);
|
||||
}
|
||||
else
|
||||
{
|
||||
// same as above - make room for the hidden arrow
|
||||
auto render_arrow_height = (int)(button.height * 1.2f);
|
||||
auto render_arrow_width = (int)(render_arrow_height / arrow_ratio);
|
||||
arrow.resize(dx == -1 ? button.x - render_arrow_width : 0,
|
||||
button.y + (button.height - render_arrow_height) / 2,
|
||||
render_arrow_width,
|
||||
render_arrow_height,
|
||||
0.95f,
|
||||
max_scale)
|
||||
.render(d2d_dc);
|
||||
}
|
||||
}
|
||||
|
||||
bool D2DOverlayWindow::show_thumbnail(const RECT& rect, double alpha)
|
||||
{
|
||||
if (!thumbnail)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
DWM_THUMBNAIL_PROPERTIES thumb_properties;
|
||||
thumb_properties.dwFlags = DWM_TNP_SOURCECLIENTAREAONLY | DWM_TNP_VISIBLE | DWM_TNP_RECTDESTINATION | DWM_TNP_OPACITY;
|
||||
thumb_properties.fSourceClientAreaOnly = FALSE;
|
||||
thumb_properties.fVisible = TRUE;
|
||||
thumb_properties.opacity = (BYTE)(255 * alpha);
|
||||
thumb_properties.rcDestination = rect;
|
||||
if (DwmUpdateThumbnailProperties(thumbnail, &thumb_properties) != S_OK)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::hide_thumbnail()
|
||||
{
|
||||
DWM_THUMBNAIL_PROPERTIES thumb_properties;
|
||||
thumb_properties.dwFlags = DWM_TNP_VISIBLE;
|
||||
thumb_properties.fVisible = FALSE;
|
||||
DwmUpdateThumbnailProperties(thumbnail, &thumb_properties);
|
||||
}
|
||||
|
||||
void D2DOverlayWindow::render(ID2D1DeviceContext5* d2d_dc)
|
||||
{
|
||||
if (!hidden && !instance->overlay_visible())
|
||||
{
|
||||
hide();
|
||||
return;
|
||||
}
|
||||
|
||||
d2d_dc->Clear();
|
||||
int x_offset = 0, y_offset = 0, dimension = 0;
|
||||
auto current_anim_value = (float)animation.value(Animation::AnimFunctions::LINEAR);
|
||||
SetLayeredWindowAttributes(hwnd, 0, (int)(255 * current_anim_value), LWA_ALPHA);
|
||||
double pos_anim_value = 1 - animation.value(Animation::AnimFunctions::EASE_OUT_EXPO);
|
||||
if (!tasklist_buttons.empty())
|
||||
{
|
||||
if (tasklist_buttons[0].x <= window_rect.left)
|
||||
{ // taskbar on left
|
||||
x_offset = (int)(-pos_anim_value * use_overlay->width() * use_overlay->get_scale());
|
||||
}
|
||||
if (tasklist_buttons[0].x >= window_rect.right)
|
||||
{ // taskbar on right
|
||||
x_offset = (int)(pos_anim_value * use_overlay->width() * use_overlay->get_scale());
|
||||
}
|
||||
if (tasklist_buttons[0].y <= window_rect.top)
|
||||
{ // taskbar on top
|
||||
y_offset = (int)(-pos_anim_value * use_overlay->height() * use_overlay->get_scale());
|
||||
}
|
||||
if (tasklist_buttons[0].y >= window_rect.bottom)
|
||||
{ // taskbar on bottom
|
||||
y_offset = (int)(pos_anim_value * use_overlay->height() * use_overlay->get_scale());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
x_offset = 0;
|
||||
y_offset = (int)(pos_anim_value * use_overlay->height() * use_overlay->get_scale());
|
||||
}
|
||||
// Draw background
|
||||
winrt::com_ptr<ID2D1SolidColorBrush> brush;
|
||||
float brush_opacity = get_overlay_opacity();
|
||||
D2D1_COLOR_F brushColor = light_mode ? D2D1::ColorF(1.0f, 1.0f, 1.0f, brush_opacity) : D2D1::ColorF(0, 0, 0, brush_opacity);
|
||||
winrt::check_hresult(d2d_dc->CreateSolidColorBrush(brushColor, brush.put()));
|
||||
D2D1_RECT_F background_rect = {};
|
||||
background_rect.bottom = (float)window_height;
|
||||
background_rect.right = (float)window_width;
|
||||
d2d_dc->SetTransform(D2D1::Matrix3x2F::Identity());
|
||||
d2d_dc->FillRectangle(background_rect, brush.get());
|
||||
|
||||
// Thumbnail logic:
|
||||
auto window_state = get_window_state(active_window);
|
||||
auto thumb_window = get_window_pos(active_window);
|
||||
if (!thumb_window.has_value())
|
||||
{
|
||||
thumb_window = RECT();
|
||||
}
|
||||
|
||||
bool miniature_shown = active_window != nullptr && thumbnail != nullptr && thumb_window && window_state != MINIMIZED;
|
||||
RECT client_rect;
|
||||
if (thumb_window && GetClientRect(active_window, &client_rect))
|
||||
{
|
||||
int dx = ((thumb_window->right - thumb_window->left) - (client_rect.right - client_rect.left)) / 2;
|
||||
int dy = ((thumb_window->bottom - thumb_window->top) - (client_rect.bottom - client_rect.top)) / 2;
|
||||
thumb_window->left += dx;
|
||||
thumb_window->right -= dx;
|
||||
thumb_window->top += dy;
|
||||
thumb_window->bottom -= dy;
|
||||
}
|
||||
if (miniature_shown && thumb_window->right - thumb_window->left <= 0 || thumb_window->bottom - thumb_window->top <= 0)
|
||||
{
|
||||
miniature_shown = false;
|
||||
}
|
||||
bool render_monitors = true;
|
||||
auto total_monitor_with_screen = total_screen;
|
||||
if (thumb_window)
|
||||
{
|
||||
total_monitor_with_screen.rect.left = std::min(total_monitor_with_screen.rect.left, thumb_window->left + monitor_dx);
|
||||
total_monitor_with_screen.rect.top = std::min(total_monitor_with_screen.rect.top, thumb_window->top + monitor_dy);
|
||||
total_monitor_with_screen.rect.right = std::max(total_monitor_with_screen.rect.right, thumb_window->right + monitor_dx);
|
||||
total_monitor_with_screen.rect.bottom = std::max(total_monitor_with_screen.rect.bottom, thumb_window->bottom + monitor_dy);
|
||||
}
|
||||
// Only allow the new rect being slight bigger.
|
||||
if (total_monitor_with_screen.width() - total_screen.width() > (thumb_window->right - thumb_window->left) / 2 ||
|
||||
total_monitor_with_screen.height() - total_screen.height() > (thumb_window->bottom - thumb_window->top) / 2)
|
||||
{
|
||||
render_monitors = false;
|
||||
}
|
||||
if (window_state == MINIMIZED)
|
||||
{
|
||||
total_monitor_with_screen = total_screen;
|
||||
}
|
||||
auto rect_and_scale = use_overlay->get_thumbnail_rect_and_scale(0, 0, total_monitor_with_screen.width(), total_monitor_with_screen.height(), 1);
|
||||
if (miniature_shown)
|
||||
{
|
||||
RECT thumbnail_pos;
|
||||
if (render_monitors)
|
||||
{
|
||||
thumbnail_pos.left = (int)((thumb_window->left + monitor_dx) * rect_and_scale.scale + rect_and_scale.rect.left);
|
||||
thumbnail_pos.top = (int)((thumb_window->top + monitor_dy) * rect_and_scale.scale + rect_and_scale.rect.top);
|
||||
thumbnail_pos.right = (int)((thumb_window->right + monitor_dx) * rect_and_scale.scale + rect_and_scale.rect.left);
|
||||
thumbnail_pos.bottom = (int)((thumb_window->bottom + monitor_dy) * rect_and_scale.scale + rect_and_scale.rect.top);
|
||||
}
|
||||
else
|
||||
{
|
||||
thumbnail_pos = use_overlay->get_thumbnail_rect_and_scale(0, 0, thumb_window->right - thumb_window->left, thumb_window->bottom - thumb_window->top, 1).rect;
|
||||
}
|
||||
// If the animation is done show the thumbnail
|
||||
// we cannot animate the thumbnail, the animation lags behind
|
||||
miniature_shown = show_thumbnail(thumbnail_pos, current_anim_value);
|
||||
}
|
||||
else
|
||||
{
|
||||
hide_thumbnail();
|
||||
}
|
||||
if (window_state == MINIMIZED)
|
||||
{
|
||||
render_monitors = true;
|
||||
}
|
||||
// render the monitors
|
||||
if (render_monitors)
|
||||
{
|
||||
brushColor = D2D1::ColorF(colors.desktop_fill_color, miniature_shown ? current_anim_value : current_anim_value * 0.3f);
|
||||
brush = nullptr;
|
||||
winrt::check_hresult(d2d_dc->CreateSolidColorBrush(brushColor, brush.put()));
|
||||
for (auto& monitor : monitors)
|
||||
{
|
||||
D2D1_RECT_F monitor_rect;
|
||||
monitor_rect.left = (float)((monitor.rect.left + monitor_dx) * rect_and_scale.scale + rect_and_scale.rect.left);
|
||||
monitor_rect.top = (float)((monitor.rect.top + monitor_dy) * rect_and_scale.scale + rect_and_scale.rect.top);
|
||||
monitor_rect.right = (float)((monitor.rect.right + monitor_dx) * rect_and_scale.scale + rect_and_scale.rect.left);
|
||||
monitor_rect.bottom = (float)((monitor.rect.bottom + monitor_dy) * rect_and_scale.scale + rect_and_scale.rect.top);
|
||||
d2d_dc->SetTransform(D2D1::Matrix3x2F::Identity());
|
||||
d2d_dc->FillRectangle(monitor_rect, brush.get());
|
||||
}
|
||||
}
|
||||
// Finalize the overlay - dimm the buttons if no thumbnail is present and show "No active window"
|
||||
use_overlay->toggle_window_group(miniature_shown || window_state == MINIMIZED);
|
||||
if (!miniature_shown && window_state != MINIMIZED)
|
||||
{
|
||||
no_active.render(d2d_dc);
|
||||
window_state = UNKNOWN;
|
||||
}
|
||||
|
||||
// Set the animation - move the draw window according to animation step
|
||||
auto popIn = D2D1::Matrix3x2F::Translation((float)x_offset, (float)y_offset);
|
||||
d2d_dc->SetTransform(popIn);
|
||||
|
||||
// Animate keys
|
||||
for (unsigned id = 0; id < key_animations.size();)
|
||||
{
|
||||
auto& animation = key_animations[id];
|
||||
D2D1_COLOR_F color;
|
||||
auto value = (float)animation.animation.value(Animation::AnimFunctions::EASE_OUT_EXPO);
|
||||
color.a = 1.0f;
|
||||
color.r = animation.original.r + (1.0f - animation.original.r) * value;
|
||||
color.g = animation.original.g + (1.0f - animation.original.g) * value;
|
||||
color.b = animation.original.b + (1.0f - animation.original.b) * value;
|
||||
animation.button->SetAttributeValue(L"fill", color);
|
||||
if (animation.animation.done())
|
||||
{
|
||||
if (value == 1)
|
||||
{
|
||||
animation.animation.reset(0.05, 1, 0);
|
||||
animation.animation.value(Animation::AnimFunctions::EASE_OUT_EXPO);
|
||||
}
|
||||
else
|
||||
{
|
||||
key_animations.erase(key_animations.begin() + id);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
++id;
|
||||
}
|
||||
// Finally: render the overlay...
|
||||
use_overlay->render(d2d_dc);
|
||||
// ... window arrows texts ...
|
||||
std::wstring left, right, up, down;
|
||||
bool left_disabled = false;
|
||||
bool right_disabled = false;
|
||||
bool up_disabled = false;
|
||||
bool down_disabled = false;
|
||||
switch (window_state)
|
||||
{
|
||||
case MINIMIZED:
|
||||
left = GET_RESOURCE_STRING(IDS_NO_ACTION);
|
||||
left_disabled = true;
|
||||
right = GET_RESOURCE_STRING(IDS_NO_ACTION);
|
||||
right_disabled = true;
|
||||
up = GET_RESOURCE_STRING(IDS_RESTORE);
|
||||
down = GET_RESOURCE_STRING(IDS_NO_ACTION);
|
||||
down_disabled = true;
|
||||
break;
|
||||
case MAXIMIZED:
|
||||
left = GET_RESOURCE_STRING(IDS_SNAP_LEFT);
|
||||
right = GET_RESOURCE_STRING(IDS_SNAP_RIGHT);
|
||||
up = GET_RESOURCE_STRING(IDS_NO_ACTION);
|
||||
up_disabled = true;
|
||||
down = GET_RESOURCE_STRING(IDS_RESTORE);
|
||||
break;
|
||||
case SNAPPED_TOP_LEFT:
|
||||
left = GET_RESOURCE_STRING(IDS_SNAP_UPPER_RIGHT);
|
||||
right = GET_RESOURCE_STRING(IDS_SNAP_UPPER_RIGHT);
|
||||
up = GET_RESOURCE_STRING(IDS_MAXIMIZE);
|
||||
down = GET_RESOURCE_STRING(IDS_SNAP_LEFT);
|
||||
break;
|
||||
case SNAPPED_LEFT:
|
||||
left = GET_RESOURCE_STRING(IDS_SNAP_RIGHT);
|
||||
right = GET_RESOURCE_STRING(IDS_RESTORE);
|
||||
up = GET_RESOURCE_STRING(IDS_SNAP_UPPER_LEFT);
|
||||
down = GET_RESOURCE_STRING(IDS_SNAP_LOWER_LEFT);
|
||||
break;
|
||||
case SNAPPED_BOTTOM_LEFT:
|
||||
left = GET_RESOURCE_STRING(IDS_SNAP_LOWER_RIGHT);
|
||||
right = GET_RESOURCE_STRING(IDS_SNAP_LOWER_RIGHT);
|
||||
up = GET_RESOURCE_STRING(IDS_SNAP_LEFT);
|
||||
down = GET_RESOURCE_STRING(IDS_MINIMIZE);
|
||||
break;
|
||||
case SNAPPED_TOP_RIGHT:
|
||||
left = GET_RESOURCE_STRING(IDS_SNAP_UPPER_LEFT);
|
||||
right = GET_RESOURCE_STRING(IDS_SNAP_UPPER_LEFT);
|
||||
up = GET_RESOURCE_STRING(IDS_MAXIMIZE);
|
||||
down = GET_RESOURCE_STRING(IDS_SNAP_RIGHT);
|
||||
break;
|
||||
case SNAPPED_RIGHT:
|
||||
left = GET_RESOURCE_STRING(IDS_RESTORE);
|
||||
right = GET_RESOURCE_STRING(IDS_SNAP_LEFT);
|
||||
up = GET_RESOURCE_STRING(IDS_SNAP_UPPER_RIGHT);
|
||||
down = GET_RESOURCE_STRING(IDS_SNAP_LOWER_RIGHT);
|
||||
break;
|
||||
case SNAPPED_BOTTOM_RIGHT:
|
||||
left = GET_RESOURCE_STRING(IDS_SNAP_LOWER_LEFT);
|
||||
right = GET_RESOURCE_STRING(IDS_SNAP_LOWER_LEFT);
|
||||
up = GET_RESOURCE_STRING(IDS_SNAP_RIGHT);
|
||||
down = GET_RESOURCE_STRING(IDS_MINIMIZE);
|
||||
break;
|
||||
case RESTORED:
|
||||
left = GET_RESOURCE_STRING(IDS_SNAP_LEFT);
|
||||
right = GET_RESOURCE_STRING(IDS_SNAP_RIGHT);
|
||||
up = GET_RESOURCE_STRING(IDS_MAXIMIZE);
|
||||
down = GET_RESOURCE_STRING(IDS_MINIMIZE);
|
||||
break;
|
||||
default:
|
||||
left = GET_RESOURCE_STRING(IDS_NO_ACTION);
|
||||
left_disabled = true;
|
||||
right = GET_RESOURCE_STRING(IDS_NO_ACTION);
|
||||
right_disabled = true;
|
||||
up = GET_RESOURCE_STRING(IDS_NO_ACTION);
|
||||
up_disabled = true;
|
||||
down = GET_RESOURCE_STRING(IDS_NO_ACTION);
|
||||
down_disabled = true;
|
||||
}
|
||||
auto text_color = D2D1::ColorF(light_mode ? 0x222222 : 0xDDDDDD, active_window_snappable && (miniature_shown || window_state == MINIMIZED) ? 1.0f : 0.3f);
|
||||
use_overlay->find_element(L"KeyUpGroup")->SetAttributeValue(L"fill-opacity", up_disabled ? 0.3f : 1.0f);
|
||||
text.set_alignment_center().write(d2d_dc, text_color, use_overlay->get_maximize_label(), up);
|
||||
use_overlay->find_element(L"KeyDownGroup")->SetAttributeValue(L"fill-opacity", down_disabled ? 0.3f : 1.0f);
|
||||
text.write(d2d_dc, text_color, use_overlay->get_minimize_label(), down);
|
||||
use_overlay->find_element(L"KeyLeftGroup")->SetAttributeValue(L"fill-opacity", left_disabled ? 0.3f : 1.0f);
|
||||
text.set_alignment_right().write(d2d_dc, text_color, use_overlay->get_snap_left(), left);
|
||||
use_overlay->find_element(L"KeyRightGroup")->SetAttributeValue(L"fill-opacity", right_disabled ? 0.3f : 1.0f);
|
||||
text.set_alignment_left().write(d2d_dc, text_color, use_overlay->get_snap_right(), right);
|
||||
// ... and the arrows with numbers
|
||||
for (auto&& button : tasklist_buttons)
|
||||
{
|
||||
if ((size_t)(button.keynum) - 1 >= arrows.size())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
render_arrow(arrows[(size_t)(button.keynum) - 1], button, window_rect, use_overlay->get_scale(), d2d_dc);
|
||||
}
|
||||
}
|
||||
106
src/modules/ShortcutGuide/ShortcutGuide/overlay_window.h
Normal file
@@ -0,0 +1,106 @@
|
||||
#pragma once
|
||||
#include "animation.h"
|
||||
#include "d2d_svg.h"
|
||||
#include "d2d_window.h"
|
||||
#include "d2d_text.h"
|
||||
|
||||
#include <common/display/monitors.h>
|
||||
#include <common/themes/windows_colors.h>
|
||||
#include "tasklist_positions.h"
|
||||
|
||||
struct ScaleResult
|
||||
{
|
||||
double scale;
|
||||
RECT rect;
|
||||
};
|
||||
|
||||
class D2DOverlaySVG : public D2DSVG
|
||||
{
|
||||
public:
|
||||
D2DOverlaySVG& load(const std::wstring& filename, ID2D1DeviceContext5* d2d_dc);
|
||||
D2DOverlaySVG& resize(int x, int y, int width, int height, float fill, float max_scale = -1.0f);
|
||||
D2DOverlaySVG& find_thumbnail(const std::wstring& id);
|
||||
D2DOverlaySVG& find_window_group(const std::wstring& id);
|
||||
ScaleResult get_thumbnail_rect_and_scale(int x_offset, int y_offset, int window_cx, int window_cy, float fill);
|
||||
D2DOverlaySVG& toggle_window_group(bool active);
|
||||
winrt::com_ptr<ID2D1SvgElement> find_element(const std::wstring& id);
|
||||
D2D1_RECT_F get_maximize_label() const;
|
||||
D2D1_RECT_F get_minimize_label() const;
|
||||
D2D1_RECT_F get_snap_left() const;
|
||||
D2D1_RECT_F get_snap_right() const;
|
||||
|
||||
private:
|
||||
D2D1_POINT_2F thumbnail_top_left = {};
|
||||
D2D1_POINT_2F thumbnail_bottom_right = {};
|
||||
RECT thumbnail_scaled_rect = {};
|
||||
winrt::com_ptr<ID2D1SvgElement> window_group;
|
||||
};
|
||||
|
||||
struct AnimateKeys
|
||||
{
|
||||
Animation animation;
|
||||
D2D1_COLOR_F original;
|
||||
winrt::com_ptr<ID2D1SvgElement> button;
|
||||
int vk_code;
|
||||
};
|
||||
|
||||
class D2DOverlayWindow : public D2DWindow
|
||||
{
|
||||
public:
|
||||
D2DOverlayWindow();
|
||||
void show(HWND active_window, bool snappable);
|
||||
~D2DOverlayWindow();
|
||||
void apply_overlay_opacity(float opacity);
|
||||
void set_theme(const std::wstring& theme);
|
||||
void quick_hide();
|
||||
|
||||
HWND get_window_handle();
|
||||
void SetWindowCloseType(std::wstring windowCloseType)
|
||||
{
|
||||
this->windowCloseType = windowCloseType;
|
||||
}
|
||||
|
||||
private:
|
||||
std::wstring windowCloseType;
|
||||
bool show_thumbnail(const RECT& rect, double alpha);
|
||||
void hide_thumbnail();
|
||||
virtual void init() override;
|
||||
virtual void resize() override;
|
||||
virtual void render(ID2D1DeviceContext5* d2d_dc) override;
|
||||
virtual void on_show() override;
|
||||
virtual void on_hide() override;
|
||||
float get_overlay_opacity();
|
||||
|
||||
bool running = true;
|
||||
std::vector<AnimateKeys> key_animations;
|
||||
std::vector<MonitorInfo> monitors;
|
||||
ScreenSize total_screen;
|
||||
int monitor_dx = 0, monitor_dy = 0;
|
||||
D2DText text;
|
||||
WindowsColors colors;
|
||||
Animation animation;
|
||||
RECT window_rect = {};
|
||||
Tasklist tasklist;
|
||||
std::vector<TasklistButton> tasklist_buttons;
|
||||
std::thread tasklist_thread;
|
||||
bool tasklist_update = false;
|
||||
std::mutex tasklist_cv_mutex;
|
||||
std::condition_variable tasklist_cv;
|
||||
|
||||
HTHUMBNAIL thumbnail;
|
||||
HWND active_window = nullptr;
|
||||
bool active_window_snappable = false;
|
||||
D2DOverlaySVG landscape, portrait;
|
||||
D2DOverlaySVG* use_overlay = nullptr;
|
||||
D2DSVG no_active;
|
||||
std::vector<D2DSVG> arrows;
|
||||
std::chrono::steady_clock::time_point shown_start_time;
|
||||
float overlay_opacity = 0.9f;
|
||||
enum
|
||||
{
|
||||
Light,
|
||||
Dark,
|
||||
System
|
||||
} theme_setting = System;
|
||||
bool light_mode = true;
|
||||
};
|
||||
4
src/modules/ShortcutGuide/ShortcutGuide/packages.config
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Windows.CppWinRT" version="2.0.200729.8" targetFramework="native" />
|
||||
</packages>
|
||||
1
src/modules/ShortcutGuide/ShortcutGuide/pch.cpp
Normal file
@@ -0,0 +1 @@
|
||||
#include "pch.h"
|
||||
30
src/modules/ShortcutGuide/ShortcutGuide/pch.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
#define NOMINMAX
|
||||
#include <winrt/base.h>
|
||||
#include <winrt/Windows.Foundation.h>
|
||||
#include <winrt/Windows.Foundation.Collections.h>
|
||||
#include <Windows.h>
|
||||
#include <dxgi1_3.h>
|
||||
#include <d3d11_2.h>
|
||||
#include <d2d1_3.h>
|
||||
#include <d2d1_3helper.h>
|
||||
#include <d2d1helper.h>
|
||||
#include <dwrite.h>
|
||||
#include <dcomp.h>
|
||||
#include <dwmapi.h>
|
||||
#include <Shobjidl.h>
|
||||
#include <Shlwapi.h>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
#include <functional>
|
||||
#include <condition_variable>
|
||||
#include <stdexcept>
|
||||
#include <tuple>
|
||||
#include <unordered_set>
|
||||
#include <string>
|
||||
#include <ProjectTelemetry.h>
|
||||
#include <filesystem>
|
||||
#include <common/logger/logger.h>
|
||||
13
src/modules/ShortcutGuide/ShortcutGuide/resource.base.h
Normal file
@@ -0,0 +1,13 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by ShortcutGuide.rc
|
||||
|
||||
//////////////////////////////
|
||||
// Non-localizable
|
||||
|
||||
#define FILE_DESCRIPTION "PowerToys ShortcutGuide"
|
||||
#define INTERNAL_NAME "ShortcutGuide"
|
||||
#define ORIGINAL_FILENAME "PowerToys.ShortcutGuide.exe"
|
||||
|
||||
// Non-localizable
|
||||
//////////////////////////////
|
||||
419
src/modules/ShortcutGuide/ShortcutGuide/shortcut_guide.cpp
Normal file
@@ -0,0 +1,419 @@
|
||||
#include "pch.h"
|
||||
#include "shortcut_guide.h"
|
||||
#include "target_state.h"
|
||||
#include "trace.h"
|
||||
|
||||
#include <common/SettingsAPI/settings_objects.h>
|
||||
#include <common/debug_control.h>
|
||||
#include <common/interop/shared_constants.h>
|
||||
#include <sstream>
|
||||
|
||||
#include <common/SettingsAPI/settings_helpers.h>
|
||||
#include <common/SettingsAPI/settings_objects.h>
|
||||
#include <common/logger/logger.h>
|
||||
#include <common/utils/process_path.h>
|
||||
#include <common/utils/resources.h>
|
||||
#include <common/utils/string_utils.h>
|
||||
#include <common/utils/winapi_error.h>
|
||||
#include <common/utils/window.h>
|
||||
#include <Psapi.h>
|
||||
#include <common/hooks/LowlevelKeyboardEvent.h>
|
||||
|
||||
// TODO: refactor singleton
|
||||
OverlayWindow* instance = nullptr;
|
||||
|
||||
namespace
|
||||
{
|
||||
// Window properties relevant to ShortcutGuide
|
||||
struct ShortcutGuideWindowInfo
|
||||
{
|
||||
HWND hwnd = nullptr; // Handle to the top-level foreground window or nullptr if there is no such window
|
||||
bool snappable = false; // True, if the window can react to Windows Snap keys
|
||||
bool disabled = false;
|
||||
};
|
||||
|
||||
ShortcutGuideWindowInfo GetShortcutGuideWindowInfo(HWND active_window)
|
||||
{
|
||||
ShortcutGuideWindowInfo result;
|
||||
active_window = GetAncestor(active_window, GA_ROOT);
|
||||
if (!IsWindowVisible(active_window))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
auto style = GetWindowLong(active_window, GWL_STYLE);
|
||||
auto exStyle = GetWindowLong(active_window, GWL_EXSTYLE);
|
||||
if ((style & WS_CHILD) == WS_CHILD ||
|
||||
(style & WS_DISABLED) == WS_DISABLED ||
|
||||
(exStyle & WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW ||
|
||||
(exStyle & WS_EX_NOACTIVATE) == WS_EX_NOACTIVATE)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
std::array<char, 256> class_name;
|
||||
GetClassNameA(active_window, class_name.data(), static_cast<int>(class_name.size()));
|
||||
if (is_system_window(active_window, class_name.data()))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
static HWND cortana_hwnd = nullptr;
|
||||
if (cortana_hwnd == nullptr)
|
||||
{
|
||||
if (strcmp(class_name.data(), "Windows.UI.Core.CoreWindow") == 0 &&
|
||||
get_process_path(active_window).ends_with(L"SearchUI.exe"))
|
||||
{
|
||||
cortana_hwnd = active_window;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else if (cortana_hwnd == active_window)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
result.hwnd = active_window;
|
||||
// In reality, Windows Snap works if even one of those styles is set
|
||||
// for a window, it is just limited. If there is no WS_MAXIMIZEBOX using
|
||||
// WinKey + Up just won't maximize the window. Similary, without
|
||||
// WS_MINIMIZEBOX the window will not get minimized. A "Save As..." dialog
|
||||
// is a example of such window - it can be snapped to both sides and to
|
||||
// all screen corners, but will not get maximized nor minimized.
|
||||
// For now, since ShortcutGuide can only disable entire "Windows Controls"
|
||||
// group, we require that the window supports all the options.
|
||||
result.snappable = ((style & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX) &&
|
||||
((style & WS_MINIMIZEBOX) == WS_MINIMIZEBOX) &&
|
||||
((style & WS_THICKFRAME) == WS_THICKFRAME);
|
||||
return result;
|
||||
}
|
||||
|
||||
const LPARAM eventActivateWindow = 1;
|
||||
|
||||
bool wasWinPressed = false;
|
||||
bool isWinPressed()
|
||||
{
|
||||
return (GetAsyncKeyState(VK_LWIN) & 0x8000) || (GetAsyncKeyState(VK_RWIN) & 0x8000);
|
||||
}
|
||||
|
||||
// all modifiers without win key
|
||||
std::vector<int> modifierKeys = { VK_SHIFT, VK_LSHIFT, VK_RSHIFT, VK_CONTROL, VK_LCONTROL, VK_RCONTROL, VK_MENU, VK_LMENU, VK_RMENU };
|
||||
|
||||
// returns false if there are other modifiers pressed or win key isn' pressed
|
||||
bool onlyWinPressed()
|
||||
{
|
||||
if (!isWinPressed())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (auto key : modifierKeys)
|
||||
{
|
||||
if (GetAsyncKeyState(key) & 0x8000)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool isWin(int key)
|
||||
{
|
||||
return key == VK_LWIN || key == VK_RWIN;
|
||||
}
|
||||
|
||||
bool isKeyDown(LowlevelKeyboardEvent event)
|
||||
{
|
||||
return event.wParam == WM_KEYDOWN || event.wParam == WM_SYSKEYDOWN;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LowlevelKeyboardEvent event;
|
||||
if (nCode == HC_ACTION)
|
||||
{
|
||||
event.lParam = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
|
||||
event.wParam = wParam;
|
||||
|
||||
if (event.lParam->vkCode == VK_ESCAPE)
|
||||
{
|
||||
Logger::trace(L"ESC key was pressed");
|
||||
instance->CloseWindow(HideWindowType::ESC_PRESSED);
|
||||
}
|
||||
|
||||
if (wasWinPressed && !isKeyDown(event) && isWin(event.lParam->vkCode))
|
||||
{
|
||||
Logger::trace(L"Win key was released");
|
||||
instance->CloseWindow(HideWindowType::WIN_RELEASED);
|
||||
}
|
||||
|
||||
if (isKeyDown(event) && isWin(event.lParam->vkCode))
|
||||
{
|
||||
wasWinPressed = true;
|
||||
}
|
||||
|
||||
if (onlyWinPressed() && isKeyDown(event) && !isWin(event.lParam->vkCode))
|
||||
{
|
||||
Logger::trace(L"Shortcut with win key was pressed");
|
||||
instance->CloseWindow(HideWindowType::WIN_SHORTCUT_PRESSED);
|
||||
}
|
||||
}
|
||||
|
||||
return CallNextHookEx(NULL, nCode, wParam, lParam);
|
||||
}
|
||||
|
||||
std::wstring ToWstring(HideWindowType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case HideWindowType::ESC_PRESSED:
|
||||
return L"ESC_PRESSED";
|
||||
case HideWindowType::WIN_RELEASED:
|
||||
return L"WIN_RELEASED";
|
||||
case HideWindowType::WIN_SHORTCUT_PRESSED:
|
||||
return L"WIN_SHORTCUT_PRESSED";
|
||||
case HideWindowType::THE_SHORTCUT_PRESSED:
|
||||
return L"THE_SHORTCUT_PRESSED";
|
||||
}
|
||||
|
||||
return L"";
|
||||
}
|
||||
}
|
||||
|
||||
OverlayWindow::OverlayWindow(HWND activeWindow)
|
||||
{
|
||||
instance = this;
|
||||
this -> activeWindow = activeWindow;
|
||||
app_name = GET_RESOURCE_STRING(IDS_SHORTCUT_GUIDE);
|
||||
|
||||
Logger::info("Overlay Window is creating");
|
||||
init_settings();
|
||||
keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), NULL);
|
||||
if (!keyboardHook)
|
||||
{
|
||||
Logger::warn(L"Failed to create low level keyboard hook. {}", get_last_error_or_default(GetLastError()));
|
||||
}
|
||||
}
|
||||
|
||||
void OverlayWindow::ShowWindow()
|
||||
{
|
||||
winkey_popup = std::make_unique<D2DOverlayWindow>();
|
||||
winkey_popup->apply_overlay_opacity(((float)overlayOpacity.value) / 100.0f);
|
||||
winkey_popup->set_theme(theme.value);
|
||||
target_state = std::make_unique<TargetState>();
|
||||
try
|
||||
{
|
||||
winkey_popup->initialize();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Logger::critical("Winkey popup failed to initialize");
|
||||
return;
|
||||
}
|
||||
|
||||
target_state->toggle_force_shown();
|
||||
}
|
||||
|
||||
void OverlayWindow::CloseWindow(HideWindowType type, int mainThreadId)
|
||||
{
|
||||
if (mainThreadId == 0)
|
||||
{
|
||||
mainThreadId = GetCurrentThreadId();
|
||||
}
|
||||
|
||||
if (this->winkey_popup)
|
||||
{
|
||||
this->winkey_popup->SetWindowCloseType(ToWstring(type));
|
||||
Logger::trace(L"Terminating process");
|
||||
PostThreadMessage(mainThreadId, WM_QUIT, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
bool OverlayWindow::IsDisabled()
|
||||
{
|
||||
WCHAR exePath[MAX_PATH] = L"";
|
||||
instance->get_exe_path(activeWindow, exePath);
|
||||
if (wcslen(exePath) > 0)
|
||||
{
|
||||
return is_disabled_app(exePath);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
OverlayWindow::~OverlayWindow()
|
||||
{
|
||||
if (event_waiter)
|
||||
{
|
||||
event_waiter.reset();
|
||||
}
|
||||
|
||||
if (winkey_popup)
|
||||
{
|
||||
winkey_popup->hide();
|
||||
}
|
||||
|
||||
if (target_state)
|
||||
{
|
||||
target_state->exit();
|
||||
target_state.reset();
|
||||
}
|
||||
|
||||
if (winkey_popup)
|
||||
{
|
||||
winkey_popup.reset();
|
||||
}
|
||||
|
||||
if (keyboardHook)
|
||||
{
|
||||
UnhookWindowsHookEx(keyboardHook);
|
||||
}
|
||||
}
|
||||
|
||||
void OverlayWindow::on_held()
|
||||
{
|
||||
auto windowInfo = GetShortcutGuideWindowInfo(activeWindow);
|
||||
if (windowInfo.disabled)
|
||||
{
|
||||
target_state->was_hidden();
|
||||
return;
|
||||
}
|
||||
winkey_popup->show(windowInfo.hwnd, windowInfo.snappable);
|
||||
}
|
||||
|
||||
void OverlayWindow::quick_hide()
|
||||
{
|
||||
winkey_popup->quick_hide();
|
||||
}
|
||||
|
||||
void OverlayWindow::was_hidden()
|
||||
{
|
||||
target_state->was_hidden();
|
||||
}
|
||||
|
||||
bool OverlayWindow::overlay_visible() const
|
||||
{
|
||||
return target_state->active();
|
||||
}
|
||||
|
||||
void OverlayWindow::init_settings()
|
||||
{
|
||||
auto settings = GetSettings();
|
||||
overlayOpacity.value = settings.overlayOpacity;
|
||||
theme.value = settings.theme;
|
||||
disabledApps.value = settings.disabledApps;
|
||||
update_disabled_apps();
|
||||
}
|
||||
|
||||
bool OverlayWindow::is_disabled_app(wchar_t* exePath)
|
||||
{
|
||||
if (exePath == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
auto exePathUpper = std::wstring(exePath);
|
||||
CharUpperBuffW(exePathUpper.data(), (DWORD)exePathUpper.length());
|
||||
for (const auto& row : disabled_apps_array)
|
||||
{
|
||||
const auto pos = exePathUpper.rfind(row);
|
||||
const auto last_slash = exePathUpper.rfind('\\');
|
||||
// Check that row occurs in disabled_apps_array, and its last occurrence contains in itself the first character after the last backslash.
|
||||
if (pos != std::wstring::npos && pos <= last_slash + 1 && pos + row.length() > last_slash)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void OverlayWindow::update_disabled_apps()
|
||||
{
|
||||
disabled_apps_array.clear();
|
||||
auto disabledUppercase = disabledApps.value;
|
||||
CharUpperBuffW(disabledUppercase.data(), (DWORD)disabledUppercase.length());
|
||||
std::wstring_view view(disabledUppercase);
|
||||
view = trim(view);
|
||||
while (!view.empty())
|
||||
{
|
||||
auto pos = (std::min)(view.find_first_of(L"\r\n"), view.length());
|
||||
disabled_apps_array.emplace_back(view.substr(0, pos));
|
||||
view.remove_prefix(pos);
|
||||
view = trim(view);
|
||||
}
|
||||
}
|
||||
|
||||
void OverlayWindow::get_exe_path(HWND window, wchar_t* path)
|
||||
{
|
||||
if (disabled_apps_array.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
DWORD pid = 0;
|
||||
GetWindowThreadProcessId(window, &pid);
|
||||
if (pid != 0)
|
||||
{
|
||||
HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
|
||||
if (processHandle && GetProcessImageFileName(processHandle, path, MAX_PATH) > 0)
|
||||
{
|
||||
CloseHandle(processHandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ShortcutGuideSettings OverlayWindow::GetSettings() noexcept
|
||||
{
|
||||
ShortcutGuideSettings settings;
|
||||
json::JsonObject properties;
|
||||
try
|
||||
{
|
||||
PowerToysSettings::PowerToyValues settingsValues =
|
||||
PowerToysSettings::PowerToyValues::load_from_settings_file(app_key);
|
||||
|
||||
auto settingsObject = settingsValues.get_raw_json();
|
||||
if (!settingsObject.GetView().Size())
|
||||
{
|
||||
return settings;
|
||||
}
|
||||
|
||||
properties = settingsObject.GetNamedObject(L"properties");
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Logger::warn("Failed to read settings. Use default settings");
|
||||
return settings;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
settings.hotkey = PowerToysSettings::HotkeyObject::from_json(properties.GetNamedObject(OpenShortcut::name)).to_string();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
settings.overlayOpacity = (int)properties.GetNamedObject(OverlayOpacity::name).GetNamedNumber(L"value");
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
settings.theme = (std::wstring)properties.GetNamedObject(Theme::name).GetNamedString(L"value");
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
settings.disabledApps = (std::wstring)properties.GetNamedObject(DisabledApps::name).GetNamedString(L"value");
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
85
src/modules/ShortcutGuide/ShortcutGuide/shortcut_guide.h
Normal file
@@ -0,0 +1,85 @@
|
||||
#pragma once
|
||||
#include "../interface/powertoy_module_interface.h"
|
||||
//#include <interface/powertoy_module_interface.h>
|
||||
#include "overlay_window.h"
|
||||
#include "native_event_waiter.h"
|
||||
#include "ShortcutGuideSettings.h"
|
||||
#include "ShortcutGuideConstants.h"
|
||||
|
||||
#include "Generated Files/resource.h"
|
||||
|
||||
// We support only one instance of the overlay
|
||||
extern class OverlayWindow* instance;
|
||||
|
||||
class TargetState;
|
||||
|
||||
enum class HideWindowType
|
||||
{
|
||||
ESC_PRESSED,
|
||||
WIN_RELEASED,
|
||||
WIN_SHORTCUT_PRESSED,
|
||||
THE_SHORTCUT_PRESSED
|
||||
};
|
||||
|
||||
class OverlayWindow
|
||||
{
|
||||
public:
|
||||
OverlayWindow(HWND activeWindow);
|
||||
void ShowWindow();
|
||||
void CloseWindow(HideWindowType type, int mainThreadId = 0);
|
||||
bool IsDisabled();
|
||||
|
||||
void on_held();
|
||||
void quick_hide();
|
||||
void was_hidden();
|
||||
|
||||
bool overlay_visible() const;
|
||||
|
||||
bool is_disabled_app(wchar_t* exePath);
|
||||
|
||||
void get_exe_path(HWND window, wchar_t* exePath);
|
||||
~OverlayWindow();
|
||||
static ShortcutGuideSettings GetSettings() noexcept;
|
||||
private:
|
||||
std::wstring app_name;
|
||||
//contains the non localized key of the powertoy
|
||||
static inline std::wstring app_key = ShortcutGuideConstants::ModuleKey;
|
||||
std::unique_ptr<TargetState> target_state;
|
||||
std::unique_ptr<D2DOverlayWindow> winkey_popup;
|
||||
std::unique_ptr<NativeEventWaiter> event_waiter;
|
||||
std::vector<std::wstring> disabled_apps_array;
|
||||
void init_settings();
|
||||
void update_disabled_apps();
|
||||
HWND activeWindow;
|
||||
HHOOK keyboardHook;
|
||||
|
||||
struct OverlayOpacity
|
||||
{
|
||||
static inline PCWSTR name = L"overlay_opacity";
|
||||
int value;
|
||||
int resourceId = IDS_SETTING_DESCRIPTION_OVERLAY_OPACITY;
|
||||
} overlayOpacity;
|
||||
|
||||
struct Theme
|
||||
{
|
||||
static inline PCWSTR name = L"theme";
|
||||
std::wstring value;
|
||||
int resourceId = IDS_SETTING_DESCRIPTION_THEME;
|
||||
std::vector<std::pair<std::wstring, UINT>> keys_and_texts = {
|
||||
{ L"system", IDS_SETTING_DESCRIPTION_THEME_SYSTEM },
|
||||
{ L"light", IDS_SETTING_DESCRIPTION_THEME_LIGHT },
|
||||
{ L"dark", IDS_SETTING_DESCRIPTION_THEME_DARK }
|
||||
};
|
||||
} theme;
|
||||
|
||||
struct DisabledApps
|
||||
{
|
||||
static inline PCWSTR name = L"disabled_apps";
|
||||
std::wstring value;
|
||||
} disabledApps;
|
||||
|
||||
struct OpenShortcut
|
||||
{
|
||||
static inline PCWSTR name = L"open_shortcutguide";
|
||||
} openShortcut;
|
||||
};
|
||||
24
src/modules/ShortcutGuide/ShortcutGuide/start_visible.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
#include "pch.h"
|
||||
#include "start_visible.h"
|
||||
|
||||
bool is_start_visible()
|
||||
{
|
||||
static const auto app_visibility = []() {
|
||||
winrt::com_ptr<IAppVisibility> result;
|
||||
CoCreateInstance(CLSID_AppVisibility,
|
||||
nullptr,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
__uuidof(result),
|
||||
result.put_void());
|
||||
return result;
|
||||
}();
|
||||
|
||||
if (!app_visibility)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
BOOL visible;
|
||||
auto result = app_visibility->IsLauncherVisible(&visible);
|
||||
return SUCCEEDED(result) && visible;
|
||||
}
|
||||
3
src/modules/ShortcutGuide/ShortcutGuide/start_visible.h
Normal file
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
bool is_start_visible();
|
||||
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/0.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>0</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-7.000000, -159.000000)">
|
||||
<g id="0" transform="translate(7.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<path d="M26.5,31.1376953 C24.166655,31.1376953 23,29.4993653 23,26.2226562 C23,24.522778 23.3155893,23.2273808 23.9467773,22.3364258 C24.5779654,21.4454708 25.4928325,21 26.6914062,21 C28.9700635,21 30.109375,22.6656734 30.109375,25.9970703 C30.109375,27.6559328 29.798343,28.9274044 29.1762695,29.8115234 C28.5541961,30.6956424 27.6621152,31.1376953 26.5,31.1376953 Z M26.5957031,22.6474609 C25.6614537,22.6474609 25.1943359,23.8209518 25.1943359,26.1679688 C25.1943359,28.3782663 25.6523392,29.4833984 26.5683594,29.4833984 C27.461593,29.4833984 27.9082031,28.3440869 27.9082031,26.0654297 C27.9082031,23.7867725 27.4707075,22.6474609 26.5957031,22.6474609 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/1.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>1</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-67.000000, -159.000000)">
|
||||
<g id="1" transform="translate(67.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<polygon fill="#FFFFFF" fill-rule="nonzero" points="30.2548828 30.9667969 24.0546875 30.9667969 24.0546875 29.2578125 26.0849609 29.2578125 26.0849609 23.1533203 24 23.6044922 24 21.8544922 28.2382812 21 28.2382812 29.2578125 30.2548828 29.2578125"></polygon>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/2.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>2</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-127.000000, -159.000000)">
|
||||
<g id="2" transform="translate(127.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<path d="M26.4746094,29.1347656 L26.4746094,29.1757812 L30.453125,29.1757812 L30.453125,30.9667969 L24,30.9667969 L24,29.2851562 L26.8095703,26.5986328 C27.3746773,26.0563124 27.772297,25.6017271 28.0024414,25.2348633 C28.2325858,24.8679995 28.3476562,24.4817729 28.3476562,24.0761719 C28.3476562,23.1738236 27.8623095,22.7226562 26.8916016,22.7226562 C26.0484984,22.7226562 25.2418658,23.0576138 24.4716797,23.7275391 L24.4716797,21.8271484 C25.3238975,21.2757134 26.2854764,21 27.3564453,21 C28.3590545,21 29.1417615,21.2517878 29.7045898,21.7553711 C30.2674182,22.2589543 30.5488281,22.9391233 30.5488281,23.7958984 C30.5488281,24.9397844 29.8629626,26.1223897 28.4912109,27.34375 L26.4746094,29.1347656 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/3.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>3</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-187.000000, -159.000000)">
|
||||
<g id="3" transform="translate(187.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<path d="M24,30.6455078 L24,28.765625 C24.6562533,29.244143 25.4218706,29.4833984 26.296875,29.4833984 C26.84831,29.4833984 27.2778305,29.36491 27.5854492,29.1279297 C27.8930679,28.8909493 28.046875,28.560549 28.046875,28.1367188 C28.046875,27.6992166 27.85661,27.3619804 27.4760742,27.125 C27.0955385,26.8880196 26.5725945,26.7695312 25.9072266,26.7695312 L25.0253906,26.7695312 L25.0253906,25.1152344 L25.8388672,25.1152344 C27.1149152,25.1152344 27.7529297,24.6914105 27.7529297,23.84375 C27.7529297,23.04622 27.2630257,22.6474609 26.2832031,22.6474609 C25.6269498,22.6474609 24.9889354,22.8593729 24.3691406,23.2832031 L24.3691406,21.5195312 C25.0572951,21.1731754 25.8593704,21 26.7753906,21 C27.7779998,21 28.5584282,21.2255837 29.1166992,21.6767578 C29.6749702,22.1279319 29.9541016,22.7135381 29.9541016,23.4335938 C29.9541016,24.7141991 29.304694,25.5162744 28.0058594,25.8398438 L28.0058594,25.8740234 C28.6985712,25.9606124 29.2454407,26.2124003 29.6464844,26.6293945 C30.047528,27.0463888 30.2480469,27.5579397 30.2480469,28.1640625 C30.2480469,29.0800827 29.9130893,29.8046848 29.2431641,30.3378906 C28.5732388,30.8710964 27.6481179,31.1376953 26.4677734,31.1376953 C25.4560496,31.1376953 24.6334667,30.9736345 24,30.6455078 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/4.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>4</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-247.000000, -159.000000)">
|
||||
<g id="4" transform="translate(247.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<path d="M30.4169922,28.7177734 L29.2412109,28.7177734 L29.2412109,30.8027344 L27.2724609,30.8027344 L27.2724609,28.7177734 L23,28.7177734 L23,27.34375 L27.1152344,21 L29.2412109,21 L29.2412109,27.1796875 L30.4169922,27.1796875 L30.4169922,28.7177734 Z M27.2998047,23.1601562 L27.2587891,23.1601562 C27.1949867,23.3242196 27.071941,23.5794254 26.8896484,23.9257812 L24.7910156,27.1796875 L27.2724609,27.1796875 L27.2724609,24.0966797 C27.2724609,23.8232408 27.2815754,23.5110695 27.2998047,23.1601562 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/5.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>5</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-307.000000, -159.000000)">
|
||||
<g id="5" transform="translate(307.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<path d="M24,30.5498047 L24,28.7041016 C24.6699252,29.1142599 25.3831342,29.3193359 26.1396484,29.3193359 C26.7093127,29.3193359 27.1547835,29.1837579 27.4760742,28.9125977 C27.7973649,28.6414374 27.9580078,28.2734398 27.9580078,27.8085938 C27.9580078,26.8378858 27.2721423,26.3525391 25.9003906,26.3525391 C25.4537738,26.3525391 24.9137401,26.3935543 24.2802734,26.4755859 L24.2802734,21 L29.7080078,21 L29.7080078,22.7636719 L26.1259766,22.7636719 L26.1259766,24.7255859 C26.4130874,24.6982421 26.6842435,24.6845703 26.9394531,24.6845703 C27.9466196,24.6845703 28.7350232,24.9488906 29.3046875,25.4775391 C29.8743518,26.0061875 30.1591797,26.7171179 30.1591797,27.6103516 C30.1591797,28.5992888 29.8196649,29.4070607 29.140625,30.0336914 C28.4615851,30.6603221 27.5410214,30.9736328 26.3789062,30.9736328 C25.4355422,30.9736328 24.6425813,30.8323582 24,30.5498047 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/6.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>6</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-367.000000, -159.000000)">
|
||||
<g id="6" transform="translate(367.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<path d="M30.2070312,21.2666016 L30.2070312,23.0712891 C29.710284,22.7887356 29.1679717,22.6474609 28.5800781,22.6474609 C27.8554651,22.6474609 27.2709983,22.9243136 26.8266602,23.4780273 C26.382322,24.031741 26.1510418,24.7734329 26.1328125,25.703125 L26.1738281,25.703125 C26.6432315,25.0104132 27.3290971,24.6640625 28.2314453,24.6640625 C29.0517619,24.6640625 29.7023088,24.9420545 30.1831055,25.4980469 C30.6639021,26.0540392 30.9042969,26.7900345 30.9042969,27.7060547 C30.9042969,28.6904346 30.5852896,29.5084603 29.9472656,30.1601562 C29.3092416,30.8118522 28.4980518,31.1376953 27.5136719,31.1376953 C26.4108018,31.1376953 25.5494823,30.7389363 24.9296875,29.9414062 C24.3098927,29.1438762 24,28.0250723 24,26.5849609 C24,24.88964 24.398759,23.5349986 25.1962891,22.5209961 C25.9938191,21.5069936 27.076165,21 28.4433594,21 C29.1998736,21 29.7877583,21.0888663 30.2070312,21.2666016 Z M27.5,26.2636719 C27.1035136,26.2636719 26.7879244,26.4026679 26.5532227,26.6806641 C26.318521,26.9586602 26.2011719,27.3141254 26.2011719,27.7470703 C26.2011719,28.2255883 26.3207996,28.6346012 26.5600586,28.9741211 C26.7993176,29.313641 27.1171855,29.4833984 27.5136719,29.4833984 C27.9010436,29.4833984 28.2109363,29.33187 28.4433594,29.0288086 C28.6757824,28.7257472 28.7919922,28.3304061 28.7919922,27.8427734 C28.7919922,26.7900338 28.3613324,26.2636719 27.5,26.2636719 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/7.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>7</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-427.000000, -159.000000)">
|
||||
<g id="7" transform="translate(427.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<polygon fill="#FFFFFF" fill-rule="nonzero" points="30.8222656 21.9980469 27.3632812 30.8027344 25.0800781 30.8027344 28.5664062 22.7636719 24 22.7636719 24 21 30.8222656 21"></polygon>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/8.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>8</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-487.000000, -159.000000)">
|
||||
<g id="8" transform="translate(487.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<path d="M25.9755859,25.8740234 L25.9755859,25.8398438 C24.8544866,25.379555 24.2939453,24.6344453 24.2939453,23.6044922 C24.2939453,22.847978 24.5947236,22.2247746 25.1962891,21.7348633 C25.7978546,21.244952 26.574865,21 27.5273438,21 C28.4980517,21 29.2727836,21.2290016 29.8515625,21.6870117 C30.4303414,22.1450218 30.7197266,22.7363245 30.7197266,23.4609375 C30.7197266,24.5319064 30.0999411,25.32031 28.8603516,25.8261719 L28.8603516,25.8535156 C29.5257195,26.0494801 30.0418276,26.3719053 30.4086914,26.8208008 C30.7755552,27.2696963 30.9589844,27.7744113 30.9589844,28.3349609 C30.9589844,29.2008507 30.6388378,29.8844376 29.9985352,30.3857422 C29.3582325,30.8870468 28.4638729,31.1376953 27.3154297,31.1376953 C26.3219351,31.1376953 25.5209991,30.8927433 24.9125977,30.402832 C24.3041962,29.9129207 24,29.2646525 24,28.4580078 C24,27.286778 24.6585221,26.4254585 25.9755859,25.8740234 Z M28.6894531,23.6455078 C28.6894531,23.3128239 28.5834972,23.0473643 28.371582,22.8491211 C28.1596669,22.6508779 27.878257,22.5517578 27.5273438,22.5517578 C27.1855452,22.5517578 26.9018566,22.6554352 26.6762695,22.862793 C26.4506825,23.0701508 26.3378906,23.3356104 26.3378906,23.6591797 C26.3378906,24.2698598 26.7298138,24.7324203 27.5136719,25.046875 C28.29753,24.7233057 28.6894531,24.2561879 28.6894531,23.6455078 Z M27.4179688,26.6943359 C26.5019485,27.0543638 26.0439453,27.6057906 26.0439453,28.3486328 C26.0439453,28.7041033 26.1840806,28.9980457 26.4643555,29.2304688 C26.7446303,29.4628918 27.0852845,29.5791016 27.4863281,29.5791016 C27.919273,29.5791016 28.2679023,29.4651704 28.5322266,29.2373047 C28.7965508,29.009439 28.9287109,28.7086607 28.9287109,28.3349609 C28.9287109,27.5875614 28.4251352,27.0406918 27.4179688,26.6943359 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
26
src/modules/ShortcutGuide/ShortcutGuide/svgs/9.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="53px" height="52px" viewBox="0 0 53 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>9</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard" transform="translate(-547.000000, -159.000000)">
|
||||
<g id="9" transform="translate(547.000000, 159.000000)">
|
||||
<rect id="Rectangle" fill="#000000" x="7" y="6" width="40" height="40"></rect>
|
||||
<g id="left" transform="translate(0.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="bottom" transform="translate(15.000000, 28.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="right" transform="translate(29.000000, 14.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(12.000000, 12.000000) rotate(-314.000000) translate(-12.000000, -12.000000) " x="4" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<g id="top" transform="translate(16.000000, 0.000000)" fill="#000000">
|
||||
<rect id="carat" transform="translate(11.311985, 12.000000) rotate(-314.000000) translate(-11.311985, -12.000000) " x="3.31198537" y="4" width="16" height="16"></rect>
|
||||
</g>
|
||||
<path d="M24.5605469,30.7548828 L24.5605469,28.9775391 C25.0755234,29.3147803 25.6953089,29.4833984 26.4199219,29.4833984 C27.1764361,29.4833984 27.7609029,29.2270533 28.1733398,28.7143555 C28.5857768,28.2016576 28.7942708,27.4736375 28.7988281,26.5302734 L28.7578125,26.5166016 C28.3248676,27.1591829 27.6663456,27.4804688 26.7822266,27.4804688 C25.9801392,27.4804688 25.3159206,27.2001981 24.7895508,26.6396484 C24.263181,26.0790988 24,25.352218 24,24.4589844 C24,23.4153594 24.3212858,22.5779654 24.9638672,21.9467773 C25.6064485,21.3155893 26.4381459,21 27.4589844,21 C28.5071667,21 29.342282,21.3964804 29.9643555,22.1894531 C30.5864289,22.9824258 30.8974609,24.1171801 30.8974609,25.59375 C30.8974609,27.3437587 30.5226274,28.705236 29.7729492,29.6782227 C29.023271,30.6512093 27.9762437,31.1376953 26.6318359,31.1376953 C25.8343059,31.1376953 25.1438831,31.0100924 24.5605469,30.7548828 Z M27.3974609,22.6474609 C27.0237612,22.6474609 26.716147,22.7989894 26.4746094,23.1020508 C26.2330717,23.4051122 26.1123047,23.795896 26.1123047,24.2744141 C26.1123047,24.7711613 26.2319324,25.1619452 26.4711914,25.4467773 C26.7104504,25.7316095 27.0351542,25.8740234 27.4453125,25.8740234 C27.8190123,25.8740234 28.1243478,25.7384454 28.3613281,25.4672852 C28.5983085,25.1961249 28.7167969,24.8554708 28.7167969,24.4453125 C28.7167969,23.930336 28.5926119,23.5019548 28.3442383,23.1601562 C28.0958646,22.8183577 27.7802754,22.6474609 27.3974609,22.6474609 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 12 KiB |
207
src/modules/ShortcutGuide/ShortcutGuide/svgs/overlay.svg
Normal file
|
After Width: | Height: | Size: 362 KiB |
|
After Width: | Height: | Size: 368 KiB |
47
src/modules/ShortcutGuide/ShortcutGuide/target_state.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
#include "pch.h"
|
||||
#include "target_state.h"
|
||||
#include "start_visible.h"
|
||||
#include <common/interop/shared_constants.h>
|
||||
#include <common/logger/logger.h>
|
||||
|
||||
constexpr unsigned VK_S = 0x53;
|
||||
|
||||
void TargetState::was_hidden()
|
||||
{
|
||||
std::unique_lock<std::recursive_mutex> lock(mutex);
|
||||
// Ignore callbacks from the D2DOverlayWindow
|
||||
if (state == ForceShown)
|
||||
{
|
||||
return;
|
||||
}
|
||||
state = Hidden;
|
||||
lock.unlock();
|
||||
cv.notify_one();
|
||||
}
|
||||
|
||||
void TargetState::exit()
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
state = Exiting;
|
||||
lock.unlock();
|
||||
cv.notify_one();
|
||||
}
|
||||
|
||||
void TargetState::toggle_force_shown()
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
if (state != ForceShown)
|
||||
{
|
||||
state = ForceShown;
|
||||
instance->on_held();
|
||||
}
|
||||
else
|
||||
{
|
||||
state = Hidden;
|
||||
}
|
||||
}
|
||||
|
||||
bool TargetState::active() const
|
||||
{
|
||||
return state == ForceShown || state == Shown;
|
||||
}
|
||||
33
src/modules/ShortcutGuide/ShortcutGuide/target_state.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#pragma once
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include "shortcut_guide.h"
|
||||
|
||||
struct KeyEvent
|
||||
{
|
||||
bool key_down;
|
||||
unsigned vk_code;
|
||||
};
|
||||
|
||||
class TargetState
|
||||
{
|
||||
public:
|
||||
TargetState() = default;
|
||||
void was_hidden();
|
||||
void exit();
|
||||
|
||||
void toggle_force_shown();
|
||||
bool active() const;
|
||||
|
||||
private:
|
||||
std::recursive_mutex mutex;
|
||||
std::condition_variable_any cv;
|
||||
enum State
|
||||
{
|
||||
Hidden,
|
||||
Shown,
|
||||
ForceShown,
|
||||
Exiting
|
||||
};
|
||||
std::atomic<State> state = Hidden;
|
||||
};
|
||||
116
src/modules/ShortcutGuide/ShortcutGuide/tasklist_positions.cpp
Normal file
@@ -0,0 +1,116 @@
|
||||
#include "pch.h"
|
||||
#include "tasklist_positions.h"
|
||||
|
||||
void Tasklist::update()
|
||||
{
|
||||
// Get HWND of the tasklist
|
||||
auto tasklist_hwnd = FindWindowA("Shell_TrayWnd", nullptr);
|
||||
if (!tasklist_hwnd)
|
||||
return;
|
||||
tasklist_hwnd = FindWindowExA(tasklist_hwnd, 0, "ReBarWindow32", nullptr);
|
||||
if (!tasklist_hwnd)
|
||||
return;
|
||||
tasklist_hwnd = FindWindowExA(tasklist_hwnd, 0, "MSTaskSwWClass", nullptr);
|
||||
if (!tasklist_hwnd)
|
||||
return;
|
||||
tasklist_hwnd = FindWindowExA(tasklist_hwnd, 0, "MSTaskListWClass", nullptr);
|
||||
if (!tasklist_hwnd)
|
||||
return;
|
||||
if (!automation)
|
||||
{
|
||||
winrt::check_hresult(CoCreateInstance(CLSID_CUIAutomation,
|
||||
nullptr,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_IUIAutomation,
|
||||
automation.put_void()));
|
||||
winrt::check_hresult(automation->CreateTrueCondition(true_condition.put()));
|
||||
}
|
||||
element = nullptr;
|
||||
winrt::check_hresult(automation->ElementFromHandle(tasklist_hwnd, element.put()));
|
||||
}
|
||||
|
||||
bool Tasklist::update_buttons(std::vector<TasklistButton>& buttons)
|
||||
{
|
||||
if (!automation || !element)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
winrt::com_ptr<IUIAutomationElementArray> elements;
|
||||
if (element->FindAll(TreeScope_Children, true_condition.get(), elements.put()) < 0)
|
||||
return false;
|
||||
if (!elements)
|
||||
return false;
|
||||
int count;
|
||||
if (elements->get_Length(&count) < 0)
|
||||
return false;
|
||||
winrt::com_ptr<IUIAutomationElement> child;
|
||||
std::vector<TasklistButton> found_buttons;
|
||||
found_buttons.reserve(count);
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
child = nullptr;
|
||||
if (elements->GetElement(i, child.put()) < 0)
|
||||
return false;
|
||||
TasklistButton button;
|
||||
if (VARIANT var_rect; child->GetCurrentPropertyValue(UIA_BoundingRectanglePropertyId, &var_rect) >= 0)
|
||||
{
|
||||
if (var_rect.vt == (VT_R8 | VT_ARRAY))
|
||||
{
|
||||
LONG pos;
|
||||
double value;
|
||||
pos = 0;
|
||||
SafeArrayGetElement(var_rect.parray, &pos, &value);
|
||||
button.x = (long)value;
|
||||
pos = 1;
|
||||
SafeArrayGetElement(var_rect.parray, &pos, &value);
|
||||
button.y = (long)value;
|
||||
pos = 2;
|
||||
SafeArrayGetElement(var_rect.parray, &pos, &value);
|
||||
button.width = (long)value;
|
||||
pos = 3;
|
||||
SafeArrayGetElement(var_rect.parray, &pos, &value);
|
||||
button.height = (long)value;
|
||||
}
|
||||
VariantClear(&var_rect);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (BSTR automation_id; child->get_CurrentAutomationId(&automation_id) >= 0)
|
||||
{
|
||||
button.name = automation_id;
|
||||
SysFreeString(automation_id);
|
||||
}
|
||||
found_buttons.push_back(button);
|
||||
}
|
||||
// assign keynums
|
||||
buttons.clear();
|
||||
for (auto& button : found_buttons)
|
||||
{
|
||||
if (buttons.empty())
|
||||
{
|
||||
button.keynum = 1;
|
||||
buttons.push_back(std::move(button));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (button.x < buttons.back().x || button.y < buttons.back().y) // skip 2nd row
|
||||
break;
|
||||
if (button.name == buttons.back().name)
|
||||
continue; // skip buttons from the same app
|
||||
button.keynum = buttons.back().keynum + 1;
|
||||
buttons.push_back(std::move(button));
|
||||
if (buttons.back().keynum == 10)
|
||||
break; // no more than 10 buttons
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<TasklistButton> Tasklist::get_buttons()
|
||||
{
|
||||
std::vector<TasklistButton> buttons;
|
||||
update_buttons(buttons);
|
||||
return buttons;
|
||||
}
|
||||
25
src/modules/ShortcutGuide/ShortcutGuide/tasklist_positions.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
#include <vector>
|
||||
#include <unordered_set>
|
||||
#include <string>
|
||||
#include <Windows.h>
|
||||
#include <UIAutomationClient.h>
|
||||
|
||||
struct TasklistButton
|
||||
{
|
||||
std::wstring name;
|
||||
long x, y, width, height, keynum;
|
||||
};
|
||||
|
||||
class Tasklist
|
||||
{
|
||||
public:
|
||||
void update();
|
||||
std::vector<TasklistButton> get_buttons();
|
||||
bool update_buttons(std::vector<TasklistButton>& buttons);
|
||||
|
||||
private:
|
||||
winrt::com_ptr<IUIAutomation> automation;
|
||||
winrt::com_ptr<IUIAutomationElement> element;
|
||||
winrt::com_ptr<IUIAutomationCondition> true_condition;
|
||||
};
|
||||
45
src/modules/ShortcutGuide/ShortcutGuide/trace.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
#include "pch.h"
|
||||
#include "trace.h"
|
||||
|
||||
TRACELOGGING_DEFINE_PROVIDER(
|
||||
g_hProvider,
|
||||
"Microsoft.PowerToys",
|
||||
// {38e8889b-9731-53f5-e901-e8a7c1753074}
|
||||
(0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74),
|
||||
TraceLoggingOptionProjectTelemetry());
|
||||
|
||||
void Trace::RegisterProvider() noexcept
|
||||
{
|
||||
TraceLoggingRegister(g_hProvider);
|
||||
}
|
||||
|
||||
void Trace::UnregisterProvider() noexcept
|
||||
{
|
||||
TraceLoggingUnregister(g_hProvider);
|
||||
}
|
||||
|
||||
void Trace::SendGuideSession(const __int64 duration_ms, const wchar_t* close_type) noexcept
|
||||
{
|
||||
TraceLoggingWrite(
|
||||
g_hProvider,
|
||||
"ShortcutGuide_GuideSession",
|
||||
TraceLoggingInt64(duration_ms, "DurationInMs"),
|
||||
TraceLoggingWideString(close_type, "CloseType"),
|
||||
ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
|
||||
TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"),
|
||||
TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
|
||||
}
|
||||
|
||||
void Trace::SendSettings(ShortcutGuideSettings settings) noexcept
|
||||
{
|
||||
TraceLoggingWrite(
|
||||
g_hProvider,
|
||||
"ShortcutGuide_Settings",
|
||||
TraceLoggingWideString(settings.hotkey.c_str(), "Hotkey"),
|
||||
TraceLoggingInt32(settings.overlayOpacity, "OverlayOpacity"),
|
||||
TraceLoggingWideString(settings.theme.c_str(), "Theme"),
|
||||
TraceLoggingWideString(settings.disabledApps.c_str(), "DisabledApps"),
|
||||
ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
|
||||
TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"),
|
||||
TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
|
||||
}
|
||||
11
src/modules/ShortcutGuide/ShortcutGuide/trace.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
#include "ShortcutGuideSettings.h"
|
||||
|
||||
class Trace
|
||||
{
|
||||
public:
|
||||
static void RegisterProvider() noexcept;
|
||||
static void UnregisterProvider() noexcept;
|
||||
static void SendGuideSession(const __int64 duration_ms, const wchar_t* close_type) noexcept;
|
||||
static void SendSettings(ShortcutGuideSettings settings) noexcept;
|
||||
};
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"Projects": [
|
||||
{
|
||||
"LanguageSet": "Azure_Languages",
|
||||
"LocItems": [
|
||||
{
|
||||
"SourceFile": "src\\modules\\ShortcutGuide\\ShortcutGuideModuleInterface\\Resources.resx",
|
||||
"CopyOption": "LangIDOnName",
|
||||
"OutputPath": "src\\modules\\ShortcutGuide\\ShortcutGuideModuleInterface"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
# This file has been moved
|
||||
|
||||
[Windows Key Shortcut Guide Overview](https://aka.ms/PowerToysOverview_ShortcutGuide)
|
||||
@@ -0,0 +1,123 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Shortcut_Guide" xml:space="preserve">
|
||||
<value>Shortcut Guide</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,45 @@
|
||||
#include <windows.h>
|
||||
#include "Generated Files/resource.h"
|
||||
#include "../../../../common/version/version.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
#include "winres.h"
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION FILE_VERSION
|
||||
PRODUCTVERSION PRODUCT_VERSION
|
||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS VS_FF_DEBUG
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_DLL
|
||||
FILESUBTYPE VFT2_UNKNOWN
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", COMPANY_NAME
|
||||
VALUE "FileDescription", FILE_DESCRIPTION
|
||||
VALUE "FileVersion", FILE_VERSION_STRING
|
||||
VALUE "InternalName", INTERNAL_NAME
|
||||
VALUE "LegalCopyright", COPYRIGHT_NOTE
|
||||
VALUE "OriginalFilename", ORIGINAL_FILENAME
|
||||
VALUE "ProductName", PRODUCT_NAME
|
||||
VALUE "ProductVersion", PRODUCT_VERSION_STRING
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
@@ -0,0 +1,103 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.props" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.props')" />
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<Target Name="GenerateResourceFiles" BeforeTargets="PrepareForBuild">
|
||||
<Exec Command="powershell -NonInteractive -executionpolicy Unrestricted $(SolutionDir)tools\build\convert-resx-to-rc.ps1 $(MSBuildThisFileDirectory) resource.base.h resource.h ShortcutGuideModuleInterface.base.rc ShortcutGuideModuleInterface.rc" />
|
||||
</Target>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>15.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{2d604c07-51fc-46bb-9eb7-75aecc7f5e81}</ProjectGuid>
|
||||
<RootNamespace>ShortcutGuideModuleInterface</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<ProjectName>ShortcutGuideModuleInterface</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<SpectreMitigation>Spectre</SpectreMitigation>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<SpectreMitigation>Spectre</SpectreMitigation>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\modules\ShortcutGuide\$(ProjectName)\</OutDir>
|
||||
<IntDir>$(SolutionDir)$(Platform)\$(Configuration)\obj\ShortcutGuide\$(ProjectName)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>;..\..\..\common\inc;..\..\..\common\Telemetry;..\..\..\;..\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>Dwmapi.lib;Dcomp.lib;Shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Generated Files\resource.h" />
|
||||
<ClInclude Include="pch.h" />
|
||||
<ClInclude Include="resource.base.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp" />
|
||||
<ClCompile Include="pch.cpp">
|
||||
<PrecompiledHeader Condition="'$(CIBuild)'!='true'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\common\logger\logger.vcxproj">
|
||||
<Project>{d9b8fc84-322a-4f9f-bbb9-20915c47ddfd}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources.resx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Generated Files\ShortcutGuideModuleInterface.rc" />
|
||||
<None Include="ShortcutGuideModuleInterface.base.rc" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<Import Project="..\..\..\..\deps\spdlog.props" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
<Import Project="..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.targets')" />
|
||||
</ImportGroup>
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.props'))" />
|
||||
<Error Condition="!Exists('..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\Microsoft.Windows.CppWinRT.2.0.200729.8\build\native\Microsoft.Windows.CppWinRT.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Generated Files">
|
||||
<UniqueIdentifier>{7008d2a1-37df-4ef1-8d2c-e27de2a1a181}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="pch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="resource.base.h">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Generated Files\resource.h">
|
||||
<Filter>Generated Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="pch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
<None Include="ShortcutGuideModuleInterface.base.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources.resx">
|
||||
<Filter>Resource Files</Filter>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Generated Files\ShortcutGuideModuleInterface.rc">
|
||||
<Filter>Generated Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,308 @@
|
||||
// dllmain.cpp : Defines the entry point for the DLL application.
|
||||
#include "pch.h"
|
||||
|
||||
#include <mutex>
|
||||
#include <common/SettingsAPI/settings_helpers.h>
|
||||
#include <common/utils/winapi_error.h>
|
||||
#include <common/utils/logger_helper.h>
|
||||
#include <common/interop/shared_constants.h>
|
||||
|
||||
#include "../interface/powertoy_module_interface.h"
|
||||
#include "Generated Files/resource.h"
|
||||
#include <common/SettingsAPI/settings_objects.h>
|
||||
|
||||
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
class ShortcutGuideModule : public PowertoyModuleIface
|
||||
{
|
||||
public:
|
||||
ShortcutGuideModule()
|
||||
{
|
||||
app_name = GET_RESOURCE_STRING(IDS_SHORTCUT_GUIDE);
|
||||
app_key = L"Shortcut Guide";
|
||||
LoggerHelpers::init_logger(app_key, L"ModuleInterface", LogSettings::shortcutGuideLoggerName);
|
||||
|
||||
std::filesystem::path oldLogPath(PTSettingsHelper::get_module_save_folder_location(app_key));
|
||||
oldLogPath.append("ShortcutGuideLogs");
|
||||
LoggerHelpers::delete_old_log_folder(oldLogPath);
|
||||
|
||||
exitEvent = CreateEvent(nullptr, false, false, CommonSharedConstants::SHORTCUT_GUIDE_EXIT_EVENT);
|
||||
if (!exitEvent)
|
||||
{
|
||||
Logger::warn(L"Failed to create {} event. {}", CommonSharedConstants::SHORTCUT_GUIDE_EXIT_EVENT, get_last_error_or_default(GetLastError()));
|
||||
}
|
||||
|
||||
InitSettings();
|
||||
}
|
||||
|
||||
virtual const wchar_t* get_name() override
|
||||
{
|
||||
return app_name.c_str();
|
||||
}
|
||||
|
||||
virtual const wchar_t* get_key() override
|
||||
{
|
||||
return app_key.c_str();
|
||||
}
|
||||
|
||||
virtual bool get_config(wchar_t* buffer, int* buffer_size) override
|
||||
{
|
||||
HINSTANCE hinstance = reinterpret_cast<HINSTANCE>(&__ImageBase);
|
||||
PowerToysSettings::Settings settings(hinstance, get_name());
|
||||
return settings.serialize_to_buffer(buffer, buffer_size);
|
||||
}
|
||||
|
||||
virtual void set_config(const wchar_t* config) override
|
||||
{
|
||||
Logger::trace("set_config()");
|
||||
try
|
||||
{
|
||||
// Parse the input JSON string.
|
||||
PowerToysSettings::PowerToyValues values =
|
||||
PowerToysSettings::PowerToyValues::from_json_string(config, get_key());
|
||||
|
||||
ParseHotkey(values);
|
||||
}
|
||||
catch (std::exception ex)
|
||||
{
|
||||
Logger::error("Failed to parse settings. {}", ex.what());
|
||||
}
|
||||
}
|
||||
|
||||
virtual void enable() override
|
||||
{
|
||||
Logger::info("Shortcut Guide is enabling");
|
||||
|
||||
if (!_enabled)
|
||||
{
|
||||
_enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger::warn("Shortcut guide is already enabled");
|
||||
}
|
||||
}
|
||||
|
||||
virtual void disable() override
|
||||
{
|
||||
Logger::info("ShortcutGuideModule::disable()");
|
||||
if (_enabled)
|
||||
{
|
||||
_enabled = false;
|
||||
TerminateProcess();
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger::warn("Shortcut Guide is already disabled");
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool is_enabled() override
|
||||
{
|
||||
return _enabled;
|
||||
}
|
||||
|
||||
virtual void destroy() override
|
||||
{
|
||||
this->disable();
|
||||
if (exitEvent)
|
||||
{
|
||||
CloseHandle(exitEvent);
|
||||
}
|
||||
|
||||
delete this;
|
||||
}
|
||||
|
||||
virtual std::optional<HotkeyEx> GetHotkeyEx() override
|
||||
{
|
||||
Logger::trace("GetHotkeyEx()");
|
||||
return m_hotkey;
|
||||
}
|
||||
|
||||
virtual void OnHotkeyEx() override
|
||||
{
|
||||
Logger::trace("OnHotkeyEx()");
|
||||
if (!_enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (IsProcessActive())
|
||||
{
|
||||
TerminateProcess();
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_hProcess)
|
||||
{
|
||||
CloseHandle(m_hProcess);
|
||||
m_hProcess = nullptr;
|
||||
}
|
||||
|
||||
StartProcess();
|
||||
}
|
||||
|
||||
virtual void send_settings_telemetry() override
|
||||
{
|
||||
Logger::trace("Send settings telemetry");
|
||||
if (!StartProcess(L"telemetry"))
|
||||
{
|
||||
Logger::error("Failed to create a process to send settings telemetry");
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
std::wstring app_name;
|
||||
//contains the non localized key of the powertoy
|
||||
std::wstring app_key;
|
||||
bool _enabled = false;
|
||||
HANDLE m_hProcess = nullptr;
|
||||
|
||||
// Hotkey to invoke the module
|
||||
HotkeyEx m_hotkey;
|
||||
HANDLE exitEvent;
|
||||
|
||||
bool StartProcess(std::wstring args = L"")
|
||||
{
|
||||
if (exitEvent)
|
||||
{
|
||||
ResetEvent(exitEvent);
|
||||
}
|
||||
|
||||
unsigned long powertoys_pid = GetCurrentProcessId();
|
||||
std::wstring executable_args = L"";
|
||||
executable_args.append(std::to_wstring(powertoys_pid));
|
||||
if (!args.empty())
|
||||
{
|
||||
executable_args.append(L" ");
|
||||
executable_args.append(args);
|
||||
}
|
||||
|
||||
SHELLEXECUTEINFOW sei{ sizeof(sei) };
|
||||
sei.fMask = { SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI };
|
||||
sei.lpFile = L"modules\\ShortcutGuide\\ShortcutGuide\\PowerToys.ShortcutGuide.exe";
|
||||
sei.nShow = SW_SHOWNORMAL;
|
||||
sei.lpParameters = executable_args.data();
|
||||
if (ShellExecuteExW(&sei) == false)
|
||||
{
|
||||
Logger::error(L"Failed to start SG process. {}", get_last_error_or_default(GetLastError()));
|
||||
auto message = get_last_error_message(GetLastError());
|
||||
if (message.has_value())
|
||||
{
|
||||
Logger::error(message.value());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Logger::trace(L"Started SG process with pid={}", GetProcessId(sei.hProcess));
|
||||
m_hProcess = sei.hProcess;
|
||||
return true;
|
||||
}
|
||||
|
||||
void TerminateProcess()
|
||||
{
|
||||
if (m_hProcess)
|
||||
{
|
||||
if (WaitForSingleObject(m_hProcess, 0) != WAIT_OBJECT_0)
|
||||
{
|
||||
if (exitEvent && SetEvent(exitEvent))
|
||||
{
|
||||
Logger::trace(L"Signaled {}", CommonSharedConstants::SHORTCUT_GUIDE_EXIT_EVENT);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger::warn(L"Failed to signal {}", CommonSharedConstants::SHORTCUT_GUIDE_EXIT_EVENT);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CloseHandle(m_hProcess);
|
||||
m_hProcess = nullptr;
|
||||
Logger::trace("SG process was already terminated");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool IsProcessActive()
|
||||
{
|
||||
return m_hProcess && WaitForSingleObject(m_hProcess, 0) != WAIT_OBJECT_0;
|
||||
}
|
||||
|
||||
void InitSettings()
|
||||
{
|
||||
try
|
||||
{
|
||||
PowerToysSettings::PowerToyValues settings =
|
||||
PowerToysSettings::PowerToyValues::load_from_settings_file(app_key);
|
||||
|
||||
ParseHotkey(settings);
|
||||
}
|
||||
catch (std::exception ex)
|
||||
{
|
||||
Logger::error("Failed to init settings. {}", ex.what());
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
Logger::error("Failed to init settings");
|
||||
}
|
||||
}
|
||||
|
||||
void ParseHotkey(PowerToysSettings::PowerToyValues& settings)
|
||||
{
|
||||
auto settingsObject = settings.get_raw_json();
|
||||
if (settingsObject.GetView().Size())
|
||||
{
|
||||
try
|
||||
{
|
||||
auto jsonHotkeyObject = settingsObject.GetNamedObject(L"properties").GetNamedObject(L"open_shortcutguide");
|
||||
auto hotkey = PowerToysSettings::HotkeyObject::from_json(jsonHotkeyObject);
|
||||
m_hotkey = HotkeyEx();
|
||||
if (hotkey.win_pressed())
|
||||
{
|
||||
m_hotkey.modifiersMask |= MOD_WIN;
|
||||
}
|
||||
|
||||
if (hotkey.ctrl_pressed())
|
||||
{
|
||||
m_hotkey.modifiersMask |= MOD_CONTROL;
|
||||
}
|
||||
|
||||
if (hotkey.shift_pressed())
|
||||
{
|
||||
m_hotkey.modifiersMask |= MOD_SHIFT;
|
||||
}
|
||||
|
||||
if (hotkey.alt_pressed())
|
||||
{
|
||||
m_hotkey.modifiersMask |= MOD_ALT;
|
||||
}
|
||||
|
||||
m_hotkey.vkCode = hotkey.get_code();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Logger::warn("Failed to initialize Shortcut Guide start shortcut");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger::info("Shortcut Guide settings are empty");
|
||||
}
|
||||
|
||||
if (!m_hotkey.modifiersMask)
|
||||
{
|
||||
Logger::info("Shortcut Guide is going to use default shortcut");
|
||||
m_hotkey.modifiersMask = MOD_SHIFT | MOD_WIN;
|
||||
m_hotkey.vkCode = VK_OEM_2;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create()
|
||||
{
|
||||
return new ShortcutGuideModule();
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="cs-CZ" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Maximalizovat]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Minimalizovat]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Žádná akce]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Obnovit]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Neprůhlednost překryvného pozadí nástroje Průvodce klávesovými zkratkami (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Doba, po kterou má být stisknutá klávesa Windows před zobrazením Průvodce klávesovými zkratkami (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Zvolit barvu překryvu Průvodce klávesovými zkratkami]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Tmavý]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Světlý]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Režim aplikace s výchozím nastavením systému]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Umožňuje zobrazit při stisknutí klávesy Windows překryvnou nápovědu s klávesovými zkratkami systému Windows.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Průvodce klávesovými zkratkami]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Přichytit doleva]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Přichytit doleva dolů]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Přichytit doprava dolů]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Přichytit doprava]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Přichytit doleva nahoru]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Přichytit doprava nahoru]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="de-DE" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Maximieren]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Minimieren]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Keine Aktion]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Wiederherstellen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Deckkraft des Überlagerungshintergrunds für die Tastenkombinationsübersicht (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Gibt an (in Millisekunden), wie lange die WINDOWS-Taste gedrückt werden muss, damit die Tastenkombinationsübersicht angezeigt wird]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Überlagerungsfarbe für Tastenkombinationsübersicht auswählen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Dunkel]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Hell]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[App-Standardmodus des Systems]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Zeigt beim Drücken der WINDOWS-Taste eine Hilfeübersicht mit den Windows-Tastenkombinationen an.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Tastenkombinationsübersicht]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Links andocken]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Unten links andocken]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Unten rechts andocken]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Rechts andocken]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Oben links andocken]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Oben rechts andocken]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="es-ES" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Maximizar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Minimizar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ninguna acción]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Restaurar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Opacidad del fondo de superposición de la guía de métodos abreviados de teclado (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Tiempo durante el que se debe presionar la tecla Windows para mostrar la guía de métodos abreviados de teclado (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Elija el color de superposición de la guía de métodos abreviados de teclado.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Oscuro]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Claro]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Modo de aplicación predeterminado del sistema]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Muestra una superposición de ayuda con los accesos directos de Windows cuando se presiona la tecla Windows.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Guía de métodos abreviados de teclado]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Acoplar a la izquierda]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Acoplar a la parte inferior izquierda]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Acoplar a la parte inferior derecha]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Acoplar a la derecha]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Acoplar a la parte superior izquierda]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Acoplar a la parte superior derecha]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="fr-FR" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Agrandir]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Réduire]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Aucune action]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Restaurer]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Opacité de l'arrière-plan de superposition dans Shortcut Guide (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Durée de l'appui sur la touche Windows avant d'afficher Shortcut Guide (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Choisir la couleur de superposition de Shortcut Guide]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Foncé]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Clair]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Mode d'application par défaut du système]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Affiche une superposition de l'aide avec les raccourcis Windows quand vous appuyez sur la touche Windows.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Aligner à gauche]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Aligner en bas à gauche]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Aligner en bas à droite]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Aligner à droite]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Aligner en haut à gauche]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Aligner en haut à droite]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="hu-HU" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Teljes méret]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Kis méret]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Nincs művelet]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Visszaállítás]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[A Billentyűsegéd átfedése hátterének átlátszatlansága (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Az időtartam, ameddig lenyomva kell tartani a Windows-billentyűt a Billentyűsegéd megjelenítéséhez (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Válassza ki a Billentyűsegéd átfedésének színét]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Sötét]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Világos]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Alapértelmezett alkalmazásmód]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[A Windows-billentyűparancsokra vonatkozó súgó átfedésének megjelenítése a Windows-billentyű megnyomásakor.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Billentyűsegéd]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Dokkolás balra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Dokkolás balra le]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Dokkolás jobbra le]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Dokkolás jobbra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Dokkolás balra fel]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Dokkolás jobbra fel]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="it-IT" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ingrandisci]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Riduci a icona]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Nessuna azione]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ripristina]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Opacità sfondo di sovrimpressione della Guida ai tasti di scelta rapida (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Durata della pressione del tasto WINDOWS prima di visualizzare Guida ai tasti di scelta rapida (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Scegliere il colore di sovrimpressione della Guida ai tasti di scelta rapida]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Scuro]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Chiaro]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Modalità app predefinita del sistema]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Mostra una guida in sovrimpressione con i tasti di scelta rapida di Windows quando viene premuto il tasto WINDOWS.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Guida ai tasti di scelta rapida]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Affianca a sinistra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Affianca in basso a sinistra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Affianca in basso a destra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Affianca a destra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Affianca in alto a sinistra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Affianca in alto a destra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="ja-JP" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[最大化]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[最小化]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[何もしない]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[復元]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide のオーバーレイ背景の不透明度 (%) です]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide を表示するために Windows キーを長押しする時間 (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide のオーバーレイの色を選択します]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[ダーク]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[ライト]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[システムの既定のアプリ モード]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Windows キーを押したときに、Windows ショートカットのヘルプ オーバーレイを表示します。]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[左にスナップ]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[左下にスナップ]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[右下にスナップ]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[右にスナップ]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[左上にスナップ]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[右上にスナップ]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="ko-KR" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[최대화]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[최소화]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[동작 없음]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[복원]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide의 오버레이 배경 불투명도(%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide가 표시되기까지 <Windows> 키를 누르는 시간(ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide 오버레이 색 선택]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[어둡게]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[밝게]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[시스템 기본 앱 모드]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[<Windows> 키를 누를 때 Windows 바로 가기와 함께 도움말 오버레이를 표시합니다.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[왼쪽으로 맞추기]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[왼쪽 아래로 맞추기]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[오른쪽 아래로 맞추기]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[오른쪽으로 맞추기]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[왼쪽 위로 맞추기]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[오른쪽 위로 맞추기]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="nl-NL" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Maximaliseren]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Minimaliseren]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Geen actie]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Herstellen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Dekking van de overlay-achtergrond van Shortcut Guide (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Hoe lang de Windows-toets moet worden ingedrukt voordat Shortcut Guide wordt weergegeven (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Overlaykleur voor Shortcut Guide kiezen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Donker]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Licht]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Systeemstandaardinstelling app-modus]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Hiermee wordt een help-overlay met Windows-snelkoppelingen weergegeven wanneer de Windows-toets wordt ingedrukt.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Links uitlijnen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Linksonder uitlijnen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Rechtsonder uitlijnen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Rechts uitlijnen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Linksboven uitlijnen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Rechtsboven uitlijnen]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="pl-PL" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Maksymalizuj]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Minimalizuj]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Brak akcji]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Przywróć]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Nieprzezroczystość tła nakładki Przewodnika po skrótach (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Czas (w ms), przez jaki należy naciskać klawisz systemu Windows przed wyświetleniem Przewodnika po skrótach]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Wybierz kolor nakładki Przewodnika po skrótach]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ciemny]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Jasny]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Domyślny systemowy tryb aplikacji]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Wyświetla nakładkę pomocy ze skrótami systemu Windows po naciśnięciu klawisza systemu Windows.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Przewodnik po skrótach]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Przyciągnij do lewej]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Przyciągnij do dołu do lewej]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Przyciągnij do dołu do prawej]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Przyciągnij do prawej]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Przyciągnij do góry do lewej]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Przyciągnij do góry do prawej]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="pt-BR" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Maximizar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Minimizar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Nenhuma ação]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Restaurar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Opacidade da tela de fundo de sobreposição do Guia de Atalhos (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Por quanto tempo pressionar a tecla Windows antes de mostrar o Guia de Atalhos (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Escolher a cor da sobreposição do Guia de Atalhos]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Escuro]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Claro]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Modo de aplicativo padrão do sistema]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Mostra uma sobreposição de ajuda com os atalhos do Windows quando a tecla Windows é pressionada.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Guia de Atalhos]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ajustar para a esquerda]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ajustar para o lado esquerdo inferior]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ajustar para o lado direito inferior]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ajustar para a direita]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ajustar para o lado esquerdo superior]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ajustar para o lado direito superior]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="pt-PT" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Maximizar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Minimizar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Nenhuma ação]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Restaurar]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Opacidade do fundo de sobreposição do Guia de Atalhos (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Durante quanto tempo se tem de premir a tecla do Windows antes de mostrar o Guia de Atalhos (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Escolha a cor de sobreposição do Guia de Atalhos]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Escuro]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Claro]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Modo de aplicação predefinido do sistema]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Mostra uma sobreposição de ajuda com atalhos do Windows quando a tecla do Windows é premida.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Guia de Atalhos]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Encaixar à esquerda]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Encaixar abaixo à esquerda]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Encaixar abaixo à direita]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Encaixar à direita]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Encaixar em cima à esquerda]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Encaixar em cima à direita]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="ru-RU" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Развернуть]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Свернуть]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Нет действия]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Восстановить]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Прозрачность фона наложения для Подсказок по сочетаниям клавиш (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Время нажатия клавиши Windows перед отображением Подсказок по сочетаниям клавиш (мс)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Выберите цвет наложения для Подсказок по сочетаниям клавиш]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Темная]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Светлая]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Режим приложения по умолчанию для системы]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Отображает наложенную справку по сочетаниям клавиш с клавишей Windows при ее нажатии.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Подсказки по сочетаниям клавиш]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Прикрепить слева]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Прикрепить снизу слева]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Прикрепить снизу справа]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Прикрепить справа]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Прикрепить вверху слева]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Прикрепить вверху справа]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="sv-SE" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Maximera]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Minimera]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ingen åtgärd]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Återställ]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ogenomskinlighet för Kortkommandoguidens överläggsbakgrund (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Hur länge du ska trycka på Windows-tangenten innan du visar Kortkommandoguiden (ms)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Välj överläggsfärg för Kortkommandoguiden]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Mörk]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ljus]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Systemets standardappläge]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Visar ett överlägg med Windows-genvägar när Windows-tangenten trycks ned.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Kortkommandoguiden]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Fäst till vänster]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Fäst nedre vänstra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Fäst nedre högra]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Fäst höger]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Fäst överst till vänster]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Fäst överst till höger]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="tr-TR" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Ekranı kapla]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Simge Durumuna Küçült]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Eylem yok]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Geri Yükle]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Kısayol Kılavuzu'nun yer paylaşımı arka planının opaklık yüzdesi]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Kaç milisaniye boyunca Windows tuşuna basıldığında Kısayol Kılavuzu'nun görüntüleneceği]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Kısayol Kılavuzu katman rengini seçin]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Koyu]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Açık]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Sistem varsayılanı uygulama modu]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Windows tuşuna basıldığında Windows kısayollarının bulunduğu bir yardım katmanını gösterir.]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Kısayol Kılavuzu]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Sola tuttur]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Sol alta tuttur]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Sağ alta tuttur]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Sağa tuttur]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Sol üste tuttur]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[Sağ üste tuttur]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="zh-CN" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[最大化]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[最小化]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[无操作]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[还原]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[快捷键指南的叠加背景的不透明度(%) ]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[需要按住 Windows 键多长时间(毫秒)才能显示快捷键指南]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[选择快捷键指南的叠加颜色]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[深色]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[浅色]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[系统默认应用模式]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[长按 Windows 键时,显示包含 Windows 快捷键的速查表。]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[快捷键指南]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[左贴靠]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[左下角贴靠]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[右下角贴靠]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[右贴靠]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[左上角贴靠]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[右上角贴靠]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LCX SchemaVersion="6.0" Name="S:\src\modules\shortcut_guide\Resources.resx" PsrId="211" FileType="1" SrcCul="en-US" TgtCul="zh-TW" xmlns="http://schemas.microsoft.com/locstudio/2006/6/lcx">
|
||||
<OwnedComments>
|
||||
<Cmt Name="Dev" />
|
||||
<Cmt Name="LcxAdmin" />
|
||||
<Cmt Name="Rccx" />
|
||||
</OwnedComments>
|
||||
<Settings Name="@SettingsPath@\default.lss" Type="Lss" />
|
||||
<Item ItemId=";Resources.resx" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
|
||||
<Disp Icon="Str" Disp="true" LocTbl="false" />
|
||||
<Item ItemId=";Maximize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Maximize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[最大化]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Minimize" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Minimize]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[最小化]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";No_Action" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[No action]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[沒有動作]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Restore" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Restore]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[還原]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Overlay_Opacity" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Opacity of the Shortcut Guide's overlay background (%)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[快捷鍵指南重疊背景的不透明度 (%)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Press_Time" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[How long to press the Windows key before showing the Shortcut Guide (ms)]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[顯示快捷鍵指南之前須按住 Windows 按鍵的時間長度 (毫秒)]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Choose Shortcut Guide overlay color]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[選擇快捷鍵指南重疊的色彩]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Dark" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Dark]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[深色]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_Light" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Light]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[淺色]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Setting_Description_Theme_System" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[System default app mode]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[系統預設應用程式模式]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Settings_Description" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shows a help overlay with Windows shortcuts when the Windows key is pressed.]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[當按下 Windows 鍵時顯示說明,並與 Windows 快速鍵重疊。]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Shortcut_Guide" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Shortcut Guide]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[快捷鍵指南]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[向左貼齊]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[向左下方貼齊]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Lower_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap lower right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[向右下方貼齊]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[向右貼齊]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Left" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper left]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[向左上方貼齊]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
<Item ItemId=";Snap_Upper_Right" ItemType="0;.resx" PsrId="211" Leaf="true">
|
||||
<Str Cat="Text">
|
||||
<Val><![CDATA[Snap upper right]]></Val>
|
||||
<Tgt Cat="Text" Stat="Loc" Orig="New">
|
||||
<Val><![CDATA[向右上方貼齊]]></Val>
|
||||
</Tgt>
|
||||
</Str>
|
||||
<Disp Icon="Str" />
|
||||
</Item>
|
||||
</Item>
|
||||
</Item>
|
||||
</LCX>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Windows.CppWinRT" version="2.0.200729.8" targetFramework="native" />
|
||||
</packages>
|
||||
@@ -0,0 +1 @@
|
||||
#include "pch.h"
|
||||
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
#define NOMINMAX
|
||||
#include <winrt/base.h>
|
||||
#include <Windows.h>
|
||||
#include <ProjectTelemetry.h>
|
||||
#include <filesystem>
|
||||
#include <common/logger/logger.h>
|
||||
#include <common/utils/resources.h>
|
||||
@@ -0,0 +1,13 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by ShortcutGuide.rc
|
||||
|
||||
//////////////////////////////
|
||||
// Non-localizable
|
||||
|
||||
#define FILE_DESCRIPTION "PowerToys ShortcutGuide"
|
||||
#define INTERNAL_NAME "ShortcutGuide"
|
||||
#define ORIGINAL_FILENAME "ShortcutGuide.dll"
|
||||
|
||||
// Non-localizable
|
||||
//////////////////////////////
|
||||