make clutter-app, and share pipeline stuff with gtk-app
[sparrow.git] / gtk-app.c
blob76fe44ac55c255edb1f1c2853798d0de7836ad80
1 /*
2 Largely based on an example by Tristan Matthews
3 http://tristanswork.blogspot.com/2008/09/fullscreen-video-in-gstreamer-with-gtk.html
5 */
6 #include <gst/gst.h>
7 #include <gtk/gtk.h>
8 #include <gst/interfaces/xoverlay.h>
9 #include <gdk/gdk.h>
10 #include <gdk/gdkx.h>
11 #include "app.h"
13 static void
14 bus_call(GstBus * bus, GstMessage *msg, gpointer data)
16 GtkWidget *window = (GtkWidget*) data;
17 if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ELEMENT &&
18 gst_structure_has_name(msg->structure, "prepare-xwindow-id")){
19 g_print("Got prepare-xwindow-id msg\n");
20 gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(GST_MESSAGE_SRC(msg)),
21 GDK_WINDOW_XWINDOW(window->window));
25 static void
26 toggle_fullscreen(GtkWidget *widget){
27 GdkWindowState state = gdk_window_get_state(GDK_WINDOW(widget->window));
28 if (state == GDK_WINDOW_STATE_FULLSCREEN){
29 gtk_window_unfullscreen(GTK_WINDOW(widget));
31 else{
32 gtk_window_fullscreen(GTK_WINDOW(widget));
37 static gboolean
38 key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
40 g_print("got key %c\n", event->keyval);
41 switch (event->keyval){
42 case 'f':
43 toggle_fullscreen(widget);
44 break;
45 default:
46 break;
48 return TRUE;
51 void destroy_cb(GtkWidget * widget, gpointer data)
53 GMainLoop *loop = (GMainLoop*) data;
54 g_print("Window destroyed\n");
55 g_main_loop_quit(loop);
59 gint main (gint argc, gchar *argv[])
61 /* initialization */
62 gst_init (&argc, &argv);
63 gtk_init (&argc, &argv);
65 GMainLoop *loop = g_main_loop_new(NULL, FALSE);
66 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
68 GstElement *sink = gst_element_factory_make("ximagesink", "sink");
69 GstElement *pipeline = (GstElement *)make_pipeline(sink);
71 gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(pipeline)),
72 (GstBusFunc)bus_call, window);
74 // attach key press signal to key press callback
75 gtk_widget_set_events(window, GDK_KEY_PRESS_MASK);
76 g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(key_press_event_cb), sink);
77 g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy_cb), loop);
80 GdkColor black = {0, 0, 0, 0};
81 gtk_widget_modify_bg(window, GTK_STATE_NORMAL, &black);
83 gtk_widget_show_all(window);
85 gst_element_set_state(pipeline, GST_STATE_PLAYING);
87 g_main_loop_run(loop);
90 /* clean up */
91 gst_element_set_state (pipeline, GST_STATE_NULL);
92 gst_object_unref (pipeline);
93 return 0;