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