2 Largely based on an example by Tristan Matthews
3 http://tristanswork.blogspot.com/2008/09/fullscreen-video-in-gstreamer-with-gtk.html
8 #include <gst/interfaces/xoverlay.h>
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
));
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
));
32 gtk_window_fullscreen(GTK_WINDOW(widget
));
38 key_press_event_cb(GtkWidget
*widget
, GdkEventKey
*event
, gpointer data
)
40 g_print("got key %c\n", event
->keyval
);
41 switch (event
->keyval
){
43 toggle_fullscreen(widget
);
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
[])
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
);
91 gst_element_set_state (pipeline
, GST_STATE_NULL
);
92 gst_object_unref (pipeline
);