aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common-defs.h1
-rw-r--r--src/voip-input-menu-item.c18
-rw-r--r--src/voip-input-widget.c43
3 files changed, 49 insertions, 13 deletions
diff --git a/src/common-defs.h b/src/common-defs.h
index a0c097c..1a4e71e 100644
--- a/src/common-defs.h
+++ b/src/common-defs.h
@@ -40,6 +40,7 @@ typedef enum {
#define DBUSMENU_VOIP_INPUT_MENUITEM_TYPE "x-canonical-ido-voip-input-type"
#define DBUSMENU_VOIP_INPUT_MENUITEM_LEVEL "x-canonical-ido-voip-input-level"
+#define DBUSMENU_VOIP_INPUT_MENUITEM_MUTE "x-canonical-ido-voip-input-mute"
#define DBUSMENU_MUTE_MENUITEM_TYPE "x-canonical-sound-menu-mute-type"
#define DBUSMENU_MUTE_MENUITEM_VALUE "x-canonical-sound-menu-mute-value"
diff --git a/src/voip-input-menu-item.c b/src/voip-input-menu-item.c
index 498fb77..337420b 100644
--- a/src/voip-input-menu-item.c
+++ b/src/voip-input-menu-item.c
@@ -48,6 +48,7 @@ static void voip_input_menu_item_dispose (GObject *object);
static void voip_input_menu_item_finalize (GObject *object);
static void handle_event (DbusmenuMenuitem * mi, const gchar * name,
GVariant * value, guint timestamp);
+// TODO:
// This method should really be shared between this and the volume slider obj
// perfectly static - wait until the device mgr wrapper is properly sorted and
// then consolidate
@@ -84,6 +85,7 @@ voip_input_menu_item_init (VoipInputMenuItem *self)
priv->source_index = DEVICE_NOT_ACTIVE;
priv->sink_input_index = DEVICE_NOT_ACTIVE;
priv->client_index = DEVICE_NOT_ACTIVE;
+ priv->mute = 0;
}
static void
@@ -153,6 +155,17 @@ voip_input_menu_item_update (VoipInputMenuItem* item,
priv->source_index = source->index;
}
priv->volume = voip_input_menu_item_construct_mono_volume (&source->volume);
+
+ // Only send over the mute updates if the state has changed.
+ if (priv->mute != source->mute){
+ g_debug ("voip menu item - update - mute = %i", priv->mute);
+
+ GVariant* new_mute_update = g_variant_new_int32 (source->mute);
+ dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(item),
+ DBUSMENU_VOIP_INPUT_MENUITEM_MUTE,
+ new_mute_update);
+ }
+
priv->mute = source->mute;
pa_volume_t vol = pa_cvolume_max (&source->volume);
@@ -178,10 +191,6 @@ voip_input_menu_item_is_interested (VoipInputMenuItem* item,
}
priv->sink_input_index = sink_input_index;
-
- g_debug ("vimi - siindex = %i", sink_input_index);
- g_debug ("vimi - siindex stored = %i", priv->sink_input_index);
-
priv->client_index = client_index;
return TRUE;
@@ -227,7 +236,6 @@ voip_input_menu_item_deactivate_voip_client (VoipInputMenuItem* item)
voip_input_menu_item_enable (item, FALSE);
}
-
void
voip_input_menu_item_enable (VoipInputMenuItem* item,
gboolean active)
diff --git a/src/voip-input-widget.c b/src/voip-input-widget.c
index de06c7c..9b29feb 100644
--- a/src/voip-input-widget.c
+++ b/src/voip-input-widget.c
@@ -76,7 +76,6 @@ voip_input_widget_class_init (VoipInputWidgetClass *klass)
static void
voip_input_widget_init (VoipInputWidget *self)
{
- //g_debug("VoipInputWidget::voip_input_widget_init");
VoipInputWidgetPrivate * priv = VOIP_INPUT_WIDGET_GET_PRIVATE(self);
priv->ido_voip_input_slider = ido_scale_menu_item_new_with_range ("VOLUME", IDO_RANGE_STYLE_DEFAULT, 0, 0, 100, 1);
@@ -122,8 +121,8 @@ voip_input_widget_finalize (GObject *object)
}
static void
-voip_input_widget_property_update( DbusmenuMenuitem* item, gchar* property,
- GVariant* value, gpointer userdata)
+voip_input_widget_property_update (DbusmenuMenuitem* item, gchar* property,
+ GVariant* value, gpointer userdata)
{
g_return_if_fail (IS_VOIP_INPUT_WIDGET (userdata));
VoipInputWidget* mitem = VOIP_INPUT_WIDGET(userdata);
@@ -138,6 +137,24 @@ voip_input_widget_property_update( DbusmenuMenuitem* item, gchar* property,
gtk_range_set_value(range, update);
}
}
+ if(g_ascii_strcasecmp(DBUSMENU_VOIP_INPUT_MENUITEM_MUTE, property) == 0){
+ if(priv->grabbed == FALSE){
+ GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_voip_input_slider);
+ GtkRange *range = (GtkRange*)slider;
+ gint update = g_variant_get_int32 (value);
+ gdouble level;
+ if (update == 1){
+ level = 0;
+ }
+ else{
+ level = g_variant_get_double (dbusmenu_menuitem_property_get_variant (priv->twin_item,
+ DBUSMENU_VOIP_INPUT_MENUITEM_LEVEL));
+ }
+ gtk_range_set_value(range, level);
+
+ g_debug ("voip-item-widget - update mute with value %i", update);
+ }
+ }
}
static void
@@ -155,6 +172,12 @@ voip_input_widget_set_twin_item (VoipInputWidget* self,
GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_voip_input_slider);
GtkRange *range = (GtkRange*)slider;
gtk_range_set_value(range, initial_level);
+
+ gint mute = g_variant_get_int32 (dbusmenu_menuitem_property_get_variant (priv->twin_item,
+ DBUSMENU_VOIP_INPUT_MENUITEM_MUTE));
+ if (mute == 1){
+ gtk_range_set_value (range, 0.0);
+ }
}
static gboolean
@@ -170,10 +193,12 @@ voip_input_widget_change_value_cb (GtkRange *range,
}
-/*
- We only want this callback to catch mouse icon press events
- which set the slider to 0 or 100. Ignore all other events.
-*/
+/**
+ * We only want this callback to catch mouse icon press events which set the
+ * slider to 0 or 100. Ignore all other events including the new Mute behaviour
+ * (slider to go to 0 on mute without setting the level to 0 and return to
+ * previous level on unmute)
+ **/
static gboolean
voip_input_widget_value_changed_cb(GtkRange *range, gpointer user_data)
{
@@ -183,7 +208,9 @@ voip_input_widget_value_changed_cb(GtkRange *range, gpointer user_data)
GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_voip_input_slider);
gdouble current_value = CLAMP(gtk_range_get_value(GTK_RANGE(slider)), 0, 100);
- if(current_value == 0 || current_value == 100){
+ gint mute = g_variant_get_int32 (dbusmenu_menuitem_property_get_variant (priv->twin_item,
+ DBUSMENU_VOIP_INPUT_MENUITEM_MUTE));
+ if ((current_value == 0 && mute != 1) || current_value == 100 ){
voip_input_widget_update(mitem, current_value);
}
return FALSE;