[Xfce4-commits] [panel-plugins/xfce4-pulseaudio-plugin] 01/01: Management of known players, notebook-style preferences (Bug #13903)
noreply at xfce.org
noreply at xfce.org
Sun Feb 25 14:08:56 CET 2018
This is an automated email from the git hooks/post-receive script.
b l u e s a b r e p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository panel-plugins/xfce4-pulseaudio-plugin.
commit e9a1fba17684602a2ccaefd5291f36b7c11d096d
Author: Sean Davis <smd.seandavis at gmail.com>
Date: Sun Feb 25 08:08:50 2018 -0500
Management of known players, notebook-style preferences (Bug #13903)
---
panel-plugin/pulseaudio-config.c | 197 ++++++++++++-
panel-plugin/pulseaudio-config.h | 9 +
panel-plugin/pulseaudio-dialog.c | 106 ++++++-
panel-plugin/pulseaudio-dialog.glade | 553 ++++++++++++++++++++++++-----------
panel-plugin/pulseaudio-menu.c | 3 +
5 files changed, 691 insertions(+), 177 deletions(-)
diff --git a/panel-plugin/pulseaudio-config.c b/panel-plugin/pulseaudio-config.c
index 5b54df5..e2767bc 100644
--- a/panel-plugin/pulseaudio-config.c
+++ b/panel-plugin/pulseaudio-config.c
@@ -55,6 +55,7 @@
#define DEFAULT_ENABLE_MPRIS FALSE
#define DEFAULT_ENABLE_MULTIMEDIA_KEYS FALSE
#endif
+#define DEFAULT_BLACKLISTED_PLAYERS ""
#define DEFAULT_MPRIS_PLAYERS ""
#define DEFAULT_ENABLE_WNCK FALSE
@@ -90,6 +91,7 @@ struct _PulseaudioConfig
gchar *mixer_command;
gboolean enable_mpris;
gchar *mpris_players;
+ gchar *blacklisted_players;
gboolean enable_wnck;
};
@@ -106,6 +108,7 @@ enum
PROP_MIXER_COMMAND,
PROP_ENABLE_MPRIS,
PROP_MPRIS_PLAYERS,
+ PROP_BLACKLISTED_PLAYERS,
PROP_ENABLE_WNCK,
N_PROPERTIES,
};
@@ -209,6 +212,16 @@ pulseaudio_config_class_init (PulseaudioConfigClass *klass)
g_object_class_install_property (gobject_class,
+ PROP_BLACKLISTED_PLAYERS,
+ g_param_spec_string ("blacklisted-players",
+ NULL, NULL,
+ DEFAULT_BLACKLISTED_PLAYERS,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+
+
+ g_object_class_install_property (gobject_class,
PROP_ENABLE_WNCK,
g_param_spec_boolean ("enable-wnck", NULL, NULL,
DEFAULT_ENABLE_WNCK,
@@ -239,6 +252,7 @@ pulseaudio_config_init (PulseaudioConfig *config)
config->mixer_command = g_strdup (DEFAULT_MIXER_COMMAND);
config->enable_mpris = DEFAULT_ENABLE_MPRIS;
config->mpris_players = g_strdup (DEFAULT_MPRIS_PLAYERS);
+ config->blacklisted_players = g_strdup (DEFAULT_BLACKLISTED_PLAYERS);
config->enable_wnck = DEFAULT_ENABLE_WNCK;
}
@@ -299,6 +313,10 @@ pulseaudio_config_get_property (GObject *object,
g_value_set_string (value, config->mpris_players);
break;
+ case PROP_BLACKLISTED_PLAYERS:
+ g_value_set_string (value, config->blacklisted_players);
+ break;
+
case PROP_ENABLE_WNCK:
g_value_set_boolean (value, config->enable_wnck);
break;
@@ -405,6 +423,13 @@ pulseaudio_config_set_property (GObject *object,
g_signal_emit (G_OBJECT (config), pulseaudio_config_signals [CONFIGURATION_CHANGED], 0);
break;
+ case PROP_BLACKLISTED_PLAYERS:
+ g_free (config->blacklisted_players);
+ config->blacklisted_players = g_value_dup_string (value);
+ g_object_notify (G_OBJECT (config), "blacklisted-players");
+ g_signal_emit (G_OBJECT (config), pulseaudio_config_signals [CONFIGURATION_CHANGED], 0);
+ break;
+
case PROP_ENABLE_WNCK:
val_bool = g_value_get_boolean(value);
if (config->enable_wnck != val_bool)
@@ -572,7 +597,10 @@ pulseaudio_config_add_mpris_player (PulseaudioConfig *config,
}
players_string = g_strjoinv (";", players);
- player_string = g_strjoin (";", players_string, player, NULL);
+ if (g_strv_length (players) > 0)
+ player_string = g_strjoin (";", players_string, player, NULL);
+ else
+ player_string = g_strdup (player);
player_list = g_strsplit(player_string, ";", 0);
pulseaudio_config_set_mpris_players (config, player_list);
@@ -585,6 +613,169 @@ pulseaudio_config_add_mpris_player (PulseaudioConfig *config,
+static gchar **
+pulseaudio_config_get_blacklisted_players (PulseaudioConfig *config)
+{
+ if (!IS_PULSEAUDIO_CONFIG (config))
+ {
+ return g_strsplit (DEFAULT_BLACKLISTED_PLAYERS, ";", 1);
+ }
+
+ return g_strsplit (config->blacklisted_players, ";", 0);
+}
+
+
+
+static void
+pulseaudio_config_set_blacklisted_players (PulseaudioConfig *config,
+ gchar **players)
+{
+ GSList *player_array;
+ gchar *player_string;
+ GValue src = { 0, };
+ guint index = 0;
+ guint i = 0;
+ GSList *list = NULL;
+
+ g_return_if_fail (IS_PULSEAUDIO_CONFIG (config));
+
+ player_array = NULL;
+ for (i = 0; i < g_strv_length (players); i++)
+ {
+ player_array = g_slist_prepend (player_array, players[i]);
+ }
+
+ player_array = g_slist_sort (player_array, (GCompareFunc) compare_players);
+
+ for (list = player_array; list != NULL; list = g_slist_next (list))
+ {
+ players[index] = list->data;
+ index++;
+ }
+
+ g_slist_free (player_array);
+
+ player_string = g_strjoinv (";", players);
+
+ g_value_init(&src, G_TYPE_STRING);
+ g_value_set_static_string(&src, player_string);
+
+ pulseaudio_config_set_property (G_OBJECT (config), PROP_BLACKLISTED_PLAYERS, &src, NULL);
+
+ g_free (player_string);
+}
+
+
+
+void
+pulseaudio_config_player_blacklist_add (PulseaudioConfig *config,
+ const gchar *player)
+{
+ gchar **players;
+ gchar **player_list;
+ gchar *players_string;
+ gchar *player_string;
+
+ players = pulseaudio_config_get_blacklisted_players (config);
+ if (g_strv_contains ((const char * const *) players, player))
+ {
+ g_strfreev(players);
+ return;
+ }
+
+ players_string = g_strjoinv (";", players);
+ if (g_strv_length (players) > 0)
+ player_string = g_strjoin (";", players_string, player, NULL);
+ else
+ player_string = g_strdup (player);
+
+ player_list = g_strsplit(player_string, ";", 0);
+
+ pulseaudio_config_set_blacklisted_players (config, player_list);
+
+ g_strfreev (player_list);
+ g_free (player_string);
+ g_free (players_string);
+ g_strfreev (players);
+}
+
+
+
+void
+pulseaudio_config_player_blacklist_remove (PulseaudioConfig *config,
+ const gchar *player)
+{
+ GString *string;
+ gchar **players;
+ gchar **player_list;
+ gchar *player_string;
+ guint i;
+
+ string = g_string_new ("");
+
+ players = pulseaudio_config_get_blacklisted_players (config);
+ if (players != NULL)
+ {
+ for (i = 0; i < g_strv_length (players); i++)
+ {
+ if (g_strcmp0(player, players[i]) != 0)
+ {
+ string = g_string_append (string, players[0]);
+ }
+ }
+ }
+
+ player_string = g_string_free (string, FALSE);
+ player_list = g_strsplit(player_string, ";", 0);
+
+ pulseaudio_config_set_blacklisted_players (config, player_list);
+
+ g_strfreev (player_list);
+ g_free (player_string);
+ g_strfreev (players);
+}
+
+
+
+gboolean
+pulseaudio_config_player_blacklist_lookup (PulseaudioConfig *config,
+ gchar *player)
+{
+ gchar **players;
+ gboolean found = FALSE;
+ players = pulseaudio_config_get_blacklisted_players (config);
+ if (g_strv_contains ((const char * const *) players, player))
+ {
+ found = TRUE;
+ }
+
+ g_strfreev(players);
+ return found;
+}
+
+
+
+void
+pulseaudio_config_clear_known_players (PulseaudioConfig *config)
+{
+ gchar *player_string;
+ GValue src = { 0, };
+
+ g_return_if_fail (IS_PULSEAUDIO_CONFIG (config));
+
+ player_string = g_strdup ("");
+
+ g_value_init(&src, G_TYPE_STRING);
+ g_value_set_static_string(&src, player_string);
+
+ pulseaudio_config_set_property (G_OBJECT (config), PROP_BLACKLISTED_PLAYERS, &src, NULL);
+ pulseaudio_config_set_property (G_OBJECT (config), PROP_MPRIS_PLAYERS, &src, NULL);
+
+ g_free (player_string);
+}
+
+
+
void
pulseaudio_config_set_can_raise_wnck (PulseaudioConfig *config,
gboolean can_raise)
@@ -654,6 +845,10 @@ pulseaudio_config_new (const gchar *property_base)
xfconf_g_property_bind (channel, property, G_TYPE_STRING, config, "mpris-players");
g_free (property);
+ property = g_strconcat (property_base, "/blacklisted-players", NULL);
+ xfconf_g_property_bind (channel, property, G_TYPE_STRING, config, "blacklisted-players");
+ g_free (property);
+
property = g_strconcat (property_base, "/enable-wnck", NULL);
xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, config, "enable-wnck");
g_free (property);
diff --git a/panel-plugin/pulseaudio-config.h b/panel-plugin/pulseaudio-config.h
index 24715f9..cb34a8e 100644
--- a/panel-plugin/pulseaudio-config.h
+++ b/panel-plugin/pulseaudio-config.h
@@ -52,6 +52,15 @@ void pulseaudio_config_set_mpris_players (PulseaudioC
void pulseaudio_config_add_mpris_player (PulseaudioConfig *config,
gchar *player);
+void pulseaudio_config_player_blacklist_add (PulseaudioConfig *config,
+ const gchar *player);
+void pulseaudio_config_player_blacklist_remove (PulseaudioConfig *config,
+ const gchar *player);
+gboolean pulseaudio_config_player_blacklist_lookup (PulseaudioConfig *config,
+ gchar *player);
+
+void pulseaudio_config_clear_known_players (PulseaudioConfig *config);
+
void pulseaudio_config_set_can_raise_wnck (PulseaudioConfig *config,
gboolean can_raise);
gboolean pulseaudio_config_get_can_raise_wnck (PulseaudioConfig *config);
diff --git a/panel-plugin/pulseaudio-dialog.c b/panel-plugin/pulseaudio-dialog.c
index a5bc5cc..2c37f12 100644
--- a/panel-plugin/pulseaudio-dialog.c
+++ b/panel-plugin/pulseaudio-dialog.c
@@ -73,6 +73,9 @@ struct _PulseaudioDialog
GObject *dialog;
PulseaudioConfig *config;
+
+ GtkWidget *treeview;
+ GtkWidget *revealer;
};
@@ -146,11 +149,62 @@ pulseaudio_dialog_run_mixer (PulseaudioDialog *dialog,
static void
+pulseaudio_dialog_player_toggled_cb (GtkCellRendererToggle *toggle, gchar *path, gpointer user_data)
+{
+ PulseaudioDialog *dialog = PULSEAUDIO_DIALOG (user_data);
+ GtkTreeModel *model;
+ GtkTreePath *treepath;
+ GtkTreeIter iter;
+ GValue hidden_val = {0,}, player_val = {0,};
+ gboolean hidden;
+ const gchar *player;
+
+ model = GTK_TREE_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(dialog->treeview)));
+ treepath = gtk_tree_path_new_from_string (path);
+ gtk_tree_model_get_iter (model, &iter, treepath);
+
+ gtk_tree_model_get_value (model, &iter, 1, &player_val);
+ gtk_tree_model_get_value (model, &iter, 2, &hidden_val);
+ hidden = !g_value_get_boolean(&hidden_val);
+ player = g_value_get_string(&player_val);
+
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 2, hidden, -1);
+
+ if (hidden)
+ pulseaudio_config_player_blacklist_add (dialog->config, player);
+ else
+ pulseaudio_config_player_blacklist_remove (dialog->config, player);
+}
+
+
+
+static void
+pulseaudio_dialog_clear_players_cb (GtkButton *button,
+ gpointer *user_data)
+{
+ PulseaudioDialog *dialog = PULSEAUDIO_DIALOG (user_data);
+ GtkListStore *liststore;
+
+ pulseaudio_config_clear_known_players (dialog->config);
+
+ liststore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dialog->treeview)));
+ gtk_list_store_clear (liststore);
+
+ gtk_revealer_set_reveal_child (GTK_REVEALER(dialog->revealer), TRUE);
+}
+
+
+
+static void
pulseaudio_dialog_build (PulseaudioDialog *dialog)
{
- GtkBuilder *builder = GTK_BUILDER (dialog);
- GObject *object;
- GError *error = NULL;
+ GtkBuilder *builder = GTK_BUILDER (dialog);
+ GObject *object;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ GError *error = NULL;
+ gchar **players;
+ guint i;
if (xfce_titled_dialog_get_type () == 0)
return;
@@ -206,8 +260,8 @@ pulseaudio_dialog_build (PulseaudioDialog *dialog)
G_CALLBACK (pulseaudio_dialog_run_mixer), dialog);
#ifdef HAVE_MPRIS2
- object = gtk_builder_get_object (builder, "checkbutton-mpris-support");
- g_return_if_fail (GTK_IS_CHECK_BUTTON (object));
+ object = gtk_builder_get_object (builder, "switch-mpris-support");
+ g_return_if_fail (GTK_IS_SWITCH (object));
g_object_bind_property (G_OBJECT (dialog->config), "enable-mpris",
G_OBJECT (object), "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
@@ -222,22 +276,54 @@ pulseaudio_dialog_build (PulseaudioDialog *dialog)
G_OBJECT(object), "sensitive",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+ object = gtk_builder_get_object(builder, "section_mp_content_1");
+ g_object_bind_property(G_OBJECT(dialog->config), "enable-mpris",
+ G_OBJECT(object), "sensitive",
+ G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+
+ object = gtk_builder_get_object(builder, "section_mp_content_2");
+ g_object_bind_property(G_OBJECT(dialog->config), "enable-mpris",
+ G_OBJECT(object), "sensitive",
+ G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+
+ /* Populate the liststore */
+ dialog->treeview = GTK_WIDGET(gtk_builder_get_object(builder, "player_tree_view"));
+ liststore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dialog->treeview)));
+ players = pulseaudio_config_get_mpris_players (dialog->config);
+ if (players != NULL)
+ {
+ for (i = 0; i < g_strv_length (players); i++)
+ {
+ gtk_list_store_append(liststore, &iter);
+ gtk_list_store_set(liststore, &iter,
+ 0, players[i],
+ 1, players[i],
+ 2, pulseaudio_config_player_blacklist_lookup(dialog->config, players[i]),
+ -1);
+ }
+ }
+ g_strfreev (players);
+
+ object = gtk_builder_get_object(builder, "col_hidden_renderer");
+ g_signal_connect (object, "toggled", (GCallback) pulseaudio_dialog_player_toggled_cb, dialog);
+
+ object = gtk_builder_get_object(builder, "clear_players");
+ g_signal_connect (object, "clicked", (GCallback) pulseaudio_dialog_clear_players_cb, dialog);
+
+ dialog->revealer = GTK_WIDGET(gtk_builder_get_object(builder, "restart_revealer"));
+
object = gtk_builder_get_object(builder, "checkbutton-wnck");
g_return_if_fail(GTK_IS_CHECK_BUTTON(object));
#ifdef HAVE_WNCK
g_object_bind_property(G_OBJECT(dialog->config), "enable-wnck",
G_OBJECT(object), "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
- g_object_bind_property(G_OBJECT(dialog->config), "enable-mpris",
- G_OBJECT(object), "sensitive",
- G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
#else
gtk_widget_set_visible(GTK_WIDGET(object), FALSE);
#endif
#else
- object = gtk_builder_get_object (builder, "media-player-frame");
+ object = gtk_builder_get_object (builder, "section_mp_content");
gtk_widget_set_visible (GTK_WIDGET (object), FALSE);
#endif
}
diff --git a/panel-plugin/pulseaudio-dialog.glade b/panel-plugin/pulseaudio-dialog.glade
index 4e50e28..1a6d33d 100644
--- a/panel-plugin/pulseaudio-dialog.glade
+++ b/panel-plugin/pulseaudio-dialog.glade
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.20.2 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<requires lib="libxfce4ui-2" version="4.11"/>
@@ -8,6 +8,21 @@
<property name="can_focus">False</property>
<property name="icon_name">xfce4-pulseaudio-plugin</property>
</object>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">edit-clear</property>
+ </object>
+ <object class="GtkListStore" id="liststore1">
+ <columns>
+ <!-- column-name icon_name -->
+ <column type="gchararray"/>
+ <!-- column-name label -->
+ <column type="gchararray"/>
+ <!-- column-name hidden -->
+ <column type="gboolean"/>
+ </columns>
+ </object>
<object class="XfceTitledDialog" id="dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">PulseAudio Panel Plugin</property>
@@ -64,196 +79,212 @@
</packing>
</child>
<child>
- <object class="GtkBox" id="vbox1">
+ <object class="GtkNotebook" id="sections">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can_focus">True</property>
<property name="border_width">6</property>
- <property name="orientation">vertical</property>
- <property name="spacing">12</property>
<child>
- <object class="GtkFrame" id="frame1">
+ <object class="GtkBox" id="section_general_content">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
<child>
- <object class="GtkAlignment" id="alignment1">
+ <object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="top_padding">6</property>
- <property name="left_padding">12</property>
- <property name="right_padding">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkBox" id="vbox2">
+ <object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkCheckButton" id="checkbutton-keyboard-shortcuts">
- <property name="label" translatable="yes">Enable keyboard _shortcuts for volume control</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Enables volume control using multimedia keys. Make sure no other application that listens to these keys (e.g. xfce4-volumed) is running in the background.</property>
- <property name="halign">start</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
<child>
- <object class="GtkCheckButton" id="checkbutton-show-notifications">
- <property name="label" translatable="yes">Show _notifications when volume changes</property>
+ <object class="GtkBox" id="vbox2">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Enables on-screen volume notifications.</property>
- <property name="halign">start</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton-keyboard-shortcuts">
+ <property name="label" translatable="yes">Enable keyboard _shortcuts for volume control</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Enables volume control using multimedia keys. Make sure no other application that listens to these keys (e.g. xfce4-volumed) is running in the background.</property>
+ <property name="halign">start</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton-show-notifications">
+ <property name="label" translatable="yes">Show _notifications when volume changes</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Enables on-screen volume notifications.</property>
+ <property name="halign">start</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Behaviour</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
</child>
- <child type="label">
- <object class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label" translatable="yes">Behaviour</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="frame2">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
<child>
- <object class="GtkAlignment" id="alignment2">
+ <object class="GtkFrame" id="frame2">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="top_padding">6</property>
- <property name="left_padding">12</property>
- <property name="right_padding">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkGrid">
+ <object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
<child>
- <object class="GtkLabel" id="label2">
+ <object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Audio _Mixer</property>
- <property name="use_underline">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Audio _Mixer</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry-mixer-command">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Audio mixer command that can be executed from the context menu, e.g. "pavucontrol", "unity-control-center sound".</property>
+ <property name="hexpand">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button-run-mixer">
+ <property name="label" translatable="yes">_Run Audio Mixer...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">start</property>
+ <property name="image">image1</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
</object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="entry-mixer-command">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">Audio mixer command that can be executed from the context menu, e.g. "pavucontrol", "unity-control-center sound".</property>
- <property name="hexpand">True</property>
- <property name="invisible_char">•</property>
- <property name="primary_icon_activatable">False</property>
- <property name="secondary_icon_activatable">False</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="button-run-mixer">
- <property name="label" translatable="yes">_Run Audio Mixer...</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="halign">start</property>
- <property name="image">image1</property>
- <property name="use_underline">True</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
- <property name="width">2</property>
- </packing>
</child>
</object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Sound Settings</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
</object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label" translatable="yes">Sound settings</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="section_general">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">General</property>
+ </object>
<packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="tab_fill">False</property>
</packing>
</child>
<child>
- <object class="GtkFrame" id="media-player-frame">
+ <object class="GtkBox" id="section_mp_content">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
<child>
- <object class="GtkAlignment" id="alignment3">
+ <object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="top_padding">6</property>
- <property name="left_padding">12</property>
- <property name="right_padding">12</property>
+ <property name="margin_left">2</property>
+ <property name="margin_right">2</property>
+ <property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
<child>
- <object class="GtkCheckButton" id="checkbutton-mpris-support">
- <property name="label" translatable="yes">Control playback of media players</property>
+ <object class="GtkLabel">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="halign">start</property>
- <property name="draw_indicator">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Control Playback of Media Players</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
</object>
<packing>
<property name="expand">False</property>
@@ -262,58 +293,248 @@
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="checkbutton-multimedia-keys">
- <property name="label" translatable="yes">Enable multimedia keys for playback control</property>
+ <object class="GtkSwitch" id="switch-mpris-support">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="halign">start</property>
- <property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
+ <property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="section_mp_content_1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">3</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
<child>
- <object class="GtkCheckButton" id="checkbutton-wnck">
- <property name="label" translatable="yes">Enable experimental window focus support</property>
+ <object class="GtkBox">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton-multimedia-keys">
+ <property name="label" translatable="yes">Enable multimedia keys for playback control</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton-wnck">
+ <property name="label" translatable="yes">Enable experimental window focus support</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
</child>
- <child type="label">
- <object class="GtkLabel" id="label4">
+ <child>
+ <object class="GtkFrame" id="section_mp_content_2">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Media Players</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
+ <property name="margin_left">2</property>
+ <property name="margin_right">2</property>
+ <property name="margin_bottom">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="player_tree_view">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers_clickable">False</property>
+ <property name="enable_search">False</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="col_icon">
+ <child>
+ <object class="GtkCellRendererPixbuf" id="col_icon_renderer"/>
+ <attributes>
+ <attribute name="icon-name">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="col_label">
+ <property name="title" translatable="yes">Title</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="col_label_renderer"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="col_hidden">
+ <property name="title" translatable="yes">Hidden</property>
+ <child>
+ <object class="GtkCellRendererToggle" id="col_hidden_renderer"/>
+ <attributes>
+ <attribute name="active">2</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="clear_players">
+ <property name="label" translatable="yes">Clear Known Items</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">start</property>
+ <property name="image">image2</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRevealer" id="restart_revealer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Please restart your panel for additional players to be displayed.</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Known Media Players</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
+ <property name="position">1</property>
</packing>
</child>
+ <child type="tab">
+ <object class="GtkLabel" id="section_mp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Media Players</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child type="tab">
+ <placeholder/>
+ </child>
</object>
<packing>
- <property name="expand">False</property>
+ <property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
diff --git a/panel-plugin/pulseaudio-menu.c b/panel-plugin/pulseaudio-menu.c
index b32a54d..1941759 100644
--- a/panel-plugin/pulseaudio-menu.c
+++ b/panel-plugin/pulseaudio-menu.c
@@ -567,6 +567,9 @@ pulseaudio_menu_new (PulseaudioVolume *volume,
{
for (i = 0; i < g_strv_length (players); i++)
{
+ if (pulseaudio_config_player_blacklist_lookup (menu->config, players[i]))
+ continue;
+
mi = mpris_menu_item_new_from_player_name (players[i]);
if (mi != NULL)
{
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list