# HG changeset patch # User Sascha Hlusiak # Date 1190124607 -7200 # Node ID 655949f889ece338e24eb26421d73787eb15693f # Parent ff587f35467a9972fe3d187300a150c374505740 New Gnome shortcuts plugin to listen for Gnome's shortcuts over dbus diff -r ff587f35467a -r 655949f889ec configure.ac --- a/configure.ac Tue Sep 18 12:47:51 2007 +0000 +++ b/configure.ac Tue Sep 18 16:10:07 2007 +0200 @@ -447,6 +447,27 @@ GENERAL_PLUGINS="$GENERAL_PLUGINS hotkey" fi +dnl *** Gnome Shortcuts Plugin + +AC_ARG_ENABLE(gnomeshortcuts, + [ --disable-gnomeshortcuts disable gnome shortcuts (default=enabled)], + [enable_gnomeshortcuts=$enableval], + [enable_gnomeshortcuts="yes"] +) + +if test "x$enable_gnomeshortcuts" = "xyes"; then + have_gnomeshortcuts="yes" + PKG_CHECK_MODULES(DBUS, [dbus-1 >= 0.60 dbus-glib-1 >= 0.60],, + [AC_MSG_ERROR([Cannot find dbus-glib >= 0.60 for gnomeshortcuts plugin])]) +else + AC_MSG_RESULT([*** Gnome Shortcuts Plugin disabled per user request ***]) + have_gnomeshortcuts="no" +fi + +if test "x$have_gnomeshortcuts" = "xyes"; then + GENERAL_PLUGINS="$GENERAL_PLUGINS gnomeshortcuts" +fi + dnl *** Status Icon plugin (for X11 only) AC_ARG_ENABLE(statusicon, @@ -1581,6 +1602,7 @@ echo " -> X Composite support: $have_aosd_xcomp" echo " Control via event device (evdev-plug): $have_evdevplug" echo " Global Hotkey Plugin: $have_hotkey" +echo " Gnome Shortcuts Plugin: $have_gnomeshortcuts" echo " LIRC: $have_lirc" echo " AudioScrobbler Client: $scrobbler" echo " Upload to MTP device: $have_mtp_up" diff -r ff587f35467a -r 655949f889ec src/gnomeshortcuts/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gnomeshortcuts/Makefile Tue Sep 18 16:10:07 2007 +0200 @@ -0,0 +1,16 @@ +include ../../mk/rules.mk +include ../../mk/init.mk + +OBJECTIVE_LIBS = libgnomeshortcuts$(SHARED_SUFFIX) + +LIBDIR = $(plugindir)/$(GENERAL_PLUGIN_DIR) + +LIBADD = $(GLIB_LIBS) $(DBUS_LIBS) +SOURCES = gnomeshortcuts.c + +OBJECTS = ${SOURCES:.c=.o} + +CFLAGS += $(PICFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) \ + -I../../intl -I../.. -I.. + +include ../../mk/objective.mk diff -r ff587f35467a -r 655949f889ec src/gnomeshortcuts/gnomeshortcuts.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gnomeshortcuts/gnomeshortcuts.c Tue Sep 18 16:10:07 2007 +0200 @@ -0,0 +1,307 @@ +/* -*- Mode: C; indent-tabs: t; c-basic-offset: 9; tab-width: 9 -*- */ +/* + * This file is part of audacious-gnome-shortcut plugin for audacious + * + * Copyright (c) 2007 Sascha Hlusiak + * Name: plugin.c + * Description: plugin.c + * + * audacious-gnome-shortcut is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * audacious-gnome-shortcut is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with audacious-gnome-shortcut; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + + +static void init (void); +static void about (void); +static void cleanup (void); +void gnome_remote_init(); +void gnome_remote_uninit(); + +static gboolean loaded = FALSE; +static DBusGProxy *media_player_keys_proxy = NULL; + +static GeneralPlugin audaciousgnomeshortcuts = +{ + .description = "Gnome Shortcuts", + .init = init, + .about = about, + .cleanup = cleanup +}; + +GeneralPlugin *gnomeshortcuts_gplist[] = { &audaciousgnomeshortcuts, NULL }; +SIMPLE_GENERAL_PLUGIN(gnomeshortcuts, gnomeshortcuts_gplist); + +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) + + +static void +hotkey_marshal_VOID__STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_STRING) (gpointer data1, + gpointer arg_1, + gpointer arg_2); + register GMarshalFunc_VOID__STRING_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + } else { + data1 = g_value_peek_pointer (param_values + 0); + } + callback = (GMarshalFunc_VOID__STRING_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_string (param_values + 2)); +} + +static void +on_media_player_key_pressed (DBusGProxy *proxy, const gchar *application, const gchar *key) +{ + if (strcmp ("Audacious", application) == 0) { + gint current_volume, old_volume; + static gint volume_static = 0; + gboolean play, mute; + + /* playing or not */ + play = audacious_drct_is_playing (); + + /* get current volume */ + audacious_drct_get_volume_main (¤t_volume); + old_volume = current_volume; + if (current_volume) + { + /* volume is not mute */ + mute = FALSE; + } else { + /* volume is mute */ + mute = TRUE; + } + + /* mute the playback */ + if (strcmp ("Mute", key) == 0) + { + if (!mute) + { + volume_static = current_volume; + audacious_drct_set_main_volume (0); + mute = TRUE; + } else { + audacious_drct_set_main_volume (volume_static); + mute = FALSE; + } + return; + } + + /* decreace volume */ +/* if ((keycode == plugin_cfg.vol_down) && (state == plugin_cfg.vol_down_mask)) + { + if (mute) + { + current_volume = old_volume; + old_volume = 0; + mute = FALSE; + } + + if ((current_volume -= plugin_cfg.vol_decrement) < 0) + { + current_volume = 0; + } + + if (current_volume != old_volume) + { + xmms_remote_set_main_volume (audacioushotkey.xmms_session, + current_volume); + } + + old_volume = current_volume; + return TRUE; + }*/ + + /* increase volume */ +/* if ((keycode == plugin_cfg.vol_up) && (state == plugin_cfg.vol_up_mask)) + { + if (mute) + { + current_volume = old_volume; + old_volume = 0; + mute = FALSE; + } + + if ((current_volume += plugin_cfg.vol_increment) > 100) + { + current_volume = 100; + } + + if (current_volume != old_volume) + { + xmms_remote_set_main_volume (audacioushotkey.xmms_session, + current_volume); + } + + old_volume = current_volume; + return TRUE; + }*/ + + /* play */ + if (strcmp ("Play", key) == 0) + { + if (!play) + { + audacious_drct_play (); + } else { + audacious_drct_pause (); + } + return; + } + + /* pause */ + if (strcmp ("Pause", key) == 0) + { + if (!play) audacious_drct_play (); + else audacious_drct_pause (); + + return; + } + + /* stop */ + if (strcmp ("Stop", key) == 0) + { + audacious_drct_stop (); + return; + } + + /* prev track */ + if (strcmp ("Previous", key) == 0) + { + audacious_drct_playlist_prev (); + return; + } + + /* next track */ + if (strcmp ("Next", key) == 0) + { + audacious_drct_playlist_next (); + return; + } + } +} + +void gnome_remote_uninit () +{ + GError *error = NULL; + if (media_player_keys_proxy == NULL) return; + + dbus_g_proxy_disconnect_signal (media_player_keys_proxy, "MediaPlayerKeyPressed", + G_CALLBACK (on_media_player_key_pressed), NULL); + + dbus_g_proxy_call (media_player_keys_proxy, + "ReleaseMediaPlayerKeys", &error, + G_TYPE_STRING, "Audacious", + G_TYPE_INVALID, G_TYPE_INVALID); + if (error != NULL) { + g_warning ("Could not release media player keys: %s", error->message); + g_error_free (error); + } + g_object_unref(media_player_keys_proxy); + media_player_keys_proxy = NULL; +} + +void gnome_remote_init () +{ + DBusGConnection *bus; + GError *error = NULL; + dbus_g_thread_init(); + + bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + if ((bus == NULL) || error) { + g_warning ("Error connecting to DBus: %s", error->message); + } else { + media_player_keys_proxy = dbus_g_proxy_new_for_name (bus, + "org.gnome.SettingsDaemon", + "/org/gnome/SettingsDaemon", + "org.gnome.SettingsDaemon"); + if (media_player_keys_proxy == NULL) return; + + dbus_g_proxy_call (media_player_keys_proxy, + "GrabMediaPlayerKeys", &error, + G_TYPE_STRING, "Audacious", + G_TYPE_UINT, 0, + G_TYPE_INVALID, + G_TYPE_INVALID); + if (error != NULL) { + g_warning ("Could not release media player keys: %s", error->message); + g_error_free (error); + } + + dbus_g_object_register_marshaller (hotkey_marshal_VOID__STRING_STRING, + G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + + dbus_g_proxy_add_signal (media_player_keys_proxy, "MediaPlayerKeyPressed", + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + + dbus_g_proxy_connect_signal (media_player_keys_proxy, "MediaPlayerKeyPressed", + G_CALLBACK (on_media_player_key_pressed), NULL, NULL); + } +} + +static void about (void) +{ + static GtkWidget *dialog; + + dialog = audacious_info_dialog (_("About Gnome Shortcut Plugin"), + _("Gnome Shortcut Plugin\n" + "Let's you control the player with Gnome's shortcuts.\n\n" + "Copyright (C) 2007 Sascha Hlusiak \n\n" + ), + _("OK"), TRUE, NULL, NULL); + + gtk_signal_connect(GTK_OBJECT(dialog), "destroy", + GTK_SIGNAL_FUNC(gtk_widget_destroyed), &dialog); +} + +static void init (void) +{ + gnome_remote_init(); + loaded = TRUE; +} + +static void cleanup (void) +{ + if (!loaded) return; + gnome_remote_uninit(); + loaded = FALSE; +}