mirror of
https://github.com/safing/portmaster
synced 2025-09-02 02:29:12 +00:00
[deskotp/tauri] update tauri, remove the need for nsis template
This commit is contained in:
parent
ce43e2a81f
commit
31b99e7647
11 changed files with 119 additions and 1670 deletions
106
desktop/tauri/src-tauri/Cargo.lock
generated
106
desktop/tauri/src-tauri/Cargo.lock
generated
|
@ -225,7 +225,9 @@ dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"notify-rust",
|
"notify-rust",
|
||||||
|
"open",
|
||||||
"reqwest 0.12.4",
|
"reqwest 0.12.4",
|
||||||
|
"rfd",
|
||||||
"rust-ini",
|
"rust-ini",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -1008,9 +1010,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cargo-mobile2"
|
name = "cargo-mobile2"
|
||||||
version = "0.11.1"
|
version = "0.12.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "61dadb1a2dffea43fd83eba99d71367794a776e2053d1405379cc7a9ef24639e"
|
checksum = "c7ac384d832f346303c9f80328bb11e04000b66743b543578ed8926a6fbc264f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"colored",
|
"colored",
|
||||||
"core-foundation",
|
"core-foundation",
|
||||||
|
@ -1020,7 +1022,7 @@ dependencies = [
|
||||||
"embed-resource",
|
"embed-resource",
|
||||||
"english-numbers",
|
"english-numbers",
|
||||||
"freedesktop_entry_parser",
|
"freedesktop_entry_parser",
|
||||||
"handlebars 4.5.0",
|
"handlebars",
|
||||||
"heck 0.5.0",
|
"heck 0.5.0",
|
||||||
"home",
|
"home",
|
||||||
"ignore",
|
"ignore",
|
||||||
|
@ -1038,7 +1040,7 @@ dependencies = [
|
||||||
"toml 0.8.13",
|
"toml 0.8.13",
|
||||||
"ureq",
|
"ureq",
|
||||||
"which",
|
"which",
|
||||||
"windows 0.54.0",
|
"windows 0.56.0",
|
||||||
"x509-certificate",
|
"x509-certificate",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2980,20 +2982,6 @@ dependencies = [
|
||||||
"crunchy",
|
"crunchy",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "handlebars"
|
|
||||||
version = "4.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225"
|
|
||||||
dependencies = [
|
|
||||||
"log",
|
|
||||||
"pest",
|
|
||||||
"pest_derive",
|
|
||||||
"serde",
|
|
||||||
"serde_json",
|
|
||||||
"thiserror",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "handlebars"
|
name = "handlebars"
|
||||||
version = "5.1.2"
|
version = "5.1.2"
|
||||||
|
@ -7026,9 +7014,9 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri"
|
name = "tauri"
|
||||||
version = "2.0.0-beta.19"
|
version = "2.0.0-beta.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6f8e5bc2e4f5eb7496d1a3e5f4d272f69f1333db5f8efed28d79d7f93334fe95"
|
checksum = "5a258ecc5ac7ddade525f512c4962fd01cd0f5265e917b4572579c32c027bb31"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
@ -7062,7 +7050,7 @@ dependencies = [
|
||||||
"tauri-macros",
|
"tauri-macros",
|
||||||
"tauri-runtime",
|
"tauri-runtime",
|
||||||
"tauri-runtime-wry",
|
"tauri-runtime-wry",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tray-icon",
|
"tray-icon",
|
||||||
|
@ -7076,9 +7064,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-build"
|
name = "tauri-build"
|
||||||
version = "2.0.0-beta.15"
|
version = "2.0.0-beta.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8aa28eebafcda490fa7097a6e3a4d07f65967614d35dd88b2aaa19dbb49241cd"
|
checksum = "82b964bb6d03d97e24e12f896aab463b02a3c2ff76a60f728cc37b5548eb470e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"cargo_toml",
|
"cargo_toml",
|
||||||
|
@ -7090,7 +7078,7 @@ dependencies = [
|
||||||
"semver",
|
"semver",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
"tauri-winres",
|
"tauri-winres",
|
||||||
"toml 0.8.13",
|
"toml 0.8.13",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
|
@ -7098,9 +7086,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-bundler"
|
name = "tauri-bundler"
|
||||||
version = "2.0.1-beta.13"
|
version = "2.0.1-beta.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8beac47963679e849dde2df8e64ca8dfaf47f6e42a5c1b8980e0dfe7bd517f97"
|
checksum = "44c4fe479a5a5cbbceb226c4e773448e4e919501a8b632b3b03639cd21106e7c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"ar",
|
"ar",
|
||||||
|
@ -7109,7 +7097,7 @@ dependencies = [
|
||||||
"dunce",
|
"dunce",
|
||||||
"flate2",
|
"flate2",
|
||||||
"glob",
|
"glob",
|
||||||
"handlebars 5.1.2",
|
"handlebars",
|
||||||
"heck 0.5.0",
|
"heck 0.5.0",
|
||||||
"hex",
|
"hex",
|
||||||
"image 0.24.9",
|
"image 0.24.9",
|
||||||
|
@ -7127,23 +7115,23 @@ dependencies = [
|
||||||
"strsim 0.11.1",
|
"strsim 0.11.1",
|
||||||
"tar",
|
"tar",
|
||||||
"tauri-icns",
|
"tauri-icns",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"time",
|
"time",
|
||||||
"ureq",
|
"ureq",
|
||||||
"uuid",
|
"uuid",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
|
"windows-registry",
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
"winreg 0.52.0",
|
|
||||||
"zip",
|
"zip",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-cli"
|
name = "tauri-cli"
|
||||||
version = "2.0.0-beta.17"
|
version = "2.0.0-beta.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "594c92a0f99e76c959f2af352b3fce95ddd7c467f43f232edc4369bcbab2c255"
|
checksum = "7018ca1c9f09f2c634b3e36e901412afaf172316d08062a934a64f879977e15b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"axum",
|
"axum",
|
||||||
|
@ -7160,7 +7148,7 @@ dependencies = [
|
||||||
"dunce",
|
"dunce",
|
||||||
"env_logger 0.11.3",
|
"env_logger 0.11.3",
|
||||||
"glob",
|
"glob",
|
||||||
"handlebars 5.1.2",
|
"handlebars",
|
||||||
"heck 0.5.0",
|
"heck 0.5.0",
|
||||||
"html5ever",
|
"html5ever",
|
||||||
"ignore",
|
"ignore",
|
||||||
|
@ -7194,23 +7182,20 @@ dependencies = [
|
||||||
"tauri-bundler",
|
"tauri-bundler",
|
||||||
"tauri-icns",
|
"tauri-icns",
|
||||||
"tauri-utils 1.5.4",
|
"tauri-utils 1.5.4",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
"thiserror",
|
|
||||||
"tokio",
|
"tokio",
|
||||||
"toml 0.8.13",
|
"toml 0.8.13",
|
||||||
"toml_edit 0.22.13",
|
"toml_edit 0.22.13",
|
||||||
"unicode-width",
|
|
||||||
"ureq",
|
"ureq",
|
||||||
"url",
|
"url",
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
"zeroize",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-codegen"
|
name = "tauri-codegen"
|
||||||
version = "2.0.0-beta.15"
|
version = "2.0.0-beta.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "727d13a28e9ec895f537d90a09acb0aa3593f703a715fe8a77f87269d3245b52"
|
checksum = "3529cfa977ed7c097f2a5e8da19ecffbe61982450a6c819e6165b6d0cfd3dd3a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"brotli",
|
"brotli",
|
||||||
|
@ -7225,7 +7210,7 @@ dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2",
|
"sha2",
|
||||||
"syn 2.0.65",
|
"syn 2.0.65",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"time",
|
"time",
|
||||||
"url",
|
"url",
|
||||||
|
@ -7245,16 +7230,16 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-macros"
|
name = "tauri-macros"
|
||||||
version = "2.0.0-beta.15"
|
version = "2.0.0-beta.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "258667612ad901d256e04ace71ac54d4b3dd8fb1e5baa24403b50991cade4365"
|
checksum = "36f97dd80334f29314aa5f40b5fad10cb9feffd08e5a5324fd728613841e5d33"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck 0.5.0",
|
"heck 0.5.0",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.65",
|
"syn 2.0.65",
|
||||||
"tauri-codegen",
|
"tauri-codegen",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -7269,7 +7254,7 @@ dependencies = [
|
||||||
"schemars",
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
"toml 0.8.13",
|
"toml 0.8.13",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
]
|
]
|
||||||
|
@ -7439,9 +7424,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-runtime"
|
name = "tauri-runtime"
|
||||||
version = "2.0.0-beta.16"
|
version = "2.0.0-beta.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "574f3d59cbe6c76b6d849bc35aa3a9e8061ff8f75f557dc33f38c0e43cf55a41"
|
checksum = "d7dc96172a43536236ab55b7da7b8461bf75810985e668589e2395cb476937cb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dpi",
|
"dpi",
|
||||||
"gtk",
|
"gtk",
|
||||||
|
@ -7450,7 +7435,7 @@ dependencies = [
|
||||||
"raw-window-handle 0.6.2",
|
"raw-window-handle 0.6.2",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"url",
|
"url",
|
||||||
"windows 0.56.0",
|
"windows 0.56.0",
|
||||||
|
@ -7458,9 +7443,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-runtime-wry"
|
name = "tauri-runtime-wry"
|
||||||
version = "2.0.0-beta.16"
|
version = "2.0.0-beta.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d6d1f223de1d674aaa561c900ac650b3160f11520e9b191a3574f6c493fc77fa"
|
checksum = "5d4fd913b1f14a9b618c7f3ae35656d3aa759767fcb95b72006357c12b9d0b09"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cocoa",
|
"cocoa",
|
||||||
"gtk",
|
"gtk",
|
||||||
|
@ -7472,7 +7457,7 @@ dependencies = [
|
||||||
"softbuffer",
|
"softbuffer",
|
||||||
"tao",
|
"tao",
|
||||||
"tauri-runtime",
|
"tauri-runtime",
|
||||||
"tauri-utils 2.0.0-beta.15",
|
"tauri-utils 2.0.0-beta.17",
|
||||||
"url",
|
"url",
|
||||||
"webkit2gtk",
|
"webkit2gtk",
|
||||||
"webview2-com",
|
"webview2-com",
|
||||||
|
@ -7513,9 +7498,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-utils"
|
name = "tauri-utils"
|
||||||
version = "2.0.0-beta.15"
|
version = "2.0.0-beta.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2b4251529d92b5c611ccaa611f8a31cb41b1aa00db8bcc0a49efe5d966bfa911"
|
checksum = "4f24a9c20d676a3f025331cc1c3841256ba88c9f25fb7fae709d2b3089c50d90"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes-gcm",
|
"aes-gcm",
|
||||||
"brotli",
|
"brotli",
|
||||||
|
@ -7524,7 +7509,6 @@ dependencies = [
|
||||||
"dunce",
|
"dunce",
|
||||||
"getrandom 0.2.15",
|
"getrandom 0.2.15",
|
||||||
"glob",
|
"glob",
|
||||||
"heck 0.5.0",
|
|
||||||
"html5ever",
|
"html5ever",
|
||||||
"infer 0.15.0",
|
"infer 0.15.0",
|
||||||
"json-patch",
|
"json-patch",
|
||||||
|
@ -8049,9 +8033,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tray-icon"
|
name = "tray-icon"
|
||||||
version = "0.13.5"
|
version = "0.14.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "39240037d755a1832e752d64f99078c3b0b21c09a71c12405070c75ef4e7cd3c"
|
checksum = "c53e41ee5fa70d22d0c11ab780beef179944e7d3199b948f5f6fbe7f7debe3b5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cocoa",
|
"cocoa",
|
||||||
"core-graphics",
|
"core-graphics",
|
||||||
|
@ -8825,6 +8809,16 @@ dependencies = [
|
||||||
"syn 2.0.65",
|
"syn 2.0.65",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-registry"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f721bc2e55efb506a1a395a545cb76c2481fb023d33b51f0050e7888716281cf"
|
||||||
|
dependencies = [
|
||||||
|
"windows-result",
|
||||||
|
"windows-targets 0.52.5",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-result"
|
name = "windows-result"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
@ -9105,9 +9099,9 @@ checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wry"
|
name = "wry"
|
||||||
version = "0.39.5"
|
version = "0.40.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c7172fc76376d55d089c627a31a5b604b4ac372793fb5378d1c7ddf008703008"
|
checksum = "7cd42682bad8d1efd0e0d0593770c602c13b8922bb1ca705cb845967de81bbc4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"block",
|
"block",
|
||||||
|
|
|
@ -12,11 +12,11 @@ rust-version = "1.60"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
tauri-build = { version = "2.0.0-beta.15", features = [] }
|
tauri-build = { version = "2.0.0-beta.17", features = [] }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Tauri
|
# Tauri
|
||||||
tauri = { version = "2.0.0-beta.19", features = ["tray-icon", "image-png", "config-json5"] }
|
tauri = { version = "2.0.0-beta.22", features = ["tray-icon", "image-png", "config-json5"] }
|
||||||
tauri-plugin-shell = "2.0.0-beta"
|
tauri-plugin-shell = "2.0.0-beta"
|
||||||
tauri-plugin-dialog = "2.0.0-beta"
|
tauri-plugin-dialog = "2.0.0-beta"
|
||||||
tauri-plugin-clipboard-manager = "2.0.0-beta"
|
tauri-plugin-clipboard-manager = "2.0.0-beta"
|
||||||
|
@ -26,7 +26,7 @@ tauri-plugin-cli = "2.0.0-beta"
|
||||||
tauri-plugin-notification = "2.0.0-beta"
|
tauri-plugin-notification = "2.0.0-beta"
|
||||||
tauri-plugin-log = "2.0.0-beta"
|
tauri-plugin-log = "2.0.0-beta"
|
||||||
|
|
||||||
tauri-cli = "2.0.0-beta.17"
|
tauri-cli = "2.0.0-beta.20"
|
||||||
|
|
||||||
# General
|
# General
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
@ -49,6 +49,9 @@ thiserror = "1.0"
|
||||||
log = "0.4.21"
|
log = "0.4.21"
|
||||||
reqwest = { version = "0.12" }
|
reqwest = { version = "0.12" }
|
||||||
|
|
||||||
|
rfd = { version = "*", default-features = false, features = [ "tokio", "gtk3", "common-controls-v6" ] }
|
||||||
|
open = "5.1.3"
|
||||||
|
|
||||||
# Linux only
|
# Linux only
|
||||||
[target.'cfg(target_os = "linux")'.dependencies]
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
glib = "0.18.4"
|
glib = "0.18.4"
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1868,6 +1868,13 @@
|
||||||
"window:allow-minimize"
|
"window:allow-minimize"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "window:allow-monitor-from-point -> Enables the monitor_from_point command without any pre-configured scope.",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"window:allow-monitor-from-point"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.",
|
"description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
@ -2302,6 +2309,13 @@
|
||||||
"window:deny-minimize"
|
"window:deny-minimize"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "window:deny-monitor-from-point -> Denies the monitor_from_point command without any pre-configured scope.",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"window:deny-monitor-from-point"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.",
|
"description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
|
|
@ -1868,6 +1868,13 @@
|
||||||
"window:allow-minimize"
|
"window:allow-minimize"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "window:allow-monitor-from-point -> Enables the monitor_from_point command without any pre-configured scope.",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"window:allow-monitor-from-point"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.",
|
"description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
@ -2302,6 +2309,13 @@
|
||||||
"window:deny-minimize"
|
"window:deny-minimize"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "window:deny-monitor-from-point -> Denies the monitor_from_point command without any pre-configured scope.",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"window:deny-monitor-from-point"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.",
|
"description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
|
|
@ -3,10 +3,11 @@ use std::sync::Mutex;
|
||||||
use std::{collections::HashMap, sync::atomic::Ordering};
|
use std::{collections::HashMap, sync::atomic::Ordering};
|
||||||
|
|
||||||
use log::{debug, error};
|
use log::{debug, error};
|
||||||
|
use tauri::tray::{MouseButton, MouseButtonState};
|
||||||
use tauri::{
|
use tauri::{
|
||||||
image::Image,
|
image::Image,
|
||||||
menu::{MenuBuilder, MenuItem, MenuItemBuilder, PredefinedMenuItem, SubmenuBuilder},
|
menu::{MenuBuilder, MenuItem, MenuItemBuilder, PredefinedMenuItem, SubmenuBuilder},
|
||||||
tray::{ClickType, TrayIcon, TrayIconBuilder},
|
tray::{TrayIcon, TrayIconBuilder},
|
||||||
Wry,
|
Wry,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -158,8 +159,20 @@ pub fn setup_tray_menu(
|
||||||
})
|
})
|
||||||
.on_tray_icon_event(|tray, event| {
|
.on_tray_icon_event(|tray, event| {
|
||||||
// not supported on linux
|
// not supported on linux
|
||||||
if event.click_type == ClickType::Left {
|
|
||||||
let _ = open_window(tray.app_handle());
|
if let tauri::tray::TrayIconEvent::Click {
|
||||||
|
id: _,
|
||||||
|
position: _,
|
||||||
|
rect: _,
|
||||||
|
button,
|
||||||
|
button_state,
|
||||||
|
} = event
|
||||||
|
{
|
||||||
|
if let MouseButton::Left = button {
|
||||||
|
if let MouseButtonState::Down = button_state {
|
||||||
|
let _ = open_window(tray.app_handle());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build(app)?;
|
.build(app)?;
|
||||||
|
|
|
@ -80,7 +80,8 @@ pub fn create_splash_window(app: &AppHandle) -> Result<WebviewWindow> {
|
||||||
|
|
||||||
pub fn close_splash_window(app: &AppHandle) -> Result<()> {
|
pub fn close_splash_window(app: &AppHandle) -> Result<()> {
|
||||||
if let Some(window) = app.get_webview_window("splash") {
|
if let Some(window) = app.get_webview_window("splash") {
|
||||||
return window.hide();
|
let _ = window.hide();
|
||||||
|
return window.destroy();
|
||||||
}
|
}
|
||||||
return Err(tauri::Error::WindowNotFound);
|
return Err(tauri::Error::WindowNotFound);
|
||||||
}
|
}
|
||||||
|
@ -131,8 +132,7 @@ pub fn may_navigate_to_ui(win: &mut WebviewWindow, force: bool) {
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if force || win.label().eq("main") {
|
||||||
if force || cfg!(debug_assertions) || win.url().unwrap().as_str() == "tauri://localhost" {
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
if let Ok(target_url) = std::env::var("TAURI_PM_URL") {
|
if let Ok(target_url) = std::env::var("TAURI_PM_URL") {
|
||||||
debug!("[tauri] navigating to {}", target_url);
|
debug!("[tauri] navigating to {}", target_url);
|
||||||
|
|
|
@ -76,7 +76,7 @@
|
||||||
"windows": {
|
"windows": {
|
||||||
"nsis": {
|
"nsis": {
|
||||||
"installMode": "perMachine",
|
"installMode": "perMachine",
|
||||||
"template": "templates/installer.nsi"
|
"installerHooks": "templates/nsis_install_hooks.nsh"
|
||||||
},
|
},
|
||||||
"wix": {
|
"wix": {
|
||||||
"fragmentPaths": [
|
"fragmentPaths": [
|
||||||
|
|
|
@ -1,804 +0,0 @@
|
||||||
Unicode true
|
|
||||||
ManifestDPIAware true
|
|
||||||
; Set the compression algorithm. Default is LZMA.
|
|
||||||
!if "{{compression}}" == ""
|
|
||||||
SetCompressor /SOLID lzma
|
|
||||||
!else
|
|
||||||
SetCompressor /SOLID "{{compression}}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!include MUI2.nsh
|
|
||||||
!include FileFunc.nsh
|
|
||||||
!include x64.nsh
|
|
||||||
!include WordFunc.nsh
|
|
||||||
!include "FileAssociation.nsh"
|
|
||||||
!include "StrFunc.nsh"
|
|
||||||
!include "Win\COM.nsh"
|
|
||||||
!include "Win\Propkey.nsh"
|
|
||||||
${StrCase}
|
|
||||||
${StrLoc}
|
|
||||||
|
|
||||||
!define MANUFACTURER "{{manufacturer}}"
|
|
||||||
!define PRODUCTNAME "{{product_name}}"
|
|
||||||
!define VERSION "{{version}}"
|
|
||||||
!define VERSIONWITHBUILD "{{version_with_build}}"
|
|
||||||
!define SHORTDESCRIPTION "{{short_description}}"
|
|
||||||
!define INSTALLMODE "{{install_mode}}"
|
|
||||||
!define LICENSE "{{license}}"
|
|
||||||
!define INSTALLERICON "{{installer_icon}}"
|
|
||||||
!define SIDEBARIMAGE "{{sidebar_image}}"
|
|
||||||
!define HEADERIMAGE "{{header_image}}"
|
|
||||||
!define MAINBINARYNAME "{{main_binary_name}}"
|
|
||||||
!define MAINBINARYSRCPATH "{{main_binary_path}}"
|
|
||||||
!define BUNDLEID "{{bundle_id}}"
|
|
||||||
!define COPYRIGHT "{{copyright}}"
|
|
||||||
!define OUTFILE "{{out_file}}"
|
|
||||||
!define ARCH "{{arch}}"
|
|
||||||
!define PLUGINSPATH "{{additional_plugins_path}}"
|
|
||||||
!define ALLOWDOWNGRADES "{{allow_downgrades}}"
|
|
||||||
!define DISPLAYLANGUAGESELECTOR "{{display_language_selector}}"
|
|
||||||
!define INSTALLWEBVIEW2MODE "{{install_webview2_mode}}"
|
|
||||||
!define WEBVIEW2INSTALLERARGS "{{webview2_installer_args}}"
|
|
||||||
!define WEBVIEW2BOOTSTRAPPERPATH "{{webview2_bootstrapper_path}}"
|
|
||||||
!define WEBVIEW2INSTALLERPATH "{{webview2_installer_path}}"
|
|
||||||
!define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}"
|
|
||||||
!define MANUPRODUCTKEY "Software\${MANUFACTURER}\${PRODUCTNAME}"
|
|
||||||
!define UNINSTALLERSIGNCOMMAND "{{uninstaller_sign_cmd}}"
|
|
||||||
!define ESTIMATEDSIZE "{{estimated_size}}"
|
|
||||||
|
|
||||||
Name "${PRODUCTNAME}"
|
|
||||||
BrandingText "${COPYRIGHT}"
|
|
||||||
OutFile "${OUTFILE}"
|
|
||||||
|
|
||||||
; We don't actually use this value as default install path,
|
|
||||||
; it's just for nsis to append the product name folder in the directory selector
|
|
||||||
; https://nsis.sourceforge.io/Reference/InstallDir
|
|
||||||
!define PLACEHOLDER_INSTALL_DIR "placeholder\${PRODUCTNAME}"
|
|
||||||
InstallDir "${PLACEHOLDER_INSTALL_DIR}"
|
|
||||||
|
|
||||||
VIProductVersion "${VERSIONWITHBUILD}"
|
|
||||||
VIAddVersionKey "ProductName" "${PRODUCTNAME}"
|
|
||||||
VIAddVersionKey "FileDescription" "${SHORTDESCRIPTION}"
|
|
||||||
VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
|
|
||||||
VIAddVersionKey "FileVersion" "${VERSION}"
|
|
||||||
VIAddVersionKey "ProductVersion" "${VERSION}"
|
|
||||||
|
|
||||||
; Plugins path, currently exists for linux only
|
|
||||||
!if "${PLUGINSPATH}" != ""
|
|
||||||
!addplugindir "${PLUGINSPATH}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${UNINSTALLERSIGNCOMMAND}" != ""
|
|
||||||
!uninstfinalize '${UNINSTALLERSIGNCOMMAND}'
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; Handle install mode, `perUser`, `perMachine` or `both`
|
|
||||||
!if "${INSTALLMODE}" == "perMachine"
|
|
||||||
RequestExecutionLevel highest
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "currentUser"
|
|
||||||
RequestExecutionLevel user
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
!define MULTIUSER_MUI
|
|
||||||
!define MULTIUSER_INSTALLMODE_INSTDIR "${PRODUCTNAME}"
|
|
||||||
!define MULTIUSER_INSTALLMODE_COMMANDLINE
|
|
||||||
!if "${ARCH}" == "x64"
|
|
||||||
!define MULTIUSER_USE_PROGRAMFILES64
|
|
||||||
!else if "${ARCH}" == "arm64"
|
|
||||||
!define MULTIUSER_USE_PROGRAMFILES64
|
|
||||||
!endif
|
|
||||||
!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "${UNINSTKEY}"
|
|
||||||
!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "CurrentUser"
|
|
||||||
!define MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME
|
|
||||||
!define MULTIUSER_INSTALLMODE_FUNCTION RestorePreviousInstallLocation
|
|
||||||
!define MULTIUSER_EXECUTIONLEVEL Highest
|
|
||||||
!include MultiUser.nsh
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; installer icon
|
|
||||||
!if "${INSTALLERICON}" != ""
|
|
||||||
!define MUI_ICON "${INSTALLERICON}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; installer sidebar image
|
|
||||||
!if "${SIDEBARIMAGE}" != ""
|
|
||||||
!define MUI_WELCOMEFINISHPAGE_BITMAP "${SIDEBARIMAGE}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; installer header image
|
|
||||||
!if "${HEADERIMAGE}" != ""
|
|
||||||
!define MUI_HEADERIMAGE
|
|
||||||
!define MUI_HEADERIMAGE_BITMAP "${HEADERIMAGE}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; Define registry key to store installer language
|
|
||||||
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
|
|
||||||
!define MUI_LANGDLL_REGISTRY_KEY "${MANUPRODUCTKEY}"
|
|
||||||
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
|
|
||||||
|
|
||||||
; Installer pages, must be ordered as they appear
|
|
||||||
; 1. Welcome Page
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
|
||||||
|
|
||||||
; 2. License Page (if defined)
|
|
||||||
!if "${LICENSE}" != ""
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MUI_PAGE_LICENSE "${LICENSE}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; 3. Install mode (if it is set to `both`)
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MULTIUSER_PAGE_INSTALLMODE
|
|
||||||
!endif
|
|
||||||
|
|
||||||
|
|
||||||
; 4. Custom page to ask user if he wants to reinstall/uninstall
|
|
||||||
; only if a previous installation was detected
|
|
||||||
Var ReinstallPageCheck
|
|
||||||
Page custom PageReinstall PageLeaveReinstall
|
|
||||||
Function PageReinstall
|
|
||||||
; Uninstall previous WiX installation if exists.
|
|
||||||
;
|
|
||||||
; A WiX installer stores the installation info in registry
|
|
||||||
; using a UUID and so we have to loop through all keys under
|
|
||||||
; `HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall`
|
|
||||||
; and check if `DisplayName` and `Publisher` keys match ${PRODUCTNAME} and ${MANUFACTURER}
|
|
||||||
;
|
|
||||||
; This has a potential issue that there maybe another installation that matches
|
|
||||||
; our ${PRODUCTNAME} and ${MANUFACTURER} but wasn't installed by our WiX installer,
|
|
||||||
; however, this should be fine since the user will have to confirm the uninstallation
|
|
||||||
; and they can chose to abort it if doesn't make sense.
|
|
||||||
StrCpy $0 0
|
|
||||||
wix_loop:
|
|
||||||
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0
|
|
||||||
StrCmp $1 "" wix_done ; Exit loop if there is no more keys to loop on
|
|
||||||
IntOp $0 $0 + 1
|
|
||||||
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "DisplayName"
|
|
||||||
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "Publisher"
|
|
||||||
StrCmp "$R0$R1" "${PRODUCTNAME}${MANUFACTURER}" 0 wix_loop
|
|
||||||
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "UninstallString"
|
|
||||||
${StrCase} $R1 $R0 "L"
|
|
||||||
${StrLoc} $R0 $R1 "msiexec" ">"
|
|
||||||
StrCmp $R0 0 0 wix_done
|
|
||||||
StrCpy $R7 "wix"
|
|
||||||
StrCpy $R6 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1"
|
|
||||||
Goto compare_version
|
|
||||||
wix_done:
|
|
||||||
|
|
||||||
; Check if there is an existing installation, if not, abort the reinstall page
|
|
||||||
ReadRegStr $R0 SHCTX "${UNINSTKEY}" ""
|
|
||||||
ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
|
|
||||||
${IfThen} "$R0$R1" == "" ${|} Abort ${|}
|
|
||||||
|
|
||||||
; Compare this installar version with the existing installation
|
|
||||||
; and modify the messages presented to the user accordingly
|
|
||||||
compare_version:
|
|
||||||
StrCpy $R4 "$(older)"
|
|
||||||
${If} $R7 == "wix"
|
|
||||||
ReadRegStr $R0 HKLM "$R6" "DisplayVersion"
|
|
||||||
${Else}
|
|
||||||
ReadRegStr $R0 SHCTX "${UNINSTKEY}" "DisplayVersion"
|
|
||||||
${EndIf}
|
|
||||||
${IfThen} $R0 == "" ${|} StrCpy $R4 "$(unknown)" ${|}
|
|
||||||
|
|
||||||
nsis_tauri_utils::SemverCompare "${VERSION}" $R0
|
|
||||||
Pop $R0
|
|
||||||
; Reinstalling the same version
|
|
||||||
${If} $R0 == 0
|
|
||||||
StrCpy $R1 "$(alreadyInstalledLong)"
|
|
||||||
StrCpy $R2 "$(addOrReinstall)"
|
|
||||||
StrCpy $R3 "$(uninstallApp)"
|
|
||||||
!insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(chooseMaintenanceOption)"
|
|
||||||
StrCpy $R5 "2"
|
|
||||||
; Upgrading
|
|
||||||
${ElseIf} $R0 == 1
|
|
||||||
StrCpy $R1 "$(olderOrUnknownVersionInstalled)"
|
|
||||||
StrCpy $R2 "$(uninstallBeforeInstalling)"
|
|
||||||
StrCpy $R3 "$(dontUninstall)"
|
|
||||||
!insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(choowHowToInstall)"
|
|
||||||
StrCpy $R5 "1"
|
|
||||||
; Downgrading
|
|
||||||
${ElseIf} $R0 == -1
|
|
||||||
StrCpy $R1 "$(newerVersionInstalled)"
|
|
||||||
StrCpy $R2 "$(uninstallBeforeInstalling)"
|
|
||||||
!if "${ALLOWDOWNGRADES}" == "true"
|
|
||||||
StrCpy $R3 "$(dontUninstall)"
|
|
||||||
!else
|
|
||||||
StrCpy $R3 "$(dontUninstallDowngrade)"
|
|
||||||
!endif
|
|
||||||
!insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(choowHowToInstall)"
|
|
||||||
StrCpy $R5 "1"
|
|
||||||
${Else}
|
|
||||||
Abort
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
Call SkipIfPassive
|
|
||||||
|
|
||||||
nsDialogs::Create 1018
|
|
||||||
Pop $R4
|
|
||||||
${IfThen} $(^RTL) == 1 ${|} nsDialogs::SetRTL $(^RTL) ${|}
|
|
||||||
|
|
||||||
${NSD_CreateLabel} 0 0 100% 24u $R1
|
|
||||||
Pop $R1
|
|
||||||
|
|
||||||
${NSD_CreateRadioButton} 30u 50u -30u 8u $R2
|
|
||||||
Pop $R2
|
|
||||||
${NSD_OnClick} $R2 PageReinstallUpdateSelection
|
|
||||||
|
|
||||||
${NSD_CreateRadioButton} 30u 70u -30u 8u $R3
|
|
||||||
Pop $R3
|
|
||||||
; disable this radio button if downgrading and downgrades are disabled
|
|
||||||
!if "${ALLOWDOWNGRADES}" == "false"
|
|
||||||
${IfThen} $R0 == -1 ${|} EnableWindow $R3 0 ${|}
|
|
||||||
!endif
|
|
||||||
${NSD_OnClick} $R3 PageReinstallUpdateSelection
|
|
||||||
|
|
||||||
; Check the first radio button if this the first time
|
|
||||||
; we enter this page or if the second button wasn't
|
|
||||||
; selected the last time we were on this page
|
|
||||||
${If} $ReinstallPageCheck != 2
|
|
||||||
SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0
|
|
||||||
${Else}
|
|
||||||
SendMessage $R3 ${BM_SETCHECK} ${BST_CHECKED} 0
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
${NSD_SetFocus} $R2
|
|
||||||
nsDialogs::Show
|
|
||||||
FunctionEnd
|
|
||||||
Function PageReinstallUpdateSelection
|
|
||||||
${NSD_GetState} $R2 $R1
|
|
||||||
${If} $R1 == ${BST_CHECKED}
|
|
||||||
StrCpy $ReinstallPageCheck 1
|
|
||||||
${Else}
|
|
||||||
StrCpy $ReinstallPageCheck 2
|
|
||||||
${EndIf}
|
|
||||||
FunctionEnd
|
|
||||||
Function PageLeaveReinstall
|
|
||||||
${NSD_GetState} $R2 $R1
|
|
||||||
|
|
||||||
; $R5 holds whether we are reinstalling the same version or not
|
|
||||||
; $R5 == "1" -> different versions
|
|
||||||
; $R5 == "2" -> same version
|
|
||||||
;
|
|
||||||
; $R1 holds the radio buttons state. its meaning is dependent on the context
|
|
||||||
StrCmp $R5 "1" 0 +2 ; Existing install is not the same version?
|
|
||||||
StrCmp $R1 "1" reinst_uninstall reinst_done ; $R1 == "1", then user chose to uninstall existing version, otherwise skip uninstalling
|
|
||||||
StrCmp $R1 "1" reinst_done ; Same version? skip uninstalling
|
|
||||||
|
|
||||||
reinst_uninstall:
|
|
||||||
HideWindow
|
|
||||||
ClearErrors
|
|
||||||
|
|
||||||
${If} $R7 == "wix"
|
|
||||||
ReadRegStr $R1 HKLM "$R6" "UninstallString"
|
|
||||||
ExecWait '$R1' $0
|
|
||||||
${Else}
|
|
||||||
ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
|
|
||||||
ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
|
|
||||||
ExecWait '$R1 /P _?=$4' $0
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
BringToFront
|
|
||||||
|
|
||||||
${IfThen} ${Errors} ${|} StrCpy $0 2 ${|} ; ExecWait failed, set fake exit code
|
|
||||||
|
|
||||||
${If} $0 <> 0
|
|
||||||
${OrIf} ${FileExists} "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
${If} $0 = 1 ; User aborted uninstaller?
|
|
||||||
StrCmp $R5 "2" 0 +2 ; Is the existing install the same version?
|
|
||||||
Quit ; ...yes, already installed, we are done
|
|
||||||
Abort
|
|
||||||
${EndIf}
|
|
||||||
MessageBox MB_ICONEXCLAMATION "$(unableToUninstall)"
|
|
||||||
Abort
|
|
||||||
${Else}
|
|
||||||
StrCpy $0 $R1 1
|
|
||||||
${IfThen} $0 == '"' ${|} StrCpy $R1 $R1 -1 1 ${|} ; Strip quotes from UninstallString
|
|
||||||
Delete $R1
|
|
||||||
RMDir $INSTDIR
|
|
||||||
${EndIf}
|
|
||||||
reinst_done:
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
; 5. Choose install directory page
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MUI_PAGE_DIRECTORY
|
|
||||||
|
|
||||||
; 6. Start menu shortcut page
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
Var AppStartMenuFolder
|
|
||||||
!insertmacro MUI_PAGE_STARTMENU Application $AppStartMenuFolder
|
|
||||||
|
|
||||||
; 7. Installation page
|
|
||||||
!insertmacro MUI_PAGE_INSTFILES
|
|
||||||
|
|
||||||
; 8. Finish page
|
|
||||||
;
|
|
||||||
; Don't auto jump to finish page after installation page,
|
|
||||||
; because the installation page has useful info that can be used debug any issues with the installer.
|
|
||||||
!define MUI_FINISHPAGE_NOAUTOCLOSE
|
|
||||||
; Use show readme button in the finish page as a button create a desktop shortcut
|
|
||||||
!define MUI_FINISHPAGE_SHOWREADME
|
|
||||||
!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(createDesktop)"
|
|
||||||
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateDesktopShortcut
|
|
||||||
; Show run app after installation.
|
|
||||||
!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MUI_PAGE_FINISH
|
|
||||||
|
|
||||||
; Uninstaller Pages
|
|
||||||
; 1. Confirm uninstall page
|
|
||||||
Var DeleteAppDataCheckbox
|
|
||||||
Var DeleteAppDataCheckboxState
|
|
||||||
!define /ifndef WS_EX_LAYOUTRTL 0x00400000
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ConfirmShow
|
|
||||||
Function un.ConfirmShow
|
|
||||||
FindWindow $1 "#32770" "" $HWNDPARENT ; Find inner dialog
|
|
||||||
${If} $(^RTL) == 1
|
|
||||||
System::Call 'USER32::CreateWindowEx(i${__NSD_CheckBox_EXSTYLE}|${WS_EX_LAYOUTRTL},t"${__NSD_CheckBox_CLASS}",t "$(deleteAppData)",i${__NSD_CheckBox_STYLE},i 50,i 100,i 400, i 25,i$1,i0,i0,i0)i.s'
|
|
||||||
${Else}
|
|
||||||
System::Call 'USER32::CreateWindowEx(i${__NSD_CheckBox_EXSTYLE},t"${__NSD_CheckBox_CLASS}",t "$(deleteAppData)",i${__NSD_CheckBox_STYLE},i 0,i 100,i 400, i 25,i$1,i0,i0,i0)i.s'
|
|
||||||
${EndIf}
|
|
||||||
Pop $DeleteAppDataCheckbox
|
|
||||||
SendMessage $HWNDPARENT ${WM_GETFONT} 0 0 $1
|
|
||||||
SendMessage $DeleteAppDataCheckbox ${WM_SETFONT} $1 1
|
|
||||||
FunctionEnd
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.ConfirmLeave
|
|
||||||
Function un.ConfirmLeave
|
|
||||||
SendMessage $DeleteAppDataCheckbox ${BM_GETCHECK} 0 0 $DeleteAppDataCheckboxState
|
|
||||||
FunctionEnd
|
|
||||||
!insertmacro MUI_UNPAGE_CONFIRM
|
|
||||||
|
|
||||||
; 2. Uninstalling Page
|
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES
|
|
||||||
|
|
||||||
;Languages
|
|
||||||
{{#each languages}}
|
|
||||||
!insertmacro MUI_LANGUAGE "{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
!insertmacro MUI_RESERVEFILE_LANGDLL
|
|
||||||
{{#each language_files}}
|
|
||||||
!include "{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
!macro SetContext
|
|
||||||
!if "${INSTALLMODE}" == "currentUser"
|
|
||||||
SetShellVarContext current
|
|
||||||
!else if "${INSTALLMODE}" == "perMachine"
|
|
||||||
SetShellVarContext all
|
|
||||||
!endif
|
|
||||||
|
|
||||||
${If} ${RunningX64}
|
|
||||||
!if "${ARCH}" == "x64"
|
|
||||||
SetRegView 64
|
|
||||||
!else if "${ARCH}" == "arm64"
|
|
||||||
SetRegView 64
|
|
||||||
!else
|
|
||||||
SetRegView 32
|
|
||||||
!endif
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Var PassiveMode
|
|
||||||
Function .onInit
|
|
||||||
${GetOptions} $CMDLINE "/P" $PassiveMode
|
|
||||||
IfErrors +2 0
|
|
||||||
StrCpy $PassiveMode 1
|
|
||||||
|
|
||||||
!if "${DISPLAYLANGUAGESELECTOR}" == "true"
|
|
||||||
!insertmacro MUI_LANGDLL_DISPLAY
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!insertmacro SetContext
|
|
||||||
|
|
||||||
${If} $INSTDIR == "${PLACEHOLDER_INSTALL_DIR}"
|
|
||||||
; Set default install location
|
|
||||||
!if "${INSTALLMODE}" == "perMachine"
|
|
||||||
${If} ${RunningX64}
|
|
||||||
!if "${ARCH}" == "x64"
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCTNAME}"
|
|
||||||
!else if "${ARCH}" == "arm64"
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCTNAME}"
|
|
||||||
!else
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCTNAME}"
|
|
||||||
!endif
|
|
||||||
${Else}
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCTNAME}"
|
|
||||||
${EndIf}
|
|
||||||
!else if "${INSTALLMODE}" == "currentUser"
|
|
||||||
StrCpy $INSTDIR "$LOCALAPPDATA\${PRODUCTNAME}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
Call RestorePreviousInstallLocation
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
!insertmacro MULTIUSER_INIT
|
|
||||||
!endif
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
|
|
||||||
Section EarlyChecks
|
|
||||||
; Abort silent installer if downgrades is disabled
|
|
||||||
!if "${ALLOWDOWNGRADES}" == "false"
|
|
||||||
IfSilent 0 silent_downgrades_done
|
|
||||||
; If downgrading
|
|
||||||
${If} $R0 == -1
|
|
||||||
System::Call 'kernel32::AttachConsole(i -1)i.r0'
|
|
||||||
${If} $0 != 0
|
|
||||||
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
|
|
||||||
System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
|
|
||||||
FileWrite $0 "$(silentDowngrades)"
|
|
||||||
${EndIf}
|
|
||||||
Abort
|
|
||||||
${EndIf}
|
|
||||||
silent_downgrades_done:
|
|
||||||
!endif
|
|
||||||
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Section WebView2
|
|
||||||
; Check if Webview2 is already installed and skip this section
|
|
||||||
${If} ${RunningX64}
|
|
||||||
ReadRegStr $4 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
${Else}
|
|
||||||
ReadRegStr $4 HKLM "SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
${EndIf}
|
|
||||||
ReadRegStr $5 HKCU "SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
|
|
||||||
StrCmp $4 "" 0 webview2_done
|
|
||||||
StrCmp $5 "" 0 webview2_done
|
|
||||||
|
|
||||||
; Webview2 install modes
|
|
||||||
!if "${INSTALLWEBVIEW2MODE}" == "downloadBootstrapper"
|
|
||||||
Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
DetailPrint "$(webview2Downloading)"
|
|
||||||
nsis_tauri_utils::download "https://go.microsoft.com/fwlink/p/?LinkId=2124703" "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
Pop $0
|
|
||||||
${If} $0 == 0
|
|
||||||
DetailPrint "$(webview2DownloadSuccess)"
|
|
||||||
${Else}
|
|
||||||
DetailPrint "$(webview2DownloadError)"
|
|
||||||
Abort "$(webview2AbortError)"
|
|
||||||
${EndIf}
|
|
||||||
StrCpy $6 "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
Goto install_webview2
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${INSTALLWEBVIEW2MODE}" == "embedBootstrapper"
|
|
||||||
Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
File "/oname=$TEMP\MicrosoftEdgeWebview2Setup.exe" "${WEBVIEW2BOOTSTRAPPERPATH}"
|
|
||||||
DetailPrint "$(installingWebview2)"
|
|
||||||
StrCpy $6 "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
Goto install_webview2
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${INSTALLWEBVIEW2MODE}" == "offlineInstaller"
|
|
||||||
Delete "$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe"
|
|
||||||
File "/oname=$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe" "${WEBVIEW2INSTALLERPATH}"
|
|
||||||
DetailPrint "$(installingWebview2)"
|
|
||||||
StrCpy $6 "$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe"
|
|
||||||
Goto install_webview2
|
|
||||||
!endif
|
|
||||||
|
|
||||||
Goto webview2_done
|
|
||||||
|
|
||||||
install_webview2:
|
|
||||||
DetailPrint "$(installingWebview2)"
|
|
||||||
; $6 holds the path to the webview2 installer
|
|
||||||
ExecWait "$6 ${WEBVIEW2INSTALLERARGS} /install" $1
|
|
||||||
${If} $1 == 0
|
|
||||||
DetailPrint "$(webview2InstallSuccess)"
|
|
||||||
${Else}
|
|
||||||
DetailPrint "$(webview2InstallError)"
|
|
||||||
Abort "$(webview2AbortError)"
|
|
||||||
${EndIf}
|
|
||||||
webview2_done:
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
!macro CheckIfAppIsRunning
|
|
||||||
!if "${INSTALLMODE}" == "currentUser"
|
|
||||||
nsis_tauri_utils::FindProcessCurrentUser "${MAINBINARYNAME}.exe"
|
|
||||||
!else
|
|
||||||
nsis_tauri_utils::FindProcess "${MAINBINARYNAME}.exe"
|
|
||||||
!endif
|
|
||||||
Pop $R0
|
|
||||||
${If} $R0 = 0
|
|
||||||
IfSilent kill 0
|
|
||||||
${IfThen} $PassiveMode != 1 ${|} MessageBox MB_OKCANCEL "$(appRunningOkKill)" IDOK kill IDCANCEL cancel ${|}
|
|
||||||
kill:
|
|
||||||
!if "${INSTALLMODE}" == "currentUser"
|
|
||||||
nsis_tauri_utils::KillProcessCurrentUser "${MAINBINARYNAME}.exe"
|
|
||||||
!else
|
|
||||||
nsis_tauri_utils::KillProcess "${MAINBINARYNAME}.exe"
|
|
||||||
!endif
|
|
||||||
Pop $R0
|
|
||||||
Sleep 500
|
|
||||||
${If} $R0 = 0
|
|
||||||
Goto app_check_done
|
|
||||||
${Else}
|
|
||||||
IfSilent silent ui
|
|
||||||
silent:
|
|
||||||
System::Call 'kernel32::AttachConsole(i -1)i.r0'
|
|
||||||
${If} $0 != 0
|
|
||||||
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
|
|
||||||
System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
|
|
||||||
FileWrite $0 "$(appRunning)$\n"
|
|
||||||
${EndIf}
|
|
||||||
Abort
|
|
||||||
ui:
|
|
||||||
Abort "$(failedToKillApp)"
|
|
||||||
${EndIf}
|
|
||||||
cancel:
|
|
||||||
Abort "$(appRunning)"
|
|
||||||
${EndIf}
|
|
||||||
app_check_done:
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Section Install
|
|
||||||
SetOutPath $INSTDIR
|
|
||||||
|
|
||||||
!insertmacro CheckIfAppIsRunning
|
|
||||||
|
|
||||||
; Copy main executable
|
|
||||||
File "${MAINBINARYSRCPATH}"
|
|
||||||
|
|
||||||
; Copy resources
|
|
||||||
{{#each resources_dirs}}
|
|
||||||
CreateDirectory "$INSTDIR\\{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
{{#each resources}}
|
|
||||||
File /a "/oname={{this.[1]}}" "{{@key}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Copy external binaries
|
|
||||||
{{#each binaries}}
|
|
||||||
File /a "/oname={{this}}" "{{@key}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Create file associations
|
|
||||||
{{#each file_associations as |association| ~}}
|
|
||||||
{{#each association.ext as |ext| ~}}
|
|
||||||
!insertmacro APP_ASSOCIATE "{{ext}}" "{{or association.name ext}}" "{{association-description association.description ext}}" "$INSTDIR\${MAINBINARYNAME}.exe,0" "Open with ${PRODUCTNAME}" "$INSTDIR\${MAINBINARYNAME}.exe $\"%1$\""
|
|
||||||
{{/each}}
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Register deep links
|
|
||||||
{{#each deep_link_protocol as |protocol| ~}}
|
|
||||||
WriteRegStr SHCTX "Software\Classes\{{protocol}}" "URL Protocol" ""
|
|
||||||
WriteRegStr SHCTX "Software\Classes\{{protocol}}" "" "URL:${BUNDLEID} protocol"
|
|
||||||
WriteRegStr SHCTX "Software\Classes\{{protocol}}\DefaultIcon" "" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\",0"
|
|
||||||
WriteRegStr SHCTX "Software\Classes\{{protocol}}\shell\open\command" "" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\" $\"%1$\""
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Create uninstaller
|
|
||||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
|
||||||
|
|
||||||
; Save $INSTDIR in registry for future installations
|
|
||||||
WriteRegStr SHCTX "${MANUPRODUCTKEY}" "" $INSTDIR
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
; Save install mode to be selected by default for the next installation such as updating
|
|
||||||
; or when uninstalling
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" $MultiUser.InstallMode 1
|
|
||||||
!endif
|
|
||||||
|
|
||||||
ExecWait '"$INSTDIR\portmaster-start.exe" install core-service --data="$INSTDIR\data"'
|
|
||||||
|
|
||||||
; Registry information for add/remove programs
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "DisplayName" "${PRODUCTNAME}"
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "DisplayIcon" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\""
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "DisplayVersion" "${VERSION}"
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "Publisher" "${MANUFACTURER}"
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "InstallLocation" "$\"$INSTDIR$\""
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
|
|
||||||
WriteRegDWORD SHCTX "${UNINSTKEY}" "NoModify" "1"
|
|
||||||
WriteRegDWORD SHCTX "${UNINSTKEY}" "NoRepair" "1"
|
|
||||||
WriteRegDWORD SHCTX "${UNINSTKEY}" "EstimatedSize" "${ESTIMATEDSIZE}"
|
|
||||||
|
|
||||||
; Create start menu shortcut (GUI)
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
|
||||||
Call CreateStartMenuShortcut
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_END
|
|
||||||
|
|
||||||
; Create shortcuts for silent and passive installers, which
|
|
||||||
; can be disabled by passing `/NS` flag
|
|
||||||
; GUI installer has buttons for users to control creating them
|
|
||||||
IfSilent check_ns_flag 0
|
|
||||||
${IfThen} $PassiveMode == 1 ${|} Goto check_ns_flag ${|}
|
|
||||||
Goto shortcuts_done
|
|
||||||
check_ns_flag:
|
|
||||||
${GetOptions} $CMDLINE "/NS" $R0
|
|
||||||
IfErrors 0 shortcuts_done
|
|
||||||
Call CreateDesktopShortcut
|
|
||||||
Call CreateStartMenuShortcut
|
|
||||||
shortcuts_done:
|
|
||||||
|
|
||||||
; Auto close this page for passive mode
|
|
||||||
${IfThen} $PassiveMode == 1 ${|} SetAutoClose true ${|}
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Function .onInstSuccess
|
|
||||||
; Check for `/R` flag only in silent and passive installers because
|
|
||||||
; GUI installer has a toggle for the user to (re)start the app
|
|
||||||
IfSilent check_r_flag 0
|
|
||||||
${IfThen} $PassiveMode == 1 ${|} Goto check_r_flag ${|}
|
|
||||||
Goto run_done
|
|
||||||
check_r_flag:
|
|
||||||
${GetOptions} $CMDLINE "/R" $R0
|
|
||||||
IfErrors run_done 0
|
|
||||||
${GetOptions} $CMDLINE "/ARGS" $R0
|
|
||||||
Exec '"$INSTDIR\${MAINBINARYNAME}.exe" $R0'
|
|
||||||
run_done:
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Function un.onInit
|
|
||||||
!insertmacro SetContext
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
!insertmacro MULTIUSER_UNINIT
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!insertmacro MUI_UNGETLANGUAGE
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
!macro DeleteAppUserModelId
|
|
||||||
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_DestinationList} ${IID_ICustomDestinationList} r1 ""
|
|
||||||
${If} $1 P<> 0
|
|
||||||
${ICustomDestinationList::DeleteList} $1 '("${BUNDLEID}")'
|
|
||||||
${IUnknown::Release} $1 ""
|
|
||||||
${EndIf}
|
|
||||||
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationDestinations} ${IID_IApplicationDestinations} r1 ""
|
|
||||||
${If} $1 P<> 0
|
|
||||||
${IApplicationDestinations::SetAppID} $1 '("${BUNDLEID}")i.r0'
|
|
||||||
${If} $0 >= 0
|
|
||||||
${IApplicationDestinations::RemoveAllDestinations} $1 ''
|
|
||||||
${EndIf}
|
|
||||||
${IUnknown::Release} $1 ""
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
; From https://stackoverflow.com/a/42816728/16993372
|
|
||||||
!macro UnpinShortcut shortcut
|
|
||||||
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} ${IID_IStartMenuPinnedList} r0 ""
|
|
||||||
${If} $0 P<> 0
|
|
||||||
System::Call 'SHELL32::SHCreateItemFromParsingName(ws, p0, g "${IID_IShellItem}", *p0r1)' "${shortcut}"
|
|
||||||
${If} $1 P<> 0
|
|
||||||
${IStartMenuPinnedList::RemoveFromList} $0 '(r1)'
|
|
||||||
${IUnknown::Release} $1 ""
|
|
||||||
${EndIf}
|
|
||||||
${IUnknown::Release} $0 ""
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Section Uninstall
|
|
||||||
!insertmacro CheckIfAppIsRunning
|
|
||||||
|
|
||||||
ExecWait 'sc.exe stop PortmasterCore'
|
|
||||||
ExecWait 'sc.exe delete PortmasterCore'
|
|
||||||
|
|
||||||
; Delete the app directory and its content from disk
|
|
||||||
; Copy main executable
|
|
||||||
Delete "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
|
|
||||||
; Delete resources
|
|
||||||
{{#each resources}}
|
|
||||||
Delete "$INSTDIR\\{{this.[1]}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Delete external binaries
|
|
||||||
{{#each binaries}}
|
|
||||||
Delete "$INSTDIR\\{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Delete app associations
|
|
||||||
{{#each file_associations as |association| ~}}
|
|
||||||
{{#each association.ext as |ext| ~}}
|
|
||||||
!insertmacro APP_UNASSOCIATE "{{ext}}" "{{or association.name ext}}"
|
|
||||||
{{/each}}
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Delete deep links
|
|
||||||
{{#each deep_link_protocol as |protocol| ~}}
|
|
||||||
ReadRegStr $R7 SHCTX "Software\Classes\{{protocol}}\shell\open\command" ""
|
|
||||||
!if $R7 == "$\"$INSTDIR\${MAINBINARYNAME}.exe$\" $\"%1$\""
|
|
||||||
DeleteRegKey SHCTX "Software\Classes\{{protocol}}"
|
|
||||||
!endif
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
|
|
||||||
; Delete uninstaller
|
|
||||||
Delete "$INSTDIR\uninstall.exe"
|
|
||||||
|
|
||||||
{{#each resources_ancestors}}
|
|
||||||
RMDir /REBOOTOK "$INSTDIR\\{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
RMDir "$INSTDIR"
|
|
||||||
|
|
||||||
!insertmacro DeleteAppUserModelId
|
|
||||||
!insertmacro UnpinShortcut "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
|
|
||||||
!insertmacro UnpinShortcut "$DESKTOP\${MAINBINARYNAME}.lnk"
|
|
||||||
|
|
||||||
; Remove start menu shortcut
|
|
||||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $AppStartMenuFolder
|
|
||||||
Delete "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
|
|
||||||
RMDir "$SMPROGRAMS\$AppStartMenuFolder"
|
|
||||||
|
|
||||||
; Remove desktop shortcuts
|
|
||||||
Delete "$DESKTOP\${MAINBINARYNAME}.lnk"
|
|
||||||
|
|
||||||
; Remove registry information for add/remove programs
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
DeleteRegKey SHCTX "${UNINSTKEY}"
|
|
||||||
!else if "${INSTALLMODE}" == "perMachine"
|
|
||||||
DeleteRegKey HKLM "${UNINSTKEY}"
|
|
||||||
!else
|
|
||||||
DeleteRegKey HKCU "${UNINSTKEY}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
DeleteRegValue HKCU "${MANUPRODUCTKEY}" "Installer Language"
|
|
||||||
|
|
||||||
; Delete app data
|
|
||||||
${If} $DeleteAppDataCheckboxState == 1
|
|
||||||
SetShellVarContext current
|
|
||||||
RmDir /r "$APPDATA\${BUNDLEID}"
|
|
||||||
RmDir /r "$LOCALAPPDATA\${BUNDLEID}"
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
${GetOptions} $CMDLINE "/P" $R0
|
|
||||||
IfErrors +2 0
|
|
||||||
SetAutoClose true
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Function RestorePreviousInstallLocation
|
|
||||||
ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
|
|
||||||
StrCmp $4 "" +2 0
|
|
||||||
StrCpy $INSTDIR $4
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Function SkipIfPassive
|
|
||||||
${IfThen} $PassiveMode == 1 ${|} Abort ${|}
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
!macro SetLnkAppUserModelId shortcut
|
|
||||||
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 ""
|
|
||||||
${If} $0 P<> 0
|
|
||||||
${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)'
|
|
||||||
${If} $1 P<> 0
|
|
||||||
${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READWRITE})'
|
|
||||||
${IUnknown::QueryInterface} $0 '("${IID_IPropertyStore}",.r2)'
|
|
||||||
${If} $2 P<> 0
|
|
||||||
System::Call 'Oleaut32::SysAllocString(w "${BUNDLEID}") i.r3'
|
|
||||||
System::Call '*${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_ID})p.r4'
|
|
||||||
System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_BSTR},,&i4 $3)p.r5'
|
|
||||||
${IPropertyStore::SetValue} $2 '($4,$5)'
|
|
||||||
|
|
||||||
System::Call 'Oleaut32::SysFreeString($3)'
|
|
||||||
System::Free $4
|
|
||||||
System::Free $5
|
|
||||||
${IPropertyStore::Commit} $2 ""
|
|
||||||
${IUnknown::Release} $2 ""
|
|
||||||
${IPersistFile::Save} $1 '("${shortcut}",1)'
|
|
||||||
${EndIf}
|
|
||||||
${IUnknown::Release} $1 ""
|
|
||||||
${EndIf}
|
|
||||||
${IUnknown::Release} $0 ""
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Function CreateDesktopShortcut
|
|
||||||
CreateShortcut "$DESKTOP\${MAINBINARYNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
!insertmacro SetLnkAppUserModelId "$DESKTOP\${MAINBINARYNAME}.lnk"
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Function CreateStartMenuShortcut
|
|
||||||
CreateDirectory "$SMPROGRAMS\$AppStartMenuFolder"
|
|
||||||
CreateShortcut "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
!insertmacro SetLnkAppUserModelId "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
|
|
||||||
FunctionEnd
|
|
|
@ -1,799 +0,0 @@
|
||||||
Unicode true
|
|
||||||
ManifestDPIAware true
|
|
||||||
; Set the compression algorithm. Default is LZMA.
|
|
||||||
!if "{{compression}}" == ""
|
|
||||||
SetCompressor /SOLID lzma
|
|
||||||
!else
|
|
||||||
SetCompressor /SOLID "{{compression}}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!include MUI2.nsh
|
|
||||||
!include FileFunc.nsh
|
|
||||||
!include x64.nsh
|
|
||||||
!include WordFunc.nsh
|
|
||||||
!include "FileAssociation.nsh"
|
|
||||||
!include "StrFunc.nsh"
|
|
||||||
!include "Win\COM.nsh"
|
|
||||||
!include "Win\Propkey.nsh"
|
|
||||||
${StrCase}
|
|
||||||
${StrLoc}
|
|
||||||
|
|
||||||
!define MANUFACTURER "{{manufacturer}}"
|
|
||||||
!define PRODUCTNAME "{{product_name}}"
|
|
||||||
!define VERSION "{{version}}"
|
|
||||||
!define VERSIONWITHBUILD "{{version_with_build}}"
|
|
||||||
!define SHORTDESCRIPTION "{{short_description}}"
|
|
||||||
!define INSTALLMODE "{{install_mode}}"
|
|
||||||
!define LICENSE "{{license}}"
|
|
||||||
!define INSTALLERICON "{{installer_icon}}"
|
|
||||||
!define SIDEBARIMAGE "{{sidebar_image}}"
|
|
||||||
!define HEADERIMAGE "{{header_image}}"
|
|
||||||
!define MAINBINARYNAME "{{main_binary_name}}"
|
|
||||||
!define MAINBINARYSRCPATH "{{main_binary_path}}"
|
|
||||||
!define BUNDLEID "{{bundle_id}}"
|
|
||||||
!define COPYRIGHT "{{copyright}}"
|
|
||||||
!define OUTFILE "{{out_file}}"
|
|
||||||
!define ARCH "{{arch}}"
|
|
||||||
!define PLUGINSPATH "{{additional_plugins_path}}"
|
|
||||||
!define ALLOWDOWNGRADES "{{allow_downgrades}}"
|
|
||||||
!define DISPLAYLANGUAGESELECTOR "{{display_language_selector}}"
|
|
||||||
!define INSTALLWEBVIEW2MODE "{{install_webview2_mode}}"
|
|
||||||
!define WEBVIEW2INSTALLERARGS "{{webview2_installer_args}}"
|
|
||||||
!define WEBVIEW2BOOTSTRAPPERPATH "{{webview2_bootstrapper_path}}"
|
|
||||||
!define WEBVIEW2INSTALLERPATH "{{webview2_installer_path}}"
|
|
||||||
!define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}"
|
|
||||||
!define MANUPRODUCTKEY "Software\${MANUFACTURER}\${PRODUCTNAME}"
|
|
||||||
!define UNINSTALLERSIGNCOMMAND "{{uninstaller_sign_cmd}}"
|
|
||||||
!define ESTIMATEDSIZE "{{estimated_size}}"
|
|
||||||
|
|
||||||
Name "${PRODUCTNAME}"
|
|
||||||
BrandingText "${COPYRIGHT}"
|
|
||||||
OutFile "${OUTFILE}"
|
|
||||||
|
|
||||||
; We don't actually use this value as default install path,
|
|
||||||
; it's just for nsis to append the product name folder in the directory selector
|
|
||||||
; https://nsis.sourceforge.io/Reference/InstallDir
|
|
||||||
!define PLACEHOLDER_INSTALL_DIR "placeholder\${PRODUCTNAME}"
|
|
||||||
InstallDir "${PLACEHOLDER_INSTALL_DIR}"
|
|
||||||
|
|
||||||
VIProductVersion "${VERSIONWITHBUILD}"
|
|
||||||
VIAddVersionKey "ProductName" "${PRODUCTNAME}"
|
|
||||||
VIAddVersionKey "FileDescription" "${SHORTDESCRIPTION}"
|
|
||||||
VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
|
|
||||||
VIAddVersionKey "FileVersion" "${VERSION}"
|
|
||||||
VIAddVersionKey "ProductVersion" "${VERSION}"
|
|
||||||
|
|
||||||
; Plugins path, currently exists for linux only
|
|
||||||
!if "${PLUGINSPATH}" != ""
|
|
||||||
!addplugindir "${PLUGINSPATH}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${UNINSTALLERSIGNCOMMAND}" != ""
|
|
||||||
!uninstfinalize '${UNINSTALLERSIGNCOMMAND}'
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; Handle install mode, `perUser`, `perMachine` or `both`
|
|
||||||
!if "${INSTALLMODE}" == "perMachine"
|
|
||||||
RequestExecutionLevel highest
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "currentUser"
|
|
||||||
RequestExecutionLevel user
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
!define MULTIUSER_MUI
|
|
||||||
!define MULTIUSER_INSTALLMODE_INSTDIR "${PRODUCTNAME}"
|
|
||||||
!define MULTIUSER_INSTALLMODE_COMMANDLINE
|
|
||||||
!if "${ARCH}" == "x64"
|
|
||||||
!define MULTIUSER_USE_PROGRAMFILES64
|
|
||||||
!else if "${ARCH}" == "arm64"
|
|
||||||
!define MULTIUSER_USE_PROGRAMFILES64
|
|
||||||
!endif
|
|
||||||
!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "${UNINSTKEY}"
|
|
||||||
!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "CurrentUser"
|
|
||||||
!define MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME
|
|
||||||
!define MULTIUSER_INSTALLMODE_FUNCTION RestorePreviousInstallLocation
|
|
||||||
!define MULTIUSER_EXECUTIONLEVEL Highest
|
|
||||||
!include MultiUser.nsh
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; installer icon
|
|
||||||
!if "${INSTALLERICON}" != ""
|
|
||||||
!define MUI_ICON "${INSTALLERICON}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; installer sidebar image
|
|
||||||
!if "${SIDEBARIMAGE}" != ""
|
|
||||||
!define MUI_WELCOMEFINISHPAGE_BITMAP "${SIDEBARIMAGE}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; installer header image
|
|
||||||
!if "${HEADERIMAGE}" != ""
|
|
||||||
!define MUI_HEADERIMAGE
|
|
||||||
!define MUI_HEADERIMAGE_BITMAP "${HEADERIMAGE}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; Define registry key to store installer language
|
|
||||||
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
|
|
||||||
!define MUI_LANGDLL_REGISTRY_KEY "${MANUPRODUCTKEY}"
|
|
||||||
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
|
|
||||||
|
|
||||||
; Installer pages, must be ordered as they appear
|
|
||||||
; 1. Welcome Page
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
|
||||||
|
|
||||||
; 2. License Page (if defined)
|
|
||||||
!if "${LICENSE}" != ""
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MUI_PAGE_LICENSE "${LICENSE}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; 3. Install mode (if it is set to `both`)
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MULTIUSER_PAGE_INSTALLMODE
|
|
||||||
!endif
|
|
||||||
|
|
||||||
|
|
||||||
; 4. Custom page to ask user if he wants to reinstall/uninstall
|
|
||||||
; only if a previous installation was detected
|
|
||||||
Var ReinstallPageCheck
|
|
||||||
Page custom PageReinstall PageLeaveReinstall
|
|
||||||
Function PageReinstall
|
|
||||||
; Uninstall previous WiX installation if exists.
|
|
||||||
;
|
|
||||||
; A WiX installer stores the installation info in registry
|
|
||||||
; using a UUID and so we have to loop through all keys under
|
|
||||||
; `HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall`
|
|
||||||
; and check if `DisplayName` and `Publisher` keys match ${PRODUCTNAME} and ${MANUFACTURER}
|
|
||||||
;
|
|
||||||
; This has a potential issue that there maybe another installation that matches
|
|
||||||
; our ${PRODUCTNAME} and ${MANUFACTURER} but wasn't installed by our WiX installer,
|
|
||||||
; however, this should be fine since the user will have to confirm the uninstallation
|
|
||||||
; and they can chose to abort it if doesn't make sense.
|
|
||||||
StrCpy $0 0
|
|
||||||
wix_loop:
|
|
||||||
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0
|
|
||||||
StrCmp $1 "" wix_done ; Exit loop if there is no more keys to loop on
|
|
||||||
IntOp $0 $0 + 1
|
|
||||||
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "DisplayName"
|
|
||||||
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "Publisher"
|
|
||||||
StrCmp "$R0$R1" "${PRODUCTNAME}${MANUFACTURER}" 0 wix_loop
|
|
||||||
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "UninstallString"
|
|
||||||
${StrCase} $R1 $R0 "L"
|
|
||||||
${StrLoc} $R0 $R1 "msiexec" ">"
|
|
||||||
StrCmp $R0 0 0 wix_done
|
|
||||||
StrCpy $R7 "wix"
|
|
||||||
StrCpy $R6 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1"
|
|
||||||
Goto compare_version
|
|
||||||
wix_done:
|
|
||||||
|
|
||||||
; Check if there is an existing installation, if not, abort the reinstall page
|
|
||||||
ReadRegStr $R0 SHCTX "${UNINSTKEY}" ""
|
|
||||||
ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
|
|
||||||
${IfThen} "$R0$R1" == "" ${|} Abort ${|}
|
|
||||||
|
|
||||||
; Compare this installar version with the existing installation
|
|
||||||
; and modify the messages presented to the user accordingly
|
|
||||||
compare_version:
|
|
||||||
StrCpy $R4 "$(older)"
|
|
||||||
${If} $R7 == "wix"
|
|
||||||
ReadRegStr $R0 HKLM "$R6" "DisplayVersion"
|
|
||||||
${Else}
|
|
||||||
ReadRegStr $R0 SHCTX "${UNINSTKEY}" "DisplayVersion"
|
|
||||||
${EndIf}
|
|
||||||
${IfThen} $R0 == "" ${|} StrCpy $R4 "$(unknown)" ${|}
|
|
||||||
|
|
||||||
nsis_tauri_utils::SemverCompare "${VERSION}" $R0
|
|
||||||
Pop $R0
|
|
||||||
; Reinstalling the same version
|
|
||||||
${If} $R0 == 0
|
|
||||||
StrCpy $R1 "$(alreadyInstalledLong)"
|
|
||||||
StrCpy $R2 "$(addOrReinstall)"
|
|
||||||
StrCpy $R3 "$(uninstallApp)"
|
|
||||||
!insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(chooseMaintenanceOption)"
|
|
||||||
StrCpy $R5 "2"
|
|
||||||
; Upgrading
|
|
||||||
${ElseIf} $R0 == 1
|
|
||||||
StrCpy $R1 "$(olderOrUnknownVersionInstalled)"
|
|
||||||
StrCpy $R2 "$(uninstallBeforeInstalling)"
|
|
||||||
StrCpy $R3 "$(dontUninstall)"
|
|
||||||
!insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(choowHowToInstall)"
|
|
||||||
StrCpy $R5 "1"
|
|
||||||
; Downgrading
|
|
||||||
${ElseIf} $R0 == -1
|
|
||||||
StrCpy $R1 "$(newerVersionInstalled)"
|
|
||||||
StrCpy $R2 "$(uninstallBeforeInstalling)"
|
|
||||||
!if "${ALLOWDOWNGRADES}" == "true"
|
|
||||||
StrCpy $R3 "$(dontUninstall)"
|
|
||||||
!else
|
|
||||||
StrCpy $R3 "$(dontUninstallDowngrade)"
|
|
||||||
!endif
|
|
||||||
!insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(choowHowToInstall)"
|
|
||||||
StrCpy $R5 "1"
|
|
||||||
${Else}
|
|
||||||
Abort
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
Call SkipIfPassive
|
|
||||||
|
|
||||||
nsDialogs::Create 1018
|
|
||||||
Pop $R4
|
|
||||||
${IfThen} $(^RTL) == 1 ${|} nsDialogs::SetRTL $(^RTL) ${|}
|
|
||||||
|
|
||||||
${NSD_CreateLabel} 0 0 100% 24u $R1
|
|
||||||
Pop $R1
|
|
||||||
|
|
||||||
${NSD_CreateRadioButton} 30u 50u -30u 8u $R2
|
|
||||||
Pop $R2
|
|
||||||
${NSD_OnClick} $R2 PageReinstallUpdateSelection
|
|
||||||
|
|
||||||
${NSD_CreateRadioButton} 30u 70u -30u 8u $R3
|
|
||||||
Pop $R3
|
|
||||||
; disable this radio button if downgrading and downgrades are disabled
|
|
||||||
!if "${ALLOWDOWNGRADES}" == "false"
|
|
||||||
${IfThen} $R0 == -1 ${|} EnableWindow $R3 0 ${|}
|
|
||||||
!endif
|
|
||||||
${NSD_OnClick} $R3 PageReinstallUpdateSelection
|
|
||||||
|
|
||||||
; Check the first radio button if this the first time
|
|
||||||
; we enter this page or if the second button wasn't
|
|
||||||
; selected the last time we were on this page
|
|
||||||
${If} $ReinstallPageCheck != 2
|
|
||||||
SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0
|
|
||||||
${Else}
|
|
||||||
SendMessage $R3 ${BM_SETCHECK} ${BST_CHECKED} 0
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
${NSD_SetFocus} $R2
|
|
||||||
nsDialogs::Show
|
|
||||||
FunctionEnd
|
|
||||||
Function PageReinstallUpdateSelection
|
|
||||||
${NSD_GetState} $R2 $R1
|
|
||||||
${If} $R1 == ${BST_CHECKED}
|
|
||||||
StrCpy $ReinstallPageCheck 1
|
|
||||||
${Else}
|
|
||||||
StrCpy $ReinstallPageCheck 2
|
|
||||||
${EndIf}
|
|
||||||
FunctionEnd
|
|
||||||
Function PageLeaveReinstall
|
|
||||||
${NSD_GetState} $R2 $R1
|
|
||||||
|
|
||||||
; $R5 holds whether we are reinstalling the same version or not
|
|
||||||
; $R5 == "1" -> different versions
|
|
||||||
; $R5 == "2" -> same version
|
|
||||||
;
|
|
||||||
; $R1 holds the radio buttons state. its meaning is dependent on the context
|
|
||||||
StrCmp $R5 "1" 0 +2 ; Existing install is not the same version?
|
|
||||||
StrCmp $R1 "1" reinst_uninstall reinst_done ; $R1 == "1", then user chose to uninstall existing version, otherwise skip uninstalling
|
|
||||||
StrCmp $R1 "1" reinst_done ; Same version? skip uninstalling
|
|
||||||
|
|
||||||
reinst_uninstall:
|
|
||||||
HideWindow
|
|
||||||
ClearErrors
|
|
||||||
|
|
||||||
${If} $R7 == "wix"
|
|
||||||
ReadRegStr $R1 HKLM "$R6" "UninstallString"
|
|
||||||
ExecWait '$R1' $0
|
|
||||||
${Else}
|
|
||||||
ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
|
|
||||||
ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
|
|
||||||
ExecWait '$R1 /P _?=$4' $0
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
BringToFront
|
|
||||||
|
|
||||||
${IfThen} ${Errors} ${|} StrCpy $0 2 ${|} ; ExecWait failed, set fake exit code
|
|
||||||
|
|
||||||
${If} $0 <> 0
|
|
||||||
${OrIf} ${FileExists} "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
${If} $0 = 1 ; User aborted uninstaller?
|
|
||||||
StrCmp $R5 "2" 0 +2 ; Is the existing install the same version?
|
|
||||||
Quit ; ...yes, already installed, we are done
|
|
||||||
Abort
|
|
||||||
${EndIf}
|
|
||||||
MessageBox MB_ICONEXCLAMATION "$(unableToUninstall)"
|
|
||||||
Abort
|
|
||||||
${Else}
|
|
||||||
StrCpy $0 $R1 1
|
|
||||||
${IfThen} $0 == '"' ${|} StrCpy $R1 $R1 -1 1 ${|} ; Strip quotes from UninstallString
|
|
||||||
Delete $R1
|
|
||||||
RMDir $INSTDIR
|
|
||||||
${EndIf}
|
|
||||||
reinst_done:
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
; 5. Choose install directory page
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MUI_PAGE_DIRECTORY
|
|
||||||
|
|
||||||
; 6. Start menu shortcut page
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
Var AppStartMenuFolder
|
|
||||||
!insertmacro MUI_PAGE_STARTMENU Application $AppStartMenuFolder
|
|
||||||
|
|
||||||
; 7. Installation page
|
|
||||||
!insertmacro MUI_PAGE_INSTFILES
|
|
||||||
|
|
||||||
; 8. Finish page
|
|
||||||
;
|
|
||||||
; Don't auto jump to finish page after installation page,
|
|
||||||
; because the installation page has useful info that can be used debug any issues with the installer.
|
|
||||||
!define MUI_FINISHPAGE_NOAUTOCLOSE
|
|
||||||
; Use show readme button in the finish page as a button create a desktop shortcut
|
|
||||||
!define MUI_FINISHPAGE_SHOWREADME
|
|
||||||
!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(createDesktop)"
|
|
||||||
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateDesktopShortcut
|
|
||||||
; Show run app after installation.
|
|
||||||
!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
|
|
||||||
!insertmacro MUI_PAGE_FINISH
|
|
||||||
|
|
||||||
; Uninstaller Pages
|
|
||||||
; 1. Confirm uninstall page
|
|
||||||
Var DeleteAppDataCheckbox
|
|
||||||
Var DeleteAppDataCheckboxState
|
|
||||||
!define /ifndef WS_EX_LAYOUTRTL 0x00400000
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ConfirmShow
|
|
||||||
Function un.ConfirmShow
|
|
||||||
FindWindow $1 "#32770" "" $HWNDPARENT ; Find inner dialog
|
|
||||||
${If} $(^RTL) == 1
|
|
||||||
System::Call 'USER32::CreateWindowEx(i${__NSD_CheckBox_EXSTYLE}|${WS_EX_LAYOUTRTL},t"${__NSD_CheckBox_CLASS}",t "$(deleteAppData)",i${__NSD_CheckBox_STYLE},i 50,i 100,i 400, i 25,i$1,i0,i0,i0)i.s'
|
|
||||||
${Else}
|
|
||||||
System::Call 'USER32::CreateWindowEx(i${__NSD_CheckBox_EXSTYLE},t"${__NSD_CheckBox_CLASS}",t "$(deleteAppData)",i${__NSD_CheckBox_STYLE},i 0,i 100,i 400, i 25,i$1,i0,i0,i0)i.s'
|
|
||||||
${EndIf}
|
|
||||||
Pop $DeleteAppDataCheckbox
|
|
||||||
SendMessage $HWNDPARENT ${WM_GETFONT} 0 0 $1
|
|
||||||
SendMessage $DeleteAppDataCheckbox ${WM_SETFONT} $1 1
|
|
||||||
FunctionEnd
|
|
||||||
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.ConfirmLeave
|
|
||||||
Function un.ConfirmLeave
|
|
||||||
SendMessage $DeleteAppDataCheckbox ${BM_GETCHECK} 0 0 $DeleteAppDataCheckboxState
|
|
||||||
FunctionEnd
|
|
||||||
!insertmacro MUI_UNPAGE_CONFIRM
|
|
||||||
|
|
||||||
; 2. Uninstalling Page
|
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES
|
|
||||||
|
|
||||||
;Languages
|
|
||||||
{{#each languages}}
|
|
||||||
!insertmacro MUI_LANGUAGE "{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
!insertmacro MUI_RESERVEFILE_LANGDLL
|
|
||||||
{{#each language_files}}
|
|
||||||
!include "{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
!macro SetContext
|
|
||||||
!if "${INSTALLMODE}" == "currentUser"
|
|
||||||
SetShellVarContext current
|
|
||||||
!else if "${INSTALLMODE}" == "perMachine"
|
|
||||||
SetShellVarContext all
|
|
||||||
!endif
|
|
||||||
|
|
||||||
${If} ${RunningX64}
|
|
||||||
!if "${ARCH}" == "x64"
|
|
||||||
SetRegView 64
|
|
||||||
!else if "${ARCH}" == "arm64"
|
|
||||||
SetRegView 64
|
|
||||||
!else
|
|
||||||
SetRegView 32
|
|
||||||
!endif
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Var PassiveMode
|
|
||||||
Function .onInit
|
|
||||||
${GetOptions} $CMDLINE "/P" $PassiveMode
|
|
||||||
IfErrors +2 0
|
|
||||||
StrCpy $PassiveMode 1
|
|
||||||
|
|
||||||
!if "${DISPLAYLANGUAGESELECTOR}" == "true"
|
|
||||||
!insertmacro MUI_LANGDLL_DISPLAY
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!insertmacro SetContext
|
|
||||||
|
|
||||||
${If} $INSTDIR == "${PLACEHOLDER_INSTALL_DIR}"
|
|
||||||
; Set default install location
|
|
||||||
!if "${INSTALLMODE}" == "perMachine"
|
|
||||||
${If} ${RunningX64}
|
|
||||||
!if "${ARCH}" == "x64"
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCTNAME}"
|
|
||||||
!else if "${ARCH}" == "arm64"
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCTNAME}"
|
|
||||||
!else
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCTNAME}"
|
|
||||||
!endif
|
|
||||||
${Else}
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCTNAME}"
|
|
||||||
${EndIf}
|
|
||||||
!else if "${INSTALLMODE}" == "currentUser"
|
|
||||||
StrCpy $INSTDIR "$LOCALAPPDATA\${PRODUCTNAME}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
Call RestorePreviousInstallLocation
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
!insertmacro MULTIUSER_INIT
|
|
||||||
!endif
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
|
|
||||||
Section EarlyChecks
|
|
||||||
; Abort silent installer if downgrades is disabled
|
|
||||||
!if "${ALLOWDOWNGRADES}" == "false"
|
|
||||||
IfSilent 0 silent_downgrades_done
|
|
||||||
; If downgrading
|
|
||||||
${If} $R0 == -1
|
|
||||||
System::Call 'kernel32::AttachConsole(i -1)i.r0'
|
|
||||||
${If} $0 != 0
|
|
||||||
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
|
|
||||||
System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
|
|
||||||
FileWrite $0 "$(silentDowngrades)"
|
|
||||||
${EndIf}
|
|
||||||
Abort
|
|
||||||
${EndIf}
|
|
||||||
silent_downgrades_done:
|
|
||||||
!endif
|
|
||||||
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Section WebView2
|
|
||||||
; Check if Webview2 is already installed and skip this section
|
|
||||||
${If} ${RunningX64}
|
|
||||||
ReadRegStr $4 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
${Else}
|
|
||||||
ReadRegStr $4 HKLM "SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
${EndIf}
|
|
||||||
ReadRegStr $5 HKCU "SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
|
|
||||||
StrCmp $4 "" 0 webview2_done
|
|
||||||
StrCmp $5 "" 0 webview2_done
|
|
||||||
|
|
||||||
; Webview2 install modes
|
|
||||||
!if "${INSTALLWEBVIEW2MODE}" == "downloadBootstrapper"
|
|
||||||
Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
DetailPrint "$(webview2Downloading)"
|
|
||||||
NSISdl::download "https://go.microsoft.com/fwlink/p/?LinkId=2124703" "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
Pop $0
|
|
||||||
${If} $0 == 0
|
|
||||||
DetailPrint "$(webview2DownloadSuccess)"
|
|
||||||
${Else}
|
|
||||||
DetailPrint "$(webview2DownloadError)"
|
|
||||||
Abort "$(webview2AbortError)"
|
|
||||||
${EndIf}
|
|
||||||
StrCpy $6 "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
Goto install_webview2
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${INSTALLWEBVIEW2MODE}" == "embedBootstrapper"
|
|
||||||
Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
File "/oname=$TEMP\MicrosoftEdgeWebview2Setup.exe" "${WEBVIEW2BOOTSTRAPPERPATH}"
|
|
||||||
DetailPrint "$(installingWebview2)"
|
|
||||||
StrCpy $6 "$TEMP\MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
Goto install_webview2
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "${INSTALLWEBVIEW2MODE}" == "offlineInstaller"
|
|
||||||
Delete "$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe"
|
|
||||||
File "/oname=$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe" "${WEBVIEW2INSTALLERPATH}"
|
|
||||||
DetailPrint "$(installingWebview2)"
|
|
||||||
StrCpy $6 "$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe"
|
|
||||||
Goto install_webview2
|
|
||||||
!endif
|
|
||||||
|
|
||||||
Goto webview2_done
|
|
||||||
|
|
||||||
install_webview2:
|
|
||||||
DetailPrint "$(installingWebview2)"
|
|
||||||
; $6 holds the path to the webview2 installer
|
|
||||||
ExecWait "$6 ${WEBVIEW2INSTALLERARGS} /install" $1
|
|
||||||
${If} $1 == 0
|
|
||||||
DetailPrint "$(webview2InstallSuccess)"
|
|
||||||
${Else}
|
|
||||||
DetailPrint "$(webview2InstallError)"
|
|
||||||
Abort "$(webview2AbortError)"
|
|
||||||
${EndIf}
|
|
||||||
webview2_done:
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
!macro CheckIfAppIsRunning
|
|
||||||
!if "${INSTALLMODE}" == "currentUser"
|
|
||||||
nsis_tauri_utils::FindProcessCurrentUser "${MAINBINARYNAME}.exe"
|
|
||||||
!else
|
|
||||||
nsis_tauri_utils::FindProcess "${MAINBINARYNAME}.exe"
|
|
||||||
!endif
|
|
||||||
Pop $R0
|
|
||||||
${If} $R0 = 0
|
|
||||||
IfSilent kill 0
|
|
||||||
${IfThen} $PassiveMode != 1 ${|} MessageBox MB_OKCANCEL "$(appRunningOkKill)" IDOK kill IDCANCEL cancel ${|}
|
|
||||||
kill:
|
|
||||||
!if "${INSTALLMODE}" == "currentUser"
|
|
||||||
nsis_tauri_utils::KillProcessCurrentUser "${MAINBINARYNAME}.exe"
|
|
||||||
!else
|
|
||||||
nsis_tauri_utils::KillProcess "${MAINBINARYNAME}.exe"
|
|
||||||
!endif
|
|
||||||
Pop $R0
|
|
||||||
Sleep 500
|
|
||||||
${If} $R0 = 0
|
|
||||||
Goto app_check_done
|
|
||||||
${Else}
|
|
||||||
IfSilent silent ui
|
|
||||||
silent:
|
|
||||||
System::Call 'kernel32::AttachConsole(i -1)i.r0'
|
|
||||||
${If} $0 != 0
|
|
||||||
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
|
|
||||||
System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
|
|
||||||
FileWrite $0 "$(appRunning)$\n"
|
|
||||||
${EndIf}
|
|
||||||
Abort
|
|
||||||
ui:
|
|
||||||
Abort "$(failedToKillApp)"
|
|
||||||
${EndIf}
|
|
||||||
cancel:
|
|
||||||
Abort "$(appRunning)"
|
|
||||||
${EndIf}
|
|
||||||
app_check_done:
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Section Install
|
|
||||||
SetOutPath $INSTDIR
|
|
||||||
|
|
||||||
!insertmacro CheckIfAppIsRunning
|
|
||||||
|
|
||||||
; Copy main executable
|
|
||||||
File "${MAINBINARYSRCPATH}"
|
|
||||||
|
|
||||||
; Copy resources
|
|
||||||
{{#each resources_dirs}}
|
|
||||||
CreateDirectory "$INSTDIR\\{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
{{#each resources}}
|
|
||||||
File /a "/oname={{this.[1]}}" "{{@key}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Copy external binaries
|
|
||||||
{{#each binaries}}
|
|
||||||
File /a "/oname={{this}}" "{{@key}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Create file associations
|
|
||||||
{{#each file_associations as |association| ~}}
|
|
||||||
{{#each association.ext as |ext| ~}}
|
|
||||||
!insertmacro APP_ASSOCIATE "{{ext}}" "{{or association.name ext}}" "{{association-description association.description ext}}" "$INSTDIR\${MAINBINARYNAME}.exe,0" "Open with ${PRODUCTNAME}" "$INSTDIR\${MAINBINARYNAME}.exe $\"%1$\""
|
|
||||||
{{/each}}
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Register deep links
|
|
||||||
{{#each deep_link_protocol as |protocol| ~}}
|
|
||||||
WriteRegStr SHCTX "Software\Classes\{{protocol}}" "URL Protocol" ""
|
|
||||||
WriteRegStr SHCTX "Software\Classes\{{protocol}}" "" "URL:${BUNDLEID} protocol"
|
|
||||||
WriteRegStr SHCTX "Software\Classes\{{protocol}}\DefaultIcon" "" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\",0"
|
|
||||||
WriteRegStr SHCTX "Software\Classes\{{protocol}}\shell\open\command" "" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\" $\"%1$\""
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Create uninstaller
|
|
||||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
|
||||||
|
|
||||||
; Save $INSTDIR in registry for future installations
|
|
||||||
WriteRegStr SHCTX "${MANUPRODUCTKEY}" "" $INSTDIR
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
; Save install mode to be selected by default for the next installation such as updating
|
|
||||||
; or when uninstalling
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" $MultiUser.InstallMode 1
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; Registry information for add/remove programs
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "DisplayName" "${PRODUCTNAME}"
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "DisplayIcon" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\""
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "DisplayVersion" "${VERSION}"
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "Publisher" "${MANUFACTURER}"
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "InstallLocation" "$\"$INSTDIR$\""
|
|
||||||
WriteRegStr SHCTX "${UNINSTKEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
|
|
||||||
WriteRegDWORD SHCTX "${UNINSTKEY}" "NoModify" "1"
|
|
||||||
WriteRegDWORD SHCTX "${UNINSTKEY}" "NoRepair" "1"
|
|
||||||
WriteRegDWORD SHCTX "${UNINSTKEY}" "EstimatedSize" "${ESTIMATEDSIZE}"
|
|
||||||
|
|
||||||
; Create start menu shortcut (GUI)
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
|
||||||
Call CreateStartMenuShortcut
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_END
|
|
||||||
|
|
||||||
; Create shortcuts for silent and passive installers, which
|
|
||||||
; can be disabled by passing `/NS` flag
|
|
||||||
; GUI installer has buttons for users to control creating them
|
|
||||||
IfSilent check_ns_flag 0
|
|
||||||
${IfThen} $PassiveMode == 1 ${|} Goto check_ns_flag ${|}
|
|
||||||
Goto shortcuts_done
|
|
||||||
check_ns_flag:
|
|
||||||
${GetOptions} $CMDLINE "/NS" $R0
|
|
||||||
IfErrors 0 shortcuts_done
|
|
||||||
Call CreateDesktopShortcut
|
|
||||||
Call CreateStartMenuShortcut
|
|
||||||
shortcuts_done:
|
|
||||||
|
|
||||||
; Auto close this page for passive mode
|
|
||||||
${IfThen} $PassiveMode == 1 ${|} SetAutoClose true ${|}
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Function .onInstSuccess
|
|
||||||
; Check for `/R` flag only in silent and passive installers because
|
|
||||||
; GUI installer has a toggle for the user to (re)start the app
|
|
||||||
IfSilent check_r_flag 0
|
|
||||||
${IfThen} $PassiveMode == 1 ${|} Goto check_r_flag ${|}
|
|
||||||
Goto run_done
|
|
||||||
check_r_flag:
|
|
||||||
${GetOptions} $CMDLINE "/R" $R0
|
|
||||||
IfErrors run_done 0
|
|
||||||
${GetOptions} $CMDLINE "/ARGS" $R0
|
|
||||||
Exec '"$INSTDIR\${MAINBINARYNAME}.exe" $R0'
|
|
||||||
run_done:
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Function un.onInit
|
|
||||||
!insertmacro SetContext
|
|
||||||
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
!insertmacro MULTIUSER_UNINIT
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!insertmacro MUI_UNGETLANGUAGE
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
!macro DeleteAppUserModelId
|
|
||||||
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_DestinationList} ${IID_ICustomDestinationList} r1 ""
|
|
||||||
${If} $1 P<> 0
|
|
||||||
${ICustomDestinationList::DeleteList} $1 '("${BUNDLEID}")'
|
|
||||||
${IUnknown::Release} $1 ""
|
|
||||||
${EndIf}
|
|
||||||
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationDestinations} ${IID_IApplicationDestinations} r1 ""
|
|
||||||
${If} $1 P<> 0
|
|
||||||
${IApplicationDestinations::SetAppID} $1 '("${BUNDLEID}")i.r0'
|
|
||||||
${If} $0 >= 0
|
|
||||||
${IApplicationDestinations::RemoveAllDestinations} $1 ''
|
|
||||||
${EndIf}
|
|
||||||
${IUnknown::Release} $1 ""
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
; From https://stackoverflow.com/a/42816728/16993372
|
|
||||||
!macro UnpinShortcut shortcut
|
|
||||||
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} ${IID_IStartMenuPinnedList} r0 ""
|
|
||||||
${If} $0 P<> 0
|
|
||||||
System::Call 'SHELL32::SHCreateItemFromParsingName(ws, p0, g "${IID_IShellItem}", *p0r1)' "${shortcut}"
|
|
||||||
${If} $1 P<> 0
|
|
||||||
${IStartMenuPinnedList::RemoveFromList} $0 '(r1)'
|
|
||||||
${IUnknown::Release} $1 ""
|
|
||||||
${EndIf}
|
|
||||||
${IUnknown::Release} $0 ""
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Section Uninstall
|
|
||||||
!insertmacro CheckIfAppIsRunning
|
|
||||||
|
|
||||||
; Delete the app directory and its content from disk
|
|
||||||
; Copy main executable
|
|
||||||
Delete "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
|
|
||||||
; Delete resources
|
|
||||||
{{#each resources}}
|
|
||||||
Delete "$INSTDIR\\{{this.[1]}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Delete external binaries
|
|
||||||
{{#each binaries}}
|
|
||||||
Delete "$INSTDIR\\{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Delete app associations
|
|
||||||
{{#each file_associations as |association| ~}}
|
|
||||||
{{#each association.ext as |ext| ~}}
|
|
||||||
!insertmacro APP_UNASSOCIATE "{{ext}}" "{{or association.name ext}}"
|
|
||||||
{{/each}}
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
; Delete deep links
|
|
||||||
{{#each deep_link_protocol as |protocol| ~}}
|
|
||||||
ReadRegStr $R7 SHCTX "Software\Classes\{{protocol}}\shell\open\command" ""
|
|
||||||
!if $R7 == "$\"$INSTDIR\${MAINBINARYNAME}.exe$\" $\"%1$\""
|
|
||||||
DeleteRegKey SHCTX "Software\Classes\{{protocol}}"
|
|
||||||
!endif
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
|
|
||||||
; Delete uninstaller
|
|
||||||
Delete "$INSTDIR\uninstall.exe"
|
|
||||||
|
|
||||||
{{#each resources_ancestors}}
|
|
||||||
RMDir /REBOOTOK "$INSTDIR\\{{this}}"
|
|
||||||
{{/each}}
|
|
||||||
RMDir "$INSTDIR"
|
|
||||||
|
|
||||||
!insertmacro DeleteAppUserModelId
|
|
||||||
!insertmacro UnpinShortcut "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
|
|
||||||
!insertmacro UnpinShortcut "$DESKTOP\${MAINBINARYNAME}.lnk"
|
|
||||||
|
|
||||||
; Remove start menu shortcut
|
|
||||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $AppStartMenuFolder
|
|
||||||
Delete "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
|
|
||||||
RMDir "$SMPROGRAMS\$AppStartMenuFolder"
|
|
||||||
|
|
||||||
; Remove desktop shortcuts
|
|
||||||
Delete "$DESKTOP\${MAINBINARYNAME}.lnk"
|
|
||||||
|
|
||||||
; Remove registry information for add/remove programs
|
|
||||||
!if "${INSTALLMODE}" == "both"
|
|
||||||
DeleteRegKey SHCTX "${UNINSTKEY}"
|
|
||||||
!else if "${INSTALLMODE}" == "perMachine"
|
|
||||||
DeleteRegKey HKLM "${UNINSTKEY}"
|
|
||||||
!else
|
|
||||||
DeleteRegKey HKCU "${UNINSTKEY}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
DeleteRegValue HKCU "${MANUPRODUCTKEY}" "Installer Language"
|
|
||||||
|
|
||||||
; Delete app data
|
|
||||||
${If} $DeleteAppDataCheckboxState == 1
|
|
||||||
SetShellVarContext current
|
|
||||||
RmDir /r "$APPDATA\${BUNDLEID}"
|
|
||||||
RmDir /r "$LOCALAPPDATA\${BUNDLEID}"
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
${GetOptions} $CMDLINE "/P" $R0
|
|
||||||
IfErrors +2 0
|
|
||||||
SetAutoClose true
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Function RestorePreviousInstallLocation
|
|
||||||
ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
|
|
||||||
StrCmp $4 "" +2 0
|
|
||||||
StrCpy $INSTDIR $4
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Function SkipIfPassive
|
|
||||||
${IfThen} $PassiveMode == 1 ${|} Abort ${|}
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
!macro SetLnkAppUserModelId shortcut
|
|
||||||
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 ""
|
|
||||||
${If} $0 P<> 0
|
|
||||||
${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)'
|
|
||||||
${If} $1 P<> 0
|
|
||||||
${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READWRITE})'
|
|
||||||
${IUnknown::QueryInterface} $0 '("${IID_IPropertyStore}",.r2)'
|
|
||||||
${If} $2 P<> 0
|
|
||||||
System::Call 'Oleaut32::SysAllocString(w "${BUNDLEID}") i.r3'
|
|
||||||
System::Call '*${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_ID})p.r4'
|
|
||||||
System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_BSTR},,&i4 $3)p.r5'
|
|
||||||
${IPropertyStore::SetValue} $2 '($4,$5)'
|
|
||||||
|
|
||||||
System::Call 'Oleaut32::SysFreeString($3)'
|
|
||||||
System::Free $4
|
|
||||||
System::Free $5
|
|
||||||
${IPropertyStore::Commit} $2 ""
|
|
||||||
${IUnknown::Release} $2 ""
|
|
||||||
${IPersistFile::Save} $1 '("${shortcut}",1)'
|
|
||||||
${EndIf}
|
|
||||||
${IUnknown::Release} $1 ""
|
|
||||||
${EndIf}
|
|
||||||
${IUnknown::Release} $0 ""
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Function CreateDesktopShortcut
|
|
||||||
CreateShortcut "$DESKTOP\${MAINBINARYNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
!insertmacro SetLnkAppUserModelId "$DESKTOP\${MAINBINARYNAME}.lnk"
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Function CreateStartMenuShortcut
|
|
||||||
CreateDirectory "$SMPROGRAMS\$AppStartMenuFolder"
|
|
||||||
CreateShortcut "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
|
|
||||||
!insertmacro SetLnkAppUserModelId "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
|
|
||||||
FunctionEnd
|
|
14
desktop/tauri/src-tauri/templates/nsis_install_hooks.nsh
Normal file
14
desktop/tauri/src-tauri/templates/nsis_install_hooks.nsh
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
!define NSIS_HOOK_POSTINSTALL "NSIS_HOOK_POSTINSTALL_"
|
||||||
|
|
||||||
|
!macro NSIS_HOOK_POSTINSTALL_
|
||||||
|
ExecWait '"$INSTDIR\portmaster-start.exe" install core-service --data="$INSTDIR\data"'
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
|
||||||
|
!define NSIS_HOOK_PREUNINSTALL "NSIS_HOOK_PREUNINSTALL_"
|
||||||
|
|
||||||
|
!macro NSIS_HOOK_PREUNINSTALL_
|
||||||
|
ExecWait 'sc.exe stop PortmasterCore'
|
||||||
|
ExecWait 'sc.exe delete PortmasterCore'
|
||||||
|
!macroend
|
||||||
|
|
Loading…
Add table
Reference in a new issue