import sys import queue import threading import logging from PyQt6.QtWidgets import QApplication from PyQt6.QtCore import QTimer from config.config_manager import ConfigManager from core.switcher import MonitorSwitcher from core.device_watcher import DeviceWatcher from core.hotkey_manager import HotkeyManager from ui.tray import TrayApp logging.basicConfig( level=logging.INFO, format="%(asctime)s %(name)s %(levelname)s %(message)s", ) def main() -> None: app = QApplication(sys.argv) app.setQuitOnLastWindowClosed(False) config = ConfigManager() switcher = MonitorSwitcher(config) watcher = DeviceWatcher(config, switcher) hotkeys = HotkeyManager(config, switcher) settings_queue: queue.Queue = queue.Queue() tray = TrayApp(config, switcher, settings_queue) watcher.start() hotkeys.register_all() tray_thread = threading.Thread( target=tray.run_tray, daemon=True, name="TrayThread" ) tray_thread.start() settings_window = None def process_queue() -> None: nonlocal settings_window while not settings_queue.empty(): cmd = settings_queue.get_nowait() if cmd == "open_settings": from ui.settings_window import SettingsWindow if settings_window is None or not settings_window.isVisible(): settings_window = SettingsWindow(config, switcher, hotkeys) settings_window.show() settings_window.raise_() settings_window.activateWindow() elif cmd == "exit": hotkeys.unregister_all() watcher.stop() app.quit() timer = QTimer() timer.timeout.connect(process_queue) timer.start(100) sys.exit(app.exec()) if __name__ == "__main__": main()