From 59cf6bdba1c4206a9587c9b642a427e6db1a2f2c Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 17 Feb 2010 17:21:53 +0000 Subject: Handles slider feedback loop with the service nicely plus tidy up --- src/indicator-sound.c | 91 ++++++++++++++++++++------------------------------- 1 file changed, 36 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 26b73a6..f9e98ed 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -82,7 +82,7 @@ static GtkMenu * get_menu (IndicatorObject * io); static GtkWidget *volume_slider = NULL; 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 user_change_value_event_cb(GtkRange *range, GtkScrollType scroll_type, gdouble input_value, gpointer user_data); +/*static gboolean user_change_value_event_cb(GtkRange *range, GtkScrollType scroll_type, gdouble input_value, gpointer user_data);*/ static gboolean value_changed_event_cb(GtkRange *range, gpointer user_data); static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data); @@ -148,15 +148,6 @@ static void indicator_sound_init (IndicatorSound *self) } -/*static void test_images_hash()*/ -/*{*/ -/* g_debug("about to test the images hash"); */ -/* gchar* current_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(current_state));*/ -/* g_debug("start up current image name = %s", current_name); */ -/* gchar* previous_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(previous_state));*/ -/* g_debug("start up previous image name = %s", previous_name); */ -/*}*/ - /* Prepare states Array. */ @@ -264,14 +255,7 @@ static void catch_signal_sink_volume_update(DBusGProxy *proxy, gdouble volume_pe // DEBUG gdouble current_value = gtk_range_get_value(range); g_debug("SIGNAL- update sink volume - current_value : %f and new value : %f", current_value, volume_percent); - - // Don't like this solution - too fuzzy - // Need the ability to detect if the slider is grabbed - if(floor(current_value) != floor(volume_percent)) - { - g_debug("Going to update slider value"); - gtk_range_set_value(range, volume_percent); - } + gtk_range_set_value(range, volume_percent); determine_state_from_volume(volume_percent); } @@ -337,15 +321,6 @@ static void update_state(const gint state) gtk_image_set_from_icon_name(speaker_image, image_name, GTK_ICON_SIZE_MENU); } -/*static void revert_state()*/ -/*{*/ - -/* g_debug("revert state beginning - previous_state = %i", previous_state);*/ -/* current_state = previous_state;*/ -/* gchar* image_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(current_state));*/ -/* gtk_image_set_from_icon_name(speaker_image, image_name, GTK_ICON_SIZE_MENU);*/ -/* g_debug("after reverting back to previous state of %i", current_state);*/ -/*}*/ static void determine_state_from_volume(gdouble volume_percent) { @@ -377,12 +352,16 @@ get_menu (IndicatorObject * io) DbusmenuGtkClient *client = dbusmenu_gtkmenu_get_client(menu); dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_SLIDER_MENUITEM_TYPE, new_slider_item); - // register Key-press listening on the widget + // register Key-press listening on the menu widget as the slider does not allow this. g_signal_connect(menu, "key-press-event", G_CALLBACK(key_press_cb), NULL); return GTK_MENU(menu); } +/** +new_slider_item: +Create a new dBusMenu Slider item, register the +**/ static gboolean new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); @@ -398,7 +377,7 @@ static gboolean new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * p // register slider changes listening on the range GtkWidget* slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)volume_slider); - g_signal_connect(slider, "change-value", G_CALLBACK(user_change_value_event_cb), newitem); +/* g_signal_connect(slider, "change-value", G_CALLBACK(user_change_value_event_cb), newitem); */ g_signal_connect(slider, "value-changed", G_CALLBACK(value_changed_event_cb), newitem); // Set images on the ido @@ -412,8 +391,10 @@ static gboolean new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * p return TRUE; } -/* Whenever we have a property change on a DbusmenuMenuitem - we need to be responsive to that. */ +/** +slider_prop_change_cb: +Whenever we have a property change on a DbusmenuMenuitem this will be called. +**/ static void slider_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value, GtkWidget *widget) { g_debug("slider_prop_change_cb - dodgy updater "); @@ -425,22 +406,21 @@ static void slider_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * } /** -This callback will get triggered irregardless of whether its a user change or a programmatic change -Our usecase for this particular callback is only interested if the slider is changed by the user hitting either icon -which will result in a programmatic value change of 0 or 100 (work around). +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) { - gdouble current_value = gtk_range_get_value(range); -/* if(current_value == 0 || current_value == 100)*/ -/* {*/ + gdouble current_value = CLAMP(gtk_range_get_value(range), 0, 100); DbusmenuMenuitem *item = (DbusmenuMenuitem*)user_data; GValue value = {0}; g_value_init(&value, G_TYPE_DOUBLE); g_value_set_double(&value, current_value); g_debug("Value changed callback - = %f", current_value); - dbusmenu_menuitem_handle_event (item, "slider_change", &value, 0); -/* }*/ + dbusmenu_menuitem_handle_event (item, "slider_change", &value, 0); + // This is not ideal in that the icon ui will update on ui actions and not on actual service feedback. + // but necessary for now as the server does not send volume update information if the source of change was this ui. + determine_state_from_volume(current_value); return FALSE; } @@ -450,9 +430,8 @@ key_press_cb: static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) { - if(event->length > 0) - g_debug("The key event's string is '%s'\n", event->string); - +/* if(event->length > 0)*/ +/* g_debug("The key event's string is '%s'\n", event->string);*/ GtkWidget* slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)volume_slider); GtkRange* range = (GtkRange*)slider; gdouble current_value = gtk_range_get_value(range); @@ -502,7 +481,7 @@ static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer dat new_value = CLAMP(new_value, 0, 100); if(new_value != current_value) { - g_debug("Attempting to set the range to %f", new_value); + g_debug("Attempting to set the range from the key listener to %f", new_value); gtk_range_set_value(range, new_value); } return FALSE; @@ -510,18 +489,20 @@ static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer dat /** This callback should only be called when the user actually drags the slider. -Turned off for now in favour of the non descriminating call back. +Turned off for now in favour of the non descriminating value-changed call back. +Once the grabbing listener is implemented on the slider may revert to using this. +Its another tool for filtering unwanted volume change updates. **/ -static gboolean user_change_value_event_cb(GtkRange *range, GtkScrollType scroll_type, gdouble input_value, gpointer user_data) -{ - DbusmenuMenuitem *item = (DbusmenuMenuitem*)user_data; - gdouble clamped_input = CLAMP(input_value, 0, 100); - GValue value = {0}; - g_debug("User input on SLIDER - = %f", clamped_input); - g_value_init(&value, G_TYPE_DOUBLE); - g_value_set_double(&value, clamped_input); - dbusmenu_menuitem_handle_event (item, "slider_change", &value, 0); - return FALSE; -} +/*static gboolean user_change_value_event_cb(GtkRange *range, GtkScrollType scroll_type, gdouble input_value, gpointer user_data)*/ +/*{*/ +/* DbusmenuMenuitem *item = (DbusmenuMenuitem*)user_data;*/ +/* gdouble clamped_input = CLAMP(input_value, 0, 100);*/ +/* GValue value = {0};*/ +/* g_debug("User input on SLIDER - = %f", clamped_input);*/ +/* g_value_init(&value, G_TYPE_DOUBLE);*/ +/* g_value_set_double(&value, clamped_input);*/ +/* dbusmenu_menuitem_handle_event (item, "slider_change", &value, 0);*/ +/* return FALSE; */ +/*} */ -- cgit v1.2.3