[Xfce4-commits] [panel-plugins/xfce4-pulseaudio-plugin] 01/01: Add optional libwnck integration for players that do not support CanRaise

noreply at xfce.org noreply at xfce.org
Sun Dec 3 05:15:02 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 0f14df6ea27bcaa0eff3f6a9e43948ca82c2b39a
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Sat Dec 2 23:14:42 2017 -0500

    Add optional libwnck integration for players that do not support CanRaise
---
 configure.ac.in                      | 17 +++++---
 panel-plugin/Makefile.am             |  2 +
 panel-plugin/mprismenuitem.c         | 79 ++++++++++++++++++++++++++++++++++--
 panel-plugin/mprismenuitem.h         |  3 ++
 panel-plugin/pulseaudio-config.c     | 58 ++++++++++++++++++++++++++
 panel-plugin/pulseaudio-config.h     |  4 ++
 panel-plugin/pulseaudio-dialog.c     | 21 ++++++++--
 panel-plugin/pulseaudio-dialog.glade | 14 +++++++
 panel-plugin/pulseaudio-menu.c       |  1 +
 9 files changed, 187 insertions(+), 12 deletions(-)

diff --git a/configure.ac.in b/configure.ac.in
index fc68b3d..8d605a1 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -105,6 +105,12 @@ dnl *******************************
 XDT_CHECK_OPTIONAL_PACKAGE([MPRIS2], [gio-2.0], [2.42], [mpris2],
                            [mpris2 support])
 
+dnl ********************************************
+dnl *** Optional (experimental) WNCK Support ***
+dnl ********************************************
+XDT_CHECK_OPTIONAL_PACKAGE([WNCK], [libwnck-3.0], [3.20], [wnck],
+                           [wnck support])
+
 dnl ***********************************
 dnl *** Check for debugging support ***
 dnl ***********************************
@@ -150,9 +156,10 @@ dnl ***************************
 echo
 echo "Build Configuration:"
 echo
-echo "* Debug Support:          $enable_debug"
-echo "* Use keybinder:          ${KEYBINDER_FOUND:-no}"
-echo "* Use libnotify:          ${LIBNOTIFY_FOUND:-no}"
-echo "* Use MPRIS2:             ${MPRIS2_FOUND:-no}"
-echo "* Default Mixer command:  $DEFAULT_MIXER_COMMAND"
+echo "* Debug Support:                $enable_debug"
+echo "* Use keybinder:                ${KEYBINDER_FOUND:-no}"
+echo "* Use libnotify:                ${LIBNOTIFY_FOUND:-no}"
+echo "* Use MPRIS2:                   ${MPRIS2_FOUND:-no}"
+echo "* Experimenal libwnck support:  ${WNCK_FOUND:-no}"
+echo "* Default Mixer command:        $DEFAULT_MIXER_COMMAND"
 echo
diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am
index d7b5835..9289f18 100644
--- a/panel-plugin/Makefile.am
+++ b/panel-plugin/Makefile.am
@@ -60,6 +60,7 @@ libpulseaudio_plugin_la_CFLAGS = \
 	$(KEYBINDER_CFLAGS) \
 	$(LIBNOTIFY_CFLAGS) \
 	$(MPRIS2_CFLAGS) \
+	$(WNCK_CFLAGS) \
 	$(PLATFORM_CFLAGS)
 
 libpulseaudio_plugin_la_LDFLAGS = \
@@ -80,6 +81,7 @@ libpulseaudio_plugin_la_LIBADD = \
 	$(KEYBINDER_LIBS) \
 	$(LIBNOTIFY_LIBS) \
 	$(MPRIS2_LIBS) \
+	$(WNCK_LIBS) \
 	$(LIBM)
 
 #
diff --git a/panel-plugin/mprismenuitem.c b/panel-plugin/mprismenuitem.c
index 4c4b689..fa454da 100644
--- a/panel-plugin/mprismenuitem.c
+++ b/panel-plugin/mprismenuitem.c
@@ -34,11 +34,16 @@
 #include <gdk/gdkkeysyms.h>
 #include <gio/gdesktopappinfo.h>
 
