Files
kadence/desktop/kadence_desktop/__main__.py
T
2026-10-18 18:02:05 +03:00

85 lines
2.6 KiB
Python

"""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 --status # prints "Focus 18:42 · Write the docs · 3/8 today"
"""
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",
"show": "Raise",
}
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) # noqa: F841 - needed for the D-Bus loop
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("--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, just raise their window.
if call_existing("Raise"):
print("Kadence is already running — raised its window.")
return 0
return KadenceApp(sys.argv, minimized=args.minimized).run()
if __name__ == "__main__":
raise SystemExit(main())