← Back to team overview

ayatana-commits team mailing list archive

lp:~cjcurran/indicator-sound/thematic_changes_handling_for_blocking into lp:indicator-sound

 

Conor Curran has proposed merging lp:~cjcurran/indicator-sound/thematic_changes_handling_for_blocking into lp:indicator-sound.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)


Mute blocking animation list is remade every time there now is a theme change. Also more filtering happens on exterior volume updates. less noise on dbus, smoother volume handling for other clients listening to pulse for volume updates.
-- 
https://code.launchpad.net/~cjcurran/indicator-sound/thematic_changes_handling_for_blocking/+merge/24160
Your team ayatana-commits is subscribed to branch lp:indicator-sound.
=== modified file 'src/indicator-sound.c'
--- src/indicator-sound.c	2010-04-22 16:58:50 +0000
+++ src/indicator-sound.c	2010-04-26 19:51:22 +0000
@@ -89,6 +89,7 @@
 static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data);
 static void slider_grabbed(GtkWidget *widget, gpointer user_data);
 static void slider_released(GtkWidget *widget, gpointer user_data);
+static void style_changed_cb(GtkWidget *widget, gpointer user_data);
 
 // DBUS communication
 static DBusGProxy *sound_dbus_proxy = NULL;
@@ -132,8 +133,10 @@
 static void prepare_blocked_animation();
 static gboolean fade_back_to_mute_image();
 static gboolean start_animation();
-
-// Construction
+static void reset_mute_blocking_animation();
+static void free_the_animation_list();
+
+
 static void
 indicator_sound_class_init (IndicatorSoundClass *klass)
 {
@@ -153,7 +156,8 @@
 	return;
 }
 
-static void indicator_sound_init (IndicatorSound *self)
+static void
+indicator_sound_init (IndicatorSound *self)
 {
 	self->service = NULL;
 	self->service = indicator_service_manager_new_version(INDICATOR_SOUND_DBUS_NAME, INDICATOR_SOUND_DBUS_VERSION);
@@ -164,7 +168,7 @@
     initial_mute = FALSE;
     device_available = TRUE;
     slider_in_direct_use = FALSE;
-    exterior_vol_update = 0;
+    exterior_vol_update = -10;
 
 	g_signal_connect(G_OBJECT(self->service), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connection_changed), self);
     return;
@@ -181,13 +185,20 @@
 	}
     g_hash_table_destroy(volume_states);
 
+    free_the_animation_list();
+
+	G_OBJECT_CLASS (indicator_sound_parent_class)->dispose (object);
+	return;
+}
+
+static void 
+free_the_animation_list()
+{
     if(blocked_animation_list != NULL){
         g_list_foreach (blocked_animation_list, (GFunc)g_object_unref, NULL);
         g_list_free(blocked_animation_list);
+        blocked_animation_list = NULL;
     }
-
-	G_OBJECT_CLASS (indicator_sound_parent_class)->dispose (object);
-	return;
 }
 
 static void
@@ -237,14 +248,14 @@
 {
     gtk_widget_set_size_request (widget, 200, -1);
     g_debug("slider parent changed");
-    //fetch_volume_percent_from_dbus();
 }
 
 /**
 new_slider_item:
 Create a new dBusMenu Slider item.
 **/
-static gboolean new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)
+static gboolean
+new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)
 {
     IndicatorObject *io = NULL;
 
@@ -272,6 +283,8 @@
     g_signal_connect(slider, "value-changed", G_CALLBACK(value_changed_event_cb), newitem);
     g_signal_connect(volume_slider, "slider-grabbed", G_CALLBACK(slider_grabbed), NULL);
     g_signal_connect(volume_slider, "slider-released", G_CALLBACK(slider_released), NULL);
+    g_signal_connect(slider, "style-set", G_CALLBACK(style_changed_cb), NULL);
+
 
     // Set images on the ido
     GtkWidget* primary_image = ido_scale_menu_item_get_primary_image((IdoScaleMenuItem*)volume_slider);
@@ -342,7 +355,8 @@
 /*
 Prepare states Array.
 */
-void prepare_state_machine()
+void 
+prepare_state_machine()
 {
     volume_states = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free);
     g_hash_table_insert(volume_states, GINT_TO_POINTER(STATE_MUTED), g_strdup("audio-volume-muted-panel"));
@@ -359,7 +373,8 @@
 Prepares the array of images to be used in the blocked animation.
 Only called at startup.
 */
-static void prepare_blocked_animation()
+static void
+prepare_blocked_animation()
 {
     gchar* blocked_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(STATE_MUTED_WHILE_INPUT));
     gchar* muted_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(STATE_MUTED));
@@ -370,13 +385,13 @@
     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;
 
-    if(mute_buf == NULL || blocked_buf == NULL){
-        g_debug("Don bother with the animation, the theme aint got the goods");
-        return;
-    }
-
     // sample 51 snapshots - range : 0-256
     for(i = 0; i < 51; i++)
     {
@@ -386,31 +401,39 @@
                              0, 0, 1, 1, GDK_INTERP_BILINEAR, MIN(255, i * 5));
         blocked_animation_list = g_list_append(blocked_animation_list, gdk_pixbuf_copy(blocked_buf));
     }
+    g_object_unref(temp_image);
+    g_object_unref(mute_buf);
+    g_object_unref(blocked_buf);
 }
 
 
-gint get_state()
+gint
+get_state()
 {
     return current_state;
 }
 
-gchar* get_state_image_name(gint state)
+gchar*
+get_state_image_name(gint state)
 {
     return g_hash_table_lookup(volume_states, GINT_TO_POINTER(state));
 }
 
-void prepare_for_tests(IndicatorObject *io)
+void
+prepare_for_tests(IndicatorObject *io)
 {
     prepare_state_machine();
     get_icon(io);
 }
 
-void tidy_up_hash()
+void
+tidy_up_hash()
 {
     g_hash_table_destroy(volume_states);
 }
 
-static void update_state(const gint state)
+static void
+update_state(const gint state)
 {
 /*    g_debug("update state beginning - previous_state = %i", previous_state);*/
 
@@ -424,7 +447,8 @@
 }
 
 
-void determine_state_from_volume(gdouble volume_percent)
+void
+determine_state_from_volume(gdouble volume_percent)
 {
 /*    g_debug("determine_state_from_volume - previous_state = %i", previous_state);*/
     if (device_available == FALSE)
@@ -446,7 +470,38 @@
 }
 
 
-static void fetch_sink_availability_from_dbus()
+static gboolean
+start_animation()
+{
+    blocked_iter = blocked_animation_list;
+    blocked_id = 0;
+    g_debug("exit from blocked hold start the animation\n");
+    animation_id = g_timeout_add(50, fade_back_to_mute_image, NULL);
+    return FALSE;
+}
+
+static gboolean
+fade_back_to_mute_image()
+{
+    if(blocked_iter != NULL)
+    {
+        g_debug("in animation 'loop'\n");
+        gtk_image_set_from_pixbuf(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;
+    }
+}
+
+/*******************************************************************/
+//DBus method handlers
+/*******************************************************************/
+static void
+fetch_sink_availability_from_dbus()
 {
     GError * error = NULL;
     gboolean * available_input;
@@ -472,7 +527,8 @@
 
 }
 
-static void fetch_volume_percent_from_dbus()
+static void 
+fetch_volume_percent_from_dbus()
 {
     GError * error = NULL;
     gdouble *volume_percent_input;
@@ -490,7 +546,8 @@
     g_debug("at the indicator start up and the volume percent returned from dbus method is %f", initial_volume_percent);
 }
 
-static void fetch_mute_value_from_dbus()
+static void 
+fetch_mute_value_from_dbus()
 {
     GError * error = NULL;
     gboolean *mute_input;
@@ -509,7 +566,11 @@
     g_debug("at the indicator start up and the MUTE returned from dbus method is %i", initial_mute);
 }
 
-static void catch_signal_sink_input_while_muted(DBusGProxy * proxy, gboolean block_value, gpointer userdata)
+/*******************************************************************/
+//DBus signal catchers
+/*******************************************************************/
+static void
+catch_signal_sink_input_while_muted(DBusGProxy * proxy, gboolean block_value, gpointer userdata)
 {
     g_debug("signal caught - sink input while muted with value %i", block_value);
     if (block_value == 1 && blocked_id == 0 && animation_id == 0 && blocked_animation_list != NULL) {
@@ -519,32 +580,9 @@
     }
 }
 
-static gboolean start_animation()
-{
-    blocked_iter = blocked_animation_list;
-    blocked_id = 0;
-    g_debug("exit from blocked hold start the animation\n");
-    animation_id = g_timeout_add(50, fade_back_to_mute_image, NULL);
-    return FALSE;
-}
-
-static gboolean fade_back_to_mute_image()
-{
-    if(blocked_iter != NULL)
-    {
-        g_debug("in animation 'loop'\n");
-        gtk_image_set_from_pixbuf(speaker_image, blocked_iter->data);
-        blocked_iter = blocked_iter->next;
-        return TRUE;
-    }
-    else{
-        animation_id = 0;
-        g_debug("exit from animation\n");
-        return FALSE;
-    }
-}
-
-static void catch_signal_sink_volume_update(DBusGProxy *proxy, gdouble volume_percent, gpointer userdata)
+
+static void
+catch_signal_sink_volume_update(DBusGProxy *proxy, gdouble volume_percent, gpointer userdata)
 {
     if (slider_in_direct_use == FALSE){
         GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)volume_slider);
@@ -559,7 +597,8 @@
     }
 }
 
-static void catch_signal_sink_mute_update(DBusGProxy *proxy, gboolean mute_value, gpointer userdata)
+static void
+catch_signal_sink_mute_update(DBusGProxy *proxy, gboolean mute_value, gpointer userdata)
 {
     //We can be sure the service won't send a mute signal unless it has changed !
     //UNMUTE's force a volume update therefore icon is updated appropriately => no need for unmute handling here.
@@ -568,22 +607,29 @@
         update_state(STATE_MUTED);
     }
     else{
-        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;            
-        }
+        reset_mute_blocking_animation();
     }
     g_debug("signal caught - sink mute update with mute value: %i", mute_value);
     gtk_widget_set_sensitive(volume_slider, !mute_value);
 }
 
-static void catch_signal_sink_availability_update(DBusGProxy *proxy, gboolean available_value, gpointer userdata)
+static void
+reset_mute_blocking_animation()
+{
+    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
+catch_signal_sink_availability_update(DBusGProxy *proxy, gboolean available_value, gpointer userdata)
 {
     device_available  = available_value;
     if (device_available == FALSE){
@@ -593,11 +639,18 @@
 }
 
 
+
+
+/*******************************************************************/
+//UI callbacks
+/******************************************************************/
+
 /**
 value_changed_event_cb:
 This callback will get triggered irregardless of whether its a user change or a programmatic change.
 **/
-static gboolean value_changed_event_cb(GtkRange *range, gpointer user_data)
+static gboolean
+value_changed_event_cb(GtkRange *range, gpointer user_data)
 {
     gdouble current_value =  CLAMP(gtk_range_get_value(range), 0, 100);
     if(current_value == exterior_vol_update){   
@@ -617,13 +670,15 @@
 }
 
 
-static void slider_grabbed (GtkWidget *widget, gpointer user_data)
+static void
+slider_grabbed (GtkWidget *widget, gpointer user_data)
 {
     slider_in_direct_use = TRUE;
     g_debug ("!!!!!!  grabbed\n");
 }
 
-static void slider_released (GtkWidget *widget, gpointer user_data)
+static void
+slider_released (GtkWidget *widget, gpointer user_data)
 {
     slider_in_direct_use = FALSE;
     g_debug ("!!!!!! released\n");
@@ -633,7 +688,8 @@
 /**
 key_press_cb:
 **/
-static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data)
+static gboolean
+key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data)
 {
     gboolean digested = FALSE;
 
@@ -687,12 +743,22 @@
             if(new_value != current_value && current_state != STATE_MUTED)
             {
                 g_debug("Attempting to set the range from the key listener to %f", new_value);
+                exterior_vol_update = -10;
                 gtk_range_set_value(range, new_value);
             }
     }
     return digested;
 }
 
+static void
+style_changed_cb(GtkWidget *widget, gpointer user_data)
+{
+    g_debug("Just caught a style change event");
+    reset_mute_blocking_animation();
+    update_state(current_state);
+    free_the_animation_list();
+    prepare_blocked_animation();
+}
 
 static void
 scroll (IndicatorObject *io, gint delta, IndicatorScrollDirection direction)
@@ -704,8 +770,6 @@
     GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (sound->slider));
     gdouble value = gtk_range_get_value (GTK_RANGE (sound->slider));
     
-    //g_debug("the scroll step size = %f", adj->step_increment);
-
     if (direction == INDICATOR_OBJECT_SCROLL_UP){
         value += adj->step_increment;
     }


Follow ups