[gtk] video: Add autoplay and loop boolean properties



commit 3eddbdc191889c251988f2a11e2cd877637734c2
Author: Benjamin Otte <otte redhat com>
Date:   Fri Apr 6 00:41:44 2018 +0200

    video: Add autoplay and loop boolean properties

 gtk/gtkvideo.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 gtk/gtkvideo.h |  10 +++++
 2 files changed, 147 insertions(+)
---
diff --git a/gtk/gtkvideo.c b/gtk/gtkvideo.c
index 5bac566196..6a351bce1e 100644
--- a/gtk/gtkvideo.c
+++ b/gtk/gtkvideo.c
@@ -51,12 +51,17 @@ struct _GtkVideo
   GtkWidget *controls_revealer;
   GtkWidget *controls;
   guint controls_hide_source;
+
+  guint autoplay : 1;
+  guint loop : 1;
 };
 
 enum
 {
   PROP_0,
+  PROP_AUTOPLAY,
   PROP_FILE,
+  PROP_LOOP,
   PROP_MEDIA_STREAM,
 
   N_PROPS
@@ -119,6 +124,17 @@ gtk_video_unrealize (GtkWidget *widget)
   GTK_WIDGET_CLASS (gtk_video_parent_class)->unrealize (widget);
 }
 
+static void
+gtk_video_map (GtkWidget *widget)
+{
+  GtkVideo *self = GTK_VIDEO (widget);
+
+  GTK_WIDGET_CLASS (gtk_video_parent_class)->map (widget);
+
+  if (self->autoplay && self->media_stream)
+    gtk_media_stream_play (self->media_stream);
+}
+
 static void
 gtk_video_unmap (GtkWidget *widget)
 {
@@ -159,10 +175,18 @@ gtk_video_get_property (GObject    *object,
 
   switch (property_id)
     {
+    case PROP_AUTOPLAY:
+      g_value_set_boolean (value, self->autoplay);
+      break;
+
     case PROP_FILE:
       g_value_set_object (value, self->file);
       break;
 
+    case PROP_LOOP:
+      g_value_set_boolean (value, self->loop);
+      break;
+
     case PROP_MEDIA_STREAM:
       g_value_set_object (value, self->media_stream);
       break;
@@ -183,10 +207,18 @@ gtk_video_set_property (GObject      *object,
 
   switch (property_id)
     {
+    case PROP_AUTOPLAY:
+      gtk_video_set_autoplay (self, g_value_get_boolean (value));
+      break;
+
     case PROP_FILE:
       gtk_video_set_file (self, g_value_get_object (value));
       break;
 
+    case PROP_LOOP:
+      gtk_video_set_loop (self, g_value_get_boolean (value));
+      break;
+
     case PROP_MEDIA_STREAM:
       gtk_video_set_media_stream (self, g_value_get_object (value));
       break;
@@ -207,12 +239,25 @@ gtk_video_class_init (GtkVideoClass *klass)
   widget_class->size_allocate = gtk_video_size_allocate;
   widget_class->realize = gtk_video_realize;
   widget_class->unrealize = gtk_video_unrealize;
+  widget_class->map = gtk_video_map;
   widget_class->unmap = gtk_video_unmap;
 
   gobject_class->dispose = gtk_video_dispose;
   gobject_class->get_property = gtk_video_get_property;
   gobject_class->set_property = gtk_video_set_property;
 
+  /**
+   * GtkVideo:autoplay:
+   *
+   * If the video should automatically begin playing.
+   */
+  properties[PROP_AUTOPLAY] =
+    g_param_spec_boolean ("autoplay",
+                          P_("Autoplay"),
+                          P_("If playback should begin automatically"),
+                          FALSE,
+                          G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+
   /**
    * GtkVideo:file:
    *
@@ -225,6 +270,18 @@ gtk_video_class_init (GtkVideoClass *klass)
                          G_TYPE_FILE,
                          G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
 
+  /**
+   * GtkVideo:loop:
+   *
+   * If new media files should be set to loop.
+   */
+  properties[PROP_LOOP] =
+    g_param_spec_boolean ("loop",
+                          P_("Loop"),
+                          P_("If new media streams should be set to loop"),
+                          FALSE,
+                          G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+
   /**
    * GtkVideo:media-stream:
    *
@@ -525,12 +582,15 @@ gtk_video_set_media_stream (GtkVideo       *self,
   if (stream)
     {
       self->media_stream = g_object_ref (stream);
+      gtk_media_stream_set_loop (stream, self->loop);
       if (gtk_widget_get_realized (GTK_WIDGET (self)))
         gtk_media_stream_realize (stream, gtk_widget_get_surface (GTK_WIDGET (self)));
       g_signal_connect (self->media_stream,
                         "notify",
                         G_CALLBACK (gtk_video_notify_cb),
                         self);
+      if (self->autoplay)
+        gtk_media_stream_play (stream);
     }
 
   gtk_media_controls_set_media_stream (GTK_MEDIA_CONTROLS (self->controls), stream);
@@ -594,6 +654,8 @@ gtk_video_set_file (GtkVideo *self,
       gtk_video_set_media_stream (self, NULL);
     }
 
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FILE]);
+
   g_object_thaw_notify (G_OBJECT (self));
 }
 
@@ -665,3 +727,78 @@ gtk_video_set_resource (GtkVideo   *self,
     g_object_unref (file);
 }
 
+/**
+ * gtk_video_get_autoplay:
+ * @self: a #GtkVideo
+ *
+ * Returns %TRUE if videos have been set to loop via gtk_video_set_loop().
+ *
+ * Returns: %TRUE if streams should autoplay
+ **/
+gboolean
+gtk_video_get_autoplay (GtkVideo *self)
+{
+  g_return_val_if_fail (GTK_IS_VIDEO (self), FALSE);
+
+  return self->autoplay;
+}
+
+/**
+ * gtk_video_set_autoplay:
+ * @self: a #GtkVideo
+ * @autoplay: whether media streams should autoplay
+ *
+ * Sets whether @self automatically starts playback when it becomes visible
+ * or when a new file gets loaded.
+ **/
+void
+gtk_video_set_autoplay (GtkVideo *self,
+                        gboolean  autoplay)
+{
+  g_return_if_fail (GTK_IS_VIDEO (self));
+
+  if (self->autoplay == autoplay)
+    return;
+
+  self->autoplay = autoplay;
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_AUTOPLAY]);
+}
+
+/**
+ * gtk_video_get_loop:
+ * @self: a #GtkVideo
+ *
+ * Returns %TRUE if videos have been set to loop via gtk_video_set_loop().
+ *
+ * Returns: %TRUE if streams should loop
+ **/
+gboolean
+gtk_video_get_loop (GtkVideo *self)
+{
+  g_return_val_if_fail (GTK_IS_VIDEO (self), FALSE);
+
+  return self->loop;
+}
+
+/**
+ * gtk_video_set_loop:
+ * @self: a #GtkVideo
+ * @loop: whether media streams should loop
+ *
+ * Sets whether new files loaded by @self should be set to loop.
+ **/
+void
+gtk_video_set_loop (GtkVideo *self,
+                    gboolean  loop)
+{
+  g_return_if_fail (GTK_IS_VIDEO (self));
+
+  if (self->loop == loop)
+    return;
+
+  self->loop = loop;
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_LOOP]);
+}
+
diff --git a/gtk/gtkvideo.h b/gtk/gtkvideo.h
index 16ffbbfcc6..e0710c2ef6 100644
--- a/gtk/gtkvideo.h
+++ b/gtk/gtkvideo.h
@@ -57,6 +57,16 @@ void            gtk_video_set_filename                  (GtkVideo
 GDK_AVAILABLE_IN_ALL
 void            gtk_video_set_resource                  (GtkVideo               *self,
                                                          const char             *resource_path);
+GDK_AVAILABLE_IN_ALL
+gboolean        gtk_video_get_autoplay                  (GtkVideo               *self);
+GDK_AVAILABLE_IN_ALL
+void            gtk_video_set_autoplay                  (GtkVideo               *self,
+                                                         gboolean                autoplay);
+GDK_AVAILABLE_IN_ALL
+gboolean        gtk_video_get_loop                      (GtkVideo               *self);
+GDK_AVAILABLE_IN_ALL
+void            gtk_video_set_loop                      (GtkVideo               *self,
+                                                         gboolean                loop);
 
 
 G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]