In Rhythmbox (GNOME's music player), when it's playing music, you can open the notifications panel and control the music playback from there. Here's a screenshot. The playback controls are bordered in orange; they have a little music note icon:
This is what I want to make; the media playback controls. Note that, while it is in the notifications panel, it's not technically a notification, because it never pops up on the screen, and you can't make it go away. In the screenshot, you can see the actual notification, which I don't want to make, below the controls.
I know that there's a Gio.Notification
, but it's not quite what I need (unless I'm very much mistaken). I searched in Gio
, Gdk
, and Gtk
, but I didn't find anything. I also searched, among other things, [gtk] media control
and [gtk] media notification
on Stack Overflow, but I didn't find anything there either.
Thanks to the help of BobMorane, I've now figured out that Rhythmbox uses libnotify
for its player controls. I know how to create actions using Notify.Notification
, and I can make them have images, etc., but what I still haven't figured out is how to:
Using Python's help()
function to look at gi.repository.Notify.Notification
, the only methods I see that seem to have potential are add_action()
(particularly its user_data
parameter) and set_hint()
(and its variants). Could these be used to achieve my goal?
How do I make a media-control "notification" in Gtk with Python, as explained above?
I think the technology used by Rhytmbox to acheive this is MPRIS (Media Player Remote Interfacing Specification). As they say on their we page:
The Media Player Remote Interfacing Specification (MPRIS) is a standard D-Bus interface which aims to provide a common programmatic API for controlling media players.
It provides a mechanism for discovery, querying and basic playback control of compliant media players, as well as a tracklist interface which is used to add context to the active media item.
In Rhythmbox, this is implemented as a core plug-in. The code is pretty complicated, but basically implements the MPRIS specification. This implementation then exposes some information and controls out to other applications which want to control the Rhythmbox, like the Gnome Shell in your case. If you deactivate the MPRIS plug-in, the "notification player" will no longer work.
In GNOME Shell, you can see they have their own MPRIS module as well (https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/mpris.js), which is used to:
In this module, the formatting of the buttons and all that stuff comes into life as well. This means that on your part (the player's designer), you should have no UI formatting to do (you don't have control over this, GNOME Shell has). What you need to do is expose what is needed by the GNOME Shell by implementing the MPRIS interfaces.
(As a side note: the calendar.js
file is the one implementing the notification list, and you can see it uses MPRIS "notifications", which it puts on top of standard notifications.)
There exist Python libraries to do so, such as Mopidy-MPRIS, bit their support for the GNOME Shell seems not to be working at the moment. You may have to look for D-Bus related libraries on FreeDesktop.org. There exists many bindings, with some in Python.
I hope this points you in the right direction.