[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