2011-04-21 4 views
1

dbus를 사용하여 gnome의 미디어 키를 수신하는 자체 응용 프로그램을 만들려고합니다. 파이썬에서 작동하는 스크립트를 발견했으며이를 C로 변환하여 작동하도록했습니다. 제 C 코드가 올바르게 빌드 및 실행되지만 dbus 신호에 응답하지 않습니다.gnome 멀티미디어 키를 사용하여 dbus 신호 리스너를 C에서 사용할 수 없습니다.

이 파이썬 코드가 작동합니다

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

내 C 코드가 작동하지 않습니다, 무엇을 누락?

#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; 
} 

답변

2

나는이 문제를 해결했다! 이름으로 (당신은 또한 파이썬 코드에서 볼 수있다) "GrabMediaPlayerKeys을"dbus_g_proxy_call 호출해야합니다

도 먼저이 명령을 실행하여 이루어집니다 마샬 등록해야합니다 :

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

다음에서 사용을 dbus_g_object_register_marshaller 함수.

전체 C 코드 : 위대한

#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; 
} 
+0

. 답변을 수락 된 것으로 표시하여 사람들이 해결 방법을 알 수 있도록하십시오. – MByD

+0

할 수있을 때까지하겠습니다. 21 시간 남았습니다 ... ;-) – Daverix