我正在尝试在Gnome 3(Gnome Shell)下监听MediaKey事件。我找到的所有示例都指的是使用DBus连接到org.gnome.SettingsDaemon.MediaKeys。我的平台上似乎不存在此服务。
我试图通过GObject-Introspection使用Python来做到这一点。例子说做这样的事情
from gi.reposiotry import Gio
connection = Gio.bus_get_sync(Gio.BusType.SESSION, None)
proxy = Gio.DBusProxy.new_sync(connection, 0, None, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys', 'org.gnome.SettingsDaemon.MediaKeys', None)
这失败了,不出所料。我错过了提供此服务的安装,还是我必须以另一种方式执行此操作?
这适用于媒体键侦听器,无论哪个窗口具有焦点,它都会侦听键事件。它适用于甚至没有自己的GUI的应用程序,并且是桌面范围的。这就是我尝试使用Mediakeys DBus服务的原因,但却发现我的桌面缺少它。
我应该清楚,MediaKeys服务不存在。我不能事件连接到服务并创建代理,因为它不存在。我想知道的是,我是否错过了安装,或者是否在Gnome 3更新中删除了此服务?如果删除了,那么我如何在这个新环境中监听媒体密钥?我正在运行Gnome 3.8.2。
抱歉,首先应该提到这一点。有一天,我会完善我的问题: - }。我正在运行Gentoo。
答案 0 :(得分:4)
你真的看到过这个问题吗? can't get dbus signal listener to work in C with gnome multimedia keys
提问者说这段代码有效:
#!/usr/bin/env python
"""Printing out gnome multi media keys via dbus-python.
"""
import gobject
import dbus
import dbus.service
import dbus.mainloop.glib
def on_mediakey(comes_from, what):
""" gets called when multimedia keys are pressed down.
"""
print ('comes from:%s what:%s') % (comes_from, what)
if what in ['Stop','Play','Next','Previous']:
print ('Got a multimedia key!')
else:
print ('Got a multimedia key...')
# set up the glib main loop.
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
bus_object = bus.get_object('org.gnome.SettingsDaemon',
'/org/gnome/SettingsDaemon/MediaKeys')
# this is what gives us the multi media keys.
dbus_interface='org.gnome.SettingsDaemon.MediaKeys'
bus_object.GrabMediaPlayerKeys("MyMultimediaThingy", 0,
dbus_interface=dbus_interface)
# connect_to_signal registers our callback function.
bus_object.connect_to_signal('MediaPlayerKeyPressed',
on_mediakey)
# and we start the main loop.
mainloop = gobject.MainLoop()
mainloop.run()
<强>更新强>:
您的问题似乎与您的Gnome发布有关,就像之前在this bug report中遇到的其他人一样。所以你可能应该升级你的发行版。