diff options
-rw-r--r-- | mate-volume-control/src/gvc-mixer-dialog.c | 150 |
1 files changed, 103 insertions, 47 deletions
diff --git a/mate-volume-control/src/gvc-mixer-dialog.c b/mate-volume-control/src/gvc-mixer-dialog.c index 9b524fe..5087bae 100644 --- a/mate-volume-control/src/gvc-mixer-dialog.c +++ b/mate-volume-control/src/gvc-mixer-dialog.c @@ -922,22 +922,95 @@ add_stream (GvcMixerDialog *dialog, MateMixerStream *stream) } } +static MateMixerStream * +find_device_test_stream (GvcMixerDialog *dialog, MateMixerDevice *device) +{ + GList *streams; + + streams = (GList *) mate_mixer_control_list_streams (dialog->priv->control); + while (streams) { + MateMixerStream *stream; + + stream = MATE_MIXER_STREAM (streams->data); + + if (mate_mixer_stream_get_device (stream) == device && + mate_mixer_stream_get_num_channels (stream) >= 1) { + MateMixerStreamFlags flags; + + flags = mate_mixer_stream_get_flags (stream); + + if ((flags & (MATE_MIXER_STREAM_OUTPUT | + MATE_MIXER_STREAM_CLIENT)) == MATE_MIXER_STREAM_OUTPUT) + return stream; + } + streams = streams->next; + } + return FALSE; +} + static void -on_control_stream_added (MateMixerControl *control, - const gchar *name, - GvcMixerDialog *dialog) +update_device_test_visibility (GvcMixerDialog *dialog) { + MateMixerDevice *device; MateMixerStream *stream; - GtkWidget *bar; - bar = g_hash_table_lookup (dialog->priv->bars, name); - if (G_UNLIKELY (bar != NULL)) + device = g_object_get_data (G_OBJECT (dialog->priv->hw_profile_combo), "device"); + if (G_UNLIKELY (device == NULL)) { + g_warn_if_reached (); return; + } + + stream = find_device_test_stream (dialog, device); + + g_object_set (G_OBJECT (dialog->priv->hw_profile_combo), + "show-button", (stream != NULL), + NULL); +} + +static void +on_control_stream_added (MateMixerControl *control, + const gchar *name, + GvcMixerDialog *dialog) +{ + MateMixerStream *stream; + MateMixerStreamFlags flags; + GtkWidget *bar; stream = mate_mixer_control_get_stream (control, name); if (G_UNLIKELY (stream == NULL)) return; + flags = mate_mixer_stream_get_flags (stream); + + /* If the newly added stream belongs to the currently selected device and + * the test button is hidden, this stream may be the one to allow the + * sound test and therefore we may need to enable the button */ + if (dialog->priv->hw_profile_combo != NULL && + ((flags & (MATE_MIXER_STREAM_OUTPUT | + MATE_MIXER_STREAM_CLIENT)) == MATE_MIXER_STREAM_OUTPUT)) { + MateMixerDevice *device1; + MateMixerDevice *device2; + + device1 = mate_mixer_stream_get_device (stream); + device2 = g_object_get_data (G_OBJECT (dialog->priv->hw_profile_combo), + "device"); + + if (device1 == device2) { + gboolean show_button; + + g_object_get (G_OBJECT (dialog->priv->hw_profile_combo), + "show-button", &show_button, + NULL); + + if (show_button == FALSE) + update_device_test_visibility (dialog); + } + } + + bar = g_hash_table_lookup (dialog->priv->bars, name); + if (G_UNLIKELY (bar != NULL)) + return; + add_stream (dialog, stream); } @@ -993,6 +1066,18 @@ on_control_stream_removed (MateMixerControl *control, const gchar *name, GvcMixerDialog *dialog) { + + if (dialog->priv->hw_profile_combo != NULL) { + gboolean show_button; + + g_object_get (G_OBJECT (dialog->priv->hw_profile_combo), + "show-button", &show_button, + NULL); + + if (show_button == TRUE) + update_device_test_visibility (dialog); + } + remove_stream (dialog, name); } @@ -1413,32 +1498,6 @@ create_stream_treeview (GvcMixerDialog *dialog, GCallback on_toggled) return treeview; } -static MateMixerStream * -find_device_test_stream (GvcMixerDialog *dialog, MateMixerDevice *device) -{ - GList *streams; - - streams = (GList *) mate_mixer_control_list_streams (dialog->priv->control); - while (streams) { - MateMixerStream *stream; - - stream = MATE_MIXER_STREAM (streams->data); - - if (mate_mixer_stream_get_device (stream) == device && - mate_mixer_stream_get_num_channels (stream) >= 1) { - MateMixerStreamFlags flags; - - flags = mate_mixer_stream_get_flags (stream); - - if ((flags & (MATE_MIXER_STREAM_OUTPUT | - MATE_MIXER_STREAM_CLIENT)) == MATE_MIXER_STREAM_OUTPUT) - return stream; - } - streams = streams->next; - } - return FALSE; -} - static void on_test_speakers_clicked (GvcComboBox *widget, GvcMixerDialog *dialog) { @@ -1503,6 +1562,10 @@ create_profile_combo_box (GvcMixerDialog *dialog, dialog->priv->size_group, FALSE); + g_object_set (G_OBJECT (combobox), + "button-label", _("Test Speakers"), + NULL); + g_object_set_data_full (G_OBJECT (combobox), "device", g_object_ref (device), @@ -1513,6 +1576,11 @@ create_profile_combo_box (GvcMixerDialog *dialog, G_CALLBACK (on_combo_box_profile_changed), dialog); + g_signal_connect (G_OBJECT (combobox), + "button-clicked", + G_CALLBACK (on_test_speakers_clicked), + dialog); + return combobox; } @@ -1555,9 +1623,8 @@ on_device_selection_changed (GtkTreeSelection *selection, GvcMixerDialog *dialog * not supported on other backends by libmatemixer, so avoid displaying * the combo box on other backends */ if (backend == MATE_MIXER_BACKEND_PULSEAUDIO) { - const GList *profiles; - const gchar *profile_name = NULL; - MateMixerStream *stream = NULL; + const GList *profiles; + const gchar *profile_name = NULL; profiles = mate_mixer_device_list_profiles (device); if (profiles != NULL) { @@ -1586,18 +1653,7 @@ on_device_selection_changed (GtkTreeSelection *selection, GvcMixerDialog *dialog /* Enable the speaker test button if the selected device * is capable of sound output */ - stream = find_device_test_stream (dialog, device); - if (stream != NULL) { - g_object_set (G_OBJECT (dialog->priv->hw_profile_combo), - "show-button", TRUE, - "button-label", _("Test Speakers"), - NULL); - - g_signal_connect (G_OBJECT (dialog->priv->hw_profile_combo), - "button-clicked", - G_CALLBACK (on_test_speakers_clicked), - dialog); - } + update_device_test_visibility (dialog); gtk_widget_show (dialog->priv->hw_profile_combo); } |