From aa8fecf38566ee022dd6fca8fa163ffab09a3eef Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 21 Oct 2020 16:38:26 +1100 Subject: [PATCH] feat(windows): kmconfig console app This app uses the new `TKeymanSettings` class to present a standardised interface for all Keyman settings -- debug, development and compatibility. This is a console app, intended for use in a variety of scenarios, including development tools, in the future. Settings can be set, exported/imported to/from json, reset, shown. Important in this PR is establishing the command line parameter consistency and usage into the future. --- windows/src/desktop/Makefile | 6 +- windows/src/desktop/desktop.groupproj | 18 +- windows/src/desktop/inst/keymandesktop.wxs | 4 + .../kmconfig/Keyman.System.KMConfigMain.pas | 333 ++++++ windows/src/desktop/kmconfig/Makefile | 32 + windows/src/desktop/kmconfig/elevation.png | Bin 0 -> 774 bytes windows/src/desktop/kmconfig/kmconfig.dpr | 43 + windows/src/desktop/kmconfig/kmconfig.dproj | 1000 +++++++++++++++++ windows/src/desktop/kmconfig/kmconfig.res | Bin 0 -> 59520 bytes windows/src/desktop/kmconfig/manifest.in | 28 + windows/src/desktop/kmconfig/manifest.rc | 1 + windows/src/desktop/kmconfig/version.in | 30 + 12 files changed, 1491 insertions(+), 4 deletions(-) create mode 100644 windows/src/desktop/kmconfig/Keyman.System.KMConfigMain.pas create mode 100644 windows/src/desktop/kmconfig/Makefile create mode 100644 windows/src/desktop/kmconfig/elevation.png create mode 100644 windows/src/desktop/kmconfig/kmconfig.dpr create mode 100644 windows/src/desktop/kmconfig/kmconfig.dproj create mode 100644 windows/src/desktop/kmconfig/kmconfig.res create mode 100644 windows/src/desktop/kmconfig/manifest.in create mode 100644 windows/src/desktop/kmconfig/manifest.rc create mode 100644 windows/src/desktop/kmconfig/version.in diff --git a/windows/src/desktop/Makefile b/windows/src/desktop/Makefile index 77f84360aa..eaacdf319b 100644 --- a/windows/src/desktop/Makefile +++ b/windows/src/desktop/Makefile @@ -2,7 +2,7 @@ # Keyman Desktop Makefile # -TARGETS=kmshell kmbrowserhost setup insthelp +TARGETS=kmshell kmconfig kmbrowserhost setup insthelp RELEASE_TARGETS=help CLEANS=inst clean-desktop MANIFESTS=kmshell setup insthelp @@ -15,6 +15,10 @@ kmshell: cd $(ROOT)\src\desktop\kmshell $(MAKE) $(TARGET) +kmconfig: + cd $(ROOT)\src\desktop\kmconfig + $(MAKE) $(TARGET) + kmbrowserhost: cd $(ROOT)\src\desktop\kmbrowserhost $(MAKE) $(TARGET) diff --git a/windows/src/desktop/desktop.groupproj b/windows/src/desktop/desktop.groupproj index 0c9296cd8c..7c6e5525e0 100644 --- a/windows/src/desktop/desktop.groupproj +++ b/windows/src/desktop/desktop.groupproj @@ -12,6 +12,9 @@ + + + Default.Personality.12 @@ -47,14 +50,23 @@ + + + + + + + + + - + - + - + diff --git a/windows/src/desktop/inst/keymandesktop.wxs b/windows/src/desktop/inst/keymandesktop.wxs index 0423191d4f..5adf32af7b 100644 --- a/windows/src/desktop/inst/keymandesktop.wxs +++ b/windows/src/desktop/inst/keymandesktop.wxs @@ -145,6 +145,10 @@ + + + + diff --git a/windows/src/desktop/kmconfig/Keyman.System.KMConfigMain.pas b/windows/src/desktop/kmconfig/Keyman.System.KMConfigMain.pas new file mode 100644 index 0000000000..f5aa517fb7 --- /dev/null +++ b/windows/src/desktop/kmconfig/Keyman.System.KMConfigMain.pas @@ -0,0 +1,333 @@ +unit Keyman.System.KMConfigMain; + +interface + +uses + Keyman.System.Settings; + +type + TKMConfig = class + private + class var IsAdmin: Boolean; + class var Settings: TKeymanSettings; + class function Import(const Filename: string): Boolean; static; + class function Export(const Filename: string): Boolean; static; + class function Reset(const ID: string): Boolean; static; + class function SetValue(const ID, Value: string): Boolean; static; + class function Show(const P2: string): Boolean; static; + class procedure Log(const message: string); + class procedure LogError(const message: string); + class procedure LogWarning(const message: string); + public + class constructor ClassCreate; + class destructor ClassDestroy; + class procedure Run; static; + end; + +implementation + +uses + System.SysUtils, + System.Win.Registry, + Winapi.Windows, + + Keyman.System.SettingsManager, + Keyman.System.SettingsManagerFile, + RegistryKeys; + +type + TANSIColor = record + Green, Grey, Default, Yellow, Red, White: string; + end; + +var + ANSIColor: TANSIColor; + +class constructor TKMConfig.ClassCreate; +var + r: TRegistry; +begin + inherited; + r := TRegistry.Create; + try + r.RootKey := HKEY_LOCAL_MACHINE; + IsAdmin := r.OpenKey(SRegKey_KeymanEngine_LM, True); + finally + r.Free; + end; + + Settings := TKeymanSettings.Create; +end; + +class destructor TKMConfig.ClassDestroy; +begin + Settings.Free; + inherited; +end; + +class procedure TKMConfig.Run; +var + Command: string; + Result: Boolean; +begin + Settings := TKeymanSettings.Create; + Command := ParamStr(1).ToLower; + if Command = 'import' then Result := Import(ParamStr(2)) + else if Command = 'export' then Result := Export(ParamStr(2)) + else if Command = 'reset' then Result := Reset(ParamStr(2)) + else if Command = 'set' then Result := SetValue(ParamStr(2), ParamStr(3)) + else if Command = 'show' then Result := Show(ParamStr(2)) + else + begin + Result := False; + writeln('Usage: kmconfig command [options]'); + writeln('Commands:'); + writeln(' import Imports settings into local machine registry'); + writeln(' export Exports settings from local machine registry to file'); + writeln(' reset [id] Resets one or all settings to default'); + writeln(' set id value Sets setting identified by id to value'); + writeln(' show [-a] [id] Lists one or all settings; -a to show all, even empty settings'); + writeln('Note: registry changes may require elevation to succeed.'); + end; + + if Result + then ExitCode := 0 + else ExitCode := 1; +end; + +class procedure TKMConfig.Log(const message: string); +begin + writeln(message); +end; + +class procedure TKMConfig.LogError(const message: string); +begin + Log(AnsiColor.Red+'ERROR: '+message+AnsiColor.Default); +end; + +class procedure TKMConfig.LogWarning(const message: string); +begin + Log(AnsiColor.Yellow+'WARNING: '+message+AnsiColor.Default); +end; + +class function TKMConfig.Export(const Filename: string): Boolean; +begin + TKeymanSettingsManager.Load(Settings); + TKeymanSettingsManagerFile.Export(Settings, Filename); + Log('All Keyman settings have been exported to '+Filename); + Result := True; +end; + +class function TKMConfig.Import(const Filename: string): Boolean; +begin + TKeymanSettingsManager.Load(Settings); + TKeymanSettingsManagerFile.Import(Settings, Filename); + TKeymanSettingsManager.Save(Settings, IsAdmin); + Log('Keyman settings in '+Filename+' have been imported'); + if not IsAdmin then + LogWarning('Some settings that require Administrator permissions may not have been updated'); + Result := True; +end; + +class function TKMConfig.Reset(const ID: string): Boolean; +var + Setting: TKeymanSetting; +begin + if ID = '' then + begin + Settings.Reset; + TKeymanSettingsManager.Load(Settings); + if Settings.Modified then + begin + TKeymanSettingsManager.Save(Settings, IsAdmin); + Log('Keyman settings have been reset to default'); + if not IsAdmin then + LogWarning('Some settings that require Administrator permissions may not have been updated'); + end + else + begin + Log('All Keyman settings were already default'); + end; + end + else + begin + TKeymanSettingsManager.Load(Settings); + Setting := Settings.Find(ID); + if not Assigned(Setting) then + begin + // Custom value, do we support it? + if ID.StartsWith(CustomKeymanSetting_TSFApp.ID, True) then + begin + LogWarning('Setting '+ID+' does not exist; not updating.'); + Exit(True); + end + else + begin + LogError('Setting '+ID+' is not a valid Keyman setting.'); + Exit(False); + end; + end; + if Setting.IsEmpty then + begin + LogWarning('Setting '+ID+' is already default; not updating.'); + Exit(True); + end; + if (Setting.Base.RootKey = HKEY_LOCAL_MACHINE) and not IsAdmin then + begin + LogError('Setting '+ID+' requires Administrator permissions to update.'); + Exit(False); + end; + + Setting.Reset; + if Setting.Modified then + begin + TKeymanSettingsManager.Save(Settings, IsAdmin); + Log('Keyman setting '+ID+' has been reset to default'); + end + else + begin + LogWarning('Keyman setting '+ID+' was already default; not updating'); + end; + end; + + Result := True; +end; + +class function TKMConfig.SetValue(const ID, Value: string): Boolean; +var + Setting: TKeymanSetting; +begin + Setting := Settings.Find(ID); + + if not Assigned(Setting) then + begin + // Custom value, do we support it? + if ID.StartsWith(CustomKeymanSetting_TSFApp.ID, True) then + begin + Setting := TKeymanSetting.CreateCustom_TSFApp(ID); + Settings.Add(Setting); + end + else + begin + LogError(ID+' is not a valid Keyman setting.'); + Exit(False); + end; + end; + + if (Setting.Base.RootKey = HKEY_LOCAL_MACHINE) and not IsAdmin then + begin + LogError('Setting '+ID+' requires Administrator permissions to update.'); + Exit(False); + end; + + case Setting.Base.ValueType of + kstString: Setting.ValueStr := Value; + kstInteger: Setting.ValueInt := StrToInt(Value); + end; + + TKeymanSettingsManager.Save(Settings, IsAdmin); + Log('Keyman setting '+ID+' has been updated to '+Value); + Result := True; +end; + +class function TKMConfig.Show(const P2: string): Boolean; + + function ShowOneSetting(const ID: string): Boolean; + var + Setting: TKeymanSetting; + v: string; + begin + Setting := Settings.Find(ID); + if not Assigned(Setting) then + begin + LogError('Setting '+ID+' is not a valid Keyman setting.'); + Exit(False); + end; + case Setting.Base.ValueType of + kstString: v := Setting.ValueStr; + kstInteger: v := Setting.ValueInt.ToString; + end; + if Setting.IsEmpty + then Log(AnsiColor.Green+Setting.Base.ID+AnsiColor.Grey+'='+AnsiColor.Grey+v+AnsiColor.Default) + else Log(AnsiColor.Green+Setting.Base.ID+AnsiColor.Grey+'='+AnsiColor.White+v+AnsiColor.Default); + Result := True; + end; + + procedure ShowAllSettings(ShowAll: Boolean); + var + Setting: TKeymanSetting; + begin + for Setting in Settings do + begin + if ShowAll or not Setting.IsEmpty then + ShowOneSetting(Setting.Base.ID); + end; + end; +begin + Result := True; + TKeymanSettingsManager.Load(Settings); + if SameText(P2, '-a') then + ShowAllSettings(True) + else if P2 = '' then + ShowAllSettings(False) + else + Result := ShowOneSetting(P2); +end; + +function DetectColorMode: Boolean; +var + mode: DWORD; + hConsole: THandle; +const + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4; +begin + Result := False; + mode := 0; + hConsole := GetStdHandle(STD_OUTPUT_HANDLE); + if hConsole = INVALID_HANDLE_VALUE then + begin + //writeln(Format('GetStdHandle failed with %d %s', [GetLastError, SysErrorMessage(GetLastError)])); + Exit; + end; + + if GetEnvironmentVariable('MSYSTEM') = 'MINGW64' then + begin + // MinGW64 test + // Use colour mode only with a non-redirected console. This test fails with pipes. + // For pipe use, explicitly use -no-color parameter + Result := GetFileType(hConsole) = 3; + end + else + begin + // Win32 console color mode test + if not GetConsoleMode(hConsole, mode) then + Exit; + + mode := mode or ENABLE_VIRTUAL_TERMINAL_PROCESSING; + if not SetConsoleMode(hConsole, mode) then + Exit; + + Result := True; + end; +end; + +const + ESC=#$1b; + ESC_BRIGHT_YELLOW=ESC+'[38;2;255;255;0m'; + ESC_RED=ESC+'[38;2;255;0;0m'; + ESC_GREEN=ESC+'[38;2;0;255;0m'; + ESC_GREY=ESC+'[38;2;128;132;128m'; + ESC_WHITE=ESC+'[38;2;255;255;255m'; + ESC_DEFAULT=ESC+'[0m'; + +initialization + if DetectColorMode then + begin + ANSIColor.Green := ESC_GREEN; + ANSIColor.Default := ESC_DEFAULT; + ANSIColor.Red := ESC_RED; + ANSIColor.Yellow := ESC_BRIGHT_YELLOW; + ANSIColor.Grey := ESC_GREY; + ANSIColor.White := ESC_WHITE; + end; +end. diff --git a/windows/src/desktop/kmconfig/Makefile b/windows/src/desktop/kmconfig/Makefile new file mode 100644 index 0000000000..d7ef95a126 --- /dev/null +++ b/windows/src/desktop/kmconfig/Makefile @@ -0,0 +1,32 @@ +# +# KMConfig Makefile +# + +!include ..\..\Defines.mak + +build: version.res manifest.res #icons + $(DELPHI_MSBUILD) kmconfig.dproj /p:Platform=Win32 + $(TDS2DBG) $(WIN32_TARGET_PATH)\kmconfig.exe + $(SENTRYTOOL_DELPHIPREP) $(WIN32_TARGET_PATH)\kmconfig.exe -dpr kmconfig.exe + $(COPY) $(WIN32_TARGET_PATH)\kmconfig.exe $(PROGRAM)\desktop + if exist $(WIN32_TARGET_PATH)\kmconfig.exe $(COPY) $(WIN32_TARGET_PATH)\kmconfig.exe $(DEBUGPATH)\desktop + +#icons: + #rc icons.rc + +clean: def-clean + +signcode: + $(SIGNCODE) /d "Keyman for Windows" $(PROGRAM)\desktop\kmconfig.exe + +backup: + $(WZZIP) $(BUILD)\desktop\kmconfig.zip $(BACKUPDEFAULTS) kmconfig.exe + +test-manifest: + # test that (a) linked manifest exists and correct, and (b) has uiAccess=true + $(MT) -nologo -inputresource:$(PROGRAM)\desktop\kmconfig.exe -validate_manifest + +install: + copy $(ROOT)\bin\desktop\kmconfig.exe "$(INSTALLPATH_KEYMANDESKTOP)" + +!include ..\..\Target.mak diff --git a/windows/src/desktop/kmconfig/elevation.png b/windows/src/desktop/kmconfig/elevation.png new file mode 100644 index 0000000000000000000000000000000000000000..45b02ced8699fb4851b1b416d4375eaa7f94471c GIT binary patch literal 774 zcmV+h1Nr=kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0-H%hK~y+Tm6J_O z(_k3K|83WG>nLT84F~}*1VkkvXkxr*jF}M<5|@D7ym4VS5)+IE&tBl*K@%^Y2_Z^w zhM1rS4;}_4igQ4e!9IkIeRSXL*3Ng(bP)02FKOO4&-?uU@AEuu@h@t%8nwKAD^|6G~rC;q&>NtXX`um*YmR8C;)k%-XlhIQQXnj4x@AtO`gTZM>TX&$$ zcZ|dp8eNVEuJx{sbvjFdrPpu0b8~YodioJY1wVK9S7WL2O{uKXcF~4ZUdE5TG#=hs z0ZI~3QIIOy5ihh=H>2Xqd!F&By3VK|k|+-PBSkuvQLq)2uo=l9oXi6nNvV-X1I|$i zTwwerj>-+_vW7vvP^44Y61HP$d>0MHOjx?(Rj0vz_fRVNhpubo65&+Buss^#Rs)P_|CE9L?a(9Pakn z(dQ^W@p>nX{_BvdPSexV`+*ZL_6siOC0=a7wmgKZtqg`7=@)MI?Z+g=xV_GqKhymD zJR=C=v|UiWv8+|C + + {6C5626E9-4DA0-4A60-93CB-D5BDE0B3D29E} + 18.8 + VCL + kmconfig.dpr + True + Debug + Win32 + 1 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + kmconfig + + + DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;tethering;svnui;mbColorLibD10;dsnapcon;FireDACADSDriver;scFontCombo;DCPdelphi2009;FireDACMSAccDriver;fmxFireDAC;vclimg;Jcl;FireDAC;vcltouch;JvCore;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;CEF4Delphi;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;EmbeddedWebBrowser_XE;VCLRESTComponents;soapserver;dbxcds;VclSmp;JvDocking;adortl;JclVcl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;keyman_components;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;tethering;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;vclimg;Jcl;FireDAC;vcltouch;vcldb;bindcompfmx;FireDACSqliteDriver;FireDACPgDriver;inetdb;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;JclVcl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + true + PerMonitorV2 + true + 1033 + true + 3 + reset engine.compatibility.text_services_framework.notepad.exe 0 + true + Keyman Config + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + true + 3 + true + 1033 + 2 + Keyman Config + true + true + true + + + + MainSource + + + + + + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + kmconfig.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + kmconfig.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + True + False + + + 12 + + + + + diff --git a/windows/src/desktop/kmconfig/kmconfig.res b/windows/src/desktop/kmconfig/kmconfig.res new file mode 100644 index 0000000000000000000000000000000000000000..18c1ffa18fc93ddfd509fbc6f3d3174db3fd4c51 GIT binary patch literal 59520 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%0D@(Y^hauFNpRbIUzy}R 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 + + + Keyman for Windows Config + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/windows/src/desktop/kmconfig/manifest.rc b/windows/src/desktop/kmconfig/manifest.rc new file mode 100644 index 0000000000..984fce31b2 --- /dev/null +++ b/windows/src/desktop/kmconfig/manifest.rc @@ -0,0 +1 @@ +1 24 manifest.xml diff --git a/windows/src/desktop/kmconfig/version.in b/windows/src/desktop/kmconfig/version.in new file mode 100644 index 0000000000..6b4e6dfe97 --- /dev/null +++ b/windows/src/desktop/kmconfig/version.in @@ -0,0 +1,30 @@ +1 VERSIONINFO + FILEVERSION $VERSIONNUM + PRODUCTVERSION $VERSIONNUM + FILEFLAGSMASK 0x3fL + FILEFLAGS 0x0L + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0904E4" + BEGIN + VALUE "CompanyName", "SIL International\0" + VALUE "FileDescription", "Keyman Config\0" + VALUE "FileVersion", "$VERSION\0" + VALUE "InternalName", "KMCONFIG\0" + VALUE "LegalCopyright", "© SIL International\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "KMCONFIG.EXE\0" + VALUE "ProductName", "Keyman for Windows\0" + VALUE "ProductVersion", "$VERSION\0" + VALUE "Comments", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0xc09, 1252 + END + END