async def start(
        self,
        on_item_added: Callable | None = None,
        on_item_removed: Callable | None = None,
        on_icon_changed: Callable | None = None,
    ):
        """
        Starts the host if not already started.

        Widgets should register their callbacks via this method.
        """
        if on_item_added:
            self._on_item_added.append(on_item_added)

        if on_item_removed:
            self._on_item_removed.append(on_item_removed)

        if on_icon_changed:
            self._on_icon_changed.append(on_icon_changed)

        if self.started:
            if on_item_added:
                for item in self.items:
                    on_item_added(item)

        else:
            self.bus = await MessageBus().connect()
            await self.bus.request_name("org.freedesktop.StatusNotifierHost-qtile")
            for iface in BUS_NAMES:
                w = StatusNotifierWatcher(iface)
                w.on_item_added = self.add_item
                w.on_item_removed = self.remove_item
                await w.start()

                # Not quite following spec here as we're not registering
                # the host on the bus.
                w.RegisterStatusNotifierHost(self.name)
                self.watchers.append(w)
            self.started = True

        Starts the host if not already started.

        Widgets should register their callbacks via this method.
        
libqtile/widget/helpers/status_notifier/statusnotifier.py