diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/Makefile.am | 43 | ||||
-rw-r--r-- | src/settings-manager.vala | 4 | ||||
-rw-r--r-- | src/sound-service-dbus.c | 233 | ||||
-rw-r--r-- | src/sound-service-dbus.h | 1 | ||||
-rw-r--r-- | src/title-menu-item.vala | 2 | ||||
-rw-r--r-- | src/transport-menu-item.vala | 8 |
7 files changed, 191 insertions, 102 deletions
diff --git a/configure.ac b/configure.ac index 62220a5..9a08077 100644 --- a/configure.ac +++ b/configure.ac @@ -37,7 +37,7 @@ INDICATE_REQUIRED_VERSION=0.4.1 DBUSMENUGLIB_REQUIRED_VERSION=0.3.9 GIO_2_0_REQUIRED_VERSION=2.25.13 -PKG_CHECK_MODULES(APPLET,gtk+-2.0 >= $GTK_REQUIRED_VERSION +PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION indicator >= $INDICATOR_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS) diff --git a/src/Makefile.am b/src/Makefile.am index 7fe7e0f..8303183 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,8 +18,7 @@ libsoundmenu_la_SOURCES = \ title-widget.h \ volume-widget.c \ volume-widget.h \ - dbus-shared-names.h \ - sound-service-client.h + dbus-shared-names.h libsoundmenu_la_CFLAGS = $(APPLET_CFLAGS) -Wall -DG_LOG_DOMAIN=\"Indicator-Sound\" libsoundmenu_la_LIBADD = $(APPLET_LIBS) @@ -29,27 +28,11 @@ checkxml: $(srcdir)/sound-service.xml @xmllint -valid -noout $< @echo $< checks out ok -sound-service-client.h: $(srcdir)/sound-service.xml - dbus-binding-tool \ - --prefix=_sound_service_client \ - --mode=glib-client \ - --output=sound-service-client.h \ - $(srcdir)/sound-service.xml - #################################################################### # Sound Service #################################################################### -################# -# dbus interface -################# -sound-service-server.h: $(srcdir)/sound-service.xml - dbus-binding-tool \ - --prefix=_sound_service_server \ - --mode=glib-server \ - --output=sound-service-server.h \ - $(srcdir)/sound-service.xml ##################### # libsoundmenu vala @@ -78,7 +61,7 @@ music_bridge_VALAFLAGS = \ --vapidir=./ \ --thread \ --pkg gee-1.0 \ - --pkg Dbusmenu-Glib-0.2 \ + --pkg Dbusmenu-Glib-0.4 \ --pkg common-defs \ --pkg gio-2.0 \ --pkg gio-unix-2.0 \ @@ -108,7 +91,6 @@ indicator_sound_service_SOURCES = \ pulse-manager.c \ sound-service-dbus.h \ sound-service-dbus.c \ - sound-service-server.h \ slider-menu-item.h \ slider-menu-item.c \ $(music_bridge_VALASOURCES:.vala=.c) @@ -117,9 +99,24 @@ indicator_sound_service_CFLAGS = $(PULSEAUDIO_CFLAGS) $(SOUNDSERVICE_CFLAGS) $(G indicator_sound_service_LDADD = $(PULSEAUDIO_LIBS) $(SOUNDSERVICE_LIBS) $(GCONF_LIBS) ######################### -# Extra stuff to package +# Service xml compilation ######################### -EXTRA_DIST = \ +DBUS_SPECS = \ + sound-service.xml + +gen-%.xml.h: %.xml + @echo "Building $@ from $<" + @echo "extern const char * _$(subst -,_,$(subst .,_,$(basename $<)));" > $@ + +gen-%.xml.c: %.xml + @echo "Building $@ from $<" + @echo "const char * _$(subst -,_,$(subst .,_,$(basename $<))) = " > $@ + @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@ + @echo ";" >> $@ + + +EXTRA_DIST += \ + $(DBUS_SPECS) sound-service.xml \ sound-service.list \ $(music_bridge_APIFILES) \ @@ -133,6 +130,8 @@ BUILT_SOURCES = \ sound-service-client.h \ sound-service-server.h \ $(music_bridge_APIFILES) \ + gen-indicator-service.xml.h \ + gen-indicator-service.xml.c \ $(music_bridge_VALASOURCES:.vala=.c) CLEANFILES = \ diff --git a/src/settings-manager.vala b/src/settings-manager.vala index 57b4487..380e442 100644 --- a/src/settings-manager.vala +++ b/src/settings-manager.vala @@ -55,7 +55,7 @@ public class SettingsManager : GLib.Object public void add_interested(string app_desktop_name) { var already_interested = this.settings.get_strv ("interested-media-players"); - foreach ( var s in already_interested){ + foreach (var s in already_interested){ if ( s == app_desktop_name ) return; } already_interested += (app_desktop_name); @@ -68,4 +68,4 @@ public class SettingsManager : GLib.Object { this.blacklist_updates(this.settings.get_strv ("blacklisted-media-players")); } -}
\ No newline at end of file +} diff --git a/src/sound-service-dbus.c b/src/sound-service-dbus.c index 0760247..c574705 100644 --- a/src/sound-service-dbus.c +++ b/src/sound-service-dbus.c @@ -3,7 +3,7 @@ * * Authors: * Conor Curran <conor.curran@canonical.com> - * Cody Russell <crussell@canonical.com> + * Ted Gould <ted.gould@canonical.com> * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published @@ -22,22 +22,28 @@ #include "config.h" #endif -#include <dbus/dbus-glib.h> +#include <gio/gio.h> +#include "gen-indicator-service.xml.h" #include "dbus-shared-names.h" #include "sound-service-dbus.h" #include "common-defs.h" #include "pulse-manager.h" // DBUS methods -static gboolean sound_service_dbus_get_sink_mute(SoundServiceDbus* service, gboolean* mute_input, GError** gerror); -static gboolean sound_service_dbus_get_sink_availability(SoundServiceDbus* service, gboolean* availability_input, GError** gerror); +static void bus_method_call (GDBusConnection * connection, + const gchar * sender, + const gchar * path, + const gchar * interface, + const gchar * method, + GVariant * params, + GDBusMethodInvocation * invocation, + gpointer user_data); -#include "sound-service-server.h" typedef struct _SoundServiceDbusPrivate SoundServiceDbusPrivate; struct _SoundServiceDbusPrivate { - DBusGConnection *connection; + GDBusConnection *connection; gboolean mute; gboolean sink_availability; }; @@ -50,6 +56,8 @@ enum { LAST_SIGNAL }; +static GDBusNodeInfo * node_info = NULL; +static GDBusInterfaceInfo * interface_info = NULL; static guint signals[LAST_SIGNAL] = { 0 }; @@ -74,31 +82,50 @@ sound_service_dbus_class_init (SoundServiceDbusClass *klass) object_class->finalize = sound_service_dbus_finalize; g_assert(klass != NULL); - dbus_g_object_type_install_info(SOUND_SERVICE_DBUS_TYPE, - &dbus_glib__sound_service_server_object_info); - - signals[SINK_INPUT_WHILE_MUTED] = g_signal_new("sink-input-while-muted", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN); - - signals[SINK_MUTE_UPDATE] = g_signal_new("sink-mute-update", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN); - signals[SINK_AVAILABLE_UPDATE] = g_signal_new("sink-available-update", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + dbus_g_object_type_install_info (SOUND_SERVICE_DBUS_TYPE, + &dbus_glib__sound_service_server_object_info); + + signals[SINK_INPUT_WHILE_MUTED] = g_signal_new ("sink-input-while-muted", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + signals[SINK_MUTE_UPDATE] = g_signal_new ("sink-mute-update", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + signals[SINK_AVAILABLE_UPDATE] = g_signal_new ("sink-available-update", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + if (node_info == NULL) { + GError * error = NULL; + + node_info = g_dbus_node_info_new_for_xml(_indicator_service, &error); + if (error != NULL) { + g_error("Unable to parse Indicator Service Interface description: %s", + error->message); + g_error_free(error); + } + } + + if (interface_info == NULL) { + interface_info = g_dbus_node_info_lookup_interface (node_info, + INDICATOR_SOUND_SERVICE_DBUS_INTERFACE); + + if (interface_info == NULL) { + g_error("Unable to find interface '" INDICATOR_SOUND_SERVICE_DBUS_INTERFACE "'"); + } + } } static void @@ -112,20 +139,29 @@ sound_service_dbus_init (SoundServiceDbus *self) priv->sink_availability = FALSE; /* Fetch the session bus */ - priv->connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + priv->connection = g_bus_get_sync (DBUS_BUS_SESSION, NULL, &error); if (error != NULL) { - g_error("sound-service-dbus:Unable to connect to the session bus when creating indicator sound service : %s", error->message); + g_error("sound-service-dbus:Unable to connect to the session bus when + creating indicator sound service : %s", error->message); g_error_free(error); return; } /* register the service on it */ - dbus_g_connection_register_g_object(priv->connection, - INDICATOR_SOUND_SERVICE_DBUS_OBJECT, - G_OBJECT(self)); + g_dbus_connection_register_object (priv->connection, + INDICATOR_SOUND_SERVICE_DBUS_OBJECT, + interface_info, + NULL, + NULL, + NULL, + &error); + if (error != NULL) { + g_error("Unable to register the object to DBus: %s", error->message); + g_error_free(error); + return; + } } - static void sound_service_dbus_dispose (GObject *object) { @@ -140,60 +176,113 @@ sound_service_dbus_finalize (GObject *object) return; } - -static gboolean sound_service_dbus_get_sink_mute (SoundServiceDbus *self, gboolean *mute_input, GError** gerror) -{ - SoundServiceDbusPrivate *priv = SOUND_SERVICE_DBUS_GET_PRIVATE (self); - g_debug("Get sink mute - sound service dbus!, about to send over mute_value of %i", priv->mute); - *mute_input = priv->mute; - return TRUE; +/* A method has been called from our dbus inteface. Figure out what it + is and dispatch it. */ +static void +bus_method_call (GDBusConnection * connection, + const gchar * sender, + const gchar * path, + const gchar * interface, + const gchar * method, + GVariant * params, + GDBusMethodInvocation * invocation, + gpointer user_data) +{ + IndicatorService * service = INDICATOR_SERVICE(user_data); + GVariant * retval = NULL; + + if (g_strcmp0(method, "GetSinkMute") == 0) { + SoundServiceDbusPrivate *priv = SOUND_SERVICE_DBUS_GET_PRIVATE (self); + g_debug("Get sink mute - sound service dbus!, + about to send over mute_value of %i", priv->mute); + retval = g_variant_new_boolean (priv->mute); + } + else if (g_strcmp0(method, "GetSinkAvailability") == 0) { + SoundServiceDbusPrivate *priv = SOUND_SERVICE_DBUS_GET_PRIVATE (self); + g_debug("Get sink availability - sound service dbus!, + about to send over availability_value of %i", priv->sink_availability); + retval = g_variant_new_boolean (priv->sink_availability); + } + else { + g_warning("Calling method '%s' on the sound service but it's unknown", method); + } + g_dbus_method_invocation_return_value(invocation, retval); } -static gboolean sound_service_dbus_get_sink_availability (SoundServiceDbus *self, gboolean *availability_input, GError** gerror) -{ - SoundServiceDbusPrivate *priv = SOUND_SERVICE_DBUS_GET_PRIVATE (self); - g_debug("Get sink availability - sound service dbus!, about to send over availability_value of %i", priv->sink_availability); - *availability_input = priv->sink_availability; - return TRUE; -} /** SIGNALS Utility methods to emit signals from the service into the ether. **/ -void sound_service_dbus_sink_input_while_muted(SoundServiceDbus* obj, gboolean block_value) +void sound_service_dbus_sink_input_while_muted(SoundServiceDbus* obj, + gboolean block_value) { - /* g_debug("Emitting signal: SINK_INPUT_WHILE_MUTED, with block_value: %i", block_value);*/ - g_signal_emit(obj, - signals[SINK_INPUT_WHILE_MUTED], - 0, - block_value); + g_debug("Emitting signal: SINK_INPUT_WHILE_MUTED, with block_value: %i", + block_value); + SoundServiceDbusPrivate *priv = SOUND_SERVICE_DBUS_GET_PRIVATE (obj); + GVariant* v_output = g_variant_new_boolean (block_value); + + GError * error = NULL; + + g_dbus_connection_emit_signal( priv->connection, + INDICATOR_SOUND_DBUS_NAME, + INDICATOR_SOUND_DBUS_OBJECT, + INDICATOR_SOUND_SERVICE_DBUS_INTERFACE, + "SinkInputWhileMuted", + v_output, + &error ); + if (error != NULL) { + g_error("Unable to emit signal 'sinkinputwhilemuted' because : %s", error->message); + g_error_free(error); + return; + } } -void sound_service_dbus_update_sink_mute(SoundServiceDbus* obj, gboolean sink_mute) +void sound_service_dbus_update_sink_mute(SoundServiceDbus* obj, + gboolean sink_mute) { - /* g_debug("Emitting signal: SINK_MUTE_UPDATE, with sink mute %i", sink_mute);*/ - + g_debug("Emitting signal: SINK_MUTE_UPDATE, with sink mute %i", sink_mute); SoundServiceDbusPrivate *priv = SOUND_SERVICE_DBUS_GET_PRIVATE (obj); - priv->mute = sink_mute; + GVariant* v_output = g_variant_new_boolean (sink_mute); - g_signal_emit(obj, - signals[SINK_MUTE_UPDATE], - 0, - priv->mute); + GError * error = NULL; + + g_dbus_connection_emit_signal( priv->connection, + INDICATOR_SOUND_DBUS_NAME, + INDICATOR_SOUND_DBUS_OBJECT, + INDICATOR_SOUND_SERVICE_DBUS_INTERFACE, + "SinkMuteUpdate", + v_output, + &error ); + if (error != NULL) { + g_error("Unable to emit signal 'sinkmuteupdate' because : %s", error->message); + g_error_free(error); + return; + } } -void sound_service_dbus_update_sink_availability(SoundServiceDbus* obj, gboolean sink_availability) +void sound_service_dbus_update_sink_availability(SoundServiceDbus* obj, + gboolean sink_availability) { /* g_debug("Emitting signal: SINK_AVAILABILITY_UPDATE, with value %i", sink_availability);*/ - + g_debug("Emitting signal: SinkAvailableUpdate, with %i", sink_availability); SoundServiceDbusPrivate *priv = SOUND_SERVICE_DBUS_GET_PRIVATE (obj); - priv->sink_availability = sink_availability; + GVariant* v_output = g_variant_new_boolean (sink_availability); + + GError * error = NULL; - g_signal_emit(obj, - signals[SINK_AVAILABLE_UPDATE], - 0, - priv->sink_availability); + g_dbus_connection_emit_signal( priv->connection, + INDICATOR_SOUND_DBUS_NAME, + INDICATOR_SOUND_DBUS_OBJECT, + INDICATOR_SOUND_SERVICE_DBUS_INTERFACE, + "SinkAvailableUpdate", + v_output, + &error ); + if (error != NULL) { + g_error("Unable to emit signal 'SinkAvailableUpdate' because : %s", error->message); + g_error_free(error); + return; + } } diff --git a/src/sound-service-dbus.h b/src/sound-service-dbus.h index b6e8193..0d1573b 100644 --- a/src/sound-service-dbus.h +++ b/src/sound-service-dbus.h @@ -48,6 +48,7 @@ struct _SoundServiceDbus { struct _SoundServiceDbusClass { GObjectClass parent_class; }; + GType sound_service_dbus_get_type (void) G_GNUC_CONST; // Utility methods to get the SIGNAL messages across into the sound-service-dbus diff --git a/src/title-menu-item.vala b/src/title-menu-item.vala index 0b99ae3..6ed24d8 100644 --- a/src/title-menu-item.vala +++ b/src/title-menu-item.vala @@ -31,7 +31,7 @@ public class TitleMenuitem : PlayerItem this.property_set_bool(MENUITEM_RUNNING, false); } - public override void handle_event(string name, GLib.Value input_value, uint timestamp) + public override void handle_event(string name, Variant input_value, uint timestamp) { if(this.owner.current_state == PlayerController.state.OFFLINE) { diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala index 0e4e6ee..55ee3b3 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -36,8 +36,8 @@ public class TransportMenuitem : PlayerItem public TransportMenuitem(PlayerController parent) { - Object(item_type: MENUITEM_TYPE, owner: parent); - this.property_set_int(MENUITEM_PLAY_STATE, 1); + Object(item_type: MENUITEM_TYPE, owner: parent); + this.property_set_int(MENUITEM_PLAY_STATE, 1); } public void change_play_state(state update) @@ -47,9 +47,9 @@ public class TransportMenuitem : PlayerItem this.property_set_int(MENUITEM_PLAY_STATE, update); } - public override void handle_event(string name, GLib.Value input_value, uint timestamp) + public override void handle_event(string name, Variant input_value, uint timestamp) { - int input = input_value.get_int(); + int input = input_value.get_int32(); debug("handle_event with value %s", input.to_string()); debug("transport owner name = %s", this.owner.app_info.get_name()); this.owner.mpris_bridge.transport_update((action)input); |