tano icon indicating copy to clipboard operation
tano copied to clipboard

Gnome shortcuts support

Open Lirein opened this issue 11 years ago • 4 comments

Please add gnome hotkey support, especially needs for multimedia keys handling, for example from xinput (remote control, LIRC, e.t.c).

Lirein avatar Mar 29 '13 15:03 Lirein

Can you provide me with a documentation or example?

ntadej avatar Mar 30 '13 12:03 ntadej

Of course, you can see the code sample in 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;

}

To get valid header you must do once: glib-genmarshal --header --body mediaplayerkeypressed.list > marshal.h

Source example from StackOverflow discussion: http://stackoverflow.com/questions/5744041/cant-get-dbus-signal-listener-to-work-in-c-with-gnome-multimedia-keys

Lirein avatar Mar 30 '13 13:03 Lirein

So you need to listen on dbus? Is there no platform independent solution available?

ntadej avatar Mar 30 '13 15:03 ntadej

Unfortunately no, this solution is for Gnome only. Of course you can use X11 keytest interface for X server implementation, but it doesn't work with Wayland server. Also there are no GNOME for Windows or Mac platform. It's *nix solution only.

UPD: Oh, KDE4 support D-BUS multimedia keys too.

Lirein avatar Mar 30 '13 16:03 Lirein