gtk-demo: Add a simple video player example
authorBenjamin Otte <otte@redhat.com>
Mon, 5 Mar 2018 01:15:29 +0000 (02:15 +0100)
committerBenjamin Otte <otte@redhat.com>
Sun, 18 Mar 2018 20:01:23 +0000 (21:01 +0100)
For now, it's impossible to unfullscreen. Somebody should figure out a
way to do this.

demos/gtk-demo/demo.gresource.xml
demos/gtk-demo/meson.build
demos/gtk-demo/video_player.c [new file with mode: 0644]

index ccc17fe9ad62368d0065f3a24395af606ed3ddde..8315a66ee2d79e908155bbbb6d5fd281411455b2 100644 (file)
     <file>transparent.c</file>
     <file>tree_store.c</file>
     <file>textmask.c</file>
+    <file>video_player.c</file>
   </gresource>
   <gresource prefix="/textview">
     <file>floppybuddy.gif</file>
index 0ad157bf8de57908de3b85c9f3d7806c4cde23a4..6734d6f1101029366da37f15cb9abe7cd08048c8 100644 (file)
@@ -71,6 +71,7 @@ demos = files([
   'theming_style_classes.c',
   'transparent.c',
   'tree_store.c',
+  'video_player.c',
 ])
 
 gtkdemo_deps = [ libgtk_dep, ]
diff --git a/demos/gtk-demo/video_player.c b/demos/gtk-demo/video_player.c
new file mode 100644 (file)
index 0000000..cf9b42f
--- /dev/null
@@ -0,0 +1,96 @@
+/* Video Player
+ *
+ * This is a simple video player using just GTK widgets.
+ */
+
+#include <gtk/gtk.h>
+
+static GtkWidget *window = NULL;
+
+static void
+open_dialog_response_cb (GtkWidget *dialog,
+                         int        response,
+                         GtkWidget *video)
+{
+  gtk_widget_hide (dialog);
+
+  if (response == GTK_RESPONSE_ACCEPT)
+    {
+      GFile *file;
+
+      file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
+      gtk_video_set_file (GTK_VIDEO (video), file);
+      g_object_unref (file);
+    }
+
+  gtk_widget_destroy (dialog);
+}
+
+static void
+open_clicked_cb (GtkWidget *button,
+                 GtkWidget *video)
+{
+  GtkWidget *dialog;
+
+  dialog = gtk_file_chooser_dialog_new ("Select a video",
+                                        GTK_WINDOW (gtk_widget_get_toplevel (button)),
+                                        GTK_FILE_CHOOSER_ACTION_OPEN,
+                                        "_Cancel", GTK_RESPONSE_CANCEL,
+                                        "_Open", GTK_RESPONSE_ACCEPT,
+                                        NULL);
+  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
+  gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+  g_signal_connect (dialog, "response", G_CALLBACK (open_dialog_response_cb), video);
+  gtk_widget_show (dialog);
+}
+
+static void
+fullscreen_clicked_cb (GtkWidget *button,
+                       gpointer   unused)
+{
+  GtkWidget *window = gtk_widget_get_toplevel (button);
+
+  gtk_window_fullscreen (GTK_WINDOW (window));
+}
+
+GtkWidget *
+do_video_player (GtkWidget *do_widget)
+{
+  GtkWidget *title;
+  GtkWidget *video;
+  GtkWidget *open_button;
+  GtkWidget *fullscreen_button;
+
+  if (!window)
+    {
+      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      gtk_window_set_display (GTK_WINDOW (window),
+                              gtk_widget_get_display (do_widget));
+      gtk_window_set_title (GTK_WINDOW (window), "Video Player");
+      g_signal_connect (window, "destroy",
+                        G_CALLBACK (gtk_widget_destroyed), &window);
+
+      video = gtk_video_new ();
+      gtk_container_add (GTK_CONTAINER (window), video);
+
+      title = gtk_header_bar_new ();
+      gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (title), TRUE);
+      gtk_header_bar_set_title (GTK_HEADER_BAR (title), "Video Player");
+      gtk_window_set_titlebar (GTK_WINDOW (window), title);
+
+      open_button = gtk_button_new_with_mnemonic ("_Open");
+      g_signal_connect (open_button, "clicked", G_CALLBACK (open_clicked_cb), video);
+      gtk_header_bar_pack_start (GTK_HEADER_BAR (title), open_button);
+
+      fullscreen_button = gtk_button_new_from_icon_name ("view-fullscreen-symbolic");
+      g_signal_connect (fullscreen_button, "clicked", G_CALLBACK (fullscreen_clicked_cb), NULL);
+      gtk_header_bar_pack_end (GTK_HEADER_BAR (title), fullscreen_button);
+    }
+
+  if (!gtk_widget_get_visible (window))
+    gtk_widget_show (window);
+  else
+    gtk_widget_destroy (window);
+
+  return window;
+}