Source code for quicktile.dbus_api

"""D-Bus API for controlling QuickTile"""

__author__ = "Stephan Sokolow (deitarion/SSokolow)"
__license__ = "GNU GPL 2.0 or later"

# Silence PyLint about my grouped imports
# pylint: disable=wrong-import-order

import logging

from dbus.service import BusName, Object, method
from dbus import SessionBus
from dbus.exceptions import DBusException
from dbus.mainloop.glib import DBusGMainLoop

# -- Type-Annotation Imports --
from typing import Optional, Tuple
from .commands import CommandRegistry
from .wm import WindowManager
# --


[docs]class QuickTile(Object): """D-Bus endpoint definition :param bus: The connection on which to export this object. See the :class:`dbus.service.Object` documentation for details. """ def __init__(self, bus: SessionBus, commands: CommandRegistry, winman: WindowManager) -> None: Object.__init__(self, bus, '/com/ssokolow/QuickTile') self.commands = commands self.winman = winman
[docs] @method(dbus_interface='com.ssokolow.QuickTile', in_signature='s', out_signature='b') def doCommand(self, command): # type: (str) -> bool """Execute a QuickTile tiling command :param command: The name of the command to attempt to run. :returns: Whether ``command`` was found in the registry. .. todo:: Expose a proper, introspectable D-Bus API. .. todo:: When I'm willing to break the external API, retire the :meth:`doCommand` name. """ return self.commands.call(command, self.winman)
[docs]def init(commands: CommandRegistry, winman: WindowManager, ) -> Optional[Tuple[BusName, QuickTile]]: """Initialize the DBus backend This handles hooking D-Bus into the Glib main loop, connecting to the session bus, and creating a :class:`QuickTile` instance.""" try: DBusGMainLoop(set_as_default=True) sess_bus = SessionBus() except DBusException: logging.warning("Could not connect to the D-Bus Session Bus.") return None dbus_name = BusName("com.ssokolow.QuickTile", sess_bus) dbus_obj = QuickTile(sess_bus, commands, winman) return dbus_name, dbus_obj