This commit is contained in:
Flowseal
2026-09-04 17:22:30 +03:00
parent d36bb7df71
commit b23c8f6122
+36 -24
View File
@@ -47,6 +47,9 @@ from utils.tray_common import (
quit_ctk, release_lock, restart_proxy, quit_ctk, release_lock, restart_proxy,
save_config, start_proxy, stop_proxy, tg_proxy_url, save_config, start_proxy, stop_proxy, tg_proxy_url,
) )
from utils.update_check import (
get_status, get_update_asset, run_check, RELEASES_PAGE_URL,
)
from ui.ctk_tray_ui import ( from ui.ctk_tray_ui import (
install_tray_config_buttons, install_tray_config_form, install_tray_config_buttons, install_tray_config_form,
populate_first_run_window, tray_settings_scroll_and_footer, populate_first_run_window, tray_settings_scroll_and_footer,
@@ -62,6 +65,7 @@ _tray_icon: Optional[object] = None
_config: dict = {} _config: dict = {}
_exiting = False _exiting = False
_win_mutex_handle = None _win_mutex_handle = None
_update_flow_lock = threading.Lock()
_ERROR_ALREADY_EXISTS = 183 _ERROR_ALREADY_EXISTS = 183
@@ -324,23 +328,31 @@ def _trigger_update_flow(icon=None, item=None) -> None:
button, so an update can still be started after the initial startup button, so an update can still be started after the initial startup
prompt was skipped/closed. prompt was skipped/closed.
""" """
from utils.update_check import RELEASES_PAGE_URL, get_status, get_update_asset if not _update_flow_lock.acquire(blocking=False):
st = get_status()
if not st.get("has_update"):
return return
url = (st.get("html_url") or "").strip() or RELEASES_PAGE_URL
ver = st.get("latest") or "?"
asset = get_update_asset(Path(sys.executable), __version__) if IS_FROZEN else None
def _show() -> None: def _show() -> None:
choice = update_ctk_form( try:
t("update.available", version=ver), if _exiting:
download_url=asset[0] if asset else None, return
release_url=url, st = get_status()
) if not st.get("has_update"):
if choice == "open": return
webbrowser.open(url) url = (st.get("html_url") or "").strip() or RELEASES_PAGE_URL
ver = st.get("latest") or "?"
asset = get_update_asset(Path(sys.executable), __version__) if IS_FROZEN else None
choice = update_ctk_form(
t("update.available", version=ver),
download_url=asset[0] if asset else None,
release_url=url,
)
if choice == "open":
webbrowser.open(url)
except Exception as exc:
log.warning("Update flow failed: %s", repr(exc))
finally:
_update_flow_lock.release()
threading.Thread(target=_show, daemon=True, name="manual-update").start() threading.Thread(target=_show, daemon=True, name="manual-update").start()
@@ -354,8 +366,6 @@ def _maybe_do_update(cfg: dict, is_exiting) -> None:
if is_exiting(): if is_exiting():
return return
try: try:
from utils.update_check import run_check
run_check(__version__) run_check(__version__)
if _tray_icon is not None: if _tray_icon is not None:
_tray_icon.menu = _build_menu() _tray_icon.menu = _build_menu()
@@ -629,17 +639,19 @@ def _build_menu():
pystray.MenuItem(t("tray.restart"), _on_restart), pystray.MenuItem(t("tray.restart"), _on_restart),
pystray.MenuItem(t("tray.settings"), _on_edit_config), pystray.MenuItem(t("tray.settings"), _on_edit_config),
pystray.MenuItem(t("tray.logs"), _on_open_logs), pystray.MenuItem(t("tray.logs"), _on_open_logs),
pystray.Menu.SEPARATOR,
pystray.MenuItem(t("tray.exit"), _on_exit),
] ]
from utils.update_check import get_status
st = get_status() st = get_status()
if st.get("has_update"): if st.get("has_update"):
items.append(pystray.Menu.SEPARATOR) items[-2:-2] = [
items.append(pystray.MenuItem( pystray.Menu.SEPARATOR,
t("tray.update", current=__version__, new=st.get("latest") or "?"), pystray.MenuItem(
_trigger_update_flow, t("tray.update", current=__version__, new=st.get("latest") or "?"),
)) _trigger_update_flow,
items.append(pystray.Menu.SEPARATOR) )
items.append(pystray.MenuItem(t("tray.exit"), _on_exit)) ]
return pystray.Menu(*items) return pystray.Menu(*items)