[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