Files
deb-lite-xl/scripts/innosetup/innosetup.iss.in
T
Takase 1ada01e7b0 Update InnoSetup files (#1988)
* inno: update visual style to modern; support hidpi

* inno: fix add to PATH and add banner images

* inno: fix arch specification and default to x64compatible

* scripts: actually use x64compatible in package-innosetup.sh

* inno: fix unsupported windows warning

* gitignore: add trailing newline

(cherry picked from commit 819fa9d30e2c0e737fad519fbff63ce2baff4456)
2025-05-18 22:55:29 +08:00

200 lines
8.5 KiB
Plaintext

#define MyAppName "Lite XL"
#define MyAppVersion "@PROJECT_VERSION@"
#define MyAppPublisher "Lite XL Team"
#define MyAppURL "https://lite-xl.com"
#define MyAppExeName "lite-xl.exe"
#define BuildDir "@PROJECT_BUILD_DIR@"
#define SourceDir "@PROJECT_SOURCE_DIR@"
; Use /dArch option to create a setup for a different architecture, e.g.:
; iscc /dArch=x86 innosetup.iss
#ifndef Arch
#define Arch "x64compatible"
#endif
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; To generate a new GUID, click Tools | Generate GUID inside the InnoSetup IDE.
AppId={{06761240-D97C-43DE-B9ED-C15F765A2D65}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
#if Pos("x86", Arch) != 0
#define ArchInternal "i686"
#else
ArchitecturesAllowed={#Arch}
ArchitecturesInstallIn64BitMode={#Arch}
#if Pos("x64", Arch) != 0
#define ArchInternal "x86_64"
#elif Pos("arm64", Arch) != 0
#define ArchInternal "aarch64"
#endif
#endif
AllowNoIcons=yes
Compression=lzma2
SolidCompression=yes
DefaultDirName={autopf}/{#MyAppName}
DefaultGroupName={#MyAppPublisher}
UninstallFilesDir={app}
WizardStyle=modern
AlwaysShowDirOnReadyPage=yes
; Uncomment the following line to run in non administrative install mode
; (install for current user only.)
;PrivilegesRequired=lowest
PrivilegesRequiredOverridesAllowed=dialog
; The [Icons] "quicklaunchicon" entry uses {userappdata}
; but its [Tasks] entry has a proper IsAdminInstallMode Check.
UsedUserAreasWarning=no
OutputDir=.
OutputBaseFilename=LiteXL-{#MyAppVersion}-{#ArchInternal}-setup
DisableDirPage=no
;DisableProgramGroupPage=yes
LicenseFile={#SourceDir}/LICENSE
SetupIconFile={#SourceDir}/resources/icons/icon.ico
UninstallDisplayIcon={app}\{#MyAppExeName}, 0
; Get a list of icons for different DPIs
#define WizardIconPath = SourceDir + "/scripts/innosetup/"
#define FinalIconPath ""
#define FindHandle
#define FindResult
#for {FindHandle = FindResult = FindFirst(WizardIconPath + "lite-xl@*.bmp", 0); FindResult; FindResult = FindNext(FindHandle)} \
Insert(FinalIconPath, 0, WizardIconPath + FindGetFileName(FindHandle) + ",")
#if FindHandle
#expr FindClose(FindHandle)
#endif
WizardSmallImageFile="{#FinalIconPath}"
; Get a list of banners for different DPIs (FIXME: figure out how to reuse this code?)
#define FinalBannerPath ""
#for {FindHandle = FindResult = FindFirst(WizardIconPath + "lite-xl-banner@*.bmp", 0); FindResult; FindResult = FindNext(FindHandle)} \
Insert(FinalBannerPath, 0, WizardIconPath + FindGetFileName(FindHandle) + ",")
#if FindHandle
#expr FindClose(FindHandle)
#endif
WizardImageFile="{#FinalBannerPath}"
; Required for the add to path option to refresh environment
ChangesEnvironment=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.2; Check: not IsAdminInstallMode
Name: "portablemode"; Description: "Extract only, do not install"; Flags: unchecked
Name: "envPath"; Description: "Add Lite XL to PATH"; Flags: unchecked
[Files]
Source: "{#SourceDir}/lite-xl/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: not WizardIsTaskSelected('portablemode')
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Check: not WizardIsTaskSelected('portablemode')
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon; Check: not WizardIsTaskSelected('portablemode')
; Name: "{usersendto}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
[Registry]
Root: "HKA"; Subkey: "Software\Classes\*\shell\{#MyAppName}"; ValueType: string; ValueName: ""; ValueData: "Open with {#MyAppName}"; Flags: uninsdeletekey
Root: "HKA"; Subkey: "Software\Classes\*\shell\{#MyAppName}"; ValueType: string; ValueName: "Icon"; ValueData: "{app}\{#MyAppExeName}, 0"; Flags: uninsdeletekey
Root: "HKA"; Subkey: "Software\Classes\*\shell\{#MyAppName}\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExename}"" ""%1"""; Flags: uninsdeletekey
Root: "HKA"; Subkey: "Software\Classes\directory\shell\{#MyAppName}"; ValueType: string; ValueName: ""; ValueData: "Open with {#MyAppName}"; Flags: uninsdeletekey
Root: "HKA"; Subkey: "Software\Classes\directory\shell\{#MyAppName}"; ValueType: string; ValueName: "Icon"; ValueData: "{app}\{#MyAppExeName}, 0"; Flags: uninsdeletekey
Root: "HKA"; Subkey: "Software\Classes\directory\shell\{#MyAppName}\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExename}"" ""%1"""; Flags: uninsdeletekey
Root: "HKA"; Subkey: "Software\Classes\directory\background\shell\{#MyAppName}"; ValueType: string; ValueName: ""; ValueData: "Open with {#MyAppName}"; Flags: uninsdeletekey
Root: "HKA"; Subkey: "Software\Classes\directory\background\shell\{#MyAppName}"; ValueType: string; ValueName: "Icon"; ValueData: "{app}\{#MyAppExeName}, 0"; Flags: uninsdeletekey
Root: "HKA"; Subkey: "Software\Classes\directory\background\shell\{#MyAppName}\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExename}"" ""%V"""; Flags: uninsdeletekey
[Run]
Filename: "{app}/{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Setup]
Uninstallable=not WizardIsTaskSelected('portablemode')
; Code to add installation path to environment taken from:
; https://stackoverflow.com/a/46609047
[Code]
const SystemKey = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
const UserKey = 'Environment';
const SystemHive = HKEY_LOCAL_MACHINE;
const UserHive = HKEY_CURRENT_USER;
procedure EnvAddPath(Path: string);
var
SystemPath: string;
UserPath: string;
R: boolean;
begin
{ Retrieve user and system PATH }
if not RegQueryStringValue(SystemHive, SystemKey, 'Path', SystemPath)
then SystemPath := '';
if not RegQueryStringValue(UserHive, UserKey, 'Path', UserPath)
then UserPath := '';
{ Skip if the string is found in user / system path }
if Pos(';' + Uppercase(Path) + ';', ';' + Uppercase(UserPath) + ';' + Uppercase(SystemPath) + ';') > 0 then exit;
{ Add the environment variable to user or system PATH depending on installation mode }
if IsAdminInstallMode() then R := RegWriteStringValue(SystemHive, SystemKey, 'Path', SystemPath + ';' + Path + ';')
else R := RegWriteStringValue(UserHive, UserKey, 'Path', UserPath + ';' + Path + ';');
{ Log any issues }
if R then Log(Path + ' is added to PATH')
else Log('Cannot add ' + Path + ' to PATH');
end;
procedure EnvRemovePath(Path: string);
var
RegKeys: array of string;
RegHives: array of integer;
Paths: string;
I: integer;
P: integer;
begin
{ During uninstallation, we always have administrator privileges }
RegKeys := [SystemKey, UserKey];
RegHives := [SystemHive, UserHive];
{ Remove the path from both user and system PATH }
for I := 0 to Length(RegKeys) - 1 do
begin
{ Skip if registry key doesn't exist }
if not RegQueryStringValue(RegHives[I], RegKeys[I], 'Path', Paths) then continue;
{ Skip if path is not in PATH }
P := Pos(';' + Uppercase(Path) + ';', ';' + Uppercase(Paths) + ';');
if p = 0 then continue;
{ Remove string from PATH }
Delete(Paths, P - 1, Length(Path) + 1);
{ Write to the environment variable }
if RegWriteStringValue(RegHives[I], RegKeys[I], 'Path', Paths)
then Log(Path + ' is removed from PATH')
else Log('Error removing ' + Path + ' from PATH');
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) and WizardIsTaskSelected('envPath')
then EnvAddPath(ExpandConstant('{app}'));
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall
then EnvRemovePath(ExpandConstant('{app}'));
end;