-/* for DBG/TRACE */
-#include <libxfce4util/libxfce4util.h>
+#ifdef HAVE_WNCK
+#define WNCK_I_KNOW_THIS_IS_UNSTABLE = 1
+#include <libwnck/libwnck.h>
+#endif
 
 
 
+/* for DBG/TRACE */
+#include <libxfce4util/libxfce4util.h>
+
 struct _MprisMenuItemPrivate {
   GtkWidget *title_label;
   GtkWidget *artist_label;
@@ -52,6 +57,7 @@ struct _MprisMenuItemPrivate {
   gboolean   can_pause;
   gboolean   can_go_next;
   gboolean   can_raise;
+  gboolean   can_raise_wnck;
 
   gboolean   is_running;
   gboolean   is_playing;
@@ -89,6 +95,11 @@ G_GNUC_END_IGNORE_DEPRECATIONS
 /* Static Declarations */
 static void         mpris_menu_item_finalize                (GObject        *object);
 static void         mpris_menu_item_raise                   (MprisMenuItem  *item);
+
+#ifdef HAVE_WNCK
+static void         mpris_menu_item_raise_window            (MprisMenuItem  *item);
+#endif
+
 static void         mpris_menu_item_launch                  (MprisMenuItem  *item);
 static void         mpris_menu_item_raise_or_launch         (MprisMenuItem  *item);
 static GtkWidget *  mpris_menu_item_get_widget_at_event     (MprisMenuItem  *item,
@@ -340,6 +351,21 @@ mpris_menu_item_set_can_raise (MprisMenuItem *item,
 
 
 void
+mpris_menu_item_set_can_raise_wnck (MprisMenuItem *item,
+                                    gboolean       can_raise)
+{
+  MprisMenuItemPrivate *priv;
+
+  g_return_if_fail (IS_MPRIS_MENU_ITEM (item));
+
+  priv = GET_PRIVATE (item);
+
+  priv->can_raise_wnck = can_raise;
+}
+
+
+
+void
 mpris_menu_item_set_is_running (MprisMenuItem *item,
                                 gboolean       running)
 {
@@ -527,9 +553,54 @@ mpris_menu_item_raise (MprisMenuItem *item)
 
   priv = GET_PRIVATE (item);
 
-  if (priv->is_running && priv->can_raise)
-    media_notify (item, "Raise");
+  if (priv->is_running)
+    {
+      if (priv->can_raise)
+        {
+          media_notify (item, "Raise");
+        }
+#ifdef HAVE_WNCK
+      else if (priv->can_raise_wnck)
+        {
+          mpris_menu_item_raise_window (item);
+        }
+#endif
+    }
+}
+
+
+
+#ifdef HAVE_WNCK
+/**
+ * Alternative "Raise" method.
+ * Some media players (e.g. Spotify) do not support the "Raise" method.
+ * This workaround utilizes libwnck to find the correct window and raise it.
+ */
+static void
+mpris_menu_item_raise_window (MprisMenuItem *item)
+{
+  MprisMenuItemPrivate *priv;
+  WnckScreen           *screen = NULL;
+  GList                *window = NULL;
+
+  g_return_if_fail (IS_MPRIS_MENU_ITEM (item));
+
+  priv = GET_PRIVATE (item);
+
+  screen = wnck_screen_get_default ();
+  if (screen != NULL)
+    {
+      wnck_screen_force_update (screen);
+      for (window = wnck_screen_get_windows (screen); window != NULL; window = window->next)
+        {
+          if (0 == g_strcmp0 (priv->title, wnck_window_get_name (WNCK_WINDOW (window->data))))
+            {
+              wnck_window_activate (WNCK_WINDOW (window->data), 0);
+            }
+        }
+    }
 }
+#endif
 
 
 
diff --git a/panel-plugin/mprismenuitem.h b/panel-plugin/mprismenuitem.h
index 3442f05..89003f9 100644
--- a/panel-plugin/mprismenuitem.h
+++ b/panel-plugin/mprismenuitem.h
@@ -89,6 +89,9 @@ void         mpris_menu_item_set_can_go_next       (MprisMenuItem *item,
 void         mpris_menu_item_set_can_raise         (MprisMenuItem *item,
                                                     gboolean can_raise);
 
+void         mpris_menu_item_set_can_raise_wnck    (MprisMenuItem *item,
+                                                    gboolean can_raise);
+
 void         mpris_menu_item_set_is_running        (MprisMenuItem *item,
                                                     gboolean running);
 
diff --git a/panel-plugin/pulseaudio-config.c b/panel-plugin/pulseaudio-config.c
index a337193..d44cf7c 100644
--- a/panel-plugin/pulseaudio-config.c
+++ b/panel-plugin/pulseaudio-config.c
@@ -57,6 +57,7 @@
 #endif
 
 #define DEFAULT_MPRIS_PLAYERS                     ""
+#define DEFAULT_ENABLE_WNCK                       FALSE
 
 
 
@@ -89,6 +90,7 @@ struct _PulseaudioConfig
   gchar           *mixer_command;
   gboolean         enable_mpris;
   gchar           *mpris_players;
+  gboolean         enable_wnck;
 };
 
 
@@ -104,6 +106,7 @@ enum
     PROP_MIXER_COMMAND,
     PROP_ENABLE_MPRIS,
     PROP_MPRIS_PLAYERS,
+    PROP_ENABLE_WNCK,
     N_PROPERTIES,
   };
 
@@ -205,6 +208,15 @@ pulseaudio_config_class_init (PulseaudioConfigClass *klass)
 
 
 
+  g_object_class_install_property (gobject_class,
+                                   PROP_ENABLE_WNCK,
+                                   g_param_spec_boolean ("enable-wnck", NULL, NULL,
+                                                         DEFAULT_ENABLE_WNCK,
+                                                         G_PARAM_READWRITE |
+                                                         G_PARAM_STATIC_STRINGS));
+
+
+
   pulseaudio_config_signals[CONFIGURATION_CHANGED] =
     g_signal_new (g_intern_static_string ("configuration-changed"),
                   G_TYPE_FROM_CLASS (gobject_class),
@@ -227,6 +239,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->enable_wnck               = DEFAULT_ENABLE_WNCK;
 }
 
 
@@ -286,6 +299,10 @@ pulseaudio_config_get_property (GObject    *object,
       g_value_set_string (value, config->mpris_players);
       break;
 
+    case PROP_ENABLE_WNCK:
+      g_value_set_boolean (value, config->enable_wnck);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -372,6 +389,9 @@ pulseaudio_config_set_property (GObject      *object,
             {
               config->enable_multimedia_keys = FALSE;
               g_object_notify(G_OBJECT(config), "enable-multimedia-keys");
+
+              config->enable_wnck = FALSE;
+              g_object_notify(G_OBJECT(config), "enable-wnck");
             }
 
           g_signal_emit(G_OBJECT(config), pulseaudio_config_signals[CONFIGURATION_CHANGED], 0);
@@ -385,6 +405,16 @@ pulseaudio_config_set_property (GObject      *object,
       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)
+      {
+        config->enable_wnck = val_bool;
+        g_object_notify (G_OBJECT (config), "enable-wnck");
+        g_signal_emit (G_OBJECT (config), pulseaudio_config_signals [CONFIGURATION_CHANGED], 0);
+      }
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -550,6 +580,30 @@ pulseaudio_config_add_mpris_player (PulseaudioConfig *config,
 
 
 
+void
+pulseaudio_config_set_can_raise_wnck (PulseaudioConfig *config,
+                                      gboolean          can_raise)
+{
+  GValue src = { 0, };
+
+  g_return_if_fail(IS_PULSEAUDIO_CONFIG(config));
+
+  g_value_init (&src, G_TYPE_BOOLEAN);
+  g_value_set_boolean (&src, can_raise);
+
+  pulseaudio_config_set_property(G_OBJECT(config), PROP_ENABLE_WNCK, &src, NULL);
+}
+
+
+
+gboolean
+pulseaudio_config_get_can_raise_wnck (PulseaudioConfig *config)
+{
+  return config->enable_wnck;
+}
+
+
+
 PulseaudioConfig *
 pulseaudio_config_new (const gchar     *property_base)
 {
@@ -595,6 +649,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, "/enable-wnck", NULL);
+      xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, config, "enable-wnck");
+      g_free (property);
+
       g_object_notify (G_OBJECT (config), "enable-keyboard-shortcuts");
       g_signal_emit (G_OBJECT (config), pulseaudio_config_signals [CONFIGURATION_CHANGED], 0);
     }
diff --git a/panel-plugin/pulseaudio-config.h b/panel-plugin/pulseaudio-config.h
index 95dd6cf..24715f9 100644
--- a/panel-plugin/pulseaudio-config.h
+++ b/panel-plugin/pulseaudio-config.h
@@ -52,6 +52,10 @@ void               pulseaudio_config_set_mpris_players              (PulseaudioC
 void               pulseaudio_config_add_mpris_player               (PulseaudioConfig     *config,
                                                                      gchar                *player);
 
+void               pulseaudio_config_set_can_raise_wnck             (PulseaudioConfig     *config,
+                                                                     gboolean              can_raise);
+gboolean           pulseaudio_config_get_can_raise_wnck             (PulseaudioConfig     *config);
+
 G_END_DECLS
 
 #endif /* !__PULSEAUDIO_CONFIG_H__ */
diff --git a/panel-plugin/pulseaudio-dialog.c b/panel-plugin/pulseaudio-dialog.c
index 90630f2..a5bc5cc 100644
--- a/panel-plugin/pulseaudio-dialog.c
+++ b/panel-plugin/pulseaudio-dialog.c
@@ -212,15 +212,30 @@ pulseaudio_dialog_build (PulseaudioDialog *dialog)
                               G_OBJECT (object), "active",
                               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);
+
       g_object_bind_property(G_OBJECT(dialog->config), "enable-mpris",
-                             G_OBJECT(gtk_builder_get_object(builder, "checkbutton-multimedia-keys")), "sensitive",
+                             G_OBJECT(object), "sensitive",
                              G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
-      object = gtk_builder_get_object(builder, "checkbutton-multimedia-keys");
+      object = gtk_builder_get_object(builder, "checkbutton-wnck");
       g_return_if_fail(GTK_IS_CHECK_BUTTON(object));
-      g_object_bind_property(G_OBJECT(dialog->config), "enable-multimedia-keys",
+#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");
       gtk_widget_set_visible (GTK_WIDGET (object), FALSE);
diff --git a/panel-plugin/pulseaudio-dialog.glade b/panel-plugin/pulseaudio-dialog.glade
index b2a258e..4e50e28 100644
--- a/panel-plugin/pulseaudio-dialog.glade
+++ b/panel-plugin/pulseaudio-dialog.glade
@@ -276,6 +276,20 @@
                             <property name="position">1</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="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
                       </object>
                     </child>
                   </object>
diff --git a/panel-plugin/pulseaudio-menu.c b/panel-plugin/pulseaudio-menu.c
index 6e1bf92..7d1db15 100644
--- a/panel-plugin/pulseaudio-menu.c
+++ b/panel-plugin/pulseaudio-menu.c
@@ -588,6 +588,7 @@ pulseaudio_menu_new (PulseaudioVolume *volume,
                       mpris_menu_item_set_artist (MPRIS_MENU_ITEM (mi), artist);
 
                       mpris_menu_item_set_can_raise (MPRIS_MENU_ITEM (mi), can_raise);
+                      mpris_menu_item_set_can_raise_wnck (MPRIS_MENU_ITEM (mi), pulseaudio_config_get_can_raise_wnck (menu->config));
 
                       mpris_menu_item_set_can_play (MPRIS_MENU_ITEM (mi), can_play);
                       mpris_menu_item_set_can_pause (MPRIS_MENU_ITEM (mi), can_pause);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list