feat: add Restart and Shutdown buttons to system tray
Some checks failed
Lint & Test / test (push) Failing after 29s

Both actions show a confirmation dialog before proceeding.
Restart uses os.execv to re-launch the process in-place.
Shutdown stops the server and exits the tray.
This commit is contained in:
2026-03-24 14:10:46 +03:00
parent 178d115cc5
commit 524f910cf0

View File

@@ -1,7 +1,10 @@
"""System tray icon for LED Grab (Windows).""" """System tray icon for LED Grab (Windows)."""
import os
import sys
import webbrowser import webbrowser
from pathlib import Path from pathlib import Path
from tkinter import messagebox
from typing import Callable from typing import Callable
from PIL import Image from PIL import Image
@@ -41,7 +44,8 @@ class TrayManager:
menu = pystray.Menu( menu = pystray.Menu(
pystray.MenuItem("Show UI", self._show_ui, default=True), pystray.MenuItem("Show UI", self._show_ui, default=True),
pystray.Menu.SEPARATOR, pystray.Menu.SEPARATOR,
pystray.MenuItem("Exit", self._exit), pystray.MenuItem("Restart", self._restart),
pystray.MenuItem("Shutdown", self._shutdown),
) )
self._icon = pystray.Icon( self._icon = pystray.Icon(
@@ -56,7 +60,16 @@ class TrayManager:
def _show_ui(self, icon: "pystray.Icon", item: "pystray.MenuItem") -> None: def _show_ui(self, icon: "pystray.Icon", item: "pystray.MenuItem") -> None:
webbrowser.open(f"http://localhost:{self._port}") webbrowser.open(f"http://localhost:{self._port}")
def _exit(self, icon: "pystray.Icon", item: "pystray.MenuItem") -> None: def _restart(self, icon: "pystray.Icon", item: "pystray.MenuItem") -> None:
if not messagebox.askyesno("LED Grab", "Restart the server?"):
return
self._icon.stop()
self._on_exit()
os.execv(sys.executable, [sys.executable, "-m", "wled_controller"])
def _shutdown(self, icon: "pystray.Icon", item: "pystray.MenuItem") -> None:
if not messagebox.askyesno("LED Grab", "Shut down the server?"):
return
self._on_exit() self._on_exit()
self._icon.stop() self._icon.stop()