[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