"""Entry point. Run with no arguments to open the app. The verbs (`--toggle`, `--status`, …) talk to a *running* instance over D-Bus instead of starting a second one, which is what makes them usable as global shortcuts: kadence-desktop --toggle # bind this to a key in System Settings kadence-desktop --mini # show/hide the floating mini timer kadence-desktop --status # prints "Focus 18:42 · Write the docs · 3/8 today" kadence-desktop --settings # open the one window with fields in it There is no main window: Kadence on the desktop is a tray agent that enforces the blocking policy and shows a floating countdown. Started with no arguments it comes up with the mini timer; `--minimized` starts it with nothing on screen, which is what the autostart entry and the systemd user unit do. """ from __future__ import annotations import argparse import logging import os import sys REMOTE_VERBS = { "toggle": "Toggle", "start": "StartWork", "break": "StartBreak", "pause": "Pause", "resume": "Resume", "complete": "Complete", "stop": "Stop", "extend": "Extend", "interrupt": "Interrupt", "status": "Status", "report": "SendReport", "mini": "ToggleMini", "show": "Raise", "settings": "Settings", } def _remote(verb: str) -> int: """Call the running instance. Returns a process exit code.""" from PyQt6.QtCore import QCoreApplication from PyQt6.QtDBus import QDBusConnection, QDBusInterface _app = QCoreApplication(sys.argv) interface = QDBusInterface( "org.kadence.Desktop", "/Timer", "org.kadence.Timer", QDBusConnection.sessionBus() ) if not interface.isValid(): print("Kadence is not running.", file=sys.stderr) return 1 reply = interface.call(REMOTE_VERBS[verb]) arguments = reply.arguments() if arguments: print(arguments[0]) return 0 def main() -> int: parser = argparse.ArgumentParser(prog="kadence-desktop", description=__doc__) parser.add_argument("--minimized", action="store_true", help="start in the tray only") parser.add_argument( "--view-only", action="store_true", help="start in view-only mode with timer turned off" ) parser.add_argument("--verbose", action="store_true") for verb in REMOTE_VERBS: parser.add_argument( f"--{verb}", action="store_true", help=f"ask the running instance to {verb}" ) args = parser.parse_args() logging.basicConfig( level=logging.DEBUG if args.verbose else os.environ.get("KADENCE_LOG", "INFO").upper(), format="%(asctime)s %(levelname)-7s %(name)s: %(message)s", ) for verb in REMOTE_VERBS: if getattr(args, verb): return _remote(verb) from kadence_desktop.app import KadenceApp from kadence_desktop.integrations.dbus_service import call_existing # Single instance: if somebody already owns the name, show their countdown. if call_existing("Raise"): print("Kadence is already running — brought its timer up.") return 0 return KadenceApp(sys.argv, minimized=args.minimized, view_only=args.view_only).run() if __name__ == "__main__": raise SystemExit(main())