mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-30 20:27:39 +00:00
Fixes #3110. The hint dialog must be launched unelevated. Refactors the UCreateProcessAsShellUser unit into the TUtilExecute class.
83 lines
2.4 KiB
ObjectPascal
83 lines
2.4 KiB
ObjectPascal
unit KeymanDesktopShell;
|
|
|
|
interface
|
|
|
|
uses
|
|
keymanapi_tlb,
|
|
utilexecute;
|
|
|
|
type
|
|
TKeymanDesktopShell = class
|
|
class function RunKeymanConfiguration(params: string = ''): Boolean;
|
|
class function WaitForKeymanConfiguration(const params: string; var ec: Cardinal; Callback: TUtilExecuteCallbackWaitEvent = nil): Boolean;
|
|
class function IsTextEditorVisible: Boolean; static;
|
|
class function OpenHelp(topic: string): Boolean;
|
|
class function OpenHelpJump(const topic: string; ActiveKeyboard: IKeymanKeyboardInstalled): Boolean;
|
|
private
|
|
class function GetRootPath: string;
|
|
class function GetRootDir: string;
|
|
class function GetShellPath: string;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
System.SysUtils,
|
|
Winapi.Windows,
|
|
|
|
KeymanPaths;
|
|
|
|
class function TKeymanDesktopShell.GetRootDir: string;
|
|
begin
|
|
Result := ExcludeTrailingPathDelimiter(TKeymanPaths.KeymanDesktopInstallPath);
|
|
end;
|
|
|
|
class function TKeymanDesktopShell.GetRootPath: string;
|
|
begin
|
|
Result := IncludeTrailingPathDelimiter(GetRootDir);
|
|
end;
|
|
|
|
class function TKeymanDesktopShell.GetShellPath: string;
|
|
begin
|
|
Result := TKeymanPaths.KeymanDesktopInstallPath(TKeymanPaths.S_KMShell);
|
|
end;
|
|
|
|
class function TKeymanDesktopShell.RunKeymanConfiguration(params: string = ''): Boolean;
|
|
begin
|
|
Result := TUtilExecute.ShellCurrentUser(0, GetShellPath, GetRootPath, params);
|
|
end;
|
|
|
|
class function TKeymanDesktopShell.WaitForKeymanConfiguration(
|
|
const params: string; var ec: Cardinal; Callback: TUtilExecuteCallbackWaitEvent): Boolean;
|
|
begin
|
|
Result := TUtilExecute.WaitForProcess('"'+GetShellPath+'" '+params, GetRootPath, ec, Callback);
|
|
end;
|
|
|
|
const
|
|
STextEditorClassName = 'TfrmTextEditor'; // I4265
|
|
|
|
class function TKeymanDesktopShell.IsTextEditorVisible: Boolean;
|
|
begin
|
|
Result := FindWindow(STextEditorClassName, nil) <> 0;
|
|
end;
|
|
|
|
class function TKeymanDesktopShell.OpenHelp(topic: string): Boolean;
|
|
var
|
|
cleantopic: WideString;
|
|
i: Integer;
|
|
begin
|
|
cleantopic := '';
|
|
for i := 1 to Length(topic) do
|
|
if CharInSet(topic[i], ['a'..'z','A'..'Z','0'..'9','_','/','\','-']) then // I3310
|
|
cleantopic := cleantopic + topic[i]; // I3310
|
|
Result := RunKeymanConfiguration('-h '+cleantopic);
|
|
end;
|
|
|
|
class function TKeymanDesktopShell.OpenHelpJump(const topic: string; ActiveKeyboard: IKeymanKeyboardInstalled): Boolean;
|
|
begin
|
|
if ActiveKeyboard = nil
|
|
then Result := RunKeymanConfiguration('-showhelp '+topic)
|
|
else Result := RunKeymanConfiguration('-showhelp "'+topic+'" "'+ActiveKeyboard.ID+'"');
|
|
end;
|
|
|
|
end.
|