diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pavucontrol.cc | 74 | ||||
-rw-r--r-- | src/pavucontrol.glade | 157 |
2 files changed, 179 insertions, 52 deletions
diff --git a/src/pavucontrol.cc b/src/pavucontrol.cc index 754cb40..0804cb1 100644 --- a/src/pavucontrol.cc +++ b/src/pavucontrol.cc @@ -38,6 +38,12 @@ static pa_context *context = NULL; static int n_outstanding = 0; +enum SinkInputType { + SINK_INPUT_ALL, + SINK_INPUT_CLIENT, + SINK_INPUT_VIRTUAL +}; + enum SinkType { SINK_ALL, SINK_HARDWARE, @@ -135,6 +141,8 @@ public: static SinkInputWidget* create(); virtual ~SinkInputWidget(); + SinkInputType type; + uint32_t index, clientIndex, sinkIndex; virtual void executeVolumeUpdate(); virtual void onMuteToggleButton(); @@ -186,16 +194,18 @@ public: Gtk::VBox *streamsVBox, *sinksVBox, *sourcesVBox; Gtk::EventBox *titleEventBox; Gtk::Label *noStreamsLabel, *noSinksLabel, *noSourcesLabel; - Gtk::ComboBox *sinkTypeComboBox, *sourceTypeComboBox; + Gtk::ComboBox *sinkInputTypeComboBox, *sinkTypeComboBox, *sourceTypeComboBox; std::map<uint32_t, SinkWidget*> sinkWidgets; std::map<uint32_t, SourceWidget*> sourceWidgets; - std::map<uint32_t, SinkInputWidget*> streamWidgets; + std::map<uint32_t, SinkInputWidget*> sinkInputWidgets; std::map<uint32_t, char*> clientNames; + SinkInputType showSinkInputType; SinkType showSinkType; SourceType showSourceType; - + + virtual void onSinkInputTypeComboBoxChanged(); virtual void onSinkTypeComboBoxChanged(); virtual void onSourceTypeComboBoxChanged(); @@ -522,6 +532,7 @@ void SinkInputWidget::SinkMenuItem::onToggle() { MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x) : Gtk::Window(cobject), + showSinkInputType(SINK_INPUT_CLIENT), showSinkType(SINK_ALL), showSourceType(SOURCE_NO_MONITOR) { @@ -532,6 +543,7 @@ MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade: x->get_widget("noStreamsLabel", noStreamsLabel); x->get_widget("noSinksLabel", noSinksLabel); x->get_widget("noSourcesLabel", noSourcesLabel); + x->get_widget("sinkInputTypeComboBox", sinkInputTypeComboBox); x->get_widget("sinkTypeComboBox", sinkTypeComboBox); x->get_widget("sourceTypeComboBox", sourceTypeComboBox); @@ -539,9 +551,11 @@ MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade: streamsVBox->set_reallocate_redraws(true); sinksVBox->set_reallocate_redraws(true); + sinkInputTypeComboBox->set_active((int) showSinkInputType); sinkTypeComboBox->set_active((int) showSinkType); sourceTypeComboBox->set_active((int) showSourceType); + sinkInputTypeComboBox->signal_changed().connect(sigc::mem_fun(*this, &MainWindow::onSinkInputTypeComboBoxChanged)); sinkTypeComboBox->signal_changed().connect(sigc::mem_fun(*this, &MainWindow::onSinkTypeComboBoxChanged)); sourceTypeComboBox->signal_changed().connect(sigc::mem_fun(*this, &MainWindow::onSourceTypeComboBoxChanged)); @@ -637,20 +651,24 @@ void MainWindow::updateSource(const pa_source_info &info) { void MainWindow::updateSinkInput(const pa_sink_input_info &info) { SinkInputWidget *w; + bool is_new = false; - if (streamWidgets.count(info.index)) - w = streamWidgets[info.index]; + if (sinkInputWidgets.count(info.index)) + w = sinkInputWidgets[info.index]; else { - streamWidgets[info.index] = w = SinkInputWidget::create(); + sinkInputWidgets[info.index] = w = SinkInputWidget::create(); w->setChannelMap(info.channel_map); streamsVBox->pack_start(*w, false, false, 0); w->index = info.index; w->clientIndex = info.client; w->mainWindow = this; + is_new = true; } w->updating = true; + w->type = info.client != PA_INVALID_INDEX ? SINK_INPUT_CLIENT : SINK_INPUT_VIRTUAL; + w->sinkIndex = info.sink; char *txt; @@ -664,11 +682,11 @@ void MainWindow::updateSinkInput(const pa_sink_input_info &info) { w->nameLabel->set_label(info.name); } - w->muteToggleButton->set_active(info.mute); w->setVolume(info.volume); + w->muteToggleButton->set_active(info.mute); - w->show(); - updateDeviceVisibility(); + if (is_new) + updateDeviceVisibility(); w->updating = false; } @@ -678,7 +696,7 @@ void MainWindow::updateClient(const pa_client_info &info) { g_free(clientNames[info.index]); clientNames[info.index] = g_strdup(info.name); - for (std::map<uint32_t, SinkInputWidget*>::iterator i = streamWidgets.begin(); i != streamWidgets.end(); ++i) { + for (std::map<uint32_t, SinkInputWidget*>::iterator i = sinkInputWidgets.begin(); i != sinkInputWidgets.end(); ++i) { SinkInputWidget *w = i->second; if (!w) @@ -694,16 +712,26 @@ void MainWindow::updateClient(const pa_client_info &info) { void MainWindow::updateDeviceVisibility() { - if (streamWidgets.empty()) - noStreamsLabel->show(); - else - noStreamsLabel->hide(); - + streamsVBox->hide_all(); sourcesVBox->hide_all(); sinksVBox->hide_all(); bool is_empty = true; + for (std::map<uint32_t, SinkInputWidget*>::iterator i = sinkInputWidgets.begin(); i != sinkInputWidgets.end(); ++i) { + SinkInputWidget* w = i->second; + + if (showSinkInputType == SINK_INPUT_ALL || w->type == showSinkInputType) { + w->show_all(); + is_empty = false; + } + } + + if (is_empty) + noStreamsLabel->show(); + + is_empty = true; + for (std::map<uint32_t, SinkWidget*>::iterator i = sinkWidgets.begin(); i != sinkWidgets.end(); ++i) { SinkWidget* w = i->second; @@ -734,6 +762,7 @@ void MainWindow::updateDeviceVisibility() { sourcesVBox->show(); sinksVBox->show(); + streamsVBox->show(); } void MainWindow::removeSink(uint32_t index) { @@ -755,11 +784,11 @@ void MainWindow::removeSource(uint32_t index) { } void MainWindow::removeSinkInput(uint32_t index) { - if (!streamWidgets.count(index)) + if (!sinkInputWidgets.count(index)) return; - delete streamWidgets[index]; - streamWidgets.erase(index); + delete sinkInputWidgets[index]; + sinkInputWidgets.erase(index); updateDeviceVisibility(); } @@ -786,6 +815,15 @@ void MainWindow::onSourceTypeComboBoxChanged() { updateDeviceVisibility(); } +void MainWindow::onSinkInputTypeComboBoxChanged() { + showSinkInputType = (SinkInputType) sinkInputTypeComboBox->get_active_row_number(); + + if (showSinkInputType == (SinkInputType) -1) + sinkInputTypeComboBox->set_active((int) SINK_INPUT_CLIENT); + + updateDeviceVisibility(); +} + static void dec_outstanding(MainWindow *w) { if (n_outstanding <= 0) return; diff --git a/src/pavucontrol.glade b/src/pavucontrol.glade index 296a91e..8bd353f 100644 --- a/src/pavucontrol.glade +++ b/src/pavucontrol.glade @@ -100,6 +100,7 @@ <child> <widget class="GtkViewport" id="viewport1"> <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> <child> <widget class="GtkVBox" id="streamsVBox"> <property name="visible">True</property> @@ -133,34 +134,60 @@ <child> <widget class="GtkHBox" id="hbox5"> <property name="visible">True</property> - <property name="homogeneous">True</property> + <property name="spacing">6</property> <child> - <widget class="GtkHBox" id="hbox6"> + <widget class="GtkImage" id="image21"> <property name="visible">True</property> - <property name="spacing">6</property> - <child> - <widget class="GtkImage" id="image21"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="icon_size">6</property> - <property name="icon_name">gtk-dialog-info</property> - </widget> - </child> + <property name="xalign">1</property> + <property name="stock">gtk-dialog-info</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment6"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="right_padding">12</property> <child> <widget class="GtkLabel" id="label4828"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Hint:</b> Right click on a playback stream to move it to another output device.</property> + <property name="label" translatable="yes"><b>Hint:</b> <i>Right click on a playback stream to move it to another output device.</i></property> <property name="use_markup">True</property> </widget> - <packing> - <property name="position">1</property> - </packing> </child> </widget> <packing> <property name="expand">False</property> - <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="xalign">1</property> + <property name="label" translatable="yes"><b>_Show:</b></property> + <property name="use_markup">True</property> + <property name="use_underline">True</property> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="sinkInputTypeComboBox"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="items" translatable="yes" comments="Applications All streams">All Streams +Applications +Virtual Streams</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">3</property> </packing> </child> </widget> @@ -180,7 +207,7 @@ <child> <widget class="GtkLabel" id="label34"> <property name="visible">True</property> - <property name="label" translatable="yes">S_treams</property> + <property name="label" translatable="yes">_Playback</property> <property name="use_underline">True</property> </widget> <packing> @@ -202,6 +229,7 @@ <child> <widget class="GtkViewport" id="viewport4"> <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> <child> <widget class="GtkVBox" id="sinksVBox"> <property name="visible">True</property> @@ -237,27 +265,57 @@ <property name="visible">True</property> <property name="spacing">6</property> <child> + <widget class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="stock">gtk-dialog-info</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment5"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="right_padding">12</property> + <child> + <widget class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Hint:</b> <i>Right click on an output device to make it the default.</i></property> + <property name="use_markup">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> <widget class="GtkLabel" id="label4826"> <property name="visible">True</property> + <property name="xalign">1</property> <property name="label" translatable="yes"><b>S_how:</b></property> <property name="use_markup">True</property> <property name="use_underline">True</property> <property name="mnemonic_widget">sinkTypeComboBox</property> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> + <property name="position">2</property> </packing> </child> <child> <widget class="GtkComboBox" id="sinkTypeComboBox"> <property name="visible">True</property> - <property name="items" translatable="yes">All Sinks -Hardware Sinks -Virtual Sinks</property> + <property name="items" translatable="yes">All Output Devices +Hardware Output Devices +Virtual Output Devices</property> </widget> <packing> - <property name="position">1</property> + <property name="expand">False</property> + <property name="position">3</property> </packing> </child> </widget> @@ -277,7 +335,7 @@ Virtual Sinks</property> <child> <widget class="GtkLabel" id="label4711"> <property name="visible">True</property> - <property name="label" translatable="yes">S_inks</property> + <property name="label" translatable="yes">_Output Devices</property> <property name="use_underline">True</property> </widget> <packing> @@ -300,6 +358,7 @@ Virtual Sinks</property> <child> <widget class="GtkViewport" id="viewport3"> <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> <child> <widget class="GtkVBox" id="sourcesVBox"> <property name="visible">True</property> @@ -335,29 +394,59 @@ Virtual Sinks</property> <property name="visible">True</property> <property name="spacing">6</property> <child> + <widget class="GtkImage" id="image5"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="stock">gtk-dialog-info</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment4"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="right_padding">12</property> + <child> + <widget class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Hint:</b> <i>Right click on an input device to make it the default.</i></property> + <property name="use_markup">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> <widget class="GtkLabel" id="label4827"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Sh_ow:</b></property> + <property name="xalign">1</property> + <property name="label" translatable="yes"><b>Sho_w:</b></property> <property name="use_markup">True</property> <property name="use_underline">True</property> <property name="mnemonic_widget">sourceTypeComboBox</property> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> + <property name="position">2</property> </packing> </child> <child> <widget class="GtkComboBox" id="sourceTypeComboBox"> <property name="visible">True</property> - <property name="items" translatable="yes">All Sources -All Except Monitor Sources -Hardware Sources -Virtual Sources -Monitor Sources</property> + <property name="items" translatable="yes">All Input Devices +All Except Monitors +Hardware Input Devices +Virtual Input Devices +Monitors</property> </widget> <packing> - <property name="position">1</property> + <property name="expand">False</property> + <property name="position">3</property> </packing> </child> </widget> @@ -377,7 +466,7 @@ Monitor Sources</property> <child> <widget class="GtkLabel" id="label4717"> <property name="visible">True</property> - <property name="label" translatable="yes">S_ources</property> + <property name="label" translatable="yes">_Input Devices</property> <property name="use_underline">True</property> </widget> <packing> |