如何在 Gtk 中制作媒体播放器控件通知?

How do I make a media player control notification in Gtk?

在Rhythmbox(GNOME 的音乐播放器)中,当它正在播放音乐时,您可以打开通知面板并从那里控制音乐播放。这是一个截图。播放控件带有橙色边框;他们有一个小音符图标:

这就是我想做的;媒体播放控件。请注意,虽然它 在通知面板中,但从技术上讲它不是通知,因为它永远不会在屏幕上弹出,您也无法让它消失。在屏幕截图中,您可以看到我不想制作的实际通知,在控件下方

我知道有 Gio.Notification,但这不是我所需要的(除非我大错特错)。我在 GioGdkGtk 中进行了搜索,但没有找到任何内容。我还在 Stack Overflow 上搜索了 [gtk] media control[gtk] media notification,但我也没有找到任何东西。

感谢 BobMorane 的帮助,我现在发现 Rhythmbox 使用 libnotify 作为其播放器控件。我知道如何使用 Notify.Notification 创建动作,我可以让它们有图像等,但我仍然没有弄清楚如何:

  1. 使通知无法关闭;
  2. 使操作按钮在图标和文本旁边,而不是在下面;
  3. 在通知面板中将通知置于所有其他通知之上。

使用Python的help()函数查看gi.repository.Notify.Notification,我认为唯一有潜力的方法是add_action()(特别是它的user_data 参数)和 set_hint()(及其变体)。这些可以用来实现我的目标吗?

如何使用 Python 在 Gtk 中制作媒体控制“通知”,如上所述?

我认为 Rhytmbox 使用的技术是 MPRIS (Media Player R表情I接口S规范)。正如他们在我们的页面上所说:

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.

在 Rhythmbox 中,这在您的案例中作为核心实现 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。如果您停用 MPRIS plug-in,“通知播放器”将不再工作。

在 GNOME Shell 中,您可以看到它们也有自己的 MPRIS 模块 (https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/mpris.js),用于:

  1. 响应播放器通知并显示信息(专辑封面、标题、按钮等)。
  2. 向播放器发送通知(例如:暂停歌曲)。

在这个模块中,按钮的格式和所有这些东西也都栩栩如生。这意味着对于您(播放器的设计者)而言,您不应该进行 UI 格式化(您无法控制它,GNOME Shell 可以)。您需要做的是通过实现 MPRIS 接口公开 GNOME Shell 所需的内容。

(附带说明:calendar.js 文件是实现通知列表的文件,您可以看到它使用 MPRIS“通知”,将其置于标准通知之上。)

存在 Python 库可以这样做,例如 Mopidy-MPRIS,他们对 GNOME Shell 的支持似乎 not to be working at the moment. You may have to look for D-Bus related libraries on FreeDesktop.org. There exists many bindings,其中一些在 Python.

我希望这能为您指明正确的方向。