我正在尝试创建一个应用程序来监听 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)。
有人能帮我了解发生了什么事,或者给我一些能让我更清楚的资料吗?因为我花了很多时间研究,但我不知道在哪里或到底要找什么。☹