[empathy: 18/23] mic-menu: display monitors when they're the current mic



commit 302af77150e52cb625bc3e164808bd812979cc32
Author: Jonny Lamb <jonny lamb collabora co uk>
Date:   Thu Jul 28 15:29:44 2011 +0100

    mic-menu: display monitors when they're the current mic
    
    ...but otherwise hide them.
    
    Signed-off-by: Jonny Lamb <jonny lamb collabora co uk>

 src/empathy-mic-menu.c |   32 ++++++++++++++++++++++++++++----
 1 files changed, 28 insertions(+), 4 deletions(-)
---
diff --git a/src/empathy-mic-menu.c b/src/empathy-mic-menu.c
index 1053b71..3ebd31c 100644
--- a/src/empathy-mic-menu.c
+++ b/src/empathy-mic-menu.c
@@ -51,6 +51,8 @@ struct _EmpathyMicMenuPrivate
 
 G_DEFINE_TYPE (EmpathyMicMenu, empathy_mic_menu, G_TYPE_OBJECT);
 
+#define MONITOR_KEY "empathy-mic-menu-is-monitor"
+
 enum
 {
   PROP_WINDOW = 1,
@@ -186,16 +188,28 @@ empathy_mic_menu_update (EmpathyMicMenu *self)
       GtkRadioAction *action = l->data;
       const gchar *name = gtk_action_get_name (GTK_ACTION (action));
       gint value;
+      gboolean active;
 
       g_object_get (action, "value", &value, NULL);
 
-      if (value == (gint) current_mic)
+      active = (value == (gint) current_mic);
+
+      if (active)
         {
           priv->in_update = TRUE;
           gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
           priv->in_update = FALSE;
         }
 
+      /* If action is a monitor then don't show it in the UI, BUT do
+       * display it regardless if it is the current device. This is so
+       * we don't have a rubbish UI by showing monitor devices in
+       * Empathy, but still show the correct device when someone plays
+       * with pavucontrol. */
+      if (g_object_get_data (G_OBJECT (action), MONITOR_KEY) != NULL
+          && !active)
+        continue;
+
       gtk_ui_manager_add_ui (ui_manager, priv->ui_id,
           /* TODO: this should probably be passed from the call
            * window, seeing that it's a reference to
@@ -209,7 +223,8 @@ static void
 empathy_mic_menu_add_microphone (EmpathyMicMenu *self,
     const gchar *name,
     const gchar *description,
-    guint source_idx)
+    guint source_idx,
+    gboolean is_monitor)
 {
   EmpathyMicMenuPrivate *priv = self->priv;
   GtkRadioAction *action;
@@ -219,6 +234,14 @@ empathy_mic_menu_add_microphone (EmpathyMicMenu *self,
   gtk_action_group_add_action_with_accel (priv->action_group,
       GTK_ACTION (action), NULL);
 
+  /* Set MONITOR_KEY on the action to non-NULL if it's a monitor
+   * because we don't want to show monitors if we can help it. */
+  if (is_monitor)
+    {
+      g_object_set_data (G_OBJECT (action), MONITOR_KEY,
+          GUINT_TO_POINTER (TRUE));
+    }
+
   group = gtk_radio_action_get_group (GTK_RADIO_ACTION (priv->anchor_action));
   gtk_radio_action_set_group (GTK_RADIO_ACTION (action), group);
 
@@ -244,7 +267,8 @@ empathy_mic_menu_microphone_added_cb (EmpathyGstAudioSrc *audio,
     gboolean is_monitor,
     EmpathyMicMenu *self)
 {
-  empathy_mic_menu_add_microphone (self, name, description, source_idx);
+  empathy_mic_menu_add_microphone (self, name, description,
+      source_idx, is_monitor);
 
   empathy_mic_menu_update (self);
 }
@@ -305,7 +329,7 @@ empathy_mic_menu_get_microphones_cb (GObject *source_object,
       EmpathyAudioSrcMicrophone *mic = mics->data;
 
       empathy_mic_menu_add_microphone (self, mic->name,
-          mic->description, mic->index);
+          mic->description, mic->index, mic->is_monitor);
     }
 
   empathy_mic_menu_update (self);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]