本文介绍了不能让DBUS信号监听用C与GNOME多媒体按键工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使自己的应用程序将使用DBUS监听媒体键侏儒。我发现了一个脚本,在python工作,我想使它通过将其转换为C.我的C code构建并运行正常工作,但它不会给DBUS信号作出反应。

这条巨蟒code工作:

 #!的/ usr /斌/包膜蟒蛇
通过DBUS-蟒蛇打印出来GNOME的多媒体键。

进口的GObject
进口DBUS
进口dbus.service
进口dbus.mainloop.glib
高清on_mediakey(comes_from什么):
    当多媒体键pssed下跌$ P $被调用。
    
    打印(来源于:%s的内容:%s'的)%(comes_from,什么)
    如果什么[停止,播放,下一步,previous']:
        打印(有一个多媒体键!)
    其他:
        打印(有一个多媒体键......)#设置了巧舌如簧的主循环。
dbus.mainloop.glib.DBusGMainLoop(set_as_default = TRUE)
总线= dbus.Bus(dbus.Bus.TYPE_SESSION)
bus_object = bus.get_object('org.gnome.SettingsDaemon',
                            '/组织/ GNOME / SettingsDaemon / MediaKeys')#这就是给我们的多媒体键。
dbus_interface ='org.gnome.SettingsDaemon.MediaKeys
bus_object.GrabMediaPlayerKeys(MyMultimediaThingy,0,
                               dbus_interface = dbus_interface)#connect_to_signal注册我们的回调函数。
bus_object.connect_to_signal('MediaPlayerKey pressed',
                             on_mediakey)#,我们开始主循环。
主循环= gobject.MainLoop()
mainloop.run()

我的C code不起作用,缺什么?

 的#include< glib.h>
#包括LT&; DBUS / DBUS-glib.h>静态无效media_key_ pressed(DBusGProxy *代理,为const char *值名称,gpointer USER_DATA){
    了g_print(mediakey:%S,值名称);
}INT
主(INT ARGC,字符** argv的)
{
  DBusGConnection *总线;
  DBusGProxy *代理;
  *的GError错误= NULL;
  GMainLoop *循环;  g_type_init();  循环= g_main_loop_new(NULL,FALSE);  总线= dbus_g_bus_get(DBUS_BUS_SESSION,&安培;错误);
  如果(!总线){
    g_printerr(无法连接到D-BUS守护程序:%S,无错误>消息);
    返回1;
  }  代理= dbus_g_proxy_new_for_name(公共汽车,
                                    org.gnome.SettingsDaemon
                                    /组织/ GNOME / SettingsDaemon / MediaKeys
                                    org.gnome.SettingsDaemon.MediaKeys);  如果(!代理){
      g_printerr(无法创建代理对象);
  }  dbus_g_proxy_add_signal(代理,
                          MediaPlayerKey pressed
                          G_TYPE_STRING,
                          G_TYPE_INVALID);  dbus_g_proxy_connect_signal(代理,
                              MediaPlayerKey pressed
                              G_CALLBACK(media_key_ pressed)
                              空值,
                              空值);  了g_print(启动媒体按键侦听器);
  g_main_loop_run(环);
  返回0;
}


解决方案

我解决了这个问题!必须调用dbus_g_proxy_call名为GrabMediaPlayerKeys(你也可以在Python code看到)

也算下来这是由第一运行此命令来完成编组:

 巧舌如簧,genmarshal --header --body mediaplayerkey pressed.list> marshal.h

,然后使用它在dbus_g_object_register_marshaller功能。

完整的C code:

 的#include< glib.h>
#包括LT&; DBUS / DBUS-glib.h>
#包括marshal.h静态无效media_key_ pressed(DBusGProxy *代理,为const char *值1,为const char *值2,gpointer USER_DATA){
    了g_print(mediakey:%S \\ n,值2);
}INT
主(INT ARGC,字符** argv的)
{
    DBusGConnection *康涅狄格州;
    DBusGProxy *代理;
    *的GError错误;
    GMainLoop *循环;    g_type_init();
    错误= NULL;    康恩= dbus_g_bus_get(DBUS_BUS_SESSION,&安培;错误);
    如果(!康涅狄格州){
        g_printerr(无法连接到D-BUS守护程序:%S \\ n,无错误>消息);
        g_error_free(错误);        返回1;
    }    循环= g_main_loop_new(NULL,FALSE);
    如果(!环路){
        g_printerr(无法创建主循环\\ n);        返回1;
    }    代理= dbus_g_proxy_new_for_name(康涅狄格州,
                                    org.gnome.SettingsDaemon
                                    /组织/ GNOME / SettingsDaemon / MediaKeys
                                    org.gnome.SettingsDaemon.MediaKeys);    如果(!代理){
        g_printerr(无法创建代理对象\\ n);
    }    错误= NULL;
    如果(!dbus_g_proxy_call(代理,
                      GrabMediaPlayerKeys,&安培;错误,
                      G_TYPE_STRING,WebMediaKeys
                      G_TYPE_UINT,0,
                      G_TYPE_INVALID,
                      G_TYPE_INVALID)){
        g_printerr(无法抢媒体播放键:%S \\ n,无错误>消息);
    }    dbus_g_object_register_marshaller(
            g_cclosure_user_marshal_VOID__STRING_STRING,
            G_TYPE_NONE,
            G_TYPE_STRING,
            G_TYPE_STRING,
            G_TYPE_INVALID);    dbus_g_proxy_add_signal(代理,
                          MediaPlayerKey pressed
                          G_TYPE_STRING,
                          G_TYPE_STRING,
                          G_TYPE_INVALID);    dbus_g_proxy_connect_signal(代理,
                              MediaPlayerKey pressed
                              G_CALLBACK(media_key_ pressed)
                              空值,
                              空值);    了g_print(启动媒体按键侦听器\\ n);
    g_main_loop_run(环);    返回0;
}

I'm trying to make my own application that will listen to the media-keys in gnome using dbus. I have found a script that works in python and I'm trying to make it work by converting it to C. My c-code builds and runs correctly but it doesn't respond to the dbus signal.

this python code works:

#!/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()

my c-code does not work, what is missing?

#include <glib.h>
#include <dbus/dbus-glib.h>

static void media_key_pressed(DBusGProxy *proxy, const char *value_name, gpointer user_data) {
    g_print("mediakey: %s",value_name);
}

int
main (int argc, char **argv)
{
  DBusGConnection *bus;
  DBusGProxy *proxy;
  GError *error = NULL;
  GMainLoop *loop;

  g_type_init();

  loop = g_main_loop_new (NULL, FALSE);

  bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
  if (!bus) {
    g_printerr("Failed to connect to the D-BUS daemon: %s", error->message);
    return 1;
  }

  proxy = dbus_g_proxy_new_for_name(bus,
                                    "org.gnome.SettingsDaemon",
                                    "/org/gnome/SettingsDaemon/MediaKeys",
                                    "org.gnome.SettingsDaemon.MediaKeys");

  if(!proxy) {
      g_printerr("Could not create proxy object");
  }

  dbus_g_proxy_add_signal(proxy,
                          "MediaPlayerKeyPressed",
                          G_TYPE_STRING,
                          G_TYPE_INVALID);

  dbus_g_proxy_connect_signal(proxy,
                              "MediaPlayerKeyPressed",
                              G_CALLBACK(media_key_pressed),
                              NULL,
                              NULL);

  g_print("Starting media key listener");
  g_main_loop_run (loop);
  return 0;
}
解决方案

I solved the problem! Must call dbus_g_proxy_call with the name "GrabMediaPlayerKeys" (which you also can see in the python code)

Must also register a marshaller which is done by first running this command:

glib-genmarshal --header --body mediaplayerkeypressed.list > marshal.h

and then use it in the dbus_g_object_register_marshaller function.

The complete C-code:

#include <glib.h>
#include <dbus/dbus-glib.h>
#include "marshal.h"

static void media_key_pressed(DBusGProxy *proxy, const char *value1, const char *value2, gpointer user_data) {
    g_print("mediakey: %s\n",value2);
}

int
main (int argc, char **argv)
{
    DBusGConnection *conn;
    DBusGProxy *proxy;
    GError *error;
    GMainLoop *loop;

    g_type_init();
    error = NULL;

    conn = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
    if (!conn) {
        g_printerr("Failed to connect to the D-BUS daemon: %s\n", error->message);
        g_error_free(error);

        return 1;
    }

    loop = g_main_loop_new (NULL, FALSE);
    if(!loop) {
        g_printerr("Could not create mainloop\n");

        return 1;
    }

    proxy = dbus_g_proxy_new_for_name(conn,
                                    "org.gnome.SettingsDaemon",
                                    "/org/gnome/SettingsDaemon/MediaKeys",
                                    "org.gnome.SettingsDaemon.MediaKeys");

    if(!proxy) {
        g_printerr("Could not create proxy object\n");
    }

    error = NULL;
    if(!dbus_g_proxy_call(proxy,
                      "GrabMediaPlayerKeys", &error,
                      G_TYPE_STRING, "WebMediaKeys",
                      G_TYPE_UINT, 0,
                      G_TYPE_INVALID,
                      G_TYPE_INVALID)) {
        g_printerr("Could not grab media player keys: %s\n", error->message);
    }

    dbus_g_object_register_marshaller (
            g_cclosure_user_marshal_VOID__STRING_STRING,
            G_TYPE_NONE,
            G_TYPE_STRING,
            G_TYPE_STRING,
            G_TYPE_INVALID);

    dbus_g_proxy_add_signal(proxy,
                          "MediaPlayerKeyPressed",
                          G_TYPE_STRING,
                          G_TYPE_STRING,
                          G_TYPE_INVALID);

    dbus_g_proxy_connect_signal(proxy,
                              "MediaPlayerKeyPressed",
                              G_CALLBACK(media_key_pressed),
                              NULL,
                              NULL);

    g_print("Starting media key listener\n");
    g_main_loop_run (loop);

    return 0;
}

这篇关于不能让DBUS信号监听用C与GNOME多媒体按键工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-26 12:34