[Xfce4-commits] <parole:master> Add fullscreen mpris2 functionality
Sean Davis
noreply at xfce.org
Thu Dec 12 00:18:17 CET 2013
Updating branch refs/heads/master
to e48f090c7c9c047e00a6b95dff84713599658adc (commit)
from 0e5fd5f87afcd5622ad8af083708a543fbfe7a45 (commit)
commit e48f090c7c9c047e00a6b95dff84713599658adc
Author: Sean Davis <smd.seandavis at gmail.com>
Date: Sun Nov 17 06:55:20 2013 -0500
Add fullscreen mpris2 functionality
src/misc/parole-provider-player.c | 43 ++++++++++++++++++++++++++
src/misc/parole-provider-player.h | 10 +++++++
src/parole-player.c | 2 +-
src/parole-plugin-player.c | 47 +++++++++++++++++++++++++++++
src/plugins/mpris2/mpris2-provider.c | 55 ++++++++++++++++++++++++++++++++--
5 files changed, 154 insertions(+), 3 deletions(-)
diff --git a/src/misc/parole-provider-player.c b/src/misc/parole-provider-player.c
index 0dff22d..659ee71 100644
--- a/src/misc/parole-provider-player.c
+++ b/src/misc/parole-provider-player.c
@@ -434,3 +434,46 @@ GtkAction *parole_provider_player_get_action(ParoleProviderPlayer *player, Parol
{
return parole_player_get_action(action);
}
+
+/**
+ * parole_provider_player_get_fullscreen:
+ * @player: a #ParoleProviderPlayer
+ *
+ * Get fullscreen status for Parole.
+ *
+ * Since: 0.6
+ **/
+gboolean parole_provider_player_get_fullscreen(ParoleProviderPlayer *player)
+{
+ g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), NULL);
+
+ if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_stream )
+ {
+ return (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_fullscreen) (player);
+ }
+
+ return FALSE;
+}
+
+/**
+ * parole_provider_player_set_fullscreen:
+ * @player: a #ParoleProviderPlayer
+ * @fullscreen: TRUE for fullscreen, FALSE for unfullscreen
+ *
+ * Set fullscreen status for Parole.
+ *
+ * Returns: TRUE if the fullscreen command succeeded, FALSE otherwise.
+ *
+ * Since: 0.6
+ **/
+gboolean parole_provider_player_set_fullscreen(ParoleProviderPlayer *player, gboolean fullscreen)
+{
+ g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), NULL);
+
+ if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_stream )
+ {
+ return (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->set_fullscreen) (player, fullscreen);
+ }
+
+ return FALSE;
+}
diff --git a/src/misc/parole-provider-player.h b/src/misc/parole-provider-player.h
index 98bee2d..2ee85f6 100644
--- a/src/misc/parole-provider-player.h
+++ b/src/misc/parole-provider-player.h
@@ -80,6 +80,11 @@ struct _ParoleProviderPlayerIface
gboolean (*seek) (ParoleProviderPlayer *player,
gdouble pos);
+
+ gboolean (*get_fullscreen) (ParoleProviderPlayer *player);
+
+ gboolean (*set_fullscreen) (ParoleProviderPlayer *player,
+ gboolean fullscreen);
void (*open_media_chooser) (ParoleProviderPlayer *player);
@@ -129,6 +134,11 @@ parole_provider_player_open_media_chooser (ParoleProviderPlayer *player);
GtkAction *parole_provider_player_get_action(ParoleProviderPlayer *player, ParolePlayerAction action);
+gboolean parole_provider_player_get_fullscreen(ParoleProviderPlayer *player);
+
+gboolean parole_provider_player_set_fullscreen(ParoleProviderPlayer *player,
+ gboolean fullscreen);
+
G_END_DECLS
#endif /* __PAROLE_PLUGIN_IFACE_H__ */
diff --git a/src/parole-player.c b/src/parole-player.c
index ddd8561..4764c0e 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -3027,7 +3027,7 @@ parole_player_init (ParolePlayer *player)
*/
/* ParolePlayer Window */
player->priv->window = GTK_WIDGET (gtk_builder_get_object (builder, "main-window"));
- g_signal_connect( G_OBJECT(player->priv->window),
+ g_signal_connect_after( G_OBJECT(player->priv->window),
"window-state-event",
G_CALLBACK(parole_player_window_state_event),
PAROLE_PLAYER(player) );
diff --git a/src/parole-plugin-player.c b/src/parole-plugin-player.c
index 2700cd8..8bd0922 100644
--- a/src/parole-plugin-player.c
+++ b/src/parole-plugin-player.c
@@ -52,6 +52,8 @@ struct ParolePluginPlayerPrivate
gulong state_changed;
gulong tag_message;
gboolean packed;
+
+ gboolean fullscreen;
};
@@ -205,6 +207,29 @@ static void parole_plugin_player_open_media_chooser (ParoleProviderPlayer *provi
g_object_unref (list);
}
+static gboolean parole_plugin_player_get_fullscreen (ParoleProviderPlayer *provider)
+{
+ ParolePluginPlayer *player;
+
+ player = PAROLE_PLUGIN_PLAYER (provider);
+
+ return player->priv->fullscreen;
+}
+
+static gboolean parole_plugin_player_set_fullscreen (ParoleProviderPlayer *provider, gboolean fullscreen)
+{
+ GtkWidget *window;
+
+ window = parole_plugin_player_get_main_window (provider);
+
+ if (fullscreen)
+ gtk_window_fullscreen(GTK_WINDOW(window));
+ else
+ gtk_window_unfullscreen(GTK_WINDOW(window));
+
+ return TRUE;
+}
+
static void parole_plugin_player_iface_init (ParoleProviderPlayerIface *iface)
{
iface->get_main_window = parole_plugin_player_get_main_window;
@@ -219,6 +244,8 @@ static void parole_plugin_player_iface_init (ParoleProviderPlayerIface *iface)
iface->play_next = parole_plugin_player_play_next;
iface->seek = parole_plugin_player_seek;
iface->open_media_chooser = parole_plugin_player_open_media_chooser;
+ iface->get_fullscreen = parole_plugin_player_get_fullscreen;
+ iface->set_fullscreen = parole_plugin_player_set_fullscreen;
}
static void
@@ -234,6 +261,18 @@ parole_plugin_player_media_tag_cb (ParoleGst *gst, const ParoleStream *stream, P
g_signal_emit_by_name (G_OBJECT (player), "tag-message", stream);
}
+static gboolean
+parole_plugin_player_window_state_event (GtkWidget *widget,
+ GdkEventWindowState *event,
+ ParolePluginPlayer *player)
+{
+ if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)
+ player->priv->fullscreen = TRUE;
+ else
+ player->priv->fullscreen = FALSE;
+ return FALSE;
+}
+
static void
parole_plugin_player_class_init (ParolePluginPlayerClass *klass)
{
@@ -247,6 +286,7 @@ parole_plugin_player_class_init (ParolePluginPlayerClass *klass)
static void
parole_plugin_player_init (ParolePluginPlayer *player)
{
+ GtkWidget *window;
player->priv = PAROLE_PLUGIN_PLAYER_GET_PRIVATE (player);
player->priv->gst = parole_gst_get ();
@@ -257,6 +297,13 @@ parole_plugin_player_init (ParolePluginPlayer *player)
player->priv->tag_message = g_signal_connect (G_OBJECT (player->priv->gst), "media-tag",
G_CALLBACK (parole_plugin_player_media_tag_cb), player);
+ player->priv->fullscreen = FALSE;
+ window = GTK_WIDGET(gtk_widget_get_toplevel (player->priv->gst));
+ g_signal_connect( G_OBJECT(window),
+ "window-state-event",
+ G_CALLBACK(parole_plugin_player_window_state_event),
+ PAROLE_PLAYER(player) );
+
player->priv->packed = FALSE;
player->priv->box = NULL;
}
diff --git a/src/plugins/mpris2/mpris2-provider.c b/src/plugins/mpris2/mpris2-provider.c
index 04dcc5c..1dd8195 100644
--- a/src/plugins/mpris2/mpris2-provider.c
+++ b/src/plugins/mpris2/mpris2-provider.c
@@ -50,6 +50,7 @@ struct _Mpris2Provider
gboolean saved_playbackstatus;
gboolean saved_shuffle;
+ gboolean saved_fullscreen;
gchar *saved_title;
gdouble volume;
ParoleState state;
@@ -74,6 +75,8 @@ static const gchar mpris2xml[] =
" <property name='DesktopEntry' type='s' access='read'/>"
" <property name='SupportedUriSchemes' type='as' access='read'/>"
" <property name='SupportedMimeTypes' type='as' access='read'/>"
+" <property name='Fullscreen' type='b' access='readwrite'/>"
+" <property name='CanSetFullscreen' type='b' access='read'/>"
" </interface>"
" <interface name='org.mpris.MediaPlayer2.Player'>"
" <method name='Next'/>"
@@ -159,6 +162,30 @@ static GVariant* mpris_Root_get_CanRaise (GError **error, Mpris2Provider *provid
return g_variant_new_boolean(TRUE);
}
+static GVariant* mpris_Root_get_Fullscreen (GError **error, Mpris2Provider *provider)
+{
+ return g_variant_new_boolean(provider->saved_fullscreen);
+}
+
+static void mpris_Root_put_Fullscreen (GVariant *value, GError **error, Mpris2Provider *provider)
+{
+ gboolean fullscreen = g_variant_get_boolean(value);
+
+ GtkWidget *window = parole_provider_player_get_main_window(provider->player);
+ if (window)
+ {
+ if (fullscreen)
+ gtk_window_fullscreen(GTK_WINDOW(window));
+ else
+ gtk_window_unfullscreen(GTK_WINDOW(window));
+ }
+}
+
+static GVariant* mpris_Root_get_CanSetFullscreen (GError **error, Mpris2Provider *provider)
+{
+ return g_variant_new_boolean(TRUE);
+}
+
static GVariant* mpris_Root_get_HasTrackList (GError **error, Mpris2Provider *provider)
{
return g_variant_new_boolean(TRUE);
@@ -166,7 +193,6 @@ static GVariant* mpris_Root_get_HasTrackList (GError **error, Mpris2Provider *pr
static GVariant* mpris_Root_get_Identity (GError **error, Mpris2Provider *provider)
{
- // This is OK
return g_variant_new_string(_("Parole Media Player"));
}
@@ -646,6 +672,12 @@ static void parole_mpris_update_any (Mpris2Provider *provider)
g_variant_builder_add (&b, "{sv}", "Metadata", mpris_Player_get_Metadata (NULL, provider));
}
}
+ if (provider->saved_fullscreen != parole_provider_player_get_fullscreen(player))
+ {
+ change_detected = TRUE;
+ provider->saved_fullscreen = !provider->saved_fullscreen;
+ g_variant_builder_add (&b, "{sv}", "Fullscreen", mpris_Root_get_Fullscreen (NULL, provider));
+ }
if(change_detected)
{
GVariant * tuples[] = {
@@ -736,6 +768,8 @@ handle_get_property (GDBusConnection *connection,
PROPGET(Root, DesktopEntry)
PROPGET(Root, SupportedUriSchemes)
PROPGET(Root, SupportedMimeTypes)
+ PROPGET(Root, Fullscreen)
+ PROPGET(Root, CanSetFullscreen)
END_INTERFACE
/* org.mpris.MediaPlayer2.Player */
BEGIN_INTERFACE(1)
@@ -774,7 +808,7 @@ handle_set_property (GDBusConnection *connection,
/* org.mpris.MediaPlayer2 */
BEGIN_INTERFACE(0)
- /* all properties readonly */
+ PROPPUT(Root, Fullscreen)
END_INTERFACE
/* org.mpris.MediaPlayer2.Player */
BEGIN_INTERFACE(1)
@@ -859,6 +893,15 @@ on_name_lost (GDBusConnection *connection,
g_warning ("Lost DBus name %s", name);
}
+static gboolean
+on_window_state_event (GtkWidget *widget,
+ GdkEventWindowState *event,
+ Mpris2Provider *provider)
+{
+ parole_mpris_update_any (provider);
+ return FALSE;
+}
+
/*
* Plugin interface.
*/
@@ -872,9 +915,11 @@ static void
mpris2_provider_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *player)
{
Mpris2Provider *provider;
+ GtkWidget *window;
provider = MPRIS2_PROVIDER (plugin);
provider->player = player;
+ provider->saved_fullscreen = FALSE;
provider->introspection_data = g_dbus_node_info_new_for_xml (mpris2xml, NULL);
g_assert (provider->introspection_data != NULL);
@@ -895,6 +940,12 @@ mpris2_provider_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *
g_signal_connect ( provider->conf, "notify::repeat",
G_CALLBACK (conf_changed_cb), plugin);
+
+ window = parole_provider_player_get_main_window(provider->player);
+ g_signal_connect( G_OBJECT(window),
+ "window-state-event",
+ G_CALLBACK(on_window_state_event),
+ provider );
}
static void
More information about the Xfce4-commits
mailing list