帮助通过“强制”获取 Gnome 设置媒体键焦点

帮助通过“强制”获取 Gnome 设置媒体键焦点

我正在尝试创建一个应用程序来监听 Gnome 发送的事件gsd-媒体键我已经实现了这个目标,但是其他应用程序(例如 VLC 和 Chrome)在启动时“窃取”了我的应用程序的焦点。

我意识到这些应用程序使用的方法与我在我的应用程序中要求 gnome 向它发送消息的方法不同,而且我还意识到我使用的方法无法执行相同的操作(窃取焦点),我只能在这些其他应用程序均未打开时让我的应用程序接收消息(这很自私,但无论如何......)。

我正在使用 node.js 进行这些测试,这是具有此处描述的行为的代码:

const DBus = require('dbus');

try {
  const dbus = new DBus();
  const session = dbus.getBus('session');

  session.getInterface('org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys',
    'org.gnome.SettingsDaemon.MediaKeys', (err, iface) => {
      if (!err) {
        iface.on('MediaPlayerKeyPressed', (n, keyName) => {
          console.log(n, keyName);
        });
        iface.GrabMediaPlayerKeys('Custom-Player', 'org.gnome.SettingsDaemon.MediaKeys');
      } else {
        console.error(err);
      }
    });
}
catch (e) {
  console.log(e);
}

这些是我的应用程序连接到 dbus 时在 JournalCtl 中生成的日志:

gsd-media-keys[134383]: Calling method 'GrabMediaPlayerKeys' for media-keys
gsd-media-keys[134383]: Registering Custom-Player at 2102244559

这些是 chrome 和 vlc 启动时生成的:

# VLC
gsd-media-keys[134383]: Updating client: index=202 name='Native client (UNIX socket client)'
gsd-media-keys[134383]: Updating client: index=202 name='VLC media player (LibVLC 3.0.9.2)'
gsd-media-keys[134383]: Creating proxy for for org.mpris.MediaPlayer2.vlc

# Chrome
gsd-media-keys[134383]: Updating client: index=214 name='Native client (UNIX socket client)'
gsd-media-keys[134383]: Updating client: index=214 name='Chrome input'
gsd-media-keys[134383]: Creating proxy for for org.mpris.MediaPlayer2.chrome.instance139709

我试图了解 Chrome 和 VLC 如何与 gsd-media-keys 通信以及如何在我的应用程序中实现相同的行为,我的印象是这两个应用程序不是通过 DBUS 来实现这一点的(我现在犹豫着是否要去他们的源代码中找出 rs)。

有人能帮我了解发生了什么事,或者给我一些能让我更清楚的资料吗?因为我花了很多时间研究,但我不知道在哪里或到底要找什么。☹

相关内容