; ============================================================================ ; MaxEditor Companion — Inno Setup script ; ============================================================================ ; ; Build pre-requisito: ; 1) cd companion ; 2) pip install -e ".[tray,gui,build]" ; 3) python build.py ; → genera companion/dist/MaxEditorCompanion.exe (~30-60 MB) ; 4) Abrir este .iss con Inno Setup Compiler (ISCC.exe) o IDE ; → genera installer/Output/MaxEditor_Setup_v0.1.0.exe ; ; Decisiones de diseño: ; ; - Install dir: {autopf}\MaxEditor → "C:\Program Files\MaxEditor" en ; instalación per-machine. Si el usuario no es admin, el wizard cae ; a per-user (%LOCALAPPDATA%\Programs\MaxEditor) sin pedir UAC. ; Esto es deliberado: la companion está pensada para arrancar como ; usuario (no como service) y instala el cert en CurrentUser\Root, ; por lo que NO necesita admin para funcionar correctamente. ; ; - PrivilegesRequiredOverridesAllowed=dialog → wizard muestra un ; prompt al inicio dejando elegir entre "para todos los usuarios" ; (UAC + Program Files) y "solo para mí" (sin UAC + LocalAppData). ; ; - Cert: NO se instala desde el installer. La companion auto-instala ; el cert SHA-256 en CurrentUser\Root al primer arranque (módulo ; `cert_store.install_cert_user()`). Esto evita complicaciones con ; UAC y permite a varios usuarios del mismo equipo tener certs ; independientes (cada uno con su propio token). ; ; - Auto-start: tarea opcional (checkbox marcado por default). Si el ; usuario la deja activada, registramos la companion en ; `HKCU\Software\Microsoft\Windows\CurrentVersion\Run`. Es per-user ; incluso en instalaciones per-machine — cada usuario decide si la ; quiere al login. ; ; - WebView2: NO bundleamos el bootstrapper de Microsoft. Asumimos ; Win10 22H2+ / Win11 (donde el runtime ya viene preinstalado o ; llega por Windows Update). Si el usuario está en Win10 viejo, la ; primera ventana del editor le pedirá instalarlo (PyWebView lo ; detecta y abre el download del Evergreen Runtime). ; ; - Uninstaller: generado automáticamente por Inno. Se asegura de ; matar el proceso de la companion antes de eliminar archivos ; (CloseApplications=force). ; ; - Ejecución del editor: la companion al arrancar abre la URL del ; backend en el browser default vía `tray.run_with_tray` (o el ; modo `--gui` que usa pywebview). El installer NO crea un ; "MaxEditor.exe" separado — el único binario es la companion. ; ============================================================================ #define MyAppName "MaxEditor Companion" #define MyAppShortName "MaxEditor" #define MyAppVersion "0.1.0" #define MyAppPublisher "MaxEditor" #define MyAppURL "https://altoque.tv/maxeditor" #define MyAppExeName "MaxEditorCompanion.exe" #define MyAppId "{{B7C2E9A1-3F4D-4C8B-9E1A-MAXEDITOR0001}}" [Setup] AppId={#MyAppId} AppName={#MyAppName} AppVersion={#MyAppVersion} AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={autopf}\{#MyAppShortName} DefaultGroupName={#MyAppShortName} DisableProgramGroupPage=yes LicenseFile= OutputDir=Output OutputBaseFilename=MaxEditor_Setup_v{#MyAppVersion} SetupIconFile=..\companion\assets\icon.ico UninstallDisplayIcon={app}\{#MyAppExeName} Compression=lzma2/ultra64 SolidCompression=yes WizardStyle=modern ArchitecturesAllowed=x64compatible ArchitecturesInstallIn64BitMode=x64compatible PrivilegesRequired=lowest PrivilegesRequiredOverridesAllowed=dialog commandline CloseApplications=force RestartApplications=no MinVersion=10.0.19041 ; Win10 2004 (build 19041) es nuestro mínimo soportado por compatibilidad ; con WebView2 Evergreen y FFmpeg builds modernos. [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}" Name: "autostart"; Description: "Iniciar {#MyAppShortName} automáticamente al iniciar Windows"; GroupDescription: "Inicio del sistema:"; Flags: checkedonce [Files] ; Binario principal generado por PyInstaller (--onefile). Source: "..\companion\dist\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion ; Icono (para shortcuts y para que el installer pueda mostrarlo). Source: "..\companion\assets\icon.ico"; DestDir: "{app}"; Flags: ignoreversion ; README opcional con info post-install. Source: "POST_INSTALL_README.txt"; DestDir: "{app}"; Flags: ignoreversion isreadme [Icons] Name: "{group}\{#MyAppShortName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{app}\icon.ico" Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" Name: "{autodesktop}\{#MyAppShortName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{app}\icon.ico"; Tasks: desktopicon [Registry] ; Auto-start per-user. Inno expande {app} a la ruta final de instalación. ; Si el usuario no marca la task, no se escribe nada y el uninstaller ; tampoco intenta limpiarla (Tasks: autostart guard). Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; \ ValueType: string; ValueName: "{#MyAppShortName}"; \ ValueData: """{app}\{#MyAppExeName}"""; \ Flags: uninsdeletevalue; Tasks: autostart [Run] ; Lanzar la companion al final del wizard (checkbox por default). Filename: "{app}\{#MyAppExeName}"; Description: "Iniciar {#MyAppName} ahora"; \ Flags: nowait postinstall skipifsilent [UninstallRun] ; Mata el proceso si quedó vivo antes de borrar el .exe. taskkill viene ; con Windows desde XP. Ignoramos el exit code (puede ser 128 si el ; proceso ya estaba cerrado). Filename: "{sys}\taskkill.exe"; Parameters: "/F /IM {#MyAppExeName}"; \ Flags: runhidden; RunOnceId: "KillCompanion" [UninstallDelete] ; Inno borra solo lo que instaló. Estos paths los crea la companion en ; runtime — los limpiamos opcionalmente. NO borramos el cert de ; CurrentUser\Root porque otras instalaciones del mismo usuario podrían ; reusarlo; el módulo `cert_store.uninstall_cert_user()` se debe correr ; manualmente si el usuario quiere limpieza total. Type: filesandordirs; Name: "{localappdata}\MaxEditor\logs" Type: filesandordirs; Name: "{localappdata}\MaxEditor\cache" ; Tokens, certs, configs y workspaces NO se tocan — son user data.