From 9a0a7255bfdcc1441277e211b4d45dffedb34e1f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 24 Jan 2011 09:24:42 -0600 Subject: refactoring the indicator --- src/sound-state-manager.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 src/sound-state-manager.c (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c new file mode 100644 index 0000000..a2121ad --- /dev/null +++ b/src/sound-state-manager.c @@ -0,0 +1,178 @@ +/* +Copyright 2011 Canonical Ltd. + +Authors: + Conor Curran + +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 +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, 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 this program. If not, see . +*/ + +#include "sound-state-manager.h" + +typedef struct _SoundStateManagerPrivate SoundStateManagerPrivate; + +struct _SoundStateManagerPrivate +{ + GDBusProxy* dbus_proxy; + GHashTable* volume_states; + GList* blocked_animation_list; +}; + +#define SOUND_STATE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUND_TYPE_STATE_MANAGER, SoundStateManagerPrivate)) + +static GtkImage *speaker_image = NULL; +static gint current_state = 0; +static gint previous_state = 0; +static GtkIconSize design_team_size; +static gint blocked_id; +static gint animation_id; + +static GList * blocked_animation_list = NULL; +static GList * blocked_iter = NULL; +static void prepare_blocked_animation(); +static gboolean fade_back_to_mute_image(); +static gboolean start_animation(); +static void reset_mute_blocking_animation(); +static void free_the_animation_list(); + +G_DEFINE_TYPE (SoundStateManager, sound_state_manager, G_TYPE_OBJECT); + +static void +sound_state_manager_init (SoundStateManager *object) +{ + /* TODO: Add initialization code here */ +} + +static void +sound_state_manager_finalize (GObject *object) +{ + /* TODO: Add deinitalization code here */ + + G_OBJECT_CLASS (sound_state_manager_parent_class)->finalize (object); +} + +static void +sound_state_manager_class_init (SoundStateManagerClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + GObjectClass* parent_class = G_OBJECT_CLASS (klass); + + object_class->finalize = sound_state_manager_finalize; +} + +/* +Prepare states Array. +*/ +void +sound_state_manager_prepare_state_machine(SoundStateManager* self) +{ + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + priv->volume_states = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); + g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(MUTED), g_strdup("audio-volume-muted-panel")); + g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(ZERO_LEVEL), g_strdup("audio-volume-low-zero-panel")); + g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(LOW_LEVEL), g_strdup("audio-volume-low-panel")); + g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(MEDIUM_LEVEL), g_strdup("audio-volume-medium-panel")); + g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(HIGH_LEVEL), g_strdup("audio-volume-high-panel")); + g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(BLOCKED), g_strdup("audio-volume-muted-blocking-panel")); + g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(UNAVAILABLE), g_strdup("audio-output-none-panel")); +} + +/* +prepare_blocked_animation: +Prepares the array of images to be used in the blocked animation. +Only called at startup. +*/ +static void +sound_state_manager_prepare_blocked_animation(SoundStateManager* self) +{ + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + + gchar* blocked_name = g_hash_table_lookup(priv->volume_states, + GINT_TO_POINTER(BLOCKED)); + gchar* muted_name = g_hash_table_lookup(priv->volume_states, + GINT_TO_POINTER(MUTED)); + + GtkImage* temp_image = indicator_image_helper(muted_name); + GdkPixbuf* mute_buf = gtk_image_get_pixbuf(temp_image); + + temp_image = indicator_image_helper(blocked_name); + GdkPixbuf* blocked_buf = gtk_image_get_pixbuf(temp_image); + + if (mute_buf == NULL || blocked_buf == NULL) { + //g_debug("Don bother with the animation, the theme aint got the goods !"); + return; + } + + int i; + + // sample 51 snapshots - range : 0-256 + for (i = 0; i < 51; i++) { + gdk_pixbuf_composite(mute_buf, blocked_buf, 0, 0, + gdk_pixbuf_get_width(mute_buf), + gdk_pixbuf_get_height(mute_buf), + 0, 0, 1, 1, GDK_INTERP_BILINEAR, MIN(255, i * 5)); + priv->blocked_animation_list = g_list_append(priv->blocked_animation_list, + gdk_pixbuf_copy(blocked_buf)); + } + g_object_ref_sink(mute_buf); + g_object_unref(mute_buf); + g_object_ref_sink(blocked_buf); + g_object_unref(blocked_buf); +} + +void +sound_state_manager_tidy_up_hash() +{ + g_hash_table_destroy(volume_states); +} + +gchar* +sound_state_manager_get_current_icon_name (SoundStateManager* self) +{ + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + return g_hash_table_lookup (priv->volume_states, + GINT_TO_POINTER(priv->current_state)); + +} + +static void g_signal_cb ( GDBusProxy* proxy, + gchar* sender_name, + gchar* signal_name, + GVariant* parameters, + gpointer user_data) +{ +} + +static void +sound_state_manager_style_changed_cb(GtkWidget *widget, gpointer user_data) +{ + //g_debug("Just caught a style change event"); + update_state(current_state); + reset_mute_blocking_animation(); + update_state(current_state); + free_the_animation_list(); + prepare_blocked_animation(); +} + +/** + * volume_widget_new: + * @returns: a new #VolumeWidget. + **/ +SoundStateManager* +sound_state_manager_new (GDProxy* proxy) +{ + SoundStateManager* manager = g_object_new (SOUND_TYPE_STATE_MANAGER, NULL); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(manager); + priv->dbus_proxy = proxy; + return manager; +} -- cgit v1.2.3 From 49df0fb3ea29693bdb8decf51f4da055c8e1a7cb Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 24 Jan 2011 16:26:21 -0600 Subject: indicator side almost up and going --- src/sound-state-manager.c | 191 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 149 insertions(+), 42 deletions(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index a2121ad..1eecaf0 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -17,40 +17,50 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include + #include "sound-state-manager.h" + typedef struct _SoundStateManagerPrivate SoundStateManagerPrivate; +// TODO ensure all the relevant below are initialized to null in init struct _SoundStateManagerPrivate { GDBusProxy* dbus_proxy; GHashTable* volume_states; GList* blocked_animation_list; + SoundState current_state; + GtkImage* speaker_image; }; #define SOUND_STATE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUND_TYPE_STATE_MANAGER, SoundStateManagerPrivate)) -static GtkImage *speaker_image = NULL; -static gint current_state = 0; -static gint previous_state = 0; static GtkIconSize design_team_size; static gint blocked_id; static gint animation_id; +static GList* blocked_iter = NULL; -static GList * blocked_animation_list = NULL; -static GList * blocked_iter = NULL; -static void prepare_blocked_animation(); -static gboolean fade_back_to_mute_image(); -static gboolean start_animation(); -static void reset_mute_blocking_animation(); -static void free_the_animation_list(); +static void sound_state_manager_prepare_blocked_animation(SoundStateManager* self); +static gboolean sound_state_manager_start_animation (SoundStateManager* self) +static gboolean sound_state_manager_fade_back_to_mute_image (gpointer user_data) +static void sound_state_manager_reset_mute_blocking_animation (SoundStateManager* self); +static void sound_state_mananger_free_the_animation_list (SoundStateManager* self); +static void sound_state_manager_prepare_state_image_names (SoundStateManager* self); G_DEFINE_TYPE (SoundStateManager, sound_state_manager, G_TYPE_OBJECT); static void -sound_state_manager_init (SoundStateManager *object) +sound_state_manager_init (SoundStateManager* self) { - /* TODO: Add initialization code here */ + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + + sound_state_manager_prepare_state_image_names (self); + sound_state_manager_prepare_blocked_animation (self); + + priv->current_state = UNAVAILABLE; + priv->speaker_image = indicator_image_helper(g_hash_table_lookup (priv->volume_states, + GINT_TO_POINTER(priv->current_state)); } static void @@ -68,13 +78,14 @@ sound_state_manager_class_init (SoundStateManagerClass *klass) GObjectClass* parent_class = G_OBJECT_CLASS (klass); object_class->finalize = sound_state_manager_finalize; + design_team_size = gtk_icon_size_register("design-team-size", 22, 22); } /* -Prepare states Array. +Prepare states versus images names hash. */ -void -sound_state_manager_prepare_state_machine(SoundStateManager* self) +static void +sound_state_manager_prepare_state_image_names (SoundStateManager* self) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); priv->volume_states = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); @@ -93,7 +104,7 @@ Prepares the array of images to be used in the blocked animation. Only called at startup. */ static void -sound_state_manager_prepare_blocked_animation(SoundStateManager* self) +sound_state_manager_prepare_blocked_animation (SoundStateManager* self) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); @@ -130,49 +141,145 @@ sound_state_manager_prepare_blocked_animation(SoundStateManager* self) g_object_unref(blocked_buf); } -void -sound_state_manager_tidy_up_hash() + +GtkImage* +sound_state_manager_get_current_icon (SoundStateManager* self) { - g_hash_table_destroy(volume_states); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + return priv->speaker_image; } -gchar* -sound_state_manager_get_current_icon_name (SoundStateManager* self) +SoundState +sound_state_manager_get_current_state (SoundStateManager* self) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); - return g_hash_table_lookup (priv->volume_states, - GINT_TO_POINTER(priv->current_state)); - + return priv->current_state; } -static void g_signal_cb ( GDBusProxy* proxy, - gchar* sender_name, - gchar* signal_name, - GVariant* parameters, - gpointer user_data) +static void +sound_state_signal_cb ( GDBusProxy* proxy, + gchar* sender_name, + gchar* signal_name, + GVariant* parameters, + gpointer user_data) { + g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); + SoundStateManager* self = SOUND_STATE_MANAGER (user_data); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + + g_variant_ref (parameters); + GVariant *value = g_variant_get_child_value (parameters, 0); + gint update = g_variant_get_int (value); + + g_debug ( "!!! signal_cb with value %i", update); + + priv->current_state = (SoundState)update; + + g_variant_unref (parameters); + + + /*if (g_strcmp0(signal_name, INDICATOR_SOUND_SIGNAL_SINK_AVAILABLE_UPDATE) == 0){ + react_to_signal_sink_availability_update ( input, self ); + } + else if (g_strcmp0(signal_name, INDICATOR_SOUND_SIGNAL_SINK_MUTE_UPDATE) == 0){ + react_to_signal_sink_mute_update ( input, self ); + } + else if (g_strcmp0(signal_name, INDICATOR_SOUND_SIGNAL_SINK_INPUT_WHILE_MUTED) == 0){ + react_to_signal_sink_input_while_muted ( input, self ); + }*/ + } -static void +void sound_state_manager_style_changed_cb(GtkWidget *widget, gpointer user_data) { //g_debug("Just caught a style change event"); - update_state(current_state); - reset_mute_blocking_animation(); - update_state(current_state); - free_the_animation_list(); - prepare_blocked_animation(); + g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); + SoundStateManager* self = SOUND_STATE_MANAGER (user_data); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + sound_state_manager_reset_mute_blocking_animation (self) + sound_state_mananger_free_the_animation_list (self); + sound_state_manager_prepare_blocked_animation (self); +} + +static void +sound_state_manager_reset_mute_blocking_animation (SoundStateManager* self) +{ + if (animation_id != 0) { + //g_debug("about to remove the animation_id callback from the mainloop!!**"); + g_source_remove(animation_id); + animation_id = 0; + } + if (blocked_id != 0) { + //g_debug("about to remove the blocked_id callback from the mainloop!!**"); + g_source_remove(blocked_id); + blocked_id = 0; + } +} + +static void +sound_state_mananger_free_the_animation_list (SoundStateManager* self) +{ + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + + if (priv->blocked_animation_list != NULL) { + g_list_foreach (priv->blocked_animation_list, (GFunc)g_object_unref, NULL); + g_list_free (priv->blocked_animation_list); + blocked_animation_list = NULL; + } +} + +/*static void +update_state(const gint state) +{ + previous_state = current_state; + current_state = state; + gchar* image_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(current_state)); + indicator_image_helper_update(speaker_image, image_name); +}*/ + +static gboolean +sound_state_manager_start_animation (SoundStateManager* self) +{ + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + + blocked_iter = priv->blocked_animation_list; + blocked_id = 0; + animation_id = g_timeout_add (50, + sound_state_manager_fade_back_to_mute_image, + self); + return FALSE; +} + +static gboolean +sound_state_manager_fade_back_to_mute_image (gpointer user_data) +{ + g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE( SOUND_STATE_MANAGER (user_data) ); + + if (blocked_iter != NULL) { + gtk_image_set_from_pixbuf (priv->speaker_image, blocked_iter->data); + blocked_iter = blocked_iter->next; + return TRUE; + } else { + animation_id = 0; + //g_debug("exit from animation now\n"); + return FALSE; + } } /** - * volume_widget_new: - * @returns: a new #VolumeWidget. + * sound_state_manager_connect_to_dbus: + * @returns: void + * When ready the indicator-sound calls this method to enable state communication + * between the indicator and the service. **/ -SoundStateManager* -sound_state_manager_new (GDProxy* proxy) +void +sound_state_manager_connect_to_dbus (SoundStateManager* self, GDProxy* proxy) { - SoundStateManager* manager = g_object_new (SOUND_TYPE_STATE_MANAGER, NULL); - SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(manager); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); priv->dbus_proxy = proxy; - return manager; + g_signal_connect (priv->dbus_proxy, "g-signal", + G_CALLBACK (sound_state_signal_cb), self); + } -- cgit v1.2.3 From 729ff587783dcf571b4a94132b57bce695a5e30f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 24 Jan 2011 17:29:31 -0600 Subject: compiling ... --- src/sound-state-manager.c | 61 ++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 25 deletions(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index 1eecaf0..bd2140a 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -18,10 +18,8 @@ with this program. If not, see . */ #include - #include "sound-state-manager.h" - typedef struct _SoundStateManagerPrivate SoundStateManagerPrivate; // TODO ensure all the relevant below are initialized to null in init @@ -35,6 +33,7 @@ struct _SoundStateManagerPrivate }; #define SOUND_STATE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUND_TYPE_STATE_MANAGER, SoundStateManagerPrivate)) +G_DEFINE_TYPE (SoundStateManager, sound_state_manager, G_TYPE_OBJECT); static GtkIconSize design_team_size; static gint blocked_id; @@ -42,13 +41,12 @@ static gint animation_id; static GList* blocked_iter = NULL; static void sound_state_manager_prepare_blocked_animation(SoundStateManager* self); -static gboolean sound_state_manager_start_animation (SoundStateManager* self) -static gboolean sound_state_manager_fade_back_to_mute_image (gpointer user_data) +static gboolean sound_state_manager_start_animation (SoundStateManager* self); +static gboolean sound_state_manager_fade_back_to_mute_image (gpointer user_data); static void sound_state_manager_reset_mute_blocking_animation (SoundStateManager* self); -static void sound_state_mananger_free_the_animation_list (SoundStateManager* self); +static void sound_state_manager_free_the_animation_list (SoundStateManager* self); static void sound_state_manager_prepare_state_image_names (SoundStateManager* self); -G_DEFINE_TYPE (SoundStateManager, sound_state_manager, G_TYPE_OBJECT); static void sound_state_manager_init (SoundStateManager* self) @@ -59,8 +57,8 @@ sound_state_manager_init (SoundStateManager* self) sound_state_manager_prepare_blocked_animation (self); priv->current_state = UNAVAILABLE; - priv->speaker_image = indicator_image_helper(g_hash_table_lookup (priv->volume_states, - GINT_TO_POINTER(priv->current_state)); + priv->speaker_image = indicator_image_helper (g_hash_table_lookup (priv->volume_states, + GINT_TO_POINTER(priv->current_state))); } static void @@ -71,13 +69,27 @@ sound_state_manager_finalize (GObject *object) G_OBJECT_CLASS (sound_state_manager_parent_class)->finalize (object); } +static void +sound_state_manager_dispose (GObject *object) +{ + SoundStateManager* self = SOUND_STATE_MANAGER (object); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + + g_hash_table_destroy (priv->volume_states); + + sound_state_manager_free_the_animation_list (self); + G_OBJECT_CLASS (sound_state_manager_parent_class)->dispose (object); +} + + static void sound_state_manager_class_init (SoundStateManagerClass *klass) { GObjectClass* object_class = G_OBJECT_CLASS (klass); - GObjectClass* parent_class = G_OBJECT_CLASS (klass); + //GObjectClass* parent_class = G_OBJECT_CLASS (klass); object_class->finalize = sound_state_manager_finalize; + object_class->dispose = sound_state_manager_dispose; design_team_size = gtk_icon_size_register("design-team-size", 22, 22); } @@ -88,14 +100,14 @@ static void sound_state_manager_prepare_state_image_names (SoundStateManager* self) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); - priv->volume_states = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); - g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(MUTED), g_strdup("audio-volume-muted-panel")); - g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(ZERO_LEVEL), g_strdup("audio-volume-low-zero-panel")); - g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(LOW_LEVEL), g_strdup("audio-volume-low-panel")); - g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(MEDIUM_LEVEL), g_strdup("audio-volume-medium-panel")); - g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(HIGH_LEVEL), g_strdup("audio-volume-high-panel")); - g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(BLOCKED), g_strdup("audio-volume-muted-blocking-panel")); - g_hash_table_insert(priv->volume_states, GINT_TO_POINTER(UNAVAILABLE), g_strdup("audio-output-none-panel")); + priv->volume_states = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free); + g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(MUTED), g_strdup("audio-volume-muted-panel")); + g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(ZERO_LEVEL), g_strdup("audio-volume-low-zero-panel")); + g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(LOW_LEVEL), g_strdup("audio-volume-low-panel")); + g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(MEDIUM_LEVEL), g_strdup("audio-volume-medium-panel")); + g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(HIGH_LEVEL), g_strdup("audio-volume-high-panel")); + g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(BLOCKED), g_strdup("audio-volume-muted-blocking-panel")); + g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(UNAVAILABLE), g_strdup("audio-output-none-panel")); } /* @@ -169,7 +181,7 @@ sound_state_signal_cb ( GDBusProxy* proxy, g_variant_ref (parameters); GVariant *value = g_variant_get_child_value (parameters, 0); - gint update = g_variant_get_int (value); + gint update = g_variant_get_int32 (value); g_debug ( "!!! signal_cb with value %i", update); @@ -196,9 +208,8 @@ sound_state_manager_style_changed_cb(GtkWidget *widget, gpointer user_data) //g_debug("Just caught a style change event"); g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); SoundStateManager* self = SOUND_STATE_MANAGER (user_data); - SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); - sound_state_manager_reset_mute_blocking_animation (self) - sound_state_mananger_free_the_animation_list (self); + sound_state_manager_reset_mute_blocking_animation (self); + sound_state_manager_free_the_animation_list (self); sound_state_manager_prepare_blocked_animation (self); } @@ -218,14 +229,14 @@ sound_state_manager_reset_mute_blocking_animation (SoundStateManager* self) } static void -sound_state_mananger_free_the_animation_list (SoundStateManager* self) +sound_state_manager_free_the_animation_list (SoundStateManager* self) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); if (priv->blocked_animation_list != NULL) { g_list_foreach (priv->blocked_animation_list, (GFunc)g_object_unref, NULL); g_list_free (priv->blocked_animation_list); - blocked_animation_list = NULL; + priv->blocked_animation_list = NULL; } } @@ -254,7 +265,7 @@ sound_state_manager_start_animation (SoundStateManager* self) static gboolean sound_state_manager_fade_back_to_mute_image (gpointer user_data) { - g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); + g_return_val_if_fail (SOUND_IS_STATE_MANAGER (user_data), FALSE); SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE( SOUND_STATE_MANAGER (user_data) ); if (blocked_iter != NULL) { @@ -275,7 +286,7 @@ sound_state_manager_fade_back_to_mute_image (gpointer user_data) * between the indicator and the service. **/ void -sound_state_manager_connect_to_dbus (SoundStateManager* self, GDProxy* proxy) +sound_state_manager_connect_to_dbus (SoundStateManager* self, GDBusProxy* proxy) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); priv->dbus_proxy = proxy; -- cgit v1.2.3 From 72165a8281fe45defba8a2b834ec6698b6d116b1 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 24 Jan 2011 19:05:05 -0600 Subject: operational --- src/sound-state-manager.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index bd2140a..004e011 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -86,10 +86,12 @@ static void sound_state_manager_class_init (SoundStateManagerClass *klass) { GObjectClass* object_class = G_OBJECT_CLASS (klass); - //GObjectClass* parent_class = G_OBJECT_CLASS (klass); object_class->finalize = sound_state_manager_finalize; object_class->dispose = sound_state_manager_dispose; + + g_type_class_add_private (klass, sizeof (SoundStateManagerPrivate)); + design_team_size = gtk_icon_size_register("design-team-size", 22, 22); } -- cgit v1.2.3 From 9643b10b825c13fe46d211b6ab1cd2230392f299 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 24 Jan 2011 19:50:10 -0600 Subject: tidy up --- src/sound-state-manager.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index 004e011..83fb952 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -22,7 +22,6 @@ with this program. If not, see . typedef struct _SoundStateManagerPrivate SoundStateManagerPrivate; -// TODO ensure all the relevant below are initialized to null in init struct _SoundStateManagerPrivate { GDBusProxy* dbus_proxy; @@ -46,6 +45,11 @@ static gboolean sound_state_manager_fade_back_to_mute_image (gpointer user_data) static void sound_state_manager_reset_mute_blocking_animation (SoundStateManager* self); static void sound_state_manager_free_the_animation_list (SoundStateManager* self); static void sound_state_manager_prepare_state_image_names (SoundStateManager* self); +static void sound_state_signal_cb ( GDBusProxy* proxy, + gchar* sender_name, + gchar* signal_name, + GVariant* parameters, + gpointer user_data ); static void @@ -53,6 +57,11 @@ sound_state_manager_init (SoundStateManager* self) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + priv->dbus_proxy = NULL; + priv->volume_states = NULL; + priv->speaker_image = NULL; + priv->blocked_animation_list = NULL; + sound_state_manager_prepare_state_image_names (self); sound_state_manager_prepare_blocked_animation (self); @@ -170,6 +179,23 @@ sound_state_manager_get_current_state (SoundStateManager* self) return priv->current_state; } +/** + * sound_state_manager_connect_to_dbus: + * @returns: void + * When ready the indicator-sound calls this method to enable state communication + * between the indicator and the service. + **/ +void +sound_state_manager_connect_to_dbus (SoundStateManager* self, GDBusProxy* proxy) +{ + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + priv->dbus_proxy = proxy; + g_debug (" here about to register for signal callback"); + g_signal_connect (priv->dbus_proxy, "g-signal", + G_CALLBACK (sound_state_signal_cb), self); + +} + static void sound_state_signal_cb ( GDBusProxy* proxy, gchar* sender_name, @@ -177,6 +203,8 @@ sound_state_signal_cb ( GDBusProxy* proxy, GVariant* parameters, gpointer user_data) { + g_debug ( "!!! signal_cb with value" ); + g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); SoundStateManager* self = SOUND_STATE_MANAGER (user_data); SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); @@ -281,18 +309,3 @@ sound_state_manager_fade_back_to_mute_image (gpointer user_data) } } -/** - * sound_state_manager_connect_to_dbus: - * @returns: void - * When ready the indicator-sound calls this method to enable state communication - * between the indicator and the service. - **/ -void -sound_state_manager_connect_to_dbus (SoundStateManager* self, GDBusProxy* proxy) -{ - SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); - priv->dbus_proxy = proxy; - g_signal_connect (priv->dbus_proxy, "g-signal", - G_CALLBACK (sound_state_signal_cb), self); - -} -- cgit v1.2.3 From d20e8f85ca28589e486fd395bd2071d63b2069ae Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 25 Jan 2011 19:28:29 -0600 Subject: tidy up --- src/sound-state-manager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index 83fb952..f6d39d0 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -190,7 +190,7 @@ sound_state_manager_connect_to_dbus (SoundStateManager* self, GDBusProxy* proxy) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); priv->dbus_proxy = proxy; - g_debug (" here about to register for signal callback"); + g_debug (" here about to register for signal callback on %s", g_dbus_proxy_get_name (priv->dbus_proxy)); g_signal_connect (priv->dbus_proxy, "g-signal", G_CALLBACK (sound_state_signal_cb), self); @@ -203,7 +203,7 @@ sound_state_signal_cb ( GDBusProxy* proxy, GVariant* parameters, gpointer user_data) { - g_debug ( "!!! signal_cb with value" ); + g_debug ( "!!! sound state manager signal_cb" ); g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); SoundStateManager* self = SOUND_STATE_MANAGER (user_data); -- cgit v1.2.3 From 7ff9e0aafc0562c8d07f8f5dae96780c7e5c01c3 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 25 Jan 2011 21:24:25 -0600 Subject: on the pigs back ... --- src/sound-state-manager.c | 59 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 8 deletions(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index f6d39d0..0fce9a8 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -19,6 +19,7 @@ with this program. If not, see . #include #include "sound-state-manager.h" +#include "dbus-shared-names.h" typedef struct _SoundStateManagerPrivate SoundStateManagerPrivate; @@ -50,6 +51,10 @@ static void sound_state_signal_cb ( GDBusProxy* proxy, gchar* signal_name, GVariant* parameters, gpointer user_data ); +static void sound_state_manager_get_state_cb (GObject *object, + GAsyncResult *res, + gpointer user_data); + static void @@ -193,7 +198,47 @@ sound_state_manager_connect_to_dbus (SoundStateManager* self, GDBusProxy* proxy) g_debug (" here about to register for signal callback on %s", g_dbus_proxy_get_name (priv->dbus_proxy)); g_signal_connect (priv->dbus_proxy, "g-signal", G_CALLBACK (sound_state_signal_cb), self); + + g_dbus_proxy_call ( priv->dbus_proxy, + "GetSoundState", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback)sound_state_manager_get_state_cb, + self); +} + +static void +sound_state_manager_get_state_cb (GObject *object, + GAsyncResult *res, + gpointer user_data) +{ + g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); + SoundStateManager* self = SOUND_STATE_MANAGER (user_data); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + GVariant *result, *value; + GError *error = NULL; + result = g_dbus_proxy_call_finish ( priv->dbus_proxy, + res, + &error ); + + if (error != NULL) { + g_debug("get_sound_state call failed: %s", error->message); + g_error_free(error); + return; + } + + value = g_variant_get_child_value(result, 0); + priv->current_state = (SoundState)g_variant_get_int32(value); + + gchar* image_name = g_hash_table_lookup (priv->volume_states, + GINT_TO_POINTER(priv->current_state) ); + indicator_image_helper_update (priv->speaker_image, image_name); + + g_variant_unref(value); + g_variant_unref(result); } static void @@ -219,16 +264,14 @@ sound_state_signal_cb ( GDBusProxy* proxy, g_variant_unref (parameters); - - /*if (g_strcmp0(signal_name, INDICATOR_SOUND_SIGNAL_SINK_AVAILABLE_UPDATE) == 0){ - react_to_signal_sink_availability_update ( input, self ); + if (g_strcmp0(signal_name, INDICATOR_SOUND_SIGNAL_STATE_UPDATE) == 0){ + gchar* image_name = g_hash_table_lookup (priv->volume_states, + GINT_TO_POINTER(priv->current_state) ); + indicator_image_helper_update (priv->speaker_image, image_name); } - else if (g_strcmp0(signal_name, INDICATOR_SOUND_SIGNAL_SINK_MUTE_UPDATE) == 0){ - react_to_signal_sink_mute_update ( input, self ); + else { + g_debug ("sorry don't know what signal this is - %s", signal_name); } - else if (g_strcmp0(signal_name, INDICATOR_SOUND_SIGNAL_SINK_INPUT_WHILE_MUTED) == 0){ - react_to_signal_sink_input_while_muted ( input, self ); - }*/ } -- cgit v1.2.3 From 8bbf7ea5805ed69a2d7450065a558398a623525f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 26 Jan 2011 16:08:46 -0600 Subject: blocking state now workings as expected --- src/sound-state-manager.c | 64 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 19 deletions(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index 0fce9a8..4a8dbe2 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -39,9 +39,10 @@ static GtkIconSize design_team_size; static gint blocked_id; static gint animation_id; static GList* blocked_iter = NULL; +static gboolean can_animate = FALSE; static void sound_state_manager_prepare_blocked_animation(SoundStateManager* self); -static gboolean sound_state_manager_start_animation (SoundStateManager* self); +static gboolean sound_state_manager_start_animation (gpointer user_data); static gboolean sound_state_manager_fade_back_to_mute_image (gpointer user_data); static void sound_state_manager_reset_mute_blocking_animation (SoundStateManager* self); static void sound_state_manager_free_the_animation_list (SoundStateManager* self); @@ -54,8 +55,7 @@ static void sound_state_signal_cb ( GDBusProxy* proxy, static void sound_state_manager_get_state_cb (GObject *object, GAsyncResult *res, gpointer user_data); - - +static gboolean sound_state_manager_can_proceed_with_blocking_animation (SoundStateManager* self); static void sound_state_manager_init (SoundStateManager* self) @@ -163,6 +163,7 @@ sound_state_manager_prepare_blocked_animation (SoundStateManager* self) priv->blocked_animation_list = g_list_append(priv->blocked_animation_list, gdk_pixbuf_copy(blocked_buf)); } + can_animate = TRUE; g_object_ref_sink(mute_buf); g_object_unref(mute_buf); g_object_ref_sink(blocked_buf); @@ -248,7 +249,7 @@ sound_state_signal_cb ( GDBusProxy* proxy, GVariant* parameters, gpointer user_data) { - g_debug ( "!!! sound state manager signal_cb" ); + //g_debug ( "!!! sound state manager signal_cb" ); g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); SoundStateManager* self = SOUND_STATE_MANAGER (user_data); @@ -258,27 +259,40 @@ sound_state_signal_cb ( GDBusProxy* proxy, GVariant *value = g_variant_get_child_value (parameters, 0); gint update = g_variant_get_int32 (value); - g_debug ( "!!! signal_cb with value %i", update); + //g_debug ( "!!! signal_cb with value %i", update); priv->current_state = (SoundState)update; g_variant_unref (parameters); if (g_strcmp0(signal_name, INDICATOR_SOUND_SIGNAL_STATE_UPDATE) == 0){ + gchar* image_name = g_hash_table_lookup (priv->volume_states, GINT_TO_POINTER(priv->current_state) ); - indicator_image_helper_update (priv->speaker_image, image_name); + if (priv->current_state == BLOCKED && + sound_state_manager_can_proceed_with_blocking_animation (self) == TRUE) { + blocked_id = g_timeout_add_seconds (4, + sound_state_manager_start_animation, + self); + indicator_image_helper_update (priv->speaker_image, image_name); + + } + else{ + indicator_image_helper_update (priv->speaker_image, image_name); + } } else { - g_debug ("sorry don't know what signal this is - %s", signal_name); + g_warning ("sorry don't know what signal this is - %s", signal_name); } } void -sound_state_manager_style_changed_cb(GtkWidget *widget, gpointer user_data) +sound_state_manager_style_changed_cb (GtkWidget *widget, + GtkStyle *previous_style, + gpointer user_data) { - //g_debug("Just caught a style change event"); + g_debug("Just caught a style change event"); g_return_if_fail (SOUND_IS_STATE_MANAGER (user_data)); SoundStateManager* self = SOUND_STATE_MANAGER (user_data); sound_state_manager_reset_mute_blocking_animation (self); @@ -313,18 +327,12 @@ sound_state_manager_free_the_animation_list (SoundStateManager* self) } } -/*static void -update_state(const gint state) -{ - previous_state = current_state; - current_state = state; - gchar* image_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(current_state)); - indicator_image_helper_update(speaker_image, image_name); -}*/ static gboolean -sound_state_manager_start_animation (SoundStateManager* self) +sound_state_manager_start_animation (gpointer userdata) { + g_return_val_if_fail (SOUND_IS_STATE_MANAGER (userdata), FALSE); + SoundStateManager* self = SOUND_STATE_MANAGER (userdata); SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); blocked_iter = priv->blocked_animation_list; @@ -339,7 +347,8 @@ static gboolean sound_state_manager_fade_back_to_mute_image (gpointer user_data) { g_return_val_if_fail (SOUND_IS_STATE_MANAGER (user_data), FALSE); - SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE( SOUND_STATE_MANAGER (user_data) ); + SoundStateManager* self = SOUND_STATE_MANAGER (user_data); + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE (self); if (blocked_iter != NULL) { gtk_image_set_from_pixbuf (priv->speaker_image, blocked_iter->data); @@ -348,7 +357,24 @@ sound_state_manager_fade_back_to_mute_image (gpointer user_data) } else { animation_id = 0; //g_debug("exit from animation now\n"); + g_dbus_proxy_call ( priv->dbus_proxy, + "GetSoundState", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback)sound_state_manager_get_state_cb, + self); + return FALSE; } } + +// Simple static helper to determine if the coast is clear to animate +static +gboolean sound_state_manager_can_proceed_with_blocking_animation (SoundStateManager* self) +{ + return (can_animate && blocked_id == 0 && animation_id == 0 ); +} + -- cgit v1.2.3 From 46cbdc7d1607b20c1bba67df4471f8e5d1243c3d Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 26 Jan 2011 16:40:38 -0600 Subject: last minute tidy up --- src/sound-state-manager.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index 4a8dbe2..2ea9b1a 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -52,9 +52,6 @@ static void sound_state_signal_cb ( GDBusProxy* proxy, gchar* signal_name, GVariant* parameters, gpointer user_data ); -static void sound_state_manager_get_state_cb (GObject *object, - GAsyncResult *res, - gpointer user_data); static gboolean sound_state_manager_can_proceed_with_blocking_animation (SoundStateManager* self); static void @@ -210,7 +207,7 @@ sound_state_manager_connect_to_dbus (SoundStateManager* self, GDBusProxy* proxy) self); } -static void +void sound_state_manager_get_state_cb (GObject *object, GAsyncResult *res, gpointer user_data) @@ -242,6 +239,17 @@ sound_state_manager_get_state_cb (GObject *object, g_variant_unref(result); } +void +sound_state_manager_deal_with_disconnect (SoundStateManager* self) +{ + SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); + priv->current_state = UNAVAILABLE; + + gchar* image_name = g_hash_table_lookup (priv->volume_states, + GINT_TO_POINTER(priv->current_state) ); + indicator_image_helper_update (priv->speaker_image, image_name); +} + static void sound_state_signal_cb ( GDBusProxy* proxy, gchar* sender_name, -- cgit v1.2.3 From 4e0d98ea31ff315c03d2a297af0743cd92acfedf Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 27 Jan 2011 16:10:48 -0600 Subject: sink automatically unmuted now when slider is manually changed in accordance with the spec revision, plus some tidy ups --- src/sound-state-manager.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/sound-state-manager.c') diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c index 2ea9b1a..e8865d8 100644 --- a/src/sound-state-manager.c +++ b/src/sound-state-manager.c @@ -193,7 +193,6 @@ sound_state_manager_connect_to_dbus (SoundStateManager* self, GDBusProxy* proxy) { SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self); priv->dbus_proxy = proxy; - g_debug (" here about to register for signal callback on %s", g_dbus_proxy_get_name (priv->dbus_proxy)); g_signal_connect (priv->dbus_proxy, "g-signal", G_CALLBACK (sound_state_signal_cb), self); @@ -223,7 +222,7 @@ sound_state_manager_get_state_cb (GObject *object, &error ); if (error != NULL) { - g_debug("get_sound_state call failed: %s", error->message); + g_warning("get_sound_state call failed: %s", error->message); g_error_free(error); return; } -- cgit v1.2.3