[Xfce4-commits] [panel-plugins/xfce4-pulseaudio-plugin] 01/01: Control MPRIS with multimedia key integration
noreply at xfce.org
noreply at xfce.org
Thu Nov 23 04:01:19 CET 2017
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 3892875b8dceb65ddfcad4091a95cd22725d4cc7
Author: Sean Davis <smd.seandavis at gmail.com>
Date: Wed Nov 22 22:01:12 2017 -0500
Control MPRIS with multimedia key integration
---
panel-plugin/pulseaudio-config.c | 50 ++++++++++++-
panel-plugin/pulseaudio-config.h | 1 +
panel-plugin/pulseaudio-dialog.c | 10 +++
panel-plugin/pulseaudio-dialog.glade | 40 +++++++++--
panel-plugin/pulseaudio-mpris.c | 29 ++++++++
panel-plugin/pulseaudio-mpris.h | 5 +-
panel-plugin/pulseaudio-plugin.c | 135 ++++++++++++++++++++++++++++++++++-
7 files changed, 260 insertions(+), 10 deletions(-)
diff --git a/panel-plugin/pulseaudio-config.c b/panel-plugin/pulseaudio-config.c
index 92537e6..04f0ebe 100644
--- a/panel-plugin/pulseaudio-config.c
+++ b/panel-plugin/pulseaudio-config.c
@@ -51,8 +51,10 @@
#ifdef HAVE_MPRIS2
#define DEFAULT_ENABLE_MPRIS TRUE
+#define DEFAULT_ENABLE_MULTIMEDIA_KEYS TRUE
#else
#define DEFAULT_ENABLE_MPRIS FALSE
+#define DEFAULT_ENABLE_MULTIMEDIA_KEYS FALSE
#endif
#define DEFAULT_MPRIS_PLAYERS ""
@@ -81,6 +83,7 @@ struct _PulseaudioConfig
GObject __parent__;
gboolean enable_keyboard_shortcuts;
+ gboolean enable_multimedia_keys;
gboolean show_notifications;
guint volume_step;
guint volume_max;
@@ -95,6 +98,7 @@ enum
{
PROP_0,
PROP_ENABLE_KEYBOARD_SHORTCUTS,
+ PROP_ENABLE_MULTIMEDIA_KEYS,
PROP_SHOW_NOTIFICATIONS,
PROP_VOLUME_STEP,
PROP_VOLUME_MAX,
@@ -137,6 +141,15 @@ pulseaudio_config_class_init (PulseaudioConfigClass *klass)
g_object_class_install_property (gobject_class,
+ PROP_ENABLE_MULTIMEDIA_KEYS,
+ g_param_spec_boolean ("enable-multimedia-keys", NULL, NULL,
+ DEFAULT_ENABLE_MULTIMEDIA_KEYS,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+
+
+ g_object_class_install_property (gobject_class,
PROP_SHOW_NOTIFICATIONS,
g_param_spec_boolean ("show-notifications", NULL, NULL,
DEFAULT_SHOW_NOTIFICATIONS,
@@ -207,6 +220,7 @@ static void
pulseaudio_config_init (PulseaudioConfig *config)
{
config->enable_keyboard_shortcuts = DEFAULT_ENABLE_KEYBOARD_SHORTCUTS;
+ config->enable_multimedia_keys = DEFAULT_ENABLE_MULTIMEDIA_KEYS;
config->show_notifications = DEFAULT_SHOW_NOTIFICATIONS;
config->volume_step = DEFAULT_VOLUME_STEP;
config->volume_max = DEFAULT_VOLUME_MAX;
@@ -244,6 +258,10 @@ pulseaudio_config_get_property (GObject *object,
g_value_set_boolean (value, config->enable_keyboard_shortcuts);
break;
+ case PROP_ENABLE_MULTIMEDIA_KEYS:
+ g_value_set_boolean (value, config->enable_multimedia_keys);
+ break;
+
case PROP_SHOW_NOTIFICATIONS:
g_value_set_boolean (value, config->show_notifications);
break;
@@ -298,6 +316,16 @@ pulseaudio_config_set_property (GObject *object,
}
break;
+ case PROP_ENABLE_MULTIMEDIA_KEYS:
+ val_bool = g_value_get_boolean (value);
+ if (config->enable_multimedia_keys != val_bool)
+ {
+ config->enable_multimedia_keys = val_bool;
+ g_object_notify (G_OBJECT (config), "enable-multimedia-keys");
+ g_signal_emit (G_OBJECT (config), pulseaudio_config_signals [CONFIGURATION_CHANGED], 0);
+ }
+ break;
+
case PROP_SHOW_NOTIFICATIONS:
val_bool = g_value_get_boolean (value);
if (config->show_notifications != val_bool)
@@ -339,7 +367,14 @@ pulseaudio_config_set_property (GObject *object,
{
config->enable_mpris = val_bool;
g_object_notify (G_OBJECT (config), "enable-mpris");
- g_signal_emit (G_OBJECT (config), pulseaudio_config_signals [CONFIGURATION_CHANGED], 0);
+
+ if (!config->enable_mpris)
+ {
+ config->enable_multimedia_keys = FALSE;
+ g_object_notify(G_OBJECT(config), "enable-multimedia-keys");
+ }
+
+ g_signal_emit(G_OBJECT(config), pulseaudio_config_signals[CONFIGURATION_CHANGED], 0);
}
break;
@@ -369,6 +404,15 @@ pulseaudio_config_get_enable_keyboard_shortcuts (PulseaudioConfig *config)
+gboolean
+pulseaudio_config_get_enable_multimedia_keys (PulseaudioConfig *config)
+{
+ g_return_val_if_fail (IS_PULSEAUDIO_CONFIG (config), DEFAULT_ENABLE_MULTIMEDIA_KEYS);
+
+ return config->enable_multimedia_keys;
+}
+
+
gboolean
pulseaudio_config_get_show_notifications (PulseaudioConfig *config)
@@ -520,6 +564,10 @@ pulseaudio_config_new (const gchar *property_base)
xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, config, "enable-keyboard-shortcuts");
g_free (property);
+ property = g_strconcat (property_base, "/enable-multimedia-keys", NULL);
+ xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, config, "enable-multimedia-keys");
+ g_free (property);
+
property = g_strconcat (property_base, "/show-notifications", NULL);
xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, config, "show-notifications");
g_free (property);
diff --git a/panel-plugin/pulseaudio-config.h b/panel-plugin/pulseaudio-config.h
index f79994c..95dd6cf 100644
--- a/panel-plugin/pulseaudio-config.h
+++ b/panel-plugin/pulseaudio-config.h
@@ -39,6 +39,7 @@ GType pulseaudio_config_get_type (void)
PulseaudioConfig *pulseaudio_config_new (const gchar *property_base);
gboolean pulseaudio_config_get_enable_keyboard_shortcuts (PulseaudioConfig *config);
+gboolean pulseaudio_config_get_enable_multimedia_keys (PulseaudioConfig *config);
gboolean pulseaudio_config_get_show_notifications (PulseaudioConfig *config);
guint pulseaudio_config_get_volume_step (PulseaudioConfig *config);
guint pulseaudio_config_get_volume_max (PulseaudioConfig *config);
diff --git a/panel-plugin/pulseaudio-dialog.c b/panel-plugin/pulseaudio-dialog.c
index 2ee18db..10dc8e2 100644
--- a/panel-plugin/pulseaudio-dialog.c
+++ b/panel-plugin/pulseaudio-dialog.c
@@ -209,6 +209,16 @@ pulseaudio_dialog_build (PulseaudioDialog *dialog)
g_object_bind_property (G_OBJECT (dialog->config), "enable-mpris",
G_OBJECT (object), "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+
+ g_object_bind_property(G_OBJECT(dialog->config), "enable-mpris",
+ G_OBJECT(gtk_builder_get_object(builder, "checkbutton-multimedia-keys")), "sensitive",
+ G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+
+ object = gtk_builder_get_object(builder, "checkbutton-multimedia-keys");
+ g_return_if_fail(GTK_IS_CHECK_BUTTON(object));
+ g_object_bind_property(G_OBJECT(dialog->config), "enable-multimedia-keys",
+ G_OBJECT(object), "active",
+ G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
#else
object = gtk_builder_get_object (builder, "media-player-frame");
gtk_widget_set_visible (GTK_WIDGET (object), FALSE);
diff --git a/panel-plugin/pulseaudio-dialog.glade b/panel-plugin/pulseaudio-dialog.glade
index 2fd244a..b2a258e 100644
--- a/panel-plugin/pulseaudio-dialog.glade
+++ b/panel-plugin/pulseaudio-dialog.glade
@@ -241,13 +241,41 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkCheckButton" id="checkbutton-mpris-support">
- <property name="label" translatable="yes">Control playback of media players</property>
+ <object class="GtkBox">
<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="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>
+ <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-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">1</property>
+ </packing>
+ </child>
</object>
</child>
</object>
diff --git a/panel-plugin/pulseaudio-mpris.c b/panel-plugin/pulseaudio-mpris.c
index 658ac5f..495d123 100644
--- a/panel-plugin/pulseaudio-mpris.c
+++ b/panel-plugin/pulseaudio-mpris.c
@@ -262,6 +262,35 @@ pulseaudio_mpris_notify_player (PulseaudioMpris *mpris,
return FALSE;
}
+
+
+gboolean
+pulseaudio_mpris_notify_any_player (PulseaudioMpris *mpris,
+ const gchar *message)
+{
+ PulseaudioMprisPlayer *player;
+ GHashTableIter iter;
+ const gchar *key;
+ gboolean found = FALSE;
+
+ g_return_val_if_fail(IS_PULSEAUDIO_MPRIS(mpris), FALSE);
+
+ g_hash_table_iter_init (&iter, mpris->players);
+ while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer) &player))
+ {
+ if (player != NULL)
+ {
+ if (pulseaudio_mpris_player_is_connected(player))
+ {
+ pulseaudio_mpris_player_call_player_method(player, message);
+ found = TRUE;
+ }
+ }
+ }
+
+ return found;
+}
+
static void
pulseaudio_mpris_init (PulseaudioMpris *mpris)
{
diff --git a/panel-plugin/pulseaudio-mpris.h b/panel-plugin/pulseaudio-mpris.h
index a059f6d..500f0aa 100644
--- a/panel-plugin/pulseaudio-mpris.h
+++ b/panel-plugin/pulseaudio-mpris.h
@@ -58,6 +58,9 @@ gboolean pulseaudio_mpris_notify_player (PulseaudioMpris
const gchar *name,
const gchar *message);
-G_END_DECLS
+gboolean pulseaudio_mpris_notify_any_player (PulseaudioMpris *mpris,
+ const gchar *message);
+
+ G_END_DECLS
#endif /* !__PULSEAUDIO_MPRIS_H__ */
diff --git a/panel-plugin/pulseaudio-plugin.c b/panel-plugin/pulseaudio-plugin.c
index 67dd3e9..18bb342 100644
--- a/panel-plugin/pulseaudio-plugin.c
+++ b/panel-plugin/pulseaudio-plugin.c
@@ -58,6 +58,10 @@
#define PULSEAUDIO_PLUGIN_LOWER_VOLUME_KEY "XF86AudioLowerVolume"
#define PULSEAUDIO_PLUGIN_MUTE_KEY "XF86AudioMute"
#define PULSEAUDIO_PLUGIN_MIC_MUTE_KEY "XF86AudioMicMute"
+#define PULSEAUDIO_PLUGIN_PLAY_KEY "XF86AudioPlay"
+#define PULSEAUDIO_PLUGIN_STOP_KEY "XF86AudioStop"
+#define PULSEAUDIO_PLUGIN_PREV_KEY "XF86AudioPrev"
+#define PULSEAUDIO_PLUGIN_NEXT_KEY "XF86AudioNext"
#endif
@@ -82,6 +86,19 @@ static void pulseaudio_plugin_mute_pressed (cons
void *user_data);
static void pulseaudio_plugin_mic_mute_pressed (const char *keystring,
void *user_data);
+
+static void pulseaudio_plugin_bind_multimedia_keys_cb (PulseaudioPlugin *pulseaudio_plugin,
+ PulseaudioConfig *pulseaudio_config);
+static gboolean pulseaudio_plugin_bind_multimedia_keys (PulseaudioPlugin *pulseaudio_plugin);
+static void pulseaudio_plugin_unbind_multimedia_keys (PulseaudioPlugin *pulseaudio_plugin);
+static void pulseaudio_plugin_play_key_pressed (const char *keystring,
+ void *user_data);
+static void pulseaudio_plugin_stop_key_pressed (const char *keystring,
+ void *user_data);
+static void pulseaudio_plugin_prev_key_pressed (const char *keystring,
+ void *user_data);
+static void pulseaudio_plugin_next_key_pressed (const char *keystring,
+ void *user_data);
#endif
struct _PulseaudioPluginClass
@@ -291,6 +308,7 @@ pulseaudio_plugin_bind_keys_cb (PulseaudioPlugin *pulseaudio_plugin,
}
+
static gboolean
pulseaudio_plugin_bind_keys (PulseaudioPlugin *pulseaudio_plugin)
{
@@ -310,6 +328,7 @@ pulseaudio_plugin_bind_keys (PulseaudioPlugin *pulseaudio_plugin)
}
+
static void
pulseaudio_plugin_unbind_keys (PulseaudioPlugin *pulseaudio_plugin)
{
@@ -323,6 +342,7 @@ pulseaudio_plugin_unbind_keys (PulseaudioPlugin *pulseaudio_plugin)
}
+
static void
pulseaudio_plugin_volume_key_pressed (const char *keystring,
void *user_data)
@@ -340,6 +360,7 @@ pulseaudio_plugin_volume_key_pressed (const char *keystring,
}
+
static void
pulseaudio_plugin_mute_pressed (const char *keystring,
void *user_data)
@@ -352,6 +373,7 @@ pulseaudio_plugin_mute_pressed (const char *keystring,
}
+
static void
pulseaudio_plugin_mic_mute_pressed (const char *keystring,
void *user_data)
@@ -362,9 +384,110 @@ pulseaudio_plugin_mic_mute_pressed (const char *keystring,
pulseaudio_volume_toggle_muted_mic (pulseaudio_plugin->volume);
}
+
+
+
+static void
+pulseaudio_plugin_bind_multimedia_keys_cb (PulseaudioPlugin *pulseaudio_plugin,
+ PulseaudioConfig *pulseaudio_config)
+{
+ g_return_if_fail (IS_PULSEAUDIO_PLUGIN (pulseaudio_plugin));
+
+ if (pulseaudio_config_get_enable_multimedia_keys (pulseaudio_plugin->config))
+ pulseaudio_plugin_bind_multimedia_keys (pulseaudio_plugin);
+ else
+ pulseaudio_plugin_unbind_multimedia_keys (pulseaudio_plugin);
+}
+
+
+
+static gboolean
+pulseaudio_plugin_bind_multimedia_keys (PulseaudioPlugin *pulseaudio_plugin)
+{
+ gboolean success;
+ g_return_val_if_fail (IS_PULSEAUDIO_PLUGIN (pulseaudio_plugin), FALSE);
+ pulseaudio_debug ("Grabbing multimedia control keys");
+
+ success = (keybinder_bind (PULSEAUDIO_PLUGIN_PLAY_KEY, pulseaudio_plugin_play_key_pressed, pulseaudio_plugin) &&
+ keybinder_bind (PULSEAUDIO_PLUGIN_STOP_KEY, pulseaudio_plugin_stop_key_pressed, pulseaudio_plugin) &&
+ keybinder_bind (PULSEAUDIO_PLUGIN_PREV_KEY, pulseaudio_plugin_prev_key_pressed, pulseaudio_plugin) &&
+ keybinder_bind (PULSEAUDIO_PLUGIN_NEXT_KEY, pulseaudio_plugin_next_key_pressed, pulseaudio_plugin));
+
+ if (!success)
+ g_warning ("Could not have grabbed multimedia control keys.");
+
+ return success;
+}
+
+
+
+static void
+pulseaudio_plugin_unbind_multimedia_keys (PulseaudioPlugin *pulseaudio_plugin)
+{
+ g_return_if_fail (IS_PULSEAUDIO_PLUGIN (pulseaudio_plugin));
+ pulseaudio_debug ("Releasing multimedia control keys");
+
+ keybinder_unbind (PULSEAUDIO_PLUGIN_PLAY_KEY, pulseaudio_plugin_play_key_pressed);
+ keybinder_unbind (PULSEAUDIO_PLUGIN_STOP_KEY, pulseaudio_plugin_stop_key_pressed);
+ keybinder_unbind (PULSEAUDIO_PLUGIN_PREV_KEY, pulseaudio_plugin_prev_key_pressed);
+ keybinder_unbind (PULSEAUDIO_PLUGIN_NEXT_KEY, pulseaudio_plugin_next_key_pressed);
+}
+
+
+
+static void
+pulseaudio_plugin_play_key_pressed (const char *keystring,
+ void *user_data)
+{
+ PulseaudioPlugin *pulseaudio_plugin = PULSEAUDIO_PLUGIN(user_data);
+
+ pulseaudio_debug ("%s pressed", keystring);
+
+ pulseaudio_mpris_notify_any_player (pulseaudio_plugin->mpris, "PlayPause");
+}
+
+
+
+static void
+pulseaudio_plugin_stop_key_pressed (const char *keystring,
+ void *user_data)
+{
+ PulseaudioPlugin *pulseaudio_plugin = PULSEAUDIO_PLUGIN(user_data);
+
+ pulseaudio_debug("%s pressed", keystring);
+
+ pulseaudio_mpris_notify_any_player(pulseaudio_plugin->mpris, "Stop");
+}
+
+
+
+static void
+pulseaudio_plugin_prev_key_pressed (const char *keystring,
+ void *user_data)
+{
+ PulseaudioPlugin *pulseaudio_plugin = PULSEAUDIO_PLUGIN(user_data);
+
+ pulseaudio_debug("%s pressed", keystring);
+
+ pulseaudio_mpris_notify_any_player(pulseaudio_plugin->mpris, "Previous");
+}
+
+
+
+static void
+pulseaudio_plugin_next_key_pressed (const char *keystring,
+ void *user_data)
+{
+ PulseaudioPlugin *pulseaudio_plugin = PULSEAUDIO_PLUGIN(user_data);
+
+ pulseaudio_debug("%s pressed", keystring);
+
+ pulseaudio_mpris_notify_any_player(pulseaudio_plugin->mpris, "Next");
+}
#endif
+
static void
pulseaudio_plugin_construct (XfcePanelPlugin *plugin)
{
@@ -393,10 +516,18 @@ pulseaudio_plugin_construct (XfcePanelPlugin *plugin)
keybinder_init ();
g_signal_connect_swapped (G_OBJECT (pulseaudio_plugin->config), "notify::enable-keyboard-shortcuts",
G_CALLBACK (pulseaudio_plugin_bind_keys_cb), pulseaudio_plugin);
+ g_signal_connect_swapped (G_OBJECT (pulseaudio_plugin->config), "notify::enable-multimedia-keys",
+ G_CALLBACK (pulseaudio_plugin_bind_multimedia_keys_cb), pulseaudio_plugin);
+
if (pulseaudio_config_get_enable_keyboard_shortcuts (pulseaudio_plugin->config))
- pulseaudio_plugin_bind_keys (pulseaudio_plugin);
+ pulseaudio_plugin_bind_keys(pulseaudio_plugin);
else
- pulseaudio_plugin_unbind_keys (pulseaudio_plugin);
+ pulseaudio_plugin_unbind_keys(pulseaudio_plugin);
+
+ if (pulseaudio_config_get_enable_multimedia_keys (pulseaudio_plugin->config))
+ pulseaudio_plugin_bind_multimedia_keys(pulseaudio_plugin);
+ else
+ pulseaudio_plugin_unbind_multimedia_keys(pulseaudio_plugin);
#endif
/* volume controller */
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list