diff options
-rw-r--r-- | src/indicator-sound.c | 12 | ||||
-rw-r--r-- | src/pulse-manager.c | 18 |
2 files changed, 17 insertions, 13 deletions
diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 73a8a23..588b2d6 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -82,7 +82,7 @@ static gdouble input_value_from_across_the_dbus = 0.0; static gboolean new_slider_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static void slider_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value, GtkWidget *widget); -static gboolean slider_value_changed_event_cb(GtkRange *range, gpointer user_data); +static gboolean slider_value_changed_event_cb(GtkRange *range, GtkScrollType scroll_type, gdouble input_value, gpointer user_data); /*static void change_speaker_image(gdouble volume_percent);*/ /*static void prepare_state_machine();*/ @@ -319,7 +319,7 @@ static gboolean new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * p g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(slider_prop_change_cb), volume_slider); GtkWidget* slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)volume_slider); - g_signal_connect(slider, "value-changed", G_CALLBACK(slider_value_changed_event_cb), newitem); + g_signal_connect(slider, "change-value", G_CALLBACK(slider_value_changed_event_cb), newitem); gtk_widget_show_all(volume_slider); return TRUE; } @@ -341,16 +341,16 @@ static void slider_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * return; } -static gboolean slider_value_changed_event_cb(GtkRange *range, gpointer user_data) +static gboolean slider_value_changed_event_cb(GtkRange *range, GtkScrollType scroll_type, gdouble input_value, gpointer user_data) { /* #if(slider_value != input_value_from_across_the_dbus)*/ /* #{ */ DbusmenuMenuitem *item = (DbusmenuMenuitem*)user_data; + gdouble clamped_input = CLAMP(input_value, 0, 100); GValue value = {0}; - gdouble input = gtk_range_get_value(range); - g_debug("CALLBACK for the range - input received = %f", input); + g_debug("User input Event listener for the range - input received = %f", clamped_input); g_value_init(&value, G_TYPE_DOUBLE); - g_value_set_double(&value, input); + g_value_set_double(&value, clamped_input); dbusmenu_menuitem_handle_event (item, "slider_change", &value, 0); /* change_speaker_image(slider_value);*/ /* }*/ diff --git a/src/pulse-manager.c b/src/pulse-manager.c index 0a35d92..169c0df 100644 --- a/src/pulse-manager.c +++ b/src/pulse-manager.c @@ -44,7 +44,8 @@ void set_sink_volume(gdouble percent) g_debug("and an actual volume of %f", (gdouble)new_volume); pa_cvolume dev_vol; sink_info *s = g_hash_table_lookup(sink_hash, GINT_TO_POINTER(DEFAULT_SINK_INDEX)); - pa_cvolume_set(&dev_vol, s->volume.channels, new_volume); + pa_cvolume_set(&dev_vol, s->volume.channels, new_volume); + // TODO - really this needs to be set in the success callback - if call fails then the ui will not be updated indefinitely! pa_operation_unref(pa_context_set_sink_volume_by_index(pulse_context, DEFAULT_SINK_INDEX, &dev_vol, NULL, NULL)); } @@ -194,15 +195,13 @@ static void pulse_sink_info_callback(pa_context *c, const pa_sink_info *sink, in DEFAULT_SINK_INDEX = (DEFAULT_SINK_INDEX < 0) ? 0 : DEFAULT_SINK_INDEX; test_hash(); update_pa_state(TRUE, device_available, default_sink_is_muted(), get_default_sink_volume()); - g_debug("default sink index : %d", DEFAULT_SINK_INDEX); - + g_debug("default sink index : %d", DEFAULT_SINK_INDEX); } else{ //Update the indicator to show PA either is not ready or has no available sink g_warning("Cannot find a suitable default sink ..."); update_pa_state(FALSE, device_available, TRUE, 0); } - } else{ g_debug("About to add an item to our hash"); @@ -285,8 +284,8 @@ static void update_sink_info(pa_context *c, const pa_sink_info *info, int eol, v /* g_debug("Are the volumes the same %i", equal); */ s->volume = info->volume; s->base_volume = info->base_volume; - s->channel_map = info->channel_map; - if(DEFAULT_SINK_INDEX == s->index/* && update_ui_vol == TRUE*/) + s->channel_map = info->channel_map; + if(DEFAULT_SINK_INDEX == s->index) { //update the UI pa_volume_t vol = pa_cvolume_avg(&s->volume); @@ -297,6 +296,11 @@ static void update_sink_info(pa_context *c, const pa_sink_info *info, int eol, v sound_service_dbus_update_sink_volume(dbus_service, pa_sw_volume_to_linear(vol) * 100); update_mute_ui(s->mute); } + else{ + // Reset the ui flag + // TODO: there must be a nicer way to do this - I suspect this pattern could introduce race conditions !!! + g_debug("SKIPPED UPDATING UI BECAUSE THE UI_NEEDS_UPDATE WAS FALSE!"); + } } else { @@ -343,7 +347,7 @@ static void subscribed_events_callback(pa_context *c, enum pa_subscription_event switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { - //TODO handle the remove event + //TODO handle the remove event => if its our default sink - grey out the ui with update_pa_state } else { pa_operation_unref(pa_context_get_sink_info_by_index(c, index, update_sink_info, userdata)); } |