Setup 09331b2fd9ccf136e2183b7cd85354cfd56e2ed50260b7aadeed63c7ea450251
Portable 21752d0fc85fb39ec1e65192920461e9ae395a22d9a68abd27f12e638d0fdd07
Right-click a tab: floating context menu with Reload, Duplicate, Group
(submenu: None / Red / Orange / Yellow / Green / Cyan / Blue / Purple),
Add to Bookmarks, Mute (also Unmute; 🔇 shows next to the title when
muted), Close. Menus close on outside click or Escape.
Group state is per-tab. A grouped tab shows a colored dot before the
title and a matching 2-px accent stripe on the top edge, so a cluster
of same-group tabs reads visually. Palette is drawn from existing
provenance colors (err/warn/acid/srv/sia/blue).
Backend IPCs are all tab-scoped (not "active tab"): tab-reload,
tab-duplicate, tab-mute (toggle or explicit boolean), tab-group,
tab-bookmark. emitTabs payload gains muted, group, and url so the
menu can read current state.
Installer wizard branding: 164×314 sidebar BMP with the compass mark
centered + "Theseus / NAVIGATOR" wordmark under it, plus a 150×57
top-strip header with a mini compass on the right. Sharp can't write
BMP directly (only png/webp/etc), so nsis/make-icons.mjs renders raw
RGB via sharp and wraps it in a hand-rolled 24-bit uncompressed BMP
header. Uninstaller reuses the same sidebar.
Silent-install fix: nsis/installer.nsh's AriadnePageCreate now checks
IfSilent BEFORE touching nsDialogs::Create. In /S mode the flag is
zeroed and the function returns cleanly, so the installer no longer
hangs waiting for a page it will never draw. This is why 0.3.2 needed
two builds — the first hung on /S install; the fixed hash is the one
that ships.
Deployed: scp + sia-upload of both trees. Verified VPS hash matches
local 09331b2f. Fresh /S install to D:\Program Files\Theseus Navigator\
placed 0.3.2 with the correct HKCU Uninstall registry entry.
100 lines
4.1 KiB
NSIS
100 lines
4.1 KiB
NSIS
; Theseus Navigator NSIS include — bundles Ariadne's Thread as an opt-out.
|
|
;
|
|
; UI: a dedicated wizard page with a real checkbox (pre-checked) instead of a
|
|
; MessageBox popup. Shown FIRST in the install flow because electron-builder's
|
|
; template places our `!include` before its own MUI_PAGE_* inserts and NSIS
|
|
; processes page directives in file order — so this is the earliest hook
|
|
; we have without editing the template. Framed as "Options" so it reads
|
|
; naturally as a preamble before the standard Welcome/License/Directory pages.
|
|
; Skipped entirely (`Abort`) if Ariadne's Thread is already installed, so
|
|
; upgrades of Theseus don't nag.
|
|
;
|
|
; The uninstall side stays a symmetric MessageBox (a full custom uninstaller
|
|
; page is overkill for one yes/no during a rare event).
|
|
|
|
!include "nsDialogs.nsh"
|
|
!include "LogicLib.nsh"
|
|
!include "MUI2.nsh"
|
|
|
|
Var AriadneCheckbox
|
|
Var InstallAriadneFlag
|
|
|
|
!define ARIADNE_INSTALLER "AriadneResolver-Setup-0.1.0.exe"
|
|
!define ARIADNE_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\{7E7A5F1C-3B4E-4C8A-9E1D-ARIADNERSLVR}_is1"
|
|
|
|
Page custom AriadnePageCreate AriadnePageLeave
|
|
|
|
Function AriadnePageCreate
|
|
; Silent install (/S) — no user, no page. Default to "don't touch Ariadne";
|
|
; the whole point of /S is unattended, and existing Ariadne stays as-is.
|
|
; nsDialogs::Create in silent mode returns a dialog handle we can't display,
|
|
; so we short-circuit BEFORE calling any nsDialogs API.
|
|
IfSilent ariadne_page_silent ariadne_page_check
|
|
ariadne_page_silent:
|
|
StrCpy $InstallAriadneFlag "0"
|
|
Return
|
|
|
|
ariadne_page_check:
|
|
; Skip the page entirely if Ariadne's Thread is already on this machine —
|
|
; nothing to offer. Registry lookup uses HKLM 64-bit view because Ariadne's
|
|
; Inno script sets ArchitecturesInstallIn64BitMode=x64compatible.
|
|
SetRegView 64
|
|
ReadRegStr $R0 HKLM "${ARIADNE_UNINST_KEY}" "UninstallString"
|
|
SetRegView lastused
|
|
StrCmp $R0 "" ariadne_page_show 0
|
|
StrCpy $InstallAriadneFlag "0"
|
|
Abort
|
|
|
|
ariadne_page_show:
|
|
!insertmacro MUI_HEADER_TEXT "Optional add-ons" "Choose whether to also install Ariadne's Thread alongside Theseus Navigator."
|
|
|
|
nsDialogs::Create 1018
|
|
Pop $0
|
|
StrCmp $0 "error" ariadne_page_bail 0
|
|
|
|
${NSD_CreateLabel} 0 0 100% 44u "Ariadne's Thread is a small system-wide resolver that lets BCDN — Bitcoin Cash Domain Names — work in Chrome, Edge, Firefox, and every other browser on this machine.$\r$\n$\r$\nWithout it, only Theseus resolves these names. You can install or remove it later."
|
|
Pop $0
|
|
|
|
${NSD_CreateCheckbox} 0 60u 100% 12u "Install Ariadne's Thread (recommended)"
|
|
Pop $AriadneCheckbox
|
|
${NSD_Check} $AriadneCheckbox
|
|
|
|
${NSD_CreateLabel} 0 80u 100% 20u "It runs a UAC (admin) prompt of its own during install. Theseus Navigator's own setup continues after this page."
|
|
Pop $0
|
|
|
|
nsDialogs::Show
|
|
Return
|
|
|
|
ariadne_page_bail:
|
|
StrCpy $InstallAriadneFlag "0"
|
|
Abort
|
|
FunctionEnd
|
|
|
|
Function AriadnePageLeave
|
|
${NSD_GetState} $AriadneCheckbox $InstallAriadneFlag
|
|
FunctionEnd
|
|
|
|
!macro customInstall
|
|
; Read the state saved from AriadnePageLeave. BST_CHECKED == 1.
|
|
${If} $InstallAriadneFlag == ${BST_CHECKED}
|
|
; Ariadne's Inno installer runs its own UAC prompt (PrivilegesRequired=admin).
|
|
; ExecWait blocks until Ariadne finishes or the user cancels UAC; either
|
|
; way, Theseus install continues normally afterwards.
|
|
ExecWait '"$INSTDIR\resources\${ARIADNE_INSTALLER}" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART'
|
|
${EndIf}
|
|
!macroend
|
|
|
|
!macro customUnInstall
|
|
; Only offer to remove Ariadne if it's actually installed.
|
|
SetRegView 64
|
|
ReadRegStr $R0 HKLM "${ARIADNE_UNINST_KEY}" "UninstallString"
|
|
SetRegView lastused
|
|
StrCmp $R0 "" ariadne_skip_uninstall
|
|
|
|
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON1 \
|
|
"Also uninstall Ariadne's Thread?$\r$\n$\r$\nRemoving it makes Bitcoin Cash names stop resolving in Chrome, Edge, Firefox, and every other browser on this machine. (Theseus's own uninstall does not depend on this — say No to keep the system-wide resolver.)" \
|
|
IDNO ariadne_skip_uninstall
|
|
ExecWait '$R0 /VERYSILENT /SUPPRESSMSGBOXES /NORESTART'
|
|
|
|
ariadne_skip_uninstall:
|
|
!macroend
|