feat(autostart): suppress browser auto-open on Windows login

When the user enables "Start with Windows" in the installer, the app
launches on every PC login. Previously each login popped a fresh WebUI
tab, which is noisy for a tray-resident background service.

The autostart shortcut now passes --autostart to start-hidden.vbs, which
sets LEDGRAB_AUTOSTART=1 in the child env. __main__ checks this flag
alongside LEDGRAB_RESTART when deciding whether to open the browser.

Manual launches (desktop/start-menu shortcuts) and the installer's
post-install "Launch LedGrab" finish-page action are unchanged — they
don't pass the arg, so they still open the WebUI tab.
This commit is contained in:
2026-04-26 23:41:03 +03:00
parent 1c9acc5afb
commit de13f44f24
3 changed files with 25 additions and 3 deletions
+4 -1
View File
@@ -162,8 +162,11 @@ Section "Desktop shortcut" SecDesktop
SectionEnd SectionEnd
Section "Start with Windows" SecAutostart Section "Start with Windows" SecAutostart
; Pass --autostart so the VBS sets LEDGRAB_AUTOSTART=1 and the app suppresses
; the browser auto-open on Windows login. Manual launches (desktop / start
; menu) don't pass the arg, so they keep opening the WebUI tab.
CreateShortcut "$SMSTARTUP\${APPNAME}.lnk" \ CreateShortcut "$SMSTARTUP\${APPNAME}.lnk" \
"wscript.exe" '"$INSTDIR\scripts\${VBSNAME}"' \ "wscript.exe" '"$INSTDIR\scripts\${VBSNAME}" --autostart' \
"$INSTDIR\app\src\ledgrab\static\icons\icon.ico" 0 "$INSTDIR\app\src\ledgrab\static\icons\icon.ico" 0
SectionEnd SectionEnd
+9
View File
@@ -10,6 +10,15 @@ Set procEnv = WshShell.Environment("Process")
procEnv("PYTHONPATH") = appRoot & "\app\src" procEnv("PYTHONPATH") = appRoot & "\app\src"
procEnv("LEDGRAB_CONFIG_PATH") = appRoot & "\app\config\default_config.yaml" procEnv("LEDGRAB_CONFIG_PATH") = appRoot & "\app\config\default_config.yaml"
' If launched as Windows autostart (via the SMSTARTUP shortcut), suppress the
' browser auto-open. Manual launches (desktop / start menu) pass no args.
For Each arg In WScript.Arguments
If arg = "--autostart" Then
procEnv("LEDGRAB_AUTOSTART") = "1"
Exit For
End If
Next
' Use embedded python.exe (NOT pythonw.exe) with WindowStyle=0. ' Use embedded python.exe (NOT pythonw.exe) with WindowStyle=0.
' Same pattern as the Media Server sibling app. ' Same pattern as the Media Server sibling app.
embeddedPython = appRoot & "\python\python.exe" embeddedPython = appRoot & "\python\python.exe"
+12 -2
View File
@@ -83,6 +83,16 @@ def _is_restart() -> bool:
return os.environ.get("LEDGRAB_RESTART", "") == "1" return os.environ.get("LEDGRAB_RESTART", "") == "1"
def _is_autostart() -> bool:
"""Detect if launched via the Windows autostart shortcut."""
return os.environ.get("LEDGRAB_AUTOSTART", "") == "1"
def _should_skip_browser() -> bool:
"""Skip auto-opening the browser on restarts and on Windows login autostart."""
return _is_restart() or _is_autostart()
def _check_port(host: str, port: int) -> None: def _check_port(host: str, port: int) -> None:
"""Exit with a clear message if the port is already in use.""" """Exit with a clear message if the port is already in use."""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
@@ -120,8 +130,8 @@ def main() -> None:
) )
server_thread.start() server_thread.start()
# Browser after a short delay (skip on restart — user already has a tab) # Browser after a short delay (skip on restart and on Windows login autostart)
if not _is_restart(): if not _should_skip_browser():
threading.Thread( threading.Thread(
target=_open_browser, target=_open_browser,
args=(config.server.port,), args=(config.server.port,),