Examples

Examples source code can be found in examples directory.

Sending notification using blocking API

Send a simple notification without waiting for user interaction. Blocking API version.

from __future__ import annotations

from sdbus_block.notifications import FreedesktopNotifications


def main() -> None:
    # Default bus will be used if no bus is explicitly passed.
    # When running as user the default bus will be session bus where
    # Notifications daemon usually runs.
    notifications = FreedesktopNotifications()

    notifications.notify(
        # summary is the only required argument.
        # For other arguments default values will be used.
        summary="FooBar",
    )


if __name__ == "__main__":
    main()

Sending notification using async API

Send a simple notification without waiting for user interaction. Async API version.

from __future__ import annotations

from asyncio import run as asyncio_run

from sdbus_async.notifications import FreedesktopNotifications

# FreedesktopNotifications is a class that automatically proxies to
# the notifications daemon's service name and path.
# NotificationsInterface is the raw interface that can be used to
# implement your own daemon or proxied to non-standard path.


async def main() -> None:
    # Default bus will be used if no bus is explicitly passed.
    # When running as user the default bus will be session bus where
    # Notifications daemon usually runs.
    notifications = FreedesktopNotifications()

    await notifications.notify(
        # summary is the only required argument.
        # For other arguments default values will be used.
        summary="FooBar",
    )


if __name__ == "__main__":
    asyncio_run(main())

Sending notification and waiting for user interaction

Because python-sdbus only supports signals in async API there is only async version of this.

Send notifications with 2 buttons displaying Foo and Bar and wait for user to press one of them or dismiss the notification.

Remmember to bind signal reading task to a variable or otherwise it might get garbage collected.

Monitor action_invoked and notification_closed signals to track user interaction.

from __future__ import annotations

from asyncio import FIRST_COMPLETED, get_running_loop
from asyncio import run as asyncio_run
from asyncio import wait

from sdbus_async.notifications import FreedesktopNotifications

# FreedesktopNotifications is a class that automatically proxies to
# the notifications daemon's service name and path.
# NotificationsInterface is the raw interface that can be used to
# implement your own daemon or proxied to non-standard path.


async def wait_action_invoked(
    notifications: FreedesktopNotifications,
    notifications_waiting: set[int],
) -> None:
    async for (
        notification_id,
        action_key,
    ) in notifications.action_invoked.catch():
        if notification_id in notifications_waiting:
            print("Action invoked:", action_key)
            return


async def wait_notification_closed(
    notifications: FreedesktopNotifications,
    notifications_waiting: set[int],
) -> None:
    async for (
        notification_id,
        reason,
    ) in notifications.notification_closed.catch():
        if notification_id in notifications_waiting:
            print("Notification closed!")
            return


async def main() -> None:
    # Default bus will be used if no bus is explicitly passed.
    # When running as user the default bus will be session bus where
    # Notifications daemon usually runs.
    notifications = FreedesktopNotifications()
    notifications_waiting: set[int] = set()

    loop = get_running_loop()

    # Always bind tasks to variables or they will be garbage collected
    action_invoked_task = loop.create_task(
        wait_action_invoked(
            notifications,
            notifications_waiting,
        )
    )
    notification_closed_task = loop.create_task(
        wait_notification_closed(
            notifications,
            notifications_waiting,
        )
    )

    notification_id = await notifications.notify(
        # summary is the only required argument.
        # For other arguments default values will be used.
        summary="Foo or Bar?",
        body="Select either Foo or Bar.",
        # Actions are defined in pairs of action_key to displayed string.
        actions=["foo", "Foo", "bar", "Bar"],
    )
    notifications_waiting.add(notification_id)

    await wait(
        (action_invoked_task, notification_closed_task),
        return_when=FIRST_COMPLETED,
    )


if __name__ == "__main__":
    asyncio_run(main())