From: Julien M. <do...@us...> - 2003-01-15 20:38:43
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Jan 15 2003 12:38:40 PST Log message: GstVideoWidget got recoded to handle events, mouse pointer hiding, gtk_socket removing, and code cleanup Modified files: libs/gst/player : gstvideowidget.c gstvideowidget.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.c.diff?r1=1.7&r2=1.8 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.h.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: gstvideowidget.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstvideowidget.c 4 Dec 2002 10:24:23 -0000 1.7 +++ gstvideowidget.c 15 Jan 2003 20:38:28 -0000 1.8 @@ -1,35 +1,69 @@ -#include <config.h> - -#include <string.h> -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> -#include <gtk/gtksocket.h> -#include <gtk/gtkmain.h> - +/* GStreamer + * Copyright (C) 1999,2000,2001,2002 Erik Walthinsen <om...@cs...> + * 2000,2001,2002 Wim Taymans <wt...@ch...> + * 2002 Steve Baker <st...@st...> + * 2003 Julien Moutte <ju...@mo...> + * + * gstvideowidget.c: Video widget for gst xvideosink window + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + #include "gstvideowidget.h" static void gst_video_widget_class_init (GstVideoWidgetClass *klass); -static void gst_video_widget_init (GstVideoWidget *vw); -static void gst_video_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_video_widget_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_video_widget_init (GstVideoWidget *vw); static void gst_video_widget_realize (GtkWidget *vw); -static gint gst_video_widget_expose (GtkWidget *widget, GdkEventExpose *event); +static void gst_video_widget_unrealize (GtkWidget *vw); -static void gst_video_widget_frame_displayed (GstElement *element, GstVideoWidget *vw); +static gint gst_video_widget_expose ( GtkWidget *widget, + GdkEventExpose *event); + +static void gst_video_widget_size_request ( GtkWidget *widget, + GtkRequisition *requisition); +static void gst_video_widget_allocate ( GtkWidget *widget, + GtkAllocation *allocation); -/* signals and args */ -enum { - LAST_SIGNAL -}; + +static void gst_video_widget_set_property ( GObject *object, guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gst_video_widget_get_property ( GObject *object, guint prop_id, + GValue *value, + GParamSpec *pspec); + +static void gst_video_widget_update_cursor ( GstVideoWidget *vw); +static void gst_video_widget_reorder_windows (GstVideoWidget *vw); + +/* Signals and Args */ enum { ARG_0, ARG_SCALE_FACTOR, + ARG_VISIBLE_CURSOR, + ARG_EVENT_CATCHER, + ARG_XID, + ARG_SOURCE_WIDTH, + ARG_SOURCE_HEIGHT, }; -static GtkObject *parent_class = NULL; -static guint gst_video_widget_signals[LAST_SIGNAL] = {0}; +static GtkWidgetClass *parent_class = NULL; + +/* Get type function for GstVideoWidget */ GtkType gst_video_widget_get_type (void) @@ -47,86 +81,263 @@ NULL, (GtkClassInitFunc)NULL, }; - vw_type = gtk_type_unique (gtk_aspect_frame_get_type (), &vw_info); + vw_type = gtk_type_unique (gtk_widget_get_type (), &vw_info); } return vw_type; } +/* Class initialization for GstVideoWidget */ + static void gst_video_widget_class_init (GstVideoWidgetClass *klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *gobject_class; + GtkWidgetClass *widget_class; - parent_class = g_type_class_peek_parent (klass); + gobject_class = (GObjectClass*) klass; + widget_class = (GtkWidgetClass*) klass; + parent_class = gtk_type_class (gtk_widget_get_type ()); + gobject_class->set_property = gst_video_widget_set_property; gobject_class->get_property = gst_video_widget_get_property; - g_object_class_install_property (gobject_class, ARG_SCALE_FACTOR, - g_param_spec_float ("scale-factor", "scale factor", "size the video should be scaled to", - 0, G_MAXFLOAT / G_MAXINT, 1, G_PARAM_READWRITE)); + g_object_class_install_property ( + gobject_class, + ARG_SCALE_FACTOR, + g_param_spec_float ( + "scale_factor", + "scale factor", + "size the video should be scaled to", + 0, G_MAXFLOAT / G_MAXINT, 1, G_PARAM_READWRITE)); + g_object_class_install_property ( + gobject_class, + ARG_VISIBLE_CURSOR, + g_param_spec_boolean ( + "visible_cursor", + "visible cursor", + "Is the mouse pointer (cursor) visible or not", + TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_EVENT_CATCHER, + g_param_spec_boolean ( + "event_catcher", + "Event catcher", + "Should the widget catch events over the video window", + TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_XID, + g_param_spec_ulong ( + "video_xid", + "video window xid", + "Video playback Xwindow XID", + 0, G_MAXLONG, 1, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_SOURCE_WIDTH, + g_param_spec_int ( + "source_width", + "video source width", + "Video playback source width", + 0, G_MAXINT, 1, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_SOURCE_HEIGHT, + g_param_spec_int ( + "source_height", + "video source height", + "Video playback source height", + 0, G_MAXINT, 1, G_PARAM_READWRITE)); + widget_class->realize = gst_video_widget_realize; + widget_class->unrealize = gst_video_widget_unrealize; widget_class->expose_event = gst_video_widget_expose; + widget_class->size_request = gst_video_widget_size_request; + widget_class->size_allocate = gst_video_widget_allocate; } +/* Initing our widget */ + static void gst_video_widget_init (GstVideoWidget *vw) { - vw->source_width = 0; - vw->source_height = 0; - vw->scale_factor = 1.0; - vw->video_socket = gtk_socket_new (); - gtk_container_add (GTK_CONTAINER (vw), vw->video_socket); + + GTK_WIDGET_SET_FLAGS (GTK_WIDGET(vw), GTK_CAN_FOCUS); + + vw->source_width = 0; + vw->source_height = 0; + vw->scale_factor = 1.0; + vw->cursor_visible = TRUE; + vw->event_catcher = TRUE; + vw->event_window = NULL; + vw->video_window = NULL; } +/** + * gst_video_widget_new: + * + * Create a new empty #GstVideoWidget. + * + * Return value: the new #GstVideoWidget. + **/ GtkWidget * -gst_video_widget_new () +gst_video_widget_new (void) { GstVideoWidget *widget = g_object_new (GST_TYPE_VIDEO_WIDGET, NULL); - + return GTK_WIDGET(widget); } +/* Realizing GstVideoWidget */ + static void gst_video_widget_realize (GtkWidget *widget) { GstVideoWidget *vw = GST_VIDEO_WIDGET (widget); - + GdkWindowAttr attributes; + gint attributes_mask; + g_return_if_fail (vw != NULL); + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + + /* Creating our widget's window */ + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.colormap = gtk_widget_get_colormap (widget); + attributes.event_mask = gtk_widget_get_events (widget); + attributes.event_mask |= GDK_EXPOSURE_MASK; + + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + + widget->window = gdk_window_new ( gtk_widget_get_parent_window (widget), + &attributes, attributes_mask); + + gdk_window_set_user_data (widget->window, widget); + /* Creating our event window */ + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = 0; + attributes.y = 0; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_ONLY; + attributes.event_mask = GDK_ALL_EVENTS_MASK; + + attributes_mask = GDK_WA_X | GDK_WA_Y; + + vw->event_window = gdk_window_new ( + widget->window, + &attributes, attributes_mask); + + gdk_window_set_user_data (vw->event_window, widget); + + gdk_window_show (vw->event_window); + + widget->style = gtk_style_attach (widget->style, widget->window); + + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); + + /* Chaining up + if (GTK_WIDGET_CLASS (parent_class)->realize) - GTK_WIDGET_CLASS (parent_class)->realize (widget); + GTK_WIDGET_CLASS (parent_class)->realize (widget);*/ + +} + +/* Unrealizing GstVideoWidget */ + +static void +gst_video_widget_unrealize (GtkWidget *widget) +{ + GstVideoWidget *vw; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GST_IS_VIDEO_WIDGET(widget)); + + vw = GST_VIDEO_WIDGET (widget); + + GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED); + + /* Hide all windows */ + + if (GTK_WIDGET_MAPPED (widget)) + gtk_widget_unmap (widget); + + GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED); + + /* Destroying event window */ + + if (GDK_IS_WINDOW(vw->event_window)) { + gdk_window_set_user_data(vw->event_window, NULL); + gdk_window_destroy(vw->event_window); + vw->event_window = NULL; + } + + if (GDK_IS_WINDOW(vw->video_window)) { + gdk_window_set_user_data(vw->video_window, NULL); + gdk_window_destroy(vw->video_window); + vw->video_window = NULL; + } + + /* Chaining up */ + + if (GTK_WIDGET_CLASS (parent_class)->unrealize) + GTK_WIDGET_CLASS (parent_class)->unrealize (widget); } +/* GstVideoWidget got exposed */ + static gint gst_video_widget_expose(GtkWidget *widget, GdkEventExpose *event) { - g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) { gdk_draw_rectangle (widget->window, widget->style->black_gc, TRUE, - event->area.x, event->area.y, event->area.width, event->area.height); + event->area.x, event->area.y, + event->area.width, event->area.height); } + return FALSE; } +/* Size request for our widget */ + static void -gst_video_widget_resize_request (GstVideoWidget *vw) +gst_video_widget_size_request (GtkWidget *widget, GtkRequisition *requisition) { + GstVideoWidget *vw; gint width, height; gfloat temp; - gdk_threads_enter (); - + g_return_if_fail(widget != NULL); + g_return_if_fail(GST_IS_VIDEO_WIDGET(widget)); + + vw = GST_VIDEO_WIDGET (widget); + temp = (vw->scale_factor * vw->source_width + 0.5); width = (gint) temp > G_MAXINT ? G_MAXINT : (gint) temp; temp = (vw->scale_factor * vw->source_height + 0.5); height = (gint) temp > G_MAXINT ? G_MAXINT : (gint) temp; + /* don't make us want to be bigger than the screen */ + if (width > gdk_screen_width()) { height = height * gdk_screen_width() / width; width = gdk_screen_width(); @@ -135,65 +346,317 @@ width = width * gdk_screen_height() / height; height = gdk_screen_height(); } - gtk_widget_set_size_request (vw->video_socket, width, height); - gdk_threads_leave (); + + requisition->width = width; + requisition->height = height; } -void -gst_video_widget_set_source_size (GstVideoWidget *vw, gint width, gint height) +/* Allocate method for our widget */ + +static void +gst_video_widget_allocate (GtkWidget *widget, GtkAllocation *allocation) { - vw->source_width = width; - vw->source_height = height; - gst_video_widget_resize_request(vw); + GstVideoWidget *vw; + gfloat width_ratio, height_ratio, temp; + guint width, height; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GST_IS_VIDEO_WIDGET(widget)); + + vw = GST_VIDEO_WIDGET (widget); + + widget->allocation = *allocation; + + /* Choosing best ratio */ + + width_ratio = (gfloat) allocation->width / (gfloat) vw->source_width; + height_ratio = (gfloat) allocation->height / (gfloat) vw->source_height; + + vw->scale_factor = MIN (width_ratio, height_ratio); + + /* Calculating width & height with optimal ratio */ + + temp = (vw->scale_factor * vw->source_width + 0.5); + width = (gint) temp > G_MAXINT ? G_MAXINT : (gint) temp; + temp = (vw->scale_factor * vw->source_height + 0.5); + height = (gint) temp > G_MAXINT ? G_MAXINT : (gint) temp; + + if (GTK_WIDGET_REALIZED (widget)) { + gdk_window_move_resize ( widget->window, + allocation->x, + allocation->y, + allocation->width, + allocation->height); + + if (GDK_IS_WINDOW(vw->event_window)) + gdk_window_move_resize ( vw->event_window, + 0, + 0, + allocation->width, + allocation->height); + + if (GDK_IS_WINDOW(vw->video_window)) + gdk_window_move_resize ( + vw->video_window, + (allocation->width - width) / 2, + (allocation->height - height) / 2, + width, + height); + + } } +/** + * gst_video_widget_set_xembed_xid: + * @vw: a #GstVideoWidget + * @xid: the window ID of an existing window. + * + * Reparents a pre-existing video window into a #GstVideoWidget. This is + * meant to embed a foreign Xwindow created by xvideosink for example. + * + * Remember you can set this value trough the "video_xid" property. This will + * trigger the embedding the same way than calling this method. + * + **/ void -gst_video_widget_reset_socket(GstVideoWidget *vw) +gst_video_widget_set_xembed_xid (GstVideoWidget *vw, gulong xid) { - if (vw->video_socket){ - gtk_container_remove (GTK_CONTAINER (vw), vw->video_socket); + GdkDisplay *display; + GtkWidget *widget = GTK_WIDGET (vw); + + gdk_threads_enter (); + + display = gtk_widget_get_display (GTK_WIDGET(vw)); + + vw->video_window = gdk_window_foreign_new_for_display (display, xid); + + if (vw->video_window) { + + gdk_window_reparent (vw->video_window, widget->window, 0, 0); + + gdk_window_show (vw->video_window); + + if (vw->event_catcher) + gdk_window_raise (vw->event_window); + + vw->xembed_xid = xid; + + gtk_widget_queue_resize (GTK_WIDGET(vw)); + } - vw->video_socket = gtk_socket_new (); - gtk_container_add (GTK_CONTAINER (vw), vw->video_socket); + else + g_warning ("Trying to embed a window which has been destroyed"); + + gdk_threads_leave (); +} +/** + * gst_video_widget_get_xembed_xid: + * @vw: a #GstVideoWidget + * + * Get current embeded window xid. + * + * Remember you can get this value trough the "video_xid" property. + * + * Return value: a #gulong referencing embeded video window. + **/ +gulong +gst_video_widget_get_xembed_xid (GstVideoWidget *vw) +{ + g_return_val_if_fail(vw != NULL, 0); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), 0); + return vw->xembed_xid; } -void -gst_video_widget_set_xembed_xid(GstVideoWidget *vw, gint xid) +/** + * gst_video_widget_set_source_size: + * @vw: a #GstVideoWidget + * @width: a #gint indicating source video's width. + * @height: a #gint indicating source video's height. + * + * Set video source size of a #GstVideoWidget and queue a resize request + * for the widget. + * + * The #GstVideoWidget must have already be created + * before you can make this call. + * + * Remember you can set these values trough "source_width" and "source_height" + * properties, but you will have to queue the resize request yourself. + * + * Return value: a #gboolean indicating wether the call succeeded or not. + **/ +gboolean +gst_video_widget_set_source_size (GstVideoWidget *vw, gint width, gint height) { - gdk_threads_enter (); + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + + vw->source_width = width; + vw->source_height = height; + gtk_widget_queue_resize (GTK_WIDGET(vw)); + + return TRUE; +} - gtk_widget_realize (vw->video_socket); - gtk_widget_show (vw->video_socket); +/** + * gst_video_widget_get_source_size: + * @socket_: a #GstVideoWidget + * @width: a pointer to a #gint where source video's width will be put. + * @height: a pointer to a #gint where source video's height will be put. + * + * Fills @width and @height with source video's dimensions. + * + * Remember you can get these values trough "source_width" and "source_height" + * properties. + * + * Return value: a #gboolean indicating wether the call succeeded or not. + **/ +gboolean +gst_video_widget_get_source_size (GstVideoWidget *vw, gint *width, gint *height) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); - gtk_socket_add_id (GTK_SOCKET (vw->video_socket), xid); + *width = vw->source_width; + *height = vw->source_height; + + return TRUE; +} - vw->xembed_xid = xid; +/** + * gst_video_widget_set_cursor_visible: + * @vw: a #GstVideoWidget + * @visible: a #gboolean indicating wether or not the cursor should be visible. + * + * Set cursor visible or not over embeded video window. + * + * Remember you can set this flag trough "visible_cursor" property. + * + * Return value: a #gboolean indicating wether the call succeeded or not. + **/ +gboolean +gst_video_widget_set_cursor_visible (GstVideoWidget *vw, gboolean visible) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + + gdk_threads_enter (); + + vw->cursor_visible = visible; + + gst_video_widget_update_cursor (vw); + gdk_threads_leave (); + + return TRUE; } -gint -gst_video_widget_get_xembed_xid(GstVideoWidget *vw) +/** + * gst_video_widget_get_cursor_visible: + * @vw: a #GstVideoWidget + * + * Get cursor visible status over embeded video window. + * + * Remember you can get this flag trough "visible_cursor" property. + * + * Return value: a #gboolean indicating wether the cursor is visible or not. + **/ +gboolean +gst_video_widget_get_cursor_visible (GstVideoWidget *vw) { - g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), 0); - return vw->xembed_xid; + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + return vw->cursor_visible; } -gint -gst_video_widget_get_source_width (GstVideoWidget *vw) +/** + * gst_video_widget_set_event_catcher: + * @vw: a #GstVideoWidget + * @event_catcher: a #gboolean indicating wether the widget should catch events + * over the embeded window or not. + * + * Set a #GstVideoWidget to catch events over the embeded window or not. + * + * Remember you can set this flag trough the "event_catcher" property. + * + * Return value: a #gboolean indicating wether the call succeeded or not. + **/ +gboolean +gst_video_widget_set_event_catcher (GstVideoWidget *vw, gboolean event_catcher) { - g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), 0); + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + + gdk_threads_enter (); + + vw->event_catcher = event_catcher; + + gst_video_widget_reorder_windows (vw); + + gdk_threads_leave (); + + return TRUE; +} - return vw->source_width; +/** + * gst_video_widget_get_event_catcher: + * @vw: a #GstVideoWidget + * + * Get event catcher status from a #GstVideoWidget to know if the widget + * catch events over embeded window or not. + * + * Remember you can get this flag trough "event_catcher" property. + * + * Return value: a #gboolean indicating wether the widget catch events or not. + **/ +gboolean +gst_video_widget_get_event_catcher (GstVideoWidget *vw) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + return vw->event_catcher; } -gint -gst_video_widget_get_source_height (GstVideoWidget *vw) +/** + * gst_video_widget_set_scale: + * @vw: a #GstVideoWidget + * @scale: a #gfloat indicating scale factor that will be used by @vw. + * + * Set a scale factor for a #GstVideoWidget. + * + * Remember you can set this flag trough the "scale_factor" property. + * + * Return value: a #gboolean indicating wether the call succeeded or not. + **/ +gboolean +gst_video_widget_set_scale (GstVideoWidget *vw, gfloat scale) { - g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), 0); + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + vw->scale_factor = scale; + gtk_widget_queue_resize (GTK_WIDGET(vw)); + return TRUE; +} - return vw->source_height; +/** + * gst_video_widget_get_scale: + * @vw: a #GstVideoWidget + * + * Get used scale factor for a #GstVideoWidget. + * + * Remember you can get this value trough "scale_factor" property. + * + * Return value: a #gfloat indicating scale factor used. + **/ +gfloat +gst_video_widget_get_scale (GstVideoWidget *vw) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + return vw->scale_factor; } +/* GstVideoWidget methods to set properties */ + static void gst_video_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { @@ -204,16 +667,35 @@ vw = GST_VIDEO_WIDGET (object); switch (prop_id) { - case ARG_SCALE_FACTOR: - vw->scale_factor = g_value_get_float (value); - gst_video_widget_resize_request(vw); + case ARG_SCALE_FACTOR: + vw->scale_factor = g_value_get_float (value); + gtk_widget_queue_resize (GTK_WIDGET(vw)); break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + case ARG_VISIBLE_CURSOR: + vw->cursor_visible = g_value_get_boolean (value); + gst_video_widget_update_cursor (vw); + break; + case ARG_EVENT_CATCHER: + vw->event_catcher = g_value_get_boolean (value); + gst_video_widget_reorder_windows (vw); + break; + case ARG_XID: + gst_video_widget_set_xembed_xid (vw, g_value_get_ulong(value)); + break; + case ARG_SOURCE_WIDTH: + vw->source_width = g_value_get_int (value); + break; + case ARG_SOURCE_HEIGHT: + vw->source_height = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } +/* GstVideoWidget methods to get properties */ + static void gst_video_widget_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { @@ -224,11 +706,87 @@ vw = GST_VIDEO_WIDGET (object); switch (prop_id) { - case ARG_SCALE_FACTOR: - g_value_set_float (value, vw->scale_factor); + case ARG_SCALE_FACTOR: + g_value_set_float (value, vw->scale_factor); break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + case ARG_VISIBLE_CURSOR: + g_value_set_boolean (value, vw->cursor_visible); + break; + case ARG_EVENT_CATCHER: + g_value_set_boolean (value, vw->event_catcher); break; + case ARG_XID: + g_value_set_ulong (value, vw->xembed_xid); + break; + case ARG_SOURCE_WIDTH: + g_value_set_int (value, vw->source_width); + break; + case ARG_SOURCE_HEIGHT: + g_value_set_int (value, vw->source_height); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* Method updating cursor status depending on widget flag */ + +static void +gst_video_widget_update_cursor (GstVideoWidget *vw) +{ + GtkWidget *widget; + + g_return_if_fail(vw != NULL); + g_return_if_fail(GST_IS_VIDEO_WIDGET(vw)); + g_return_if_fail(GDK_IS_WINDOW(vw->video_window)); + + widget = GTK_WIDGET (vw); + + if (vw->cursor_visible) + gdk_window_set_cursor (widget->window, NULL); + else { + + GdkBitmap *empty_bitmap; + GdkColor useless; + GdkCursor *cursor; + char invisible_cursor_bits[] = { 0x0 }; + + useless.red = useless.green = useless.blue = useless.pixel = 0; + + empty_bitmap = gdk_bitmap_create_from_data ( widget->window, + invisible_cursor_bits, + 1, 1); + + cursor = gdk_cursor_new_from_pixmap ( empty_bitmap, + empty_bitmap, + &useless, + &useless, 0, 0); + + gdk_window_set_cursor (widget->window, cursor); + + gdk_cursor_unref (cursor); + + g_object_unref (empty_bitmap); + } +} + +/* Method reordering event window and video window depending on event_catcher +flag */ + +static void +gst_video_widget_reorder_windows (GstVideoWidget *vw) +{ + g_return_if_fail(vw != NULL); + g_return_if_fail(GST_IS_VIDEO_WIDGET(vw)); + g_return_if_fail(GDK_IS_WINDOW(vw->video_window)); + + if (vw->event_catcher) { + if (GDK_IS_WINDOW(vw->event_window)) + gdk_window_raise(vw->event_window); + } + else { + if (GDK_IS_WINDOW(vw->video_window)) + gdk_window_raise(vw->video_window); } } Index: gstvideowidget.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstvideowidget.h 20 Jun 2002 16:13:21 -0000 1.4 +++ gstvideowidget.h 15 Jan 2003 20:38:28 -0000 1.5 @@ -1,10 +1,34 @@ +/* GStreamer + * Copyright (C) 1999,2000,2001,2002 Erik Walthinsen <om...@cs...> + * 2000,2001,2002 Wim Taymans <wt...@ch...> + * 2002 Steve Baker <st...@st...> + * 2003 Julien Moutte <ju...@mo...> + * + * gstvideowidget.h: Video widget for gst xvideosink window + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + #ifndef __GST_VIDEO_WIDGET_H__ #define __GST_VIDEO_WIDGET_H__ #include <config.h> -#include <gst/gst.h> -#include <gtk/gtkaspectframe.h> +#include <gtk/gtkwidget.h> +#include <gdk/gdkx.h> #define GST_TYPE_VIDEO_WIDGET (gst_video_widget_get_type ()) #define GST_VIDEO_WIDGET(obj) (GTK_CHECK_CAST ((obj), GST_TYPE_VIDEO_WIDGET, GstVideoWidget)) @@ -15,42 +39,63 @@ typedef struct _GstVideoWidget GstVideoWidget; typedef struct _GstVideoWidgetClass GstVideoWidgetClass; - -typedef struct _GstVideoWidgetPrivate GstVideoWidgetPrivate; - struct _GstVideoWidget { - GtkAspectFrame parent; + + GtkWidget parent; - GtkWidget *video_socket; - gint xembed_xid; + GdkWindow *event_window; + GdkWindow *video_window; + + gulong xembed_xid; + gint source_width; gint source_height; + + gboolean cursor_visible; + gboolean event_catcher; + gfloat scale_factor; - gboolean scale; + }; - -#define GST_VIDEO_WIDGET_STATE(play) ((play)->state) -#define GST_VIDEO_WIDGET_MEDIA_TYPE(play) ((play)->flags) -#define GST_VIDEO_WIDGET_IS_AUDIO_TYPE(play) ((play)->flags & GST_VIDEO_WIDGET_TYPE_AUDIO) -#define GST_VIDEO_WIDGET_IS_VIDEO_TYPE(play) ((play)->flags & GST_VIDEO_WIDGET_TYPE_VIDEO) - struct _GstVideoWidgetClass { - GtkAspectFrameClass parent_class; + + GtkWidgetClass parent_class; + }; +GtkType gst_video_widget_get_type (void); -GtkType gst_video_widget_get_type (void); +GtkWidget* gst_video_widget_new (void); -/* setup the player */ -GtkWidget* gst_video_widget_new (void); +/* Set/Get video source size */ -/* set display stuff */ -void gst_video_widget_set_source_size (GstVideoWidget *vw, gint width, gint height); -void gst_video_widget_reset_socket (GstVideoWidget *vw); -void gst_video_widget_set_xembed_xid (GstVideoWidget *vw, gint xid); -gint gst_video_widget_get_source_width (GstVideoWidget *play); -gint gst_video_widget_get_source_height (GstVideoWidget *play); +gboolean gst_video_widget_set_source_size ( GstVideoWidget *vw, + gint width, gint height); +gboolean gst_video_widget_get_source_size ( GstVideoWidget *vw, + gint *width, gint *height); + +/* Set/Get mouse pointer visible or not */ + +gboolean gst_video_widget_set_cursor_visible ( GstVideoWidget *vw, + gboolean visible); +gboolean gst_video_widget_get_cursor_visible (GstVideoWidget *vw); + +/* Set/Get if the widget should catch events over embeded window */ + +gboolean gst_video_widget_set_event_catcher ( GstVideoWidget *vw, + gboolean event_catcher); +gboolean gst_video_widget_get_event_catcher (GstVideoWidget *vw); + +/* Set/Get scale factor used by the widget */ + +gboolean gst_video_widget_set_scale (GstVideoWidget *vw, gfloat scale); +gfloat gst_video_widget_get_scale (GstVideoWidget *vw); + +/* Set/Get the XID of the Xwindow to be embedded */ + +void gst_video_widget_set_xembed_xid (GstVideoWidget *vw, gulong xid); +gulong gst_video_widget_get_xembed_xid (GstVideoWidget *vw); #endif /* __GST_VIDEO_WIDGET_H__ */ |
From: Julien M. <do...@us...> - 2003-01-15 21:01:41
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Jan 15 2003 13:01:40 PST Log message: Update gstmediaplay to use the new GstVideoWidget code Modified files: libs/gst/player : gstmediaplay.c gstmediaplay.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.71&r2=1.72 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.h.diff?r1=1.25&r2=1.26 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.71 retrieving revision 1.72 diff -u -d -r1.71 -r1.72 --- gstmediaplay.c 7 Jan 2003 19:18:05 -0000 1.71 +++ gstmediaplay.c 15 Jan 2003 21:01:28 -0000 1.72 @@ -213,15 +213,14 @@ if (logo_path) g_free(logo_path); - gtk_box_pack_start (GTK_BOX (mplay), GTK_WIDGET (mplay->logo), FALSE, FALSE, 0); - mplay->control = gst_control_new ( gst_media_play_get_glade_xml("mediacontrol.glade", "hbox_controller", NULL), gst_media_play_get_glade_xml("mediacontrol.glade", "window_volume_popup", NULL) ); g_return_if_fail(mplay->control != NULL); gtk_box_pack_start (GTK_BOX (mplay), GTK_WIDGET (mplay->control), FALSE, FALSE, 0); - + gtk_box_pack_start (GTK_BOX (mplay), GTK_WIDGET (mplay->logo), FALSE, FALSE, 0); + mplay->video_widget = gst_video_widget_new (); g_return_if_fail(mplay->video_widget != NULL); gtk_box_pack_start (GTK_BOX (mplay), mplay->video_widget, TRUE, TRUE, 0); @@ -357,13 +356,26 @@ void gst_media_play_set_video_scale (GstMediaPlay *mplay, gfloat scale_factor) { + g_return_if_fail(mplay != NULL); g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); if (mplay->video_widget) { - g_object_set (G_OBJECT (mplay->video_widget), "scale_factor", scale_factor, NULL); + g_object_set ( G_OBJECT (mplay->video_widget), + "scale_factor", scale_factor, NULL); } } void +gst_media_play_set_visible_cursor(GstMediaPlay *mplay, gboolean visible) +{ + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + if (mplay->video_widget) { + g_object_set ( G_OBJECT (mplay->video_widget), + "visible_cursor", visible, NULL); + } + } + +void gst_media_play_show_media_info (GstMediaPlay *mplay) { GtkWidget *media_info; @@ -542,9 +554,10 @@ gtk_container_add (GTK_CONTAINER (mplay->window_fs), mplay->fs_vbox); g_object_ref(mplay->video_widget); - gst_video_widget_reset_socket(GST_VIDEO_WIDGET(mplay->video_widget)); + gtk_widget_unrealize (mplay->video_widget); gtk_container_remove(GTK_CONTAINER(mplay), mplay->video_widget); gtk_box_pack_start (GTK_BOX (mplay->fs_vbox), mplay->video_widget, TRUE, TRUE, 0); + gtk_widget_realize (mplay->video_widget); g_object_unref(mplay->video_widget); gst_play_need_new_video_window(mplay->play); @@ -589,9 +602,10 @@ gtk_widget_hide (GTK_WIDGET (mplay->window_fs)); g_object_ref(mplay->video_widget); - gst_video_widget_reset_socket(GST_VIDEO_WIDGET(mplay->video_widget)); + gtk_widget_unrealize (mplay->video_widget); gtk_container_remove(GTK_CONTAINER(mplay->fs_vbox), mplay->video_widget); gtk_box_pack_start (GTK_BOX (mplay), mplay->video_widget, TRUE, TRUE, 0); + gtk_widget_realize (mplay->video_widget); g_object_unref(mplay->video_widget); gst_play_need_new_video_window(mplay->play); @@ -601,9 +615,9 @@ gtk_box_pack_start (GTK_BOX (mplay), mplay->control, FALSE, FALSE, 0); g_object_unref(mplay->control); - gtk_box_reorder_child(GTK_BOX (mplay), mplay->video_widget, 0); - gtk_box_reorder_child(GTK_BOX (mplay), mplay->control, 1); - + gtk_box_reorder_child(GTK_BOX (mplay), mplay->control, 0); + gtk_box_reorder_child(GTK_BOX (mplay), mplay->video_widget, 1); + gtk_widget_show (mplay->control); gtk_widget_destroy (mplay->control_window_fs); Index: gstmediaplay.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstmediaplay.h 7 Jan 2003 19:18:05 -0000 1.25 +++ gstmediaplay.h 15 Jan 2003 21:01:28 -0000 1.26 @@ -71,6 +71,8 @@ void gst_media_play_set_display_mode (GstMediaPlay *mplay, GstMediaPlayMode display_mode); GstMediaPlayMode gst_media_play_get_display_mode (GstMediaPlay *mplay); +void gst_media_play_set_visible_cursor(GstMediaPlay *mplay, gboolean visible); + void gst_media_play_set_volume (GstMediaPlay *mplay, gdouble value); gdouble gst_media_play_get_volume (GstMediaPlay *mplay); |
From: Julien M. <do...@us...> - 2003-01-15 22:30:04
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Jan 15 2003 14:30:02 PST Log message: Stream end does not show logo anymore until we decide what we want to do Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.72&r2=1.73 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -d -r1.72 -r1.73 --- gstmediaplay.c 15 Jan 2003 21:01:28 -0000 1.72 +++ gstmediaplay.c 15 Jan 2003 22:29:50 -0000 1.73 @@ -756,8 +756,6 @@ gst_media_play_stream_end (GstPlay *play, GstMediaPlay *mplay) { g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - if (mplay->logo) gtk_widget_show(mplay->logo); gst_media_play_set_state (mplay, GST_STATE_READY); } |
From: Julien M. <do...@us...> - 2003-01-16 13:13:34
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Thu Jan 16 2003 05:13:32 PST Log message: Removing some unneeded commented code Modified files: libs/gst/player : gstvideowidget.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.c.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: gstvideowidget.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstvideowidget.c 15 Jan 2003 20:38:28 -0000 1.8 +++ gstvideowidget.c 16 Jan 2003 13:13:20 -0000 1.9 @@ -252,12 +252,7 @@ widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); - - /* Chaining up - - if (GTK_WIDGET_CLASS (parent_class)->realize) - GTK_WIDGET_CLASS (parent_class)->realize (widget);*/ - + } /* Unrealizing GstVideoWidget */ |
From: Julien M. <do...@us...> - 2003-01-16 16:41:21
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Thu Jan 16 2003 08:41:19 PST Log message: New ratio management in GstVideoWidget to handle scale factor override and gtk window resizable Modified files: libs/gst/player : gstvideowidget.c gstvideowidget.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.c.diff?r1=1.9&r2=1.10 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.h.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: gstvideowidget.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstvideowidget.c 16 Jan 2003 13:13:20 -0000 1.9 +++ gstvideowidget.c 16 Jan 2003 16:41:07 -0000 1.10 @@ -175,6 +175,7 @@ vw->source_width = 0; vw->source_height = 0; vw->scale_factor = 1.0; + vw->scale_override = FALSE; vw->cursor_visible = TRUE; vw->event_catcher = TRUE; vw->event_window = NULL; @@ -354,7 +355,7 @@ GstVideoWidget *vw; gfloat width_ratio, height_ratio, temp; guint width, height; - + g_return_if_fail(widget != NULL); g_return_if_fail(GST_IS_VIDEO_WIDGET(widget)); @@ -364,10 +365,15 @@ /* Choosing best ratio */ - width_ratio = (gfloat) allocation->width / (gfloat) vw->source_width; - height_ratio = (gfloat) allocation->height / (gfloat) vw->source_height; + if (vw->scale_override) { + vw->scale_override = FALSE; + } + else { + width_ratio = (gfloat) allocation->width / (gfloat) vw->source_width; + height_ratio = (gfloat) allocation->height / (gfloat) vw->source_height; - vw->scale_factor = MIN (width_ratio, height_ratio); + vw->scale_factor = MIN (width_ratio, height_ratio); + } /* Calculating width & height with optimal ratio */ @@ -628,6 +634,7 @@ g_return_val_if_fail(vw != NULL, FALSE); g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); vw->scale_factor = scale; + vw->scale_override = TRUE; gtk_widget_queue_resize (GTK_WIDGET(vw)); return TRUE; } @@ -664,6 +671,7 @@ switch (prop_id) { case ARG_SCALE_FACTOR: vw->scale_factor = g_value_get_float (value); + vw->scale_override = TRUE; gtk_widget_queue_resize (GTK_WIDGET(vw)); break; case ARG_VISIBLE_CURSOR: Index: gstvideowidget.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstvideowidget.h 15 Jan 2003 20:38:28 -0000 1.5 +++ gstvideowidget.h 16 Jan 2003 16:41:07 -0000 1.6 @@ -54,6 +54,7 @@ gboolean cursor_visible; gboolean event_catcher; + gboolean scale_override; gfloat scale_factor; }; |
From: Julien M. <do...@us...> - 2003-01-21 08:57:14
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Tue Jan 21 2003 00:57:12 PST Log message: GstVideoWidget now handles logo with scaling and stuff :) Waaoooww that's nice ! Try it :) Modified files: libs/gst/player : gstmediaplay.c gstmediaplay.h gstvideowidget.c gstvideowidget.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.77&r2=1.78 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.h.diff?r1=1.28&r2=1.29 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.c.diff?r1=1.11&r2=1.12 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.h.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.77 retrieving revision 1.78 diff -u -d -r1.77 -r1.78 --- gstmediaplay.c 18 Jan 2003 21:58:54 -0000 1.77 +++ gstmediaplay.c 21 Jan 2003 08:56:59 -0000 1.78 @@ -212,31 +212,27 @@ gtk_box_set_spacing (GTK_BOX(mplay), 0); /* player widgets */ - /* logo_path = g_strdup ("/home/dolphy/tmp/gst-player.png"); */ - - logo_path = g_build_path ( G_DIR_SEPARATOR_S, - DATADIR, - "pixmaps", - "gst-player-logo.png",NULL); - - mplay->logo = gtk_image_new_from_file (logo_path); - /*gtk_widget_get_colormap (mplay->logo); - gtk_widget_modify_bg (mplay->logo,GTK_STATE_NORMAL,black_color);*/ - - if (logo_path) g_free(logo_path); - mplay->control = gst_control_new ( gst_media_play_get_glade_xml("mediacontrol.glade", "hbox_controller", NULL), gst_media_play_get_glade_xml("mediacontrol.glade", "window_volume_popup", NULL) ); g_return_if_fail(mplay->control != NULL); gtk_box_pack_start (GTK_BOX (mplay), GTK_WIDGET (mplay->control), FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (mplay), GTK_WIDGET (mplay->logo), TRUE, TRUE, 0); mplay->video_widget = gst_video_widget_new (); - gtk_widget_set_size_request (mplay->video_widget, 200,200); g_return_if_fail(mplay->video_widget != NULL); + logo_path = g_build_path ( G_DIR_SEPARATOR_S, + DATADIR, + "pixmaps", + "gst-player-logo.png",NULL); + + mplay->logo_pixbuf = gdk_pixbuf_new_from_file (logo_path, NULL); + gst_video_widget_set_logo ( GST_VIDEO_WIDGET(mplay->video_widget), + mplay->logo_pixbuf); + + if (logo_path) g_free(logo_path); + mplay->playlist = gtk_playlist_new (); g_return_if_fail(mplay->playlist != NULL); @@ -259,7 +255,7 @@ mplay->display_mode = GST_MEDIA_PLAY_NORMAL; gtk_widget_show (mplay->control); - gtk_widget_show (mplay->logo); + gtk_widget_show (mplay->video_widget); mplay->location = NULL; } @@ -296,8 +292,10 @@ static void gst_media_play_toggle_playlist (GtkWidget *widget, GstMediaPlay *mplay) { - g_message ("playlist"); - gtk_widget_show (mplay->playlist); + if (GTK_WIDGET_VISIBLE(mplay->playlist)) + gtk_widget_hide(mplay->playlist); + else + gtk_widget_show (mplay->playlist); } static void gst_media_play_stop (GtkWidget *widget, GstMediaPlay *mplay) @@ -700,7 +698,6 @@ if (mplay->video_widget) { gtk_widget_show (mplay->video_widget); - if (mplay->logo) gtk_widget_hide (mplay->logo); gst_video_widget_set_xembed_xid(GST_VIDEO_WIDGET(mplay->video_widget), xid); } Index: gstmediaplay.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.h,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gstmediaplay.h 18 Jan 2003 21:58:54 -0000 1.28 +++ gstmediaplay.h 21 Jan 2003 08:56:59 -0000 1.29 @@ -25,19 +25,14 @@ GstPlay *play; - GtkWindow *window_fs; + GtkWidget *video_widget; - GtkWidget *fs_vbox; - GtkWidget *control_window_fs; - GtkWidget *control_vbox; GtkWidget *control; GtkWidget *statusarea; - /* Added by dolphy : logo */ - - GtkWidget *logo; + GdkPixbuf *logo_pixbuf; GtkWidget *playlist; const gchar *location; Index: gstvideowidget.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstvideowidget.c 17 Jan 2003 18:32:45 -0000 1.11 +++ gstvideowidget.c 21 Jan 2003 08:56:59 -0000 1.12 @@ -59,6 +59,7 @@ ARG_XID, ARG_SOURCE_WIDTH, ARG_SOURCE_HEIGHT, + ARG_LOGO, }; static GtkWidgetClass *parent_class = NULL; @@ -155,7 +156,16 @@ "video source height", "Video playback source height", 0, G_MAXINT, 1, G_PARAM_READWRITE)); - + + g_object_class_install_property ( + gobject_class, + ARG_LOGO, + g_param_spec_object ( + "logo", + "Logo", + "Picture that should appear as a logo when no video", + gdk_pixbuf_get_type (), G_PARAM_READWRITE)); + widget_class->realize = gst_video_widget_realize; widget_class->unrealize = gst_video_widget_unrealize; widget_class->expose_event = gst_video_widget_expose; @@ -180,6 +190,7 @@ vw->event_catcher = TRUE; vw->event_window = NULL; vw->video_window = NULL; + vw->logo_pixbuf = NULL; } /** @@ -253,7 +264,7 @@ widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); - + } /* Unrealizing GstVideoWidget */ @@ -302,12 +313,82 @@ static gint gst_video_widget_expose(GtkWidget *widget, GdkEventExpose *event) { - g_return_val_if_fail (event != NULL, FALSE); + GstVideoWidget *vw; + + g_return_val_if_fail(widget != NULL, FALSE); + g_return_val_if_fail(GST_IS_VIDEO_WIDGET(widget), FALSE); + g_return_val_if_fail(event != NULL, FALSE); + + vw = GST_VIDEO_WIDGET (widget); if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) { - gdk_draw_rectangle (widget->window, widget->style->black_gc, TRUE, + + if ( (!vw->video_window) && (vw->logo_pixbuf) ) { + GdkPixbuf *frame; + guchar *pixels; + int rowstride; + gint width, height, alloc_width, alloc_height, logo_x, logo_y; + gfloat width_ratio, height_ratio; + + frame = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + FALSE, 8, widget->allocation.width, + widget->allocation.height); + + width = gdk_pixbuf_get_width (vw->logo_pixbuf); + height = gdk_pixbuf_get_height (vw->logo_pixbuf); + alloc_width = widget->allocation.width; + alloc_height = widget->allocation.height; + + /* Checking if allocated space is smaller than our logo */ + + if ( (alloc_width < width) || (alloc_height < height) ) { + width_ratio = (gfloat) alloc_width / (gfloat) width; + height_ratio = (gfloat) alloc_height / (gfloat) height; + width_ratio = MIN(width_ratio, height_ratio); + height_ratio = width_ratio; + } + else + width_ratio = height_ratio = 1.0; + + logo_x = (alloc_width / 2) - ( width * width_ratio / 2); + logo_y = (alloc_height / 2) - ( height * height_ratio / 2); + + /* Scaling to available space */ + + gdk_pixbuf_composite ( + vw->logo_pixbuf, + frame, + 0, 0, + alloc_width, alloc_height, + logo_x, logo_y, + width_ratio, height_ratio, + GDK_INTERP_BILINEAR, + 255); + + /* Drawing our frame */ + + rowstride = gdk_pixbuf_get_rowstride (frame); + + pixels = gdk_pixbuf_get_pixels (frame) + + rowstride * event->area.y + event->area.x * 3; + + gdk_draw_rgb_image_dithalign ( + widget->window, widget->style->black_gc, + event->area.x, event->area.y, + event->area.width, event->area.height, + GDK_RGB_DITHER_NORMAL, + pixels, rowstride, + event->area.x, event->area.y); + + g_object_unref (frame); + } + else { + gdk_draw_rectangle ( + widget->window, widget->style->black_gc, TRUE, event->area.x, event->area.y, event->area.width, event->area.height); + } + } return FALSE; @@ -321,30 +402,40 @@ GstVideoWidget *vw; gint width, height; gfloat temp; - + g_return_if_fail(widget != NULL); g_return_if_fail(GST_IS_VIDEO_WIDGET(widget)); vw = GST_VIDEO_WIDGET (widget); - temp = (vw->scale_factor * vw->source_width + 0.5); - width = (gint) temp > G_MAXINT ? G_MAXINT : (gint) temp; - temp = (vw->scale_factor * vw->source_height + 0.5); - height = (gint) temp > G_MAXINT ? G_MAXINT : (gint) temp; + if ( (vw->source_width) && (vw->source_height) && (vw->scale_factor) ) { + temp = (vw->scale_factor * vw->source_width + 0.5); + width = (gint) temp > G_MAXINT ? G_MAXINT : (gint) temp; + temp = (vw->scale_factor * vw->source_height + 0.5); + height = (gint) temp > G_MAXINT ? G_MAXINT : (gint) temp; - /* don't make us want to be bigger than the screen */ + /* don't make us want to be bigger than the screen */ - if (width > gdk_screen_width()) { - height = height * gdk_screen_width() / width; - width = gdk_screen_width(); + if (width > gdk_screen_width()) { + height = height * gdk_screen_width() / width; + width = gdk_screen_width(); + } + if (height > gdk_screen_height()) { + width = width * gdk_screen_height() / height; + height = gdk_screen_height(); + } } - if (height > gdk_screen_height()) { - width = width * gdk_screen_height() / height; - height = gdk_screen_height(); + else { + if (vw->logo_pixbuf) { + width = gdk_pixbuf_get_width(vw->logo_pixbuf); + height = gdk_pixbuf_get_height(vw->logo_pixbuf); + } + else { + width = 100; + height = 100; + } } - /*g_message ("requesting %d %d", width, height);*/ - requisition->width = width; requisition->height = height; } @@ -362,26 +453,28 @@ g_return_if_fail(GST_IS_VIDEO_WIDGET(widget)); vw = GST_VIDEO_WIDGET (widget); - + widget->allocation = *allocation; - /*g_message ("i requested %d %d got %d %d my scale %f", - widget->requisition.width, - widget->requisition.height, - widget->allocation.width, - widget->allocation.height, - vw->scale_factor);*/ - /* Choosing best ratio */ if (vw->scale_override) { vw->scale_override = FALSE; } else { - width_ratio = (gfloat) allocation->width / (gfloat) vw->source_width; - height_ratio = (gfloat) allocation->height / (gfloat) vw->source_height; + + /* Ratio get impacted only if video window loaded */ + if ( (vw->source_width) && + (vw->source_height) && + (GDK_IS_WINDOW(vw->video_window)) ) + { + width_ratio = (gfloat) allocation->width / + (gfloat) vw->source_width; + height_ratio = (gfloat) allocation->height / + (gfloat) vw->source_height; - vw->scale_factor = MIN (width_ratio, height_ratio); + vw->scale_factor = MIN (width_ratio, height_ratio); + } } /* Calculating width & height with optimal ratio */ @@ -412,7 +505,6 @@ (allocation->height - height) / 2, width, height); - } } @@ -666,6 +758,46 @@ return vw->scale_factor; } +/** + * gst_video_widget_set_logo: + * @vw: a #GstVideoWidget. + * @logo: a #GdkPixbuf to set as the image for the logo. + * + * Sets the image of @vw to the given @logo pixbuf. + * + * Warning @logo should not be freed after this call unless you destroyed + * widget. Indeed no copy is done. We use your #GdkPixbuf ! + **/ +void +gst_video_widget_set_logo (GstVideoWidget *vw, GdkPixbuf *logo_pixbuf) +{ + g_return_if_fail (vw != NULL); + g_return_if_fail (GST_IS_VIDEO_WIDGET(vw)); + + if (logo_pixbuf == vw->logo_pixbuf) + return; + + if (vw->logo_pixbuf) + g_object_unref (vw->logo_pixbuf); + + vw->logo_pixbuf = logo_pixbuf; +} + +/** + * gst_video_widget_get_logo: + * @vw: a #GstVideoWidget. + * @returns: the #GdkPixbuf set as logo of @vw. + * + * Gets the logo of @vw. + **/ +GdkPixbuf* +gst_video_widget_get_logo (GstVideoWidget *vw) +{ + g_return_if_fail (vw != NULL); + g_return_if_fail (GST_IS_VIDEO_WIDGET(vw)); + return vw->logo_pixbuf; +} + /* GstVideoWidget methods to set properties */ static void @@ -700,6 +832,15 @@ case ARG_SOURCE_HEIGHT: vw->source_height = g_value_get_int (value); break; + case ARG_LOGO: + { + GdkPixbuf *image; + + image = (GdkPixbuf*) g_value_get_object (value); + + gst_video_widget_set_logo (vw, image); + } + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -736,6 +877,10 @@ case ARG_SOURCE_HEIGHT: g_value_set_int (value, vw->source_height); break; + case ARG_LOGO: + g_value_set_object (value, + (GObject*) vw->logo_pixbuf); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -751,7 +896,6 @@ g_return_if_fail(vw != NULL); g_return_if_fail(GST_IS_VIDEO_WIDGET(vw)); - g_return_if_fail(GDK_IS_WINDOW(vw->video_window)); widget = GTK_WIDGET (vw); Index: gstvideowidget.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstvideowidget.h 16 Jan 2003 16:41:07 -0000 1.6 +++ gstvideowidget.h 21 Jan 2003 08:57:00 -0000 1.7 @@ -29,6 +29,7 @@ #include <gtk/gtkwidget.h> #include <gdk/gdkx.h> +#include <gdk-pixbuf/gdk-pixbuf.h> #define GST_TYPE_VIDEO_WIDGET (gst_video_widget_get_type ()) #define GST_VIDEO_WIDGET(obj) (GTK_CHECK_CAST ((obj), GST_TYPE_VIDEO_WIDGET, GstVideoWidget)) @@ -46,6 +47,8 @@ GdkWindow *event_window; GdkWindow *video_window; + GdkPixbuf *logo_pixbuf; + gulong xembed_xid; gint source_width; @@ -98,5 +101,10 @@ void gst_video_widget_set_xembed_xid (GstVideoWidget *vw, gulong xid); gulong gst_video_widget_get_xembed_xid (GstVideoWidget *vw); + +/* Set/Get the GdkPixbuf used for logo display */ + +void gst_video_widget_set_logo (GstVideoWidget *vw, GdkPixbuf *logo_pixbuf); +GdkPixbuf* gst_video_widget_get_logo (GstVideoWidget *vw); #endif /* __GST_VIDEO_WIDGET_H__ */ |
From: Julien M. <do...@us...> - 2003-01-21 17:07:54
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Tue Jan 21 2003 09:07:52 PST Log message: Fixed bug : when no media location loaded play button does not try to set state to play causing a gnomevfs error Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.80&r2=1.81 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- gstmediaplay.c 21 Jan 2003 16:45:21 -0000 1.80 +++ gstmediaplay.c 21 Jan 2003 17:07:37 -0000 1.81 @@ -275,6 +275,7 @@ gst_media_play_set_state (GstMediaPlay *mplay, GstElementState state) { g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + g_return_if_fail(mplay->location != NULL); gst_play_set_state (mplay->play, state); } |
From: Julien M. <do...@us...> - 2003-01-22 11:01:28
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Jan 22 2003 03:01:27 PST Log message: On my way to make gst-player ready for a release - Major code cleanup in gstmediaplay.c - First steps of the playlist integration - Glade files modified Modified files: libs/gst/player : gstcontrol.c gstcontrol.h gstmediaplay.c gstmediaplay.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstcontrol.c.diff?r1=1.33&r2=1.34 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstcontrol.h.diff?r1=1.14&r2=1.15 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.81&r2=1.82 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.h.diff?r1=1.29&r2=1.30 ====Begin Diffs==== Index: gstcontrol.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstcontrol.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gstcontrol.c 18 Jan 2003 21:58:54 -0000 1.33 +++ gstcontrol.c 22 Jan 2003 11:00:28 -0000 1.34 @@ -19,6 +19,8 @@ enum { TOGGLE_PLAY, TOGGLE_PLAYLIST, + NEXT, + PREVIOUS, STOP, VOLUME_CHANGE, SEEK_CHANGE, @@ -124,6 +126,22 @@ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + gst_control_signals [NEXT] = + g_signal_new ("clicked_next", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GstControlClass, next), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + gst_control_signals [PREVIOUS] = + g_signal_new ("clicked_previous", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GstControlClass, previous), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); gst_control_signals [STOP] = g_signal_new ("stop", G_TYPE_FROM_CLASS (gobject_class), @@ -488,6 +506,14 @@ } if (widget == glade_xml_get_widget(priv->xml, "button_playlist")){ g_signal_emit (control, gst_control_signals [TOGGLE_PLAYLIST], 0); + return; + } + if (widget == glade_xml_get_widget(priv->xml, "button_next")){ + g_signal_emit (control, gst_control_signals [NEXT], 0); + return; + } + if (widget == glade_xml_get_widget(priv->xml, "button_previous")){ + g_signal_emit (control, gst_control_signals [PREVIOUS], 0); return; } if (widget == glade_xml_get_widget(priv->xml, "button_volume")){ Index: gstcontrol.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstcontrol.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstcontrol.h 18 Jan 2003 21:58:54 -0000 1.14 +++ gstcontrol.h 22 Jan 2003 11:00:31 -0000 1.15 @@ -28,11 +28,13 @@ { GtkVBoxClass parent_class; - void (*toggle_play) (GstControl *control); - void (*toggle_playlist) (GstControl *control); - void (*stop) (GstControl *control); - void (*volume_change) (GstControl *control); - void (*seek_change) (GstControl *control); + void (*toggle_play) (GstControl *control); + void (*toggle_playlist) (GstControl *control); + void (*next) (GstControl *control); + void (*previous) (GstControl *control); + void (*stop) (GstControl *control); + void (*volume_change) (GstControl *control); + void (*seek_change) (GstControl *control); void (*display_mode_change) (GstControl *control, GstMediaPlayMode display_mode); }; Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.81 retrieving revision 1.82 diff -u -d -r1.81 -r1.82 --- gstmediaplay.c 21 Jan 2003 17:07:37 -0000 1.81 +++ gstmediaplay.c 22 Jan 2003 11:00:33 -0000 1.82 @@ -16,67 +16,65 @@ #include "gstplayer-marshal.h" #include "gtk-playlist.h" -static void gst_media_play_class_init (GstMediaPlayClass *klass); -static void gst_media_play_init (GstMediaPlay *play); - -/* signal handlers for GstControl */ -static void gst_media_play_slider_changed (GtkAdjustment *adj, GstMediaPlay *mplay); -static void gst_media_play_toggle_mute (GtkWidget *widget, GstMediaPlay *mplay); -static void gst_media_play_seek_to_pos (GtkWidget *widget, gdouble value, GstMediaPlay *mplay); -static void gst_media_play_pause (GtkWidget *widget, GstMediaPlay *mplay); [...1031 lines suppressed...] + } + else { + media_info = gst_media_info_new ("no file loaded"); + } + + gtk_widget_show (media_info); +} + +void +gst_media_play_show_preferences (GstMediaPlay *mplay) +{ + GtkWidget *preferences; + + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + preferences = gst_preferences_new (); - return TRUE; + gtk_widget_show (preferences); } Index: gstmediaplay.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.h,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstmediaplay.h 21 Jan 2003 08:56:59 -0000 1.29 +++ gstmediaplay.h 22 Jan 2003 11:00:39 -0000 1.30 @@ -3,6 +3,7 @@ #include <gst/play/play.h> + typedef enum { GST_MEDIA_PLAY_NORMAL, GST_MEDIA_PLAY_NOCONTROL, @@ -67,8 +68,6 @@ void gst_media_play_set_display_mode (GstMediaPlay *mplay, GstMediaPlayMode display_mode); GstMediaPlayMode gst_media_play_get_display_mode (GstMediaPlay *mplay); -void gst_media_play_set_visible_cursor(GstMediaPlay *mplay, gboolean visible); - void gst_media_play_set_volume (GstMediaPlay *mplay, gdouble value); gdouble gst_media_play_get_volume (GstMediaPlay *mplay); @@ -78,7 +77,7 @@ void gst_media_play_set_location (GstMediaPlay *mplay, const gchar *location); const gchar* gst_media_play_get_location (GstMediaPlay *mplay); -int gst_media_play_handle_keypress (GtkWidget *widget, GdkEventKey *event, +gint gst_media_play_handle_keypress (GtkWidget *widget, GdkEventKey *event, GstMediaPlay *mplay); gboolean gst_media_gconf_get_boolean (const gchar *key, gboolean *value); |
From: Julien M. <do...@us...> - 2003-01-22 15:30:23
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Jan 22 2003 07:30:19 PST Log message: Big code cleanup one more time new gtk-playlist from hadess fixing a bug when loading some oggs Modified files: libs/gst/player : gstmediaplay.c gstmediaplay.h gtk-playlist.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.82&r2=1.83 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.h.diff?r1=1.30&r2=1.31 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gtk-playlist.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.82 retrieving revision 1.83 diff -u -d -r1.82 -r1.83 --- gstmediaplay.c 22 Jan 2003 11:00:33 -0000 1.82 +++ gstmediaplay.c 22 Jan 2003 15:29:56 -0000 1.83 @@ -1,4 +1,26 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* GStreamer + * Copyright (C) 1999,2000,2001,2002 Erik Walthinsen <om...@cs...> + * 2000,2001,2002 Wim Taymans <wt...@ch...> + * 2002 Steve Baker <st...@st...> + * 2003 Julien Moutte <ju...@mo...> + * + * gstmediaplay.c: Media Player widget for Gst-Player + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ #include <locale.h> #include <config.h> @@ -16,104 +38,329 @@ #include "gstplayer-marshal.h" #include "gtk-playlist.h" -static void gst_media_play_class_init (GstMediaPlayClass *klass); -static void gst_media_play_init (GstMediaPlay *play); +static GObject *parent_class = NULL; -/* Play/Pause, Stop, Next, Previous, Mute */ +enum { + STATE_CHANGE, + DISPLAY_MODE_CHANGE, + CURRENT_LOCATION, + LAST_SIGNAL +}; -static void gst_media_play_toggle_play_pause ( GtkWidget *widget, - GstMediaPlay *mplay); -static void gst_media_play_stop ( GtkWidget *widget, - GstMediaPlay *mplay); -static void gst_media_play_next ( GtkWidget *widget, - GstMediaPlay *mplay); -static void gst_media_play_previous ( GtkWidget *widget, - GstMediaPlay *mplay); -static void gst_media_play_toggle_mute ( GtkWidget *widget, - GstMediaPlay *mplay); +static gint gst_media_play_signals [LAST_SIGNAL] = { 0 }; -/* Event handlers, callbacks */ -static gint gst_media_play_motion_notify_callback ( GtkWidget *widget, - GdkEventMotion *event, - GstMediaPlay *mplay); -static void gst_media_play_have_video_size ( GstPlay *play, - gint width, gint height, - GstMediaPlay *mplay); -static void gst_media_play_have_xid ( GstPlay *play, - gint xid, - GstMediaPlay *mplay); -static void gst_media_play_got_length ( GstPlay *play, - gint64 length_nanos, - GstMediaPlay *mplay); -static void gst_media_play_time_tick ( GstPlay *play, - gint64 time_nanos, - GstMediaPlay *mplay); -static void gst_media_play_volume_changed ( GtkWidget *widget, - gdouble value, - GstMediaPlay *mplay); -static void gst_media_play_seek_to_pos ( GtkWidget *widget, - gdouble value, - GstMediaPlay *mplay); -static void gst_media_play_state_change ( GstPlay *play, - GstElementState old_state, - GstElementState new_state, - GstMediaPlay *mplay); -static void gst_media_play_stream_end ( GstPlay *play, - GstMediaPlay *mplay); +/* ============================================================= */ +/* */ +/* Private Methods */ +/* */ +/* ============================================================= */ -/* GFX Stuff */ +/* =========================================== */ +/* */ +/* Tool Box */ +/* */ +/* =========================================== */ -static void gst_media_play_toggle_playlist ( GtkWidget *widget, - GstMediaPlay *mplay); +static gchar* +gst_media_play_get_ui_file (const gchar *fname) +{ + gchar *full_fname; + + /* Searching for glade file in uninstalled dir */ + + full_fname = g_strjoin("/", GLADEUI_UNINSTALLED_DIR, fname, NULL); + if ( g_file_test(full_fname, G_FILE_TEST_IS_REGULAR) ) + return full_fname; + + if (full_fname) g_free(full_fname); + + /* Searching for glade file in installed dir */ + + full_fname = g_strjoin("/", GLADEUI_DIR, fname, NULL); + if ( g_file_test(full_fname, G_FILE_TEST_IS_REGULAR) ) + return full_fname; + + /* Not found */ + + if (full_fname) g_free(full_fname); + + return NULL; +} -/* Tools */ +static GladeXML* +gst_media_play_get_glade_xml_from_file ( const gchar *fname, + const gchar *root, + const gchar *domain) +{ + return glade_xml_new(fname, root, domain); +} -static void gst_media_error_dialog ( const gchar *message); -GladeXML* gst_media_play_get_glade_xml ( const gchar *fname, - const gchar *root, - const gchar *domain); -gchar* gst_media_play_get_ui_file ( const gchar *fname); +static GladeXML* +gst_media_play_get_glade_xml ( const gchar *fname, + const gchar *root, + const gchar *domain) +{ + gchar *full_fname = NULL; + GladeXML *xml = NULL; + full_fname = gst_media_play_get_ui_file (fname); + g_return_val_if_fail(full_fname != NULL, NULL); + xml = gst_media_play_get_glade_xml_from_file (full_fname, root, domain); + if (full_fname) g_free (full_fname); + return xml; +} +static void +gst_media_error_dialog (const gchar *message) +{ + GtkWidget *dialog; + /* throw up a dialog box; FIXME: we don't have a parent */ + /* FIXME: maybe even fallback the GError and do error + * handling higher up ? */ + dialog = gtk_message_dialog_new (NULL, 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + message); + gtk_dialog_run (GTK_DIALOG (dialog)); + /* + gtk_widget_show (dialog); + g_signal_connect_swapped (GTK_OBJECT (dialog), "response", + G_CALLBACK (gtk_widget_destroy), + GTK_OBJECT (dialog)); + */ +} -static GObject *parent_class = NULL; +/* =========================================== */ +/* */ +/* GFX stuff */ +/* */ +/* =========================================== */ -enum { - STATE_CHANGE, - DISPLAY_MODE_CHANGE, - CURRENT_LOCATION, - LAST_SIGNAL -}; +static void +gst_media_play_toggle_playlist ( GtkWidget *widget, + GstMediaPlay *mplay) +{ + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + if (GTK_WIDGET_VISIBLE(mplay->playlist)) + gtk_widget_hide(mplay->playlist); + else + gtk_widget_show (mplay->playlist); +} -GType -gst_media_play_get_type (void) + +static gboolean +hide_control_window (GstMediaPlay *mplay) { - static GType play_type = 0; + g_return_val_if_fail(mplay != NULL, FALSE); + g_return_val_if_fail(GST_IS_MEDIA_PLAY(mplay), FALSE); + + if (mplay->control) + gtk_widget_hide (GTK_WIDGET(mplay->control)); + + return FALSE; +} + +static gboolean +gst_media_play_hide_mouse_cursor (GstMediaPlay *mplay) +{ + g_return_val_if_fail(mplay != NULL, FALSE); + g_return_val_if_fail(GST_IS_MEDIA_PLAY(mplay), FALSE); + + gst_video_widget_set_cursor_visible ( + GST_VIDEO_WIDGET(mplay->video_widget), FALSE); + return FALSE; +} + +static void +gst_media_play_set_fullscreen ( GstMediaPlay *mplay, + gboolean fullscreen) +{ + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - if (!play_type) - { - static const GTypeInfo style_info = - { - sizeof (GstMediaPlayClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) gst_media_play_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GstMediaPlay), - 0, /* n_preallocs */ - (GInstanceInitFunc) gst_media_play_init, - }; + if (fullscreen){ + gst_video_widget_set_cursor_visible ( + GST_VIDEO_WIDGET(mplay->video_widget), FALSE); - play_type = g_type_register_static (GTK_TYPE_VBOX, - "GstMediaPlay", - &style_info, 0); + /* Hide the control panel offscreen */ + mplay->move_id = g_timeout_add ( 1000, + (GSourceFunc) hide_control_window, + mplay); + } + else { + if (mplay->move_id) { + g_source_remove (mplay->move_id); + mplay->move_id = 0; + } + + gtk_widget_show (GTK_WIDGET(mplay->control)); } +} + +/* =========================================== */ +/* */ +/* Event Handlers, Callbacks */ +/* */ +/* =========================================== */ + +static gint +gst_media_play_motion_notify_callback ( GtkWidget *widget, + GdkEventMotion *event, + GstMediaPlay *mplay) +{ + gint pointer_x, pointer_y; + GdkModifierType state; + static mouse_hide_timer; - return play_type; + if (mouse_hide_timer) + g_source_remove (mouse_hide_timer); + + gst_video_widget_set_cursor_visible (GST_VIDEO_WIDGET(widget), TRUE); + + if (mplay->display_mode == GST_MEDIA_PLAY_FULLSCREEN) + gtk_widget_show (GTK_WIDGET(mplay->control)); + + gdk_window_get_pointer (widget->window, &pointer_x, &pointer_y, &state); + + mouse_hide_timer = g_timeout_add ( + 3000, + (GSourceFunc) gst_media_play_hide_mouse_cursor, + mplay); + + return TRUE; } -static gint gst_media_play_signals [LAST_SIGNAL] = { 0 }; +static void +gst_media_play_have_video_size ( GstPlay *play, + gint width, gint height, + GstMediaPlay *mplay) +{ + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + if (mplay->video_widget) + gst_video_widget_set_source_size( + GST_VIDEO_WIDGET(mplay->video_widget), + width, height); +} + +static void +gst_media_play_have_xid ( GstPlay *play, + gint xid, + GstMediaPlay *mplay) +{ + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + if (mplay->video_widget) + gst_video_widget_set_xembed_xid( + GST_VIDEO_WIDGET(mplay->video_widget), + xid); +} + +static void +gst_media_play_got_length ( GstPlay *play, + gint64 length_nanos, + GstMediaPlay *mplay) +{ + gint seconds; + + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + seconds = (gint) (length_nanos / GST_SECOND); + mplay->length_nanos = length_nanos; + gst_control_set_enable_seek (GST_CONTROL (mplay->control), TRUE); + gst_control_set_length (GST_CONTROL (mplay->control), length_nanos); +} + +static void +gst_media_play_time_tick ( GstPlay *play, + gint64 time_nanos, + GstMediaPlay *mplay) +{ + gdouble seek_pos; + gint seconds; + + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + seek_pos = ((gdouble) time_nanos) / ((gdouble) mplay->length_nanos); + seconds = (gint) (time_nanos / GST_SECOND); + gst_control_set_seek_pos (mplay->control, seek_pos); + gst_control_set_time (GST_CONTROL (mplay->control), time_nanos); +} + +static void +gst_media_play_volume_changed ( GtkWidget *widget, + gdouble value, + GstMediaPlay *mplay) +{ + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + gst_play_set_volume (mplay->play, value); +} + +static void +gst_media_play_seek_to_pos ( GtkWidget *widget, + gdouble value, + GstMediaPlay *mplay) +{ + gdouble length_nanos; + gint64 seek_time; + + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + length_nanos = (gdouble)mplay->length_nanos; + seek_time = (gint64)(length_nanos * value); + gst_play_seek_to_time (mplay->play, seek_time); +} + +static void +gst_media_play_state_change ( GstPlay *play, + GstElementState old_state, + GstElementState new_state, + GstMediaPlay *mplay) +{ + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + gst_control_set_state (GST_CONTROL (mplay->control), old_state, new_state); +} + +static void +gst_media_play_stream_end ( GstPlay *play, + GstMediaPlay *mplay) +{ + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + gst_media_play_set_state (mplay, GST_STATE_READY); + + if (!gtk_playlist_has_next_mrl (GTK_PLAYLIST(mplay->playlist))) { + gchar *mrl; + + gtk_playlist_set_at_start (GTK_PLAYLIST(mplay->playlist)); + gst_media_play_set_location ( + mplay, + gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); + + } + else { + gtk_playlist_set_next (GTK_PLAYLIST(mplay->playlist)); + gst_media_play_set_location ( + mplay, + gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); + gst_media_play_set_state (mplay, GST_STATE_PLAYING); + } +} + +/* =========================================== */ +/* */ +/* Init & Class init */ +/* */ +/* =========================================== */ static void gst_media_play_class_init (GstMediaPlayClass *klass) @@ -267,19 +514,19 @@ mplay->location = NULL; } -GstMediaPlay* -gst_media_play_new (void) -{ - return GST_MEDIA_PLAY (g_object_new (GST_TYPE_MEDIA_PLAY, NULL)); -} - /* ============================================================= */ /* */ -/* Play/Pause, Stop, Next, Previous */ +/* Public Methods */ /* */ /* ============================================================= */ -static void +/* =========================================== */ +/* */ +/* Play/Pause, Stop, Next, Previous, Mute */ +/* */ +/* =========================================== */ + +void gst_media_play_toggle_play_pause ( GtkWidget *widget, GstMediaPlay *mplay) { @@ -303,7 +550,7 @@ } } -static void +void gst_media_play_stop ( GtkWidget *widget, GstMediaPlay *mplay) { @@ -312,7 +559,7 @@ gst_media_play_set_state (mplay, GST_STATE_READY); } -static void +void gst_media_play_next ( GtkWidget *widget, GstMediaPlay *mplay) { @@ -340,7 +587,7 @@ gst_media_play_set_state (mplay, GST_STATE_PLAYING); } -static void +void gst_media_play_previous ( GtkWidget *widget, GstMediaPlay *mplay) { @@ -368,7 +615,7 @@ gst_media_play_set_state (mplay, GST_STATE_PLAYING); } -static void +void gst_media_play_toggle_mute ( GtkWidget *widget, GstMediaPlay *mplay) { @@ -382,25 +629,11 @@ gst_control_set_mute(GST_CONTROL(mplay->control), muted); } - -/* ============================================================= */ -/* */ -/* GFX stuff */ -/* */ -/* ============================================================= */ - -static void -gst_media_play_toggle_playlist ( GtkWidget *widget, - GstMediaPlay *mplay) -{ - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - if (GTK_WIDGET_VISIBLE(mplay->playlist)) - gtk_widget_hide(mplay->playlist); - else - gtk_widget_show (mplay->playlist); -} +/* =========================================== */ +/* */ +/* GFX stuff */ +/* */ +/* =========================================== */ void gst_media_play_show_about (GstMediaPlay *mplay) @@ -442,263 +675,6 @@ gtk_widget_show (about); } -static gboolean -hide_control_window (GstMediaPlay *mplay) -{ - g_return_val_if_fail(mplay != NULL, FALSE); - g_return_val_if_fail(GST_IS_MEDIA_PLAY(mplay), FALSE); - - if (mplay->control) - gtk_widget_hide (GTK_WIDGET(mplay->control)); - - return FALSE; -} - -static gboolean -gst_media_play_hide_mouse_cursor (GstMediaPlay *mplay) -{ - g_return_val_if_fail(mplay != NULL, FALSE); - g_return_val_if_fail(GST_IS_MEDIA_PLAY(mplay), FALSE); - - gst_video_widget_set_cursor_visible ( - GST_VIDEO_WIDGET(mplay->video_widget), FALSE); - return FALSE; -} - -void -gst_media_play_set_fullscreen ( GstMediaPlay *mplay, - gboolean fullscreen) -{ - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - if (fullscreen){ - gst_video_widget_set_cursor_visible ( - GST_VIDEO_WIDGET(mplay->video_widget), FALSE); - - /* Hide the control panel offscreen */ - mplay->move_id = g_timeout_add ( 1000, - (GSourceFunc) hide_control_window, - mplay); - } - else { - if (mplay->move_id) { - g_source_remove (mplay->move_id); - mplay->move_id = 0; - } - - gtk_widget_show (GTK_WIDGET(mplay->control)); - } -} - -/* ============================================================= */ -/* */ -/* Event Handlers, Callbacks */ -/* */ -/* ============================================================= */ - -static gint -gst_media_play_motion_notify_callback ( GtkWidget *widget, - GdkEventMotion *event, - GstMediaPlay *mplay) -{ - gint pointer_x, pointer_y; - GdkModifierType state; - static mouse_hide_timer; - - if (mouse_hide_timer) - g_source_remove (mouse_hide_timer); - - gst_video_widget_set_cursor_visible (GST_VIDEO_WIDGET(widget), TRUE); - - if (mplay->display_mode == GST_MEDIA_PLAY_FULLSCREEN) - gtk_widget_show (GTK_WIDGET(mplay->control)); - - gdk_window_get_pointer (widget->window, &pointer_x, &pointer_y, &state); - - mouse_hide_timer = g_timeout_add ( - 3000, - (GSourceFunc) gst_media_play_hide_mouse_cursor, - mplay); - - return TRUE; -} - -gint -gst_media_play_handle_keypress ( GtkWidget *widget, - GdkEventKey *event, - GstMediaPlay *mplay) -{ - guint state; - gboolean handled = FALSE; - - g_return_val_if_fail (GST_IS_MEDIA_PLAY (mplay), 0); - - state = event->state; - - switch (event->keyval) { - case GDK_Up: - gst_media_play_set_volume (mplay, - gst_media_play_get_volume (mplay) + 0.1); - handled = TRUE; - break; - case GDK_Down: - gst_media_play_set_volume (mplay, - gst_media_play_get_volume (mplay) - 0.1); - handled = TRUE; - break; - case GDK_space: - case GDK_p: - if (gst_media_play_get_state (mplay) == GST_STATE_PLAYING) { - gst_media_play_set_state (mplay, GST_STATE_PAUSED); - } - else { - gst_media_play_set_state (mplay, GST_STATE_PLAYING); - } - handled = TRUE; - break; - case GDK_Return: - case GDK_Escape: - if (mplay->display_mode == GST_MEDIA_PLAY_FULLSCREEN){ - gst_media_play_set_display_mode (mplay, GST_MEDIA_PLAY_NORMAL); - } - handled = TRUE; - break; - } - - return handled; -} - -static void -gst_media_play_have_video_size ( GstPlay *play, - gint width, gint height, - GstMediaPlay *mplay) -{ - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - if (mplay->video_widget) - gst_video_widget_set_source_size( - GST_VIDEO_WIDGET(mplay->video_widget), - width, height); -} - -static void -gst_media_play_have_xid ( GstPlay *play, - gint xid, - GstMediaPlay *mplay) -{ - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - if (mplay->video_widget) - gst_video_widget_set_xembed_xid( - GST_VIDEO_WIDGET(mplay->video_widget), - xid); -} - -static void -gst_media_play_got_length ( GstPlay *play, - gint64 length_nanos, - GstMediaPlay *mplay) -{ - gint seconds; - - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - seconds = (gint) (length_nanos / GST_SECOND); - mplay->length_nanos = length_nanos; - gst_control_set_enable_seek (GST_CONTROL (mplay->control), TRUE); - gst_control_set_length (GST_CONTROL (mplay->control), length_nanos); -} - -static void -gst_media_play_time_tick ( GstPlay *play, - gint64 time_nanos, - GstMediaPlay *mplay) -{ - gdouble seek_pos; - gint seconds; - - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - seek_pos = ((gdouble) time_nanos) / ((gdouble) mplay->length_nanos); - seconds = (gint) (time_nanos / GST_SECOND); - gst_control_set_seek_pos (mplay->control, seek_pos); - gst_control_set_time (GST_CONTROL (mplay->control), time_nanos); -} - -static void -gst_media_play_volume_changed ( GtkWidget *widget, - gdouble value, - GstMediaPlay *mplay) -{ - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - gst_play_set_volume (mplay->play, value); -} - -static void -gst_media_play_seek_to_pos ( GtkWidget *widget, - gdouble value, - GstMediaPlay *mplay) -{ - gdouble length_nanos; - gint64 seek_time; - - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - length_nanos = (gdouble)mplay->length_nanos; - seek_time = (gint64)(length_nanos * value); - gst_play_seek_to_time (mplay->play, seek_time); -} - -static void -gst_media_play_state_change ( GstPlay *play, - GstElementState old_state, - GstElementState new_state, - GstMediaPlay *mplay) -{ - g_return_if_fail(mplay != NULL); - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - gst_control_set_state (GST_CONTROL (mplay->control), old_state, new_state); -} - -static void -gst_media_play_stream_end ( GstPlay *play, - GstMediaPlay *mplay) -{ - g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - - gst_media_play_set_state (mplay, GST_STATE_READY); - - if (!gtk_playlist_has_next_mrl (GTK_PLAYLIST(mplay->playlist))) { - char *mrl; - - gtk_playlist_set_at_start (GTK_PLAYLIST(mplay->playlist)); - gst_media_play_set_location ( - mplay, - gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); - - } - else { - gtk_playlist_set_next (GTK_PLAYLIST(mplay->playlist)); - gst_media_play_set_location ( - mplay, - gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); - gst_media_play_set_state (mplay, GST_STATE_PLAYING); - } -} - -/* ============================================================= */ -/* */ -/* Public Methods */ -/* */ -/* ============================================================= */ - void gst_media_play_set_display_mode ( GstMediaPlay *mplay, GstMediaPlayMode display_mode) @@ -736,6 +712,12 @@ return mplay->display_mode; } +/* =========================================== */ +/* */ +/* GstPlay stuff */ +/* */ +/* =========================================== */ + void gst_media_play_set_video_scale (GstMediaPlay *mplay, gfloat scale_factor) { @@ -828,59 +810,11 @@ return gtk_adjustment_get_value(adj); } -/* ============================================================= */ -/* */ -/* Tool box */ -/* */ -/* ============================================================= */ - -gchar* -gst_media_play_get_ui_file (const gchar *fname) -{ - gchar *full_fname; - - /* Searching for glade file in uninstalled dir */ - - full_fname = g_strjoin("/", GLADEUI_UNINSTALLED_DIR, fname, NULL); - if ( g_file_test(full_fname, G_FILE_TEST_IS_REGULAR) ) - return full_fname; - - if (full_fname) g_free(full_fname); - - /* Searching for glade file in installed dir */ - - full_fname = g_strjoin("/", GLADEUI_DIR, fname, NULL); - if ( g_file_test(full_fname, G_FILE_TEST_IS_REGULAR) ) - return full_fname; - - /* Not found */ - - if (full_fname) g_free(full_fname); - - return NULL; -} - -GladeXML* -gst_media_play_get_glade_xml_from_file ( const gchar *fname, - const gchar *root, - const gchar *domain) -{ - return glade_xml_new(fname, root, domain); -} - -GladeXML* -gst_media_play_get_glade_xml ( const gchar *fname, - const gchar *root, - const gchar *domain) -{ - gchar *full_fname = NULL; - GladeXML *xml = NULL; - full_fname = gst_media_play_get_ui_file (fname); - g_return_val_if_fail(full_fname != NULL, NULL); - xml = gst_media_play_get_glade_xml_from_file (full_fname, root, domain); - if (full_fname) g_free (full_fname); - return xml; -} +/* =========================================== */ +/* */ +/* Tool Box */ +/* */ +/* =========================================== */ gboolean gst_media_gconf_get_boolean (const gchar *key, gboolean *value) @@ -905,24 +839,89 @@ return TRUE; } -static void -gst_media_error_dialog (const gchar *message) +gint +gst_media_play_handle_keypress ( GtkWidget *widget, + GdkEventKey *event, + GstMediaPlay *mplay) { - GtkWidget *dialog; - /* throw up a dialog box; FIXME: we don't have a parent */ - /* FIXME: maybe even fallback the GError and do error - * handling higher up ? */ - dialog = gtk_message_dialog_new (NULL, 0, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - message); - gtk_dialog_run (GTK_DIALOG (dialog)); - /* - gtk_widget_show (dialog); - g_signal_connect_swapped (GTK_OBJECT (dialog), "response", - G_CALLBACK (gtk_widget_destroy), - GTK_OBJECT (dialog)); - */ + guint state; + gboolean handled = FALSE; + + g_return_val_if_fail (GST_IS_MEDIA_PLAY (mplay), 0); + + state = event->state; + + switch (event->keyval) { + case GDK_Up: + gst_media_play_set_volume (mplay, + gst_media_play_get_volume (mplay) + 0.1); + handled = TRUE; + break; + case GDK_Down: + gst_media_play_set_volume (mplay, + gst_media_play_get_volume (mplay) - 0.1); + handled = TRUE; + break; + case GDK_space: + case GDK_p: + if (gst_media_play_get_state (mplay) == GST_STATE_PLAYING) { + gst_media_play_set_state (mplay, GST_STATE_PAUSED); + } + else { + gst_media_play_set_state (mplay, GST_STATE_PLAYING); + } + handled = TRUE; + break; + case GDK_Return: + case GDK_Escape: + if (mplay->display_mode == GST_MEDIA_PLAY_FULLSCREEN){ + gst_media_play_set_display_mode (mplay, GST_MEDIA_PLAY_NORMAL); + } + handled = TRUE; + break; + } + + return handled; +} + +/* =========================================== */ +/* */ +/* Widget typing & Creation */ +/* */ +/* =========================================== */ + +GType +gst_media_play_get_type (void) +{ + static GType play_type = 0; + + if (!play_type) + { + static const GTypeInfo style_info = + { + sizeof (GstMediaPlayClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) gst_media_play_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GstMediaPlay), + 0, /* n_preallocs */ + (GInstanceInitFunc) gst_media_play_init, + }; + + play_type = g_type_register_static (GTK_TYPE_VBOX, + "GstMediaPlay", + &style_info, 0); + } + + return play_type; +} + +GstMediaPlay* +gst_media_play_new (void) +{ + return GST_MEDIA_PLAY (g_object_new (GST_TYPE_MEDIA_PLAY, NULL)); } /* ============================================================= */ Index: gstmediaplay.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.h,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- gstmediaplay.h 22 Jan 2003 11:00:39 -0000 1.30 +++ gstmediaplay.h 22 Jan 2003 15:30:00 -0000 1.31 @@ -1,3 +1,27 @@ +/* GStreamer + * Copyright (C) 1999,2000,2001,2002 Erik Walthinsen <om...@cs...> + * 2000,2001,2002 Wim Taymans <wt...@ch...> + * 2002 Steve Baker <st...@st...> + * 2003 Julien Moutte <ju...@mo...> + * + * gstmediaplay.h: Media Player widget for Gst-Player + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + #ifndef __GST_MEDIA_PLAY_H__ #define __GST_MEDIA_PLAY_H__ @@ -50,36 +74,62 @@ struct _GstMediaPlayClass { GtkVBoxClass parent_class; + /* signals */ - void (*state_changed) (GstMediaPlay *mplay, GstElementState old_state, GstElementState new_state); - void (*display_mode_change) (GstMediaPlay *mplay, GstMediaPlayMode display_mode); - void (*current_location) (GstMediaPlay *mplay, gchar *location, gchar *location_short); + + void (*state_changed) ( GstMediaPlay *mplay, + GstElementState old_state, + GstElementState new_state); + void (*display_mode_change) ( GstMediaPlay *mplay, + GstMediaPlayMode display_mode); + void (*current_location) ( GstMediaPlay *mplay, + gchar *location, + gchar *location_short); }; GType gst_media_play_get_type (void); GstMediaPlay* gst_media_play_new (void); -void gst_media_play_set_video_scale (GstMediaPlay *mplay, gfloat scale_factor); -gfloat gst_media_play_get_video_scale (GstMediaPlay *mplay); - -void gst_media_play_set_state (GstMediaPlay *mplay, GstElementState state); -GstElementState gst_media_play_get_state (GstMediaPlay *mplay); +void gst_media_play_toggle_play_pause ( GtkWidget *widget, + GstMediaPlay *mplay); +void gst_media_play_stop ( GtkWidget *widget, + GstMediaPlay *mplay); +void gst_media_play_next ( GtkWidget *widget, + GstMediaPlay *mplay); +void gst_media_play_previous ( GtkWidget *widget, + GstMediaPlay *mplay); +void gst_media_play_toggle_mute ( GtkWidget *widget, + GstMediaPlay *mplay); -void gst_media_play_set_display_mode (GstMediaPlay *mplay, GstMediaPlayMode display_mode); +void gst_media_play_set_display_mode ( GstMediaPlay *mplay, + GstMediaPlayMode display_mode); + GstMediaPlayMode gst_media_play_get_display_mode (GstMediaPlay *mplay); -void gst_media_play_set_volume (GstMediaPlay *mplay, gdouble value); -gdouble gst_media_play_get_volume (GstMediaPlay *mplay); +void gst_media_play_show_about ( GstMediaPlay *mplay); -void gst_media_play_show_media_info (GstMediaPlay *mplay); -void gst_media_play_show_preferences (GstMediaPlay *mplay); -void gst_media_play_show_about (GstMediaPlay *mplay); +void gst_media_play_set_video_scale ( GstMediaPlay *mplay, + gfloat scale_factor); +gfloat gst_media_play_get_video_scale ( GstMediaPlay *mplay); -void gst_media_play_set_location (GstMediaPlay *mplay, const gchar *location); -const gchar* gst_media_play_get_location (GstMediaPlay *mplay); -gint gst_media_play_handle_keypress (GtkWidget *widget, GdkEventKey *event, - GstMediaPlay *mplay); +void gst_media_play_set_state ( GstMediaPlay *mplay, + GstElementState state); +GstElementState gst_media_play_get_state ( GstMediaPlay *mplay); -gboolean gst_media_gconf_get_boolean (const gchar *key, gboolean *value); +void gst_media_play_set_volume ( GstMediaPlay *mplay, + gdouble value); +gdouble gst_media_play_get_volume ( GstMediaPlay *mplay); + +void gst_media_play_set_location ( GstMediaPlay *mplay, + const gchar *location); +const gchar* gst_media_play_get_location ( GstMediaPlay *mplay); + + +gint gst_media_play_handle_keypress ( GtkWidget *widget, + GdkEventKey *event, + GstMediaPlay *mplay); + +gboolean gst_media_gconf_get_boolean ( const gchar *key, + gboolean *value); #endif /* __GST_MEDIA_PLAY_H__ */ Index: gtk-playlist.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gtk-playlist.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gtk-playlist.c 21 Jan 2003 14:04:41 -0000 1.2 +++ gtk-playlist.c 22 Jan 2003 15:30:01 -0000 1.3 @@ -33,7 +33,6 @@ #include <string.h> #include <libgnome/gnome-i18n.h> -/*#include "debug.h"*/ #define READ_CHUNK_SIZE 8192 @@ -1117,7 +1116,8 @@ } if (strncmp ("audio/", mimetype, 6) != 0 - && strncmp ("video/", mimetype, 6) != 0) + && strncmp ("video/", mimetype, 6) != 0 + && strncmp ("application/x-ogg", mimetype, 17) != 0) { g_message("trying to add '%s' with mimetype '%s'", mrl, mimetype); |
From: Julien M. <do...@us...> - 2003-01-25 17:31:20
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Sat Jan 25 2003 09:31:18 PST Log message: Added a playing logo in the playlist Implemented a destroy method in GstMediaPlay so that the playlist widget can memorize it's position Modified files: libs/gst/player : gstmediaplay.c gstmediaplay.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.84&r2=1.85 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.h.diff?r1=1.31&r2=1.32 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.84 retrieving revision 1.85 diff -u -d -r1.84 -r1.85 --- gstmediaplay.c 22 Jan 2003 17:14:53 -0000 1.84 +++ gstmediaplay.c 25 Jan 2003 17:31:06 -0000 1.85 @@ -38,7 +38,7 @@ #include "gstplayer-marshal.h" #include "gtk-playlist.h" -static GObject *parent_class = NULL; +static GtkVBoxClass *parent_class = NULL; enum { STATE_CHANGE, @@ -212,10 +212,9 @@ { gint pointer_x, pointer_y; GdkModifierType state; - static mouse_hide_timer; - if (mouse_hide_timer) - g_source_remove (mouse_hide_timer); + if (mplay->hide_cursor_id) + g_source_remove (mplay->hide_cursor_id); gst_video_widget_set_cursor_visible (GST_VIDEO_WIDGET(widget), TRUE); @@ -224,7 +223,7 @@ gdk_window_get_pointer (widget->window, &pointer_x, &pointer_y, &state); - mouse_hide_timer = g_timeout_add ( + mplay->hide_cursor_id = g_timeout_add ( 3000, (GSourceFunc) gst_media_play_hide_mouse_cursor, mplay); @@ -363,12 +362,70 @@ /* =========================================== */ static void +gst_media_play_destroy (GtkObject *object) +{ + GstMediaPlay *mplay; + + g_return_if_fail(object != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(object)); + + mplay = GST_MEDIA_PLAY (object); + + if (mplay->hide_cursor_id) { + g_source_remove (mplay->hide_cursor_id); + mplay->hide_cursor_id = 0; + } + + if (mplay->logo_pixbuf) { + g_object_unref (mplay->logo_pixbuf); + mplay->logo_pixbuf = NULL; + } + + if (GTK_IS_WIDGET(mplay->video_widget)) { + gtk_widget_destroy (mplay->video_widget); + mplay->video_widget = NULL; + } + + if (GTK_IS_WIDGET(mplay->playlist)) { + gtk_widget_destroy (mplay->playlist); + mplay->playlist = NULL; + } + + if (GTK_IS_WIDGET(mplay->control)) { + gtk_widget_destroy (mplay->control); + mplay->control = NULL; + } + + if (mplay->play) { + g_object_unref (mplay->play); + mplay->play = NULL; + } + + if (mplay->location) { + g_free (mplay->location); + mplay->location = NULL; + } + if (mplay->location_short) { + g_free (mplay->location_short); + mplay->location_short = NULL; + } + + /* Chain up */ + if (GTK_OBJECT_CLASS(parent_class)->destroy) + (* GTK_OBJECT_CLASS(parent_class)->destroy) (object); +} + +static void gst_media_play_class_init (GstMediaPlayClass *klass) { GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; GtkObjectClass *object_class = (GtkObjectClass *) klass; GObjectClass *gobject_class = (GObjectClass *) klass; + object_class->destroy = gst_media_play_destroy; + + parent_class = gtk_type_class (gtk_vbox_get_type ()); + gst_media_play_signals [STATE_CHANGE] = g_signal_new ("state_change", G_TYPE_FROM_CLASS (klass), @@ -477,15 +534,28 @@ logo_path = gst_media_play_get_ui_file("gst-player-logo.png"); mplay->logo_pixbuf = gdk_pixbuf_new_from_file (logo_path, NULL); + if (logo_path) { + g_free(logo_path); + logo_path = NULL; + } + gst_video_widget_set_logo ( GST_VIDEO_WIDGET(mplay->video_widget), mplay->logo_pixbuf); + gtk_widget_set_size_request (mplay->video_widget, 300, 300); + + logo_path = gst_media_play_get_ui_file("gst-player-playing.png"); - if (logo_path) g_free(logo_path); + mplay->play_pixbuf = gdk_pixbuf_new_from_file (logo_path, NULL); + if (logo_path) { + g_free(logo_path); + logo_path = NULL; + } mplay->playlist = gtk_playlist_new ( gst_media_play_get_ui_file("playlist.glade"), - NULL); + mplay->play_pixbuf); + g_return_if_fail(mplay->playlist != NULL); gtk_box_pack_start (GTK_BOX (mplay), mplay->video_widget, TRUE, TRUE, 0); @@ -537,15 +607,19 @@ playstate = gst_play_get_state (mplay->play); - if (playstate == GST_STATE_PLAYING) + if (playstate == GST_STATE_PLAYING) { gst_media_play_set_state (mplay, GST_STATE_PAUSED); - else if (playstate == GST_STATE_PAUSED) + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), FALSE); + } + else if (playstate == GST_STATE_PAUSED) { gst_media_play_set_state (mplay, GST_STATE_PLAYING); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); + } else if (playstate == GST_STATE_READY) { gst_media_play_set_location ( mplay, gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); - + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); gst_media_play_set_state (mplay, GST_STATE_PLAYING); } @@ -558,6 +632,7 @@ g_return_if_fail(mplay != NULL); g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); gst_media_play_set_state (mplay, GST_STATE_READY); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), FALSE); } void @@ -568,6 +643,7 @@ g_return_if_fail (GST_IS_MEDIA_PLAY(mplay)); gst_media_play_set_state (mplay, GST_STATE_READY); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), FALSE); if (!gtk_playlist_has_next_mrl (GTK_PLAYLIST(mplay->playlist))) { char *mrl; @@ -585,6 +661,7 @@ gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); } + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); gst_media_play_set_state (mplay, GST_STATE_PLAYING); } @@ -596,6 +673,7 @@ g_return_if_fail (GST_IS_MEDIA_PLAY(mplay)); gst_media_play_set_state (mplay, GST_STATE_READY); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), FALSE); if (!gtk_playlist_has_previous_mrl (GTK_PLAYLIST(mplay->playlist))) { char *mrl; @@ -613,6 +691,7 @@ gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); } + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); gst_media_play_set_state (mplay, GST_STATE_PLAYING); } Index: gstmediaplay.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- gstmediaplay.h 22 Jan 2003 15:30:00 -0000 1.31 +++ gstmediaplay.h 25 Jan 2003 17:31:06 -0000 1.32 @@ -58,6 +58,7 @@ GtkWidget *statusarea; GdkPixbuf *logo_pixbuf; + GdkPixbuf *play_pixbuf; GtkWidget *playlist; const gchar *location; @@ -68,6 +69,7 @@ /* For moving the control window */ guint32 move_id; + guint32 hide_cursor_id; int control_y; }; |
From: Julien M. <do...@us...> - 2003-01-25 23:50:08
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Sat Jan 25 2003 15:50:06 PST Log message: HAVE_GSTREAMER_CVS is not necessary anymore... Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.86&r2=1.87 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.86 retrieving revision 1.87 diff -u -d -r1.86 -r1.87 --- gstmediaplay.c 25 Jan 2003 18:21:21 -0000 1.86 +++ gstmediaplay.c 25 Jan 2003 23:49:54 -0000 1.87 @@ -475,11 +475,8 @@ g_return_if_fail(mplay->play != NULL); -#ifdef HAVE_GSTREAMER_CVS audio_sink = gst_gconf_get_default_audio_sink (); -#else - audio_sink = gst_gconf_render_bin_from_key ("default/audiosink"); -#endif + if (!GST_IS_ELEMENT (audio_sink)) { gst_media_error_dialog ( @@ -491,11 +488,8 @@ } gst_play_set_audio_sink (mplay->play, audio_sink); -#ifdef HAVE_GSTREAMER_CVS video_sink = gst_gconf_get_default_video_sink (); -#else - video_sink = gst_gconf_render_bin_from_key ("default/videosink"); -#endif + if (!GST_IS_ELEMENT (video_sink)) { gst_media_error_dialog ( |
From: Julien M. <do...@us...> - 2003-01-28 22:29:40
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Tue Jan 28 2003 14:29:33 PST Log message: This video widget size restriction has some ratio issues. I need to dig into that deeper. Commenting it for now so that video ratio is correct on startup Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.87&r2=1.88 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.87 retrieving revision 1.88 diff -u -d -r1.87 -r1.88 --- gstmediaplay.c 25 Jan 2003 23:49:54 -0000 1.87 +++ gstmediaplay.c 28 Jan 2003 22:29:17 -0000 1.88 @@ -539,7 +539,7 @@ gst_video_widget_set_logo ( GST_VIDEO_WIDGET(mplay->video_widget), mplay->logo_pixbuf); - gtk_widget_set_size_request (mplay->video_widget, 300, 300); + /*gtk_widget_set_size_request (mplay->video_widget, 300, 300);*/ logo_path = gst_media_play_get_ui_file("gst-player-playing.png"); |
From: Julien M. <do...@us...> - 2003-01-29 14:49:57
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Jan 29 2003 06:49:55 PST Log message: Improved playlist behaviour : repeat mode loop on previous and next Logo get displayed at stream end Logo get displayed while switching from one media to another Preparing changed signal from playlist to play track when double clicked in the playlist treeview Modified files: libs/gst/player : gstmediaplay.c gstvideowidget.c gstvideowidget.h gtk-playlist.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.88&r2=1.89 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.c.diff?r1=1.12&r2=1.13 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.h.diff?r1=1.7&r2=1.8 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gtk-playlist.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.88 retrieving revision 1.89 diff -u -d -r1.88 -r1.89 --- gstmediaplay.c 28 Jan 2003 22:29:17 -0000 1.88 +++ gstmediaplay.c 29 Jan 2003 14:49:41 -0000 1.89 @@ -205,6 +205,16 @@ /* */ /* =========================================== */ +static void +gst_media_play_playlist_changed ( GtkWidget *widget, + GstMediaPlay *mplay) +{ + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + g_message ("playlist changed"); +} + static gint gst_media_play_motion_notify_callback ( GtkWidget *widget, GdkEventMotion *event, @@ -335,6 +345,9 @@ { g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + gst_video_widget_set_logo_focus ( + GST_VIDEO_WIDGET(mplay->video_widget), TRUE); + gst_media_play_set_state (mplay, GST_STATE_READY); if (!gtk_playlist_has_next_mrl (GTK_PLAYLIST(mplay->playlist))) { @@ -560,6 +573,9 @@ g_signal_connect (G_OBJECT (mplay->video_widget), "motion-notify-event", G_CALLBACK (gst_media_play_motion_notify_callback), mplay); + g_signal_connect (G_OBJECT (mplay->playlist), "changed", + G_CALLBACK (gst_media_play_playlist_changed), mplay); + g_signal_connect (G_OBJECT (mplay->control), "toggle_play", G_CALLBACK (gst_media_play_toggle_play_pause), mplay); g_signal_connect (G_OBJECT (mplay->control), "toggle_playlist", @@ -638,28 +654,23 @@ { g_return_if_fail (mplay != NULL); g_return_if_fail (GST_IS_MEDIA_PLAY(mplay)); - - gst_media_play_set_state (mplay, GST_STATE_READY); - gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), FALSE); - - if (!gtk_playlist_has_next_mrl (GTK_PLAYLIST(mplay->playlist))) { - char *mrl; - - gtk_playlist_set_at_start (GTK_PLAYLIST(mplay->playlist)); - gst_media_play_set_location ( - mplay, - gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); - } - else { + if (gtk_playlist_has_next_mrl (GTK_PLAYLIST(mplay->playlist)) || + gtk_playlist_get_repeat (GTK_PLAYLIST(mplay->playlist)) ) { + gst_video_widget_set_logo_focus ( + GST_VIDEO_WIDGET(mplay->video_widget), TRUE); + + gst_media_play_set_state (mplay, GST_STATE_READY); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), FALSE); + gtk_playlist_set_next (GTK_PLAYLIST(mplay->playlist)); gst_media_play_set_location ( mplay, gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); + + gst_media_play_set_state (mplay, GST_STATE_PLAYING); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); } - - gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); - gst_media_play_set_state (mplay, GST_STATE_PLAYING); } void @@ -669,27 +680,22 @@ g_return_if_fail (mplay != NULL); g_return_if_fail (GST_IS_MEDIA_PLAY(mplay)); - gst_media_play_set_state (mplay, GST_STATE_READY); - gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), FALSE); - - if (!gtk_playlist_has_previous_mrl (GTK_PLAYLIST(mplay->playlist))) { - char *mrl; + if (gtk_playlist_has_previous_mrl (GTK_PLAYLIST(mplay->playlist)) || + gtk_playlist_get_repeat (GTK_PLAYLIST(mplay->playlist)) ) { + gst_video_widget_set_logo_focus ( + GST_VIDEO_WIDGET(mplay->video_widget), TRUE); + + gst_media_play_set_state (mplay, GST_STATE_READY); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), FALSE); - gtk_playlist_set_at_start (GTK_PLAYLIST(mplay->playlist)); - gst_media_play_set_location ( - mplay, - gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); - - } - else { gtk_playlist_set_previous (GTK_PLAYLIST(mplay->playlist)); gst_media_play_set_location ( mplay, gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist))); + + gst_media_play_set_state (mplay, GST_STATE_PLAYING); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); } - - gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); - gst_media_play_set_state (mplay, GST_STATE_PLAYING); } void @@ -929,32 +935,43 @@ state = event->state; switch (event->keyval) { - case GDK_Up: - gst_media_play_set_volume (mplay, - gst_media_play_get_volume (mplay) + 0.1); - handled = TRUE; + case GDK_l: + if (gst_video_widget_get_logo_focus( + GST_VIDEO_WIDGET(mplay->video_widget))) + gst_video_widget_set_logo_focus( + GST_VIDEO_WIDGET(mplay->video_widget), + FALSE); + else + gst_video_widget_set_logo_focus( + GST_VIDEO_WIDGET(mplay->video_widget), + TRUE); break; - case GDK_Down: - gst_media_play_set_volume (mplay, - gst_media_play_get_volume (mplay) - 0.1); - handled = TRUE; + case GDK_Up: + gst_media_play_set_volume (mplay, + gst_media_play_get_volume (mplay) + 0.1); + handled = TRUE; break; - case GDK_space: - case GDK_p: - if (gst_media_play_get_state (mplay) == GST_STATE_PLAYING) { - gst_media_play_set_state (mplay, GST_STATE_PAUSED); - } - else { - gst_media_play_set_state (mplay, GST_STATE_PLAYING); - } - handled = TRUE; + case GDK_Down: + gst_media_play_set_volume (mplay, + gst_media_play_get_volume (mplay) - 0.1); + handled = TRUE; break; - case GDK_Return: - case GDK_Escape: - if (mplay->display_mode == GST_MEDIA_PLAY_FULLSCREEN){ - gst_media_play_set_display_mode (mplay, GST_MEDIA_PLAY_NORMAL); - } - handled = TRUE; + case GDK_space: + case GDK_p: + if (gst_media_play_get_state (mplay) == GST_STATE_PLAYING) { + gst_media_play_set_state (mplay, GST_STATE_PAUSED); + } + else { + gst_media_play_set_state (mplay, GST_STATE_PLAYING); + } + handled = TRUE; + break; + case GDK_Return: + case GDK_Escape: + if (mplay->display_mode == GST_MEDIA_PLAY_FULLSCREEN){ + gst_media_play_set_display_mode (mplay, GST_MEDIA_PLAY_NORMAL); + } + handled = TRUE; break; } Index: gstvideowidget.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstvideowidget.c 21 Jan 2003 08:56:59 -0000 1.12 +++ gstvideowidget.c 29 Jan 2003 14:49:41 -0000 1.13 @@ -55,6 +55,7 @@ ARG_0, ARG_SCALE_FACTOR, ARG_VISIBLE_CURSOR, + ARG_LOGO_FOCUSED, ARG_EVENT_CATCHER, ARG_XID, ARG_SOURCE_WIDTH, @@ -120,6 +121,15 @@ "visible cursor", "Is the mouse pointer (cursor) visible or not", TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_LOGO_FOCUSED, + g_param_spec_boolean ( + "logo_focused", + "logo is focused", + "Is the logo focused or not", + TRUE, G_PARAM_READWRITE)); g_object_class_install_property ( gobject_class, @@ -188,6 +198,7 @@ vw->scale_override = FALSE; vw->cursor_visible = TRUE; vw->event_catcher = TRUE; + vw->logo_focused = TRUE; vw->event_window = NULL; vw->video_window = NULL; vw->logo_pixbuf = NULL; @@ -323,7 +334,7 @@ if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) { - if ( (!vw->video_window) && (vw->logo_pixbuf) ) { + if ( (vw->logo_focused) && (vw->logo_pixbuf) ) { GdkPixbuf *frame; guchar *pixels; int rowstride; @@ -528,8 +539,12 @@ gdk_threads_enter (); + g_message ("got an xwindow"); + display = gtk_widget_get_display (GTK_WIDGET(vw)); + vw->logo_focused = FALSE; + vw->video_window = gdk_window_foreign_new_for_display (display, xid); if (vw->video_window) { @@ -671,6 +686,52 @@ } /** + * gst_video_widget_set_logo_focus: + * @vw: a #GstVideoWidget + * @visible: a #gboolean indicating wether or not the logo should have focus. + * + * Set logo's focus over embeded video window. + * + * Remember you can set this flag trough "logo_focused" property. + * + * Return value: a #gboolean indicating wether the call succeeded or not. + **/ +gboolean +gst_video_widget_set_logo_focus (GstVideoWidget *vw, gboolean focused) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + + gdk_threads_enter (); + + vw->logo_focused = focused; + + gst_video_widget_reorder_windows (vw); + + gdk_threads_leave (); + + return TRUE; +} + +/** + * gst_video_widget_get_logo_focus: + * @vw: a #GstVideoWidget + * + * Get logo focus status over embeded video window. + * + * Remember you can get this flag trough "logo_focused" property. + * + * Return value: a #gboolean indicating wether the logo has focus or not. + **/ +gboolean +gst_video_widget_get_logo_focus (GstVideoWidget *vw) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + return vw->logo_focused; +} + +/** * gst_video_widget_set_event_catcher: * @vw: a #GstVideoWidget * @event_catcher: a #gboolean indicating wether the widget should catch events @@ -819,6 +880,10 @@ vw->cursor_visible = g_value_get_boolean (value); gst_video_widget_update_cursor (vw); break; + case ARG_LOGO_FOCUSED: + vw->logo_focused = g_value_get_boolean (value); + gst_video_widget_reorder_windows (vw); + break; case ARG_EVENT_CATCHER: vw->event_catcher = g_value_get_boolean (value); gst_video_widget_reorder_windows (vw); @@ -865,6 +930,9 @@ case ARG_VISIBLE_CURSOR: g_value_set_boolean (value, vw->cursor_visible); break; + case ARG_LOGO_FOCUSED: + g_value_set_boolean (value, vw->logo_focused); + break; case ARG_EVENT_CATCHER: g_value_set_boolean (value, vw->event_catcher); break; @@ -927,15 +995,16 @@ } } -/* Method reordering event window and video window depending on event_catcher -flag */ +/* + * Method reordering event window and video window + * depending on event_catcher flag + */ static void gst_video_widget_reorder_windows (GstVideoWidget *vw) { g_return_if_fail(vw != NULL); g_return_if_fail(GST_IS_VIDEO_WIDGET(vw)); - g_return_if_fail(GDK_IS_WINDOW(vw->video_window)); if (vw->event_catcher) { if (GDK_IS_WINDOW(vw->event_window)) @@ -944,5 +1013,12 @@ else { if (GDK_IS_WINDOW(vw->video_window)) gdk_window_raise(vw->video_window); + } + + if ( (vw->logo_focused) && (GDK_IS_WINDOW(vw->video_window)) ) { + gdk_window_hide(vw->video_window); + } + else if ( (!vw->logo_focused) && (GDK_IS_WINDOW(vw->video_window)) ) { + gdk_window_show(vw->video_window); } } Index: gstvideowidget.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstvideowidget.h 21 Jan 2003 08:57:00 -0000 1.7 +++ gstvideowidget.h 29 Jan 2003 14:49:41 -0000 1.8 @@ -56,6 +56,7 @@ gboolean cursor_visible; gboolean event_catcher; + gboolean logo_focused; gboolean scale_override; gfloat scale_factor; @@ -85,6 +86,12 @@ gboolean gst_video_widget_set_cursor_visible ( GstVideoWidget *vw, gboolean visible); gboolean gst_video_widget_get_cursor_visible (GstVideoWidget *vw); + +/* Set/Get mouse pointer visible or not */ + +gboolean gst_video_widget_set_logo_focus ( GstVideoWidget *vw, + gboolean focused); +gboolean gst_video_widget_get_logo_focus (GstVideoWidget *vw); /* Set/Get if the widget should catch events over embeded window */ Index: gtk-playlist.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gtk-playlist.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gtk-playlist.c 22 Jan 2003 15:30:01 -0000 1.3 +++ gtk-playlist.c 29 Jan 2003 14:49:41 -0000 1.4 @@ -89,6 +89,7 @@ static void init_treeview (GtkWidget *treeview, GtkPlaylist *playlist); static gboolean gtk_playlist_unset_playing (GtkPlaylist *playlist); +static void gtk_playlist_set_at_end (GtkPlaylist *playlist); GtkType gtk_playlist_get_type (void) @@ -1192,9 +1193,7 @@ if (update_current_from_playlist (playlist) == FALSE) return FALSE; - if (playlist->_priv->repeat == TRUE) - return TRUE; - + gtk_tree_model_get_iter (playlist->_priv->model, &iter, playlist->_priv->current); @@ -1289,7 +1288,11 @@ g_return_if_fail (GTK_IS_PLAYLIST (playlist)); if (gtk_playlist_has_previous_mrl (playlist) == FALSE) + { + if (playlist->_priv->repeat == TRUE) + gtk_playlist_set_at_end (playlist); return; + } gtk_playlist_unset_playing (playlist); @@ -1353,7 +1356,7 @@ gtk_playlist_set_at_start (GtkPlaylist *playlist) { g_return_if_fail (GTK_IS_PLAYLIST (playlist)); - + gtk_playlist_unset_playing (playlist); if (playlist->_priv->current != NULL) @@ -1362,6 +1365,28 @@ playlist->_priv->current = NULL; } update_current_from_playlist (playlist); +} + +static void +gtk_playlist_set_at_end (GtkPlaylist *playlist) +{ + gint nb_childs = 0; + g_return_if_fail (GTK_IS_PLAYLIST (playlist)); + + gtk_playlist_unset_playing (playlist); + + nb_childs = gtk_tree_model_iter_n_children (playlist->_priv->model, NULL); + + if (playlist->_priv->current != NULL) + { + gtk_tree_path_free (playlist->_priv->current); + playlist->_priv->current = NULL; + } + + if (nb_childs) + playlist->_priv->current = gtk_tree_path_new_from_indices ( + nb_childs-1, -1); + } /* This one returns a new string, in UTF8 even if the mrl is encoded |
From: Julien M. <do...@us...> - 2003-01-29 18:58:28
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Jan 29 2003 10:58:27 PST Log message: Double clicking on tracks in the playlist now works :))) Gst-Player is becoming a good player (audio at least ;-) ) Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.89&r2=1.90 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.89 retrieving revision 1.90 diff -u -d -r1.89 -r1.90 --- gstmediaplay.c 29 Jan 2003 14:49:41 -0000 1.89 +++ gstmediaplay.c 29 Jan 2003 18:58:13 -0000 1.90 @@ -209,10 +209,29 @@ gst_media_play_playlist_changed ( GtkWidget *widget, GstMediaPlay *mplay) { + gchar *mrl = NULL; + g_return_if_fail(mplay != NULL); g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - g_message ("playlist changed"); + mrl = gtk_playlist_get_current_mrl (GTK_PLAYLIST(mplay->playlist)); + + if ( !mplay->location || + ( mplay->location && + mrl && + g_strcasecmp (mplay->location, mrl) != 0 + ) + ) + { + gst_media_play_set_location (mplay, mrl); + gst_media_play_set_state (mplay, GST_STATE_PLAYING); + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); + } + else if (mplay->location) + gtk_playlist_set_playing (GTK_PLAYLIST(mplay->playlist), TRUE); + + if (mrl) g_free (mrl); + } static gint |
From: Julien M. <do...@us...> - 2003-01-29 21:27:38
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Jan 29 2003 13:27:36 PST Log message: Bug Fix : Control bar was not hiding in fullscreen mode Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.90&r2=1.91 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.90 retrieving revision 1.91 diff -u -d -r1.90 -r1.91 --- gstmediaplay.c 29 Jan 2003 18:58:13 -0000 1.90 +++ gstmediaplay.c 29 Jan 2003 21:27:23 -0000 1.91 @@ -170,6 +170,10 @@ gst_video_widget_set_cursor_visible ( GST_VIDEO_WIDGET(mplay->video_widget), FALSE); + + if (gst_media_play_get_display_mode (mplay) == GST_MEDIA_PLAY_FULLSCREEN) + gtk_widget_hide (mplay->control); + return FALSE; } |
From: Julien M. <do...@us...> - 2003-02-02 15:46:55
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Sun Feb 02 2003 07:46:53 PST Log message: Implemented datasrc element switching depending on location (filesrc, gnomevfssrc) Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.92&r2=1.93 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.92 retrieving revision 1.93 diff -u -d -r1.92 -r1.93 --- gstmediaplay.c 2 Feb 2003 12:05:14 -0000 1.92 +++ gstmediaplay.c 2 Feb 2003 15:46:41 -0000 1.93 @@ -877,6 +877,7 @@ gst_media_play_set_location (GstMediaPlay *mplay, const gchar *location) { GnomeVFSFileInfo info; + GstElement *datasrc = NULL; g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); g_return_if_fail(location != NULL); @@ -901,6 +902,18 @@ gst_media_play_set_state (mplay, GST_STATE_READY); + if (g_file_exists (location)) { + g_message ("location is a local file using filesrc"); + datasrc = gst_element_factory_make ("filesrc", "source"); + } + else { + g_message ("location is not a local file using gnomevfssrc"); + datasrc = gst_element_factory_make ("gnomevfssrc", "source"); + } + + if (GST_IS_ELEMENT(datasrc)) + gst_play_set_data_src (mplay->play, datasrc); + gst_play_set_location (mplay->play, mplay->location); } |
From: Julien M. <do...@us...> - 2003-02-03 14:09:37
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Mon Feb 03 2003 06:09:35 PST Log message: Xinerama aware stuff 0.1 alpha :). Modified files: libs/gst/player : gstmediaplay.c gstvideowidget.c gstvideowidget.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.93&r2=1.94 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.c.diff?r1=1.14&r2=1.15 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.h.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.93 retrieving revision 1.94 diff -u -d -r1.93 -r1.94 --- gstmediaplay.c 2 Feb 2003 15:46:41 -0000 1.93 +++ gstmediaplay.c 3 Feb 2003 14:09:22 -0000 1.94 @@ -889,12 +889,13 @@ gst_play_need_new_video_window ( mplay->play); /* get a short filename if we can */ - if (GNOME_VFS_OK != gnome_vfs_get_file_info(location, &info, GNOME_VFS_FILE_INFO_DEFAULT)){ + if (GNOME_VFS_OK != gnome_vfs_get_file_info( location, + &info, + GNOME_VFS_FILE_INFO_DEFAULT) + ) mplay->location_short = location; - } - else { + else mplay->location_short = info.name; - } g_signal_emit ( mplay, gst_media_play_signals [CURRENT_LOCATION], @@ -999,13 +1000,37 @@ TRUE); break; case GDK_Up: + /* gst_media_play_set_volume (mplay, - gst_media_play_get_volume (mplay) + 0.1); + gst_media_play_get_volume (mplay) + 0.1); */ + gst_video_widget_set_y_align ( + GST_VIDEO_WIDGET(mplay->video_widget), + gst_video_widget_get_y_align ( + GST_VIDEO_WIDGET(mplay->video_widget)) - 0.1); handled = TRUE; break; case GDK_Down: + /* gst_media_play_set_volume (mplay, - gst_media_play_get_volume (mplay) - 0.1); + gst_media_play_get_volume (mplay) - 0.1); */ + gst_video_widget_set_y_align ( + GST_VIDEO_WIDGET(mplay->video_widget), + gst_video_widget_get_y_align ( + GST_VIDEO_WIDGET(mplay->video_widget)) + 0.1); + handled = TRUE; + break; + case GDK_Left: + gst_video_widget_set_x_align ( + GST_VIDEO_WIDGET(mplay->video_widget), + gst_video_widget_get_x_align ( + GST_VIDEO_WIDGET(mplay->video_widget)) - 0.1); + handled = TRUE; + break; + case GDK_Right: + gst_video_widget_set_x_align ( + GST_VIDEO_WIDGET(mplay->video_widget), + gst_video_widget_get_x_align ( + GST_VIDEO_WIDGET(mplay->video_widget)) + 0.1); handled = TRUE; break; case GDK_space: Index: gstvideowidget.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstvideowidget.c 2 Feb 2003 12:05:14 -0000 1.14 +++ gstvideowidget.c 3 Feb 2003 14:09:22 -0000 1.15 @@ -54,6 +54,8 @@ enum { ARG_0, ARG_SCALE_FACTOR, + ARG_X_ALIGN, + ARG_Y_ALIGN, ARG_VISIBLE_CURSOR, ARG_LOGO_FOCUSED, ARG_EVENT_CATCHER, @@ -112,6 +114,24 @@ "scale factor", "size the video should be scaled to", 0, G_MAXFLOAT / G_MAXINT, 1, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_X_ALIGN, + g_param_spec_float ( + "x_align", + "x alignment", + "x alignment factor", + 0, G_MAXFLOAT / G_MAXINT, 1, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_Y_ALIGN, + g_param_spec_float ( + "y_align", + "y alignment", + "y alignment factor", + 0, G_MAXFLOAT / G_MAXINT, 1, G_PARAM_READWRITE)); g_object_class_install_property ( gobject_class, @@ -194,6 +214,8 @@ vw->source_width = 0; vw->source_height = 0; + vw->x_align = 0.5; + vw->y_align = 0.5; vw->scale_factor = 1.0; vw->scale_override = FALSE; vw->cursor_visible = TRUE; @@ -361,8 +383,15 @@ else width_ratio = height_ratio = 1.0; - logo_x = (alloc_width / 2) - ( width * width_ratio / 2); - logo_y = (alloc_height / 2) - ( height * height_ratio / 2); + logo_x = vw->x_align * ( alloc_width - (width * width_ratio)); + logo_y = vw->y_align * ( alloc_height - (height * height_ratio)); + + if (logo_x < 0) logo_x = 0; + if (logo_y < 0) logo_y = 0; + if (logo_x > ( alloc_width - (width * width_ratio) ) ) + logo_x = alloc_width - (width * width_ratio); + if (logo_y > ( alloc_height - (height * height_ratio) ) ) + logo_y = alloc_height - (height * height_ratio); /* Scaling to available space */ @@ -508,14 +537,27 @@ 0, allocation->width, allocation->height); - - if (GDK_IS_WINDOW(vw->video_window)) + + if (GDK_IS_WINDOW(vw->video_window)) { + gint video_x, video_y; + + video_x = vw->x_align * ( allocation->width - width); + video_y = vw->y_align * ( allocation->height - height); + + if (video_x < 0) video_x = 0; + if (video_y < 0) video_y = 0; + if (video_x > ( allocation->width - width)) + video_x = allocation->width - width; + if (video_y > ( allocation->height - height)) + video_y = allocation->height - height; + gdk_window_move_resize ( vw->video_window, - (allocation->width - width) / 2, - (allocation->height - height) / 2, + video_x, + video_y, width, height); + } } } @@ -569,6 +611,7 @@ gdk_threads_leave (); } + /** * gst_video_widget_get_xembed_xid: * @vw: a #GstVideoWidget @@ -822,6 +865,88 @@ return vw->scale_factor; } +/** + * gst_video_widget_set_x_align: + * @vw: a #GstVideoWidget + * @x_align: a #gfloat indicating x alignment that will be used by @vw. + * + * Set a x alignment value for a #GstVideoWidget. + * + * Remember you can set this flag trough the "x_align" property. + * + * Return value: a #gboolean indicating wether the call succeeded or not. + **/ +gboolean +gst_video_widget_set_x_align (GstVideoWidget *vw, gfloat x_align) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + if (x_align > 1) x_align = 1; + if (x_align < 0) x_align = 0; + vw->x_align = x_align; + gtk_widget_queue_resize (GTK_WIDGET(vw)); + return TRUE; +} + +/** + * gst_video_widget_get_x_align: + * @vw: a #GstVideoWidget + * + * Get used x alignment for a #GstVideoWidget. + * + * Remember you can get this value trough "x_align" property. + * + * Return value: a #gfloat indicating used x alignment. + **/ +gfloat +gst_video_widget_get_x_align (GstVideoWidget *vw) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + return vw->x_align; +} + +/** + * gst_video_widget_set_y_align: + * @vw: a #GstVideoWidget + * @y_align: a #gfloat indicating y alignment that will be used by @vw. + * + * Set a y alignment value for a #GstVideoWidget. + * + * Remember you can set this flag trough the "y_align" property. + * + * Return value: a #gboolean indicating wether the call succeeded or not. + **/ +gboolean +gst_video_widget_set_y_align (GstVideoWidget *vw, gfloat y_align) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + if (y_align > 1) y_align = 1; + if (y_align < 0) y_align = 0; + vw->y_align = y_align; + gtk_widget_queue_resize (GTK_WIDGET(vw)); + return TRUE; +} + +/** + * gst_video_widget_get_y_align: + * @vw: a #GstVideoWidget + * + * Get used y alignment for a #GstVideoWidget. + * + * Remember you can get this value trough "y_align" property. + * + * Return value: a #gfloat indicating used y alignment. + **/ +gfloat +gst_video_widget_get_y_align (GstVideoWidget *vw) +{ + g_return_val_if_fail(vw != NULL, FALSE); + g_return_val_if_fail (GST_IS_VIDEO_WIDGET (vw), FALSE); + return vw->y_align; +} + /** * gst_video_widget_set_logo: * @vw: a #GstVideoWidget. @@ -879,6 +1004,14 @@ vw->scale_override = TRUE; gtk_widget_queue_resize (GTK_WIDGET(vw)); break; + case ARG_X_ALIGN: + vw->x_align = g_value_get_float (value); + gtk_widget_queue_resize (GTK_WIDGET(vw)); + break; + case ARG_Y_ALIGN: + vw->y_align = g_value_get_float (value); + gtk_widget_queue_resize (GTK_WIDGET(vw)); + break; case ARG_VISIBLE_CURSOR: vw->cursor_visible = g_value_get_boolean (value); gst_video_widget_update_cursor (vw); @@ -929,6 +1062,12 @@ switch (prop_id) { case ARG_SCALE_FACTOR: g_value_set_float (value, vw->scale_factor); + break; + case ARG_X_ALIGN: + g_value_set_float (value, vw->x_align); + break; + case ARG_Y_ALIGN: + g_value_set_float (value, vw->y_align); break; case ARG_VISIBLE_CURSOR: g_value_set_boolean (value, vw->cursor_visible); Index: gstvideowidget.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstvideowidget.h 29 Jan 2003 14:49:41 -0000 1.8 +++ gstvideowidget.h 3 Feb 2003 14:09:22 -0000 1.9 @@ -54,6 +54,9 @@ gint source_width; gint source_height; + gfloat x_align; + gfloat y_align; + gboolean cursor_visible; gboolean event_catcher; gboolean logo_focused; @@ -103,6 +106,13 @@ gboolean gst_video_widget_set_scale (GstVideoWidget *vw, gfloat scale); gfloat gst_video_widget_get_scale (GstVideoWidget *vw); + +/* Set/Get x,y alignment used by the widget */ + +gboolean gst_video_widget_set_x_align (GstVideoWidget *vw, gfloat x_align); +gfloat gst_video_widget_get_x_align (GstVideoWidget *vw); +gboolean gst_video_widget_set_y_align (GstVideoWidget *vw, gfloat y_align); +gfloat gst_video_widget_get_y_align (GstVideoWidget *vw); /* Set/Get the XID of the Xwindow to be embedded */ |
From: Julien M. <do...@us...> - 2003-02-28 13:33:00
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Fri Feb 28 2003 05:32:58 PST Log message: Improving playlist, fixed some bugs (removing current song, should play remaining ones) Moreover adding a whole bunch of files to the playlist should not crash the player anymore as it's not considered as a playlist change (for the playback purpose) Modified files: libs/gst/player : gstmediaplay.c gtk-playlist.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.99&r2=1.100 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gtk-playlist.c.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.99 retrieving revision 1.100 diff -u -d -r1.99 -r1.100 --- gstmediaplay.c 12 Feb 2003 14:08:21 -0000 1.99 +++ gstmediaplay.c 28 Feb 2003 13:32:45 -0000 1.100 @@ -990,7 +990,7 @@ gst_media_play_set_state (mplay, GST_STATE_READY); - if (g_file_exists (location)) { + if (g_file_test (location,G_FILE_TEST_EXISTS)) { g_message ("location is a local file using filesrc"); datasrc = gst_element_factory_make ("filesrc", "source"); } Index: gtk-playlist.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gtk-playlist.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gtk-playlist.c 29 Jan 2003 14:49:41 -0000 1.4 +++ gtk-playlist.c 28 Feb 2003 13:32:45 -0000 1.5 @@ -518,7 +518,7 @@ /* The current item was removed from the playlist */ playlist->_priv->current = NULL; g_signal_emit (G_OBJECT (playlist), - gtk_playlist_table_signals[CURRENT_REMOVED], 0, + gtk_playlist_table_signals[CHANGED], 0, NULL); } else { if (ref != NULL) @@ -528,9 +528,6 @@ gtk_tree_row_reference_get_path (ref); gtk_tree_row_reference_free (ref); } - g_signal_emit (G_OBJECT (playlist), - gtk_playlist_table_signals[CHANGED], 0, - NULL); } } @@ -882,9 +879,9 @@ playlist->_priv->current = gtk_tree_model_get_path (playlist->_priv->model, &iter); - g_signal_emit (G_OBJECT (playlist), + /*g_signal_emit (G_OBJECT (playlist), gtk_playlist_table_signals[CHANGED], 0, - NULL); + NULL);*/ return TRUE; } @@ -899,6 +896,13 @@ if (eel_read_entire_file (mrl, &size, &contents) != GNOME_VFS_OK) return FALSE; + if (strstr (contents, "\n") == NULL) + { + retval = gtk_playlist_add_one_mrl (playlist, contents, NULL); + g_free (contents); + return retval; + } + lines = g_strsplit (contents, "\n", 0); g_free (contents); @@ -1092,6 +1096,18 @@ return retval; } +static gboolean +gtk_playlist_add_ra (GtkPlaylist *playlist, const char *mrl) +{ + /* How nice, same format as m3u it seems */ + return gtk_playlist_add_m3u (playlist, mrl); +} +#if 0 //FIXME +static gboolean +gtk_playlist_add_wmv (GtkPlaylist *playlist, const char *mrl) +{ +} +#endif gboolean gtk_playlist_add_mrl (GtkPlaylist *playlist, const char *mrl, const char *display_name) @@ -1112,6 +1128,9 @@ return gtk_playlist_add_pls (playlist, mrl); } else if (strcmp ("audio/x-ms-asx", mimetype) == 0) { return gtk_playlist_add_asx (playlist, mrl); + } else if (strcmp ("audio/x-real-audio", mimetype) == 0 + || strcmp ("audio/x-pn-realaudio", mimetype) == 0) { + return gtk_playlist_add_ra (playlist, mrl); } else if (strcmp ("x-directory/normal", mimetype) == 0) { //FIXME Load all the files in the dir ? } @@ -1395,18 +1414,30 @@ gchar * gtk_playlist_mrl_to_title (const gchar *mrl) { - char *filename_for_display, *filename, *unescaped; + char *filename_for_display, *with_suffix, *filename, *unescaped; filename = g_path_get_basename (mrl); unescaped = gnome_vfs_unescape_string_for_display (filename); g_free (filename); - filename_for_display = g_filename_to_utf8 (unescaped, + with_suffix = g_filename_to_utf8 (unescaped, -1, /* length */ NULL, /* bytes_read */ NULL, /* bytes_written */ NULL); /* error */ g_free (unescaped); + + if (strrchr (with_suffix, '.') + && strlen (strrchr (with_suffix, '.')) < 5) + { + filename_for_display = g_strndup (with_suffix, + strlen (with_suffix) + - strlen (strrchr (with_suffix, '.'))); + } else { + filename_for_display = g_strdup (with_suffix); + } + + g_free (with_suffix); return filename_for_display; } |
From: Julien M. <do...@us...> - 2003-03-03 18:35:00
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Mon Mar 03 2003 10:34:52 PST Log message: Committing a first alpha release of visualisation support It is NOT STABLE :) But it should work for the first song you play :) Modified files: libs/gst/player : gstmediaplay.c gstmediaplay.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.100&r2=1.101 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.h.diff?r1=1.35&r2=1.36 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.100 retrieving revision 1.101 diff -u -d -r1.100 -r1.101 --- gstmediaplay.c 28 Feb 2003 13:32:45 -0000 1.100 +++ gstmediaplay.c 3 Mar 2003 18:34:32 -0000 1.101 @@ -294,6 +294,29 @@ /* =========================================== */ static void +gst_media_play_have_vis_window ( GstElement *element, + gint xid, + GstMediaPlay *mplay) +{ + gint width, height; + g_return_if_fail(mplay != NULL); + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); + + g_message ("app size is : %d,%d", GTK_WIDGET(mplay->video_widget)->allocation.width, GTK_WIDGET(mplay->video_widget)->allocation.height); + if ( (mplay->video_widget) && (!mplay->media_has_video) ) { + width = GTK_WIDGET(mplay->video_widget)->allocation.width; + height = GTK_WIDGET(mplay->video_widget)->allocation.height; + gst_video_widget_set_source_size( + GST_VIDEO_WIDGET(mplay->video_widget), + width, height); + gst_video_widget_set_xembed_xid( + GST_VIDEO_WIDGET(mplay->video_widget), + xid); + } + +} + +static void gst_media_play_playlist_changed ( GtkWidget *widget, GstMediaPlay *mplay) { @@ -369,9 +392,20 @@ gint xid, GstMediaPlay *mplay) { + GstPad *tee_vis_pad, *vis_queue_sink_pad; + g_return_if_fail(mplay != NULL); g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - + + mplay->media_has_video = TRUE; + + /* Disconnecting goom */ + + tee_vis_pad = g_hash_table_lookup(mplay->vis_pads, "tee_visual_pad"); + vis_queue_sink_pad = g_hash_table_lookup(mplay->vis_pads, "visual_queue_pad"); + + gst_pad_unlink (tee_vis_pad, vis_queue_sink_pad); + if (mplay->video_widget) gst_video_widget_set_xembed_xid( GST_VIDEO_WIDGET(mplay->video_widget), @@ -533,7 +567,17 @@ gtk_widget_destroy (mplay->control); mplay->control = NULL; } - + + if (mplay->vis_elements) { + g_hash_table_destroy (mplay->vis_elements); + mplay->vis_elements = NULL; + } + + if (mplay->vis_pads) { + g_hash_table_destroy (mplay->vis_pads); + mplay->vis_pads = NULL; + } + if (mplay->play) { g_object_unref (mplay->play); mplay->play = NULL; @@ -593,6 +637,12 @@ gst_media_play_init (GstMediaPlay *mplay) { GstElement *audio_sink, *video_sink; + GstElement *tee_element, *goom_element, *colorspace_element; + GstElement *vis_thread, *audio_thread, *vis_player_bin; + GstElement *visual_video_sink, *visual_video_sink_element; + GstElement *vis_queue, * audio_queue; + GstPad *vis_queue_sink_pad, *audio_queue_sink_pad; + GstPad *tee_vis_pad, *tee_audio_pad; GError *error = NULL; gchar *logo_path = NULL; @@ -606,6 +656,11 @@ g_return_if_fail(mplay->play != NULL); + /* Creating a Hash table which will hold our elements */ + + mplay->vis_elements = g_hash_table_new(g_str_hash, g_str_equal); + mplay->vis_pads = g_hash_table_new(g_str_hash, g_str_equal); + audio_sink = gst_gconf_get_default_audio_sink (); if (!GST_IS_ELEMENT (audio_sink)) @@ -617,7 +672,6 @@ ); return; } - gst_play_set_audio_sink (mplay->play, audio_sink); video_sink = gst_gconf_get_default_video_sink (); @@ -631,19 +685,111 @@ return; } gst_play_set_video_sink (mplay->play, video_sink); + + /* Creating this bin + + { queue ! goom ! colorspace ! video_sink } + / +tee + \ + { queue ! audio_sink } + */ + + + vis_thread = gst_thread_new ("vis_thread"); + g_return_if_fail (GST_IS_THREAD (vis_thread)); + audio_thread = gst_thread_new ("audio_thread"); + g_return_if_fail (GST_IS_THREAD (audio_thread)); + + vis_player_bin = gst_element_factory_make ("bin", "vis_player_bin"); + vis_queue = gst_element_factory_make ("queue", "vis_queue"); + audio_queue = gst_element_factory_make ("queue", "audio_queue"); + tee_element = gst_element_factory_make ("tee", "audio_tee"); + goom_element = gst_element_factory_make ("goom", "visual_filter"); + colorspace_element = gst_element_factory_make ("colorspace", "colorspace"); + visual_video_sink = gst_gconf_get_default_video_sink (); + + g_return_if_fail(GST_IS_ELEMENT(vis_player_bin)); + g_hash_table_insert(mplay->vis_elements, "vis_player_bin", vis_player_bin); + g_return_if_fail(GST_IS_ELEMENT(vis_queue)); + g_hash_table_insert(mplay->vis_elements, "vis_queue", vis_queue); + g_return_if_fail(GST_IS_ELEMENT(audio_queue)); + g_hash_table_insert(mplay->vis_elements, "audio_queue", audio_queue); + g_return_if_fail(GST_IS_ELEMENT(tee_element)); + g_hash_table_insert(mplay->vis_elements, "audio_tee", tee_element); + g_return_if_fail(GST_IS_ELEMENT(goom_element)); + g_hash_table_insert(mplay->vis_elements, "visual_filter", goom_element); + g_return_if_fail(GST_IS_ELEMENT(colorspace_element)); + g_hash_table_insert(mplay->vis_elements, "colorspace", colorspace_element); + g_return_if_fail(GST_IS_ELEMENT(visual_video_sink)); + g_hash_table_insert(mplay->vis_elements, "visual_sink", visual_video_sink); + + tee_vis_pad = gst_element_get_request_pad (tee_element, "src%d"); + g_hash_table_insert(mplay->vis_pads, "tee_visual_pad", tee_vis_pad); + tee_audio_pad = gst_element_get_request_pad (tee_element, "src%d"); + g_hash_table_insert(mplay->vis_pads, "tee_audio_pad", tee_audio_pad); + vis_queue_sink_pad = gst_element_get_pad (vis_queue, "sink"); + g_hash_table_insert(mplay->vis_pads, "visual_queue_pad", vis_queue_sink_pad); + audio_queue_sink_pad = gst_element_get_pad (audio_queue, "sink"); + g_hash_table_insert(mplay->vis_pads, "audio_queue_pad", audio_queue_sink_pad); + + gst_pad_link (tee_audio_pad, audio_queue_sink_pad); + gst_element_link (vis_queue, goom_element); + gst_element_link (goom_element, colorspace_element); + gst_element_link (colorspace_element, visual_video_sink); + gst_element_link (audio_queue, audio_sink); + gst_bin_add_many ( + GST_BIN (vis_thread), vis_queue, goom_element, + colorspace_element, visual_video_sink, NULL); + gst_bin_add_many ( + GST_BIN (audio_thread), audio_queue, audio_sink, NULL); + gst_bin_add_many ( + GST_BIN (vis_player_bin), tee_element, + vis_thread, audio_thread, NULL); + + gst_element_add_ghost_pad ( vis_player_bin, + gst_element_get_pad (tee_element, "sink"), + "sink"); + + gst_play_set_audio_sink (mplay->play, vis_player_bin); + + /* gst_play_set_audio_sink (mplay->play, audio_sink); */ + + /* Connecting a callback for the xwindow of the visualisation */ + + visual_video_sink_element = gst_play_get_sink_element ( + mplay->play, + visual_video_sink, + GST_PLAY_SINK_TYPE_VIDEO); + + g_hash_table_insert( mplay->vis_elements, + "visual_sink_element", + visual_video_sink_element); + + mplay->media_has_video = FALSE; + + g_object_set( G_OBJECT(visual_video_sink_element), + "need_new_window", + TRUE, + "toplevel", + FALSE, NULL); + + g_signal_connect (G_OBJECT (visual_video_sink_element), "have_xid", + G_CALLBACK (gst_media_play_have_vis_window), mplay); + g_signal_connect (G_OBJECT (mplay->play), "stream_end", - G_CALLBACK (gst_media_play_stream_end), mplay); + G_CALLBACK (gst_media_play_stream_end), mplay); g_signal_connect (G_OBJECT (mplay->play), "time_tick", - G_CALLBACK (gst_media_play_time_tick), mplay); + G_CALLBACK (gst_media_play_time_tick), mplay); g_signal_connect (G_OBJECT (mplay->play), "stream_length", - G_CALLBACK (gst_media_play_got_length), mplay); + G_CALLBACK (gst_media_play_got_length), mplay); g_signal_connect (G_OBJECT (mplay->play), "have_xid", - G_CALLBACK (gst_media_play_have_xid), mplay); + G_CALLBACK (gst_media_play_have_xid), mplay); g_signal_connect (G_OBJECT (mplay->play), "have_video_size", - G_CALLBACK (gst_media_play_have_video_size), mplay); + G_CALLBACK (gst_media_play_have_video_size), mplay); g_signal_connect (G_OBJECT (mplay->play), "state_change", - G_CALLBACK (gst_media_play_state_change), mplay); + G_CALLBACK (gst_media_play_state_change), mplay); gtk_box_set_homogeneous (GTK_BOX(mplay), FALSE); gtk_box_set_spacing (GTK_BOX(mplay), 0); @@ -964,15 +1110,37 @@ gst_media_play_set_location (GstMediaPlay *mplay, const gchar *location) { GnomeVFSFileInfo info; - GstElement *datasrc = NULL; + GstElement *datasrc = NULL, *visual_sink_element; + GstPad *tee_vis_pad, *vis_queue_sink_pad; + g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); g_return_if_fail(location != NULL); mplay->location_short = NULL; mplay->location = location; + mplay->media_has_video = FALSE; + gst_video_widget_set_logo_focus ( GST_VIDEO_WIDGET(mplay->video_widget), TRUE); + + /* Connecting goom */ + + tee_vis_pad = g_hash_table_lookup( mplay->vis_pads, + "tee_visual_pad"); + vis_queue_sink_pad = g_hash_table_lookup( mplay->vis_pads, + "visual_queue_pad"); + + gst_pad_link (tee_vis_pad, vis_queue_sink_pad); + + visual_sink_element = g_hash_table_lookup( mplay->vis_elements, + "visual_sink_element"); + + if (GST_IS_ELEMENT(visual_sink_element)){ + g_object_set( G_OBJECT(visual_sink_element), + "need_new_window", TRUE, NULL); + } + gst_play_need_new_video_window ( mplay->play); /* get a short filename if we can */ Index: gstmediaplay.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.h,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- gstmediaplay.h 12 Feb 2003 14:08:23 -0000 1.35 +++ gstmediaplay.h 3 Mar 2003 18:34:37 -0000 1.36 @@ -68,6 +68,10 @@ const gchar *location; const gchar *location_short; gint64 length_nanos; + + GHashTable *vis_elements; + GHashTable *vis_pads; + gboolean media_has_video; GstMediaPlayMode display_mode; |
From: Julien M. <do...@us...> - 2003-03-29 16:02:55
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Sat Mar 29 2003 08:02:53 PST Log message: Cleaned up my code Modified files: libs/gst/player : gstvideowidget.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.c.diff?r1=1.18&r2=1.19 ====Begin Diffs==== Index: gstvideowidget.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstvideowidget.c 6 Feb 2003 23:40:37 -0000 1.18 +++ gstvideowidget.c 29 Mar 2003 16:02:40 -0000 1.19 @@ -24,31 +24,6 @@ #include "gstvideowidget.h" -static void gst_video_widget_class_init (GstVideoWidgetClass *klass); -static void gst_video_widget_init (GstVideoWidget *vw); - -static void gst_video_widget_realize (GtkWidget *vw); -static void gst_video_widget_unrealize (GtkWidget *vw); - -static gint gst_video_widget_expose ( GtkWidget *widget, - GdkEventExpose *event); - -static void gst_video_widget_size_request ( GtkWidget *widget, - GtkRequisition *requisition); -static void gst_video_widget_allocate ( GtkWidget *widget, - GtkAllocation *allocation); - - -static void gst_video_widget_set_property ( GObject *object, guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_video_widget_get_property ( GObject *object, guint prop_id, - GValue *value, - GParamSpec *pspec); - -static void gst_video_widget_update_cursor ( GstVideoWidget *vw); -static void gst_video_widget_reorder_windows (GstVideoWidget *vw); - /* Signals and Args */ enum { @@ -65,161 +40,91 @@ static GtkWidgetClass *parent_class = NULL; -/* Get type function for GstVideoWidget */ - -GtkType -gst_video_widget_get_type (void) -{ - static GtkType vw_type = 0; +/* ============================================================= */ +/* */ +/* Private Methods */ +/* */ +/* ============================================================= */ - if (!vw_type) { - static const GtkTypeInfo vw_info = { - "GstVideoWidget", - sizeof (GstVideoWidget), - sizeof (GstVideoWidgetClass), - (GtkClassInitFunc) gst_video_widget_class_init, - (GtkObjectInitFunc) gst_video_widget_init, - NULL, - NULL, - (GtkClassInitFunc)NULL, - }; - vw_type = gtk_type_unique (gtk_widget_get_type (), &vw_info); - } - return vw_type; -} +/* =========================================== */ +/* */ +/* Tool Box */ +/* */ +/* =========================================== */ -/* Class initialization for GstVideoWidget */ +/* Method updating cursor status depending on widget flag */ static void -gst_video_widget_class_init (GstVideoWidgetClass *klass) +gst_video_widget_update_cursor (GstVideoWidget *vw) { - GObjectClass *gobject_class; - GtkWidgetClass *widget_class; - - gobject_class = (GObjectClass*) klass; - widget_class = (GtkWidgetClass*) klass; - - parent_class = gtk_type_class (gtk_widget_get_type ()); - - gobject_class->set_property = gst_video_widget_set_property; - gobject_class->get_property = gst_video_widget_get_property; - - g_object_class_install_property ( - gobject_class, - ARG_SCALE_FACTOR, - g_param_spec_float ( - "scale_factor", - "scale factor", - "size the video should be scaled to", - 0, G_MAXFLOAT / G_MAXINT, 1, G_PARAM_READWRITE)); - - g_object_class_install_property ( - gobject_class, - ARG_VISIBLE_CURSOR, - g_param_spec_boolean ( - "visible_cursor", - "visible cursor", - "Is the mouse pointer (cursor) visible or not", - TRUE, G_PARAM_READWRITE)); - - g_object_class_install_property ( - gobject_class, - ARG_LOGO_FOCUSED, - g_param_spec_boolean ( - "logo_focused", - "logo is focused", - "Is the logo focused or not", - TRUE, G_PARAM_READWRITE)); + GtkWidget *widget; - g_object_class_install_property ( - gobject_class, - ARG_EVENT_CATCHER, - g_param_spec_boolean ( - "event_catcher", - "Event catcher", - "Should the widget catch events over the video window", - TRUE, G_PARAM_READWRITE)); + g_return_if_fail(vw != NULL); + g_return_if_fail(GST_IS_VIDEO_WIDGET(vw)); - g_object_class_install_property ( - gobject_class, - ARG_XID, - g_param_spec_ulong ( - "video_xid", - "video window xid", - "Video playback Xwindow XID", - 0, G_MAXLONG, 1, G_PARAM_READWRITE)); + widget = GTK_WIDGET (vw); - g_object_class_install_property ( - gobject_class, - ARG_SOURCE_WIDTH, - g_param_spec_int ( - "source_width", - "video source width", - "Video playback source width", - 0, G_MAXINT, 1, G_PARAM_READWRITE)); - - g_object_class_install_property ( - gobject_class, - ARG_SOURCE_HEIGHT, - g_param_spec_int ( - "source_height", - "video source height", - "Video playback source height", - 0, G_MAXINT, 1, G_PARAM_READWRITE)); + if (vw->cursor_visible) + gdk_window_set_cursor (widget->window, NULL); + else { - g_object_class_install_property ( - gobject_class, - ARG_LOGO, - g_param_spec_object ( - "logo", - "Logo", - "Picture that should appear as a logo when no video", - gdk_pixbuf_get_type (), G_PARAM_READWRITE)); + GdkBitmap *empty_bitmap; + GdkColor useless; + GdkCursor *cursor; + char invisible_cursor_bits[] = { 0x0 }; - widget_class->realize = gst_video_widget_realize; - widget_class->unrealize = gst_video_widget_unrealize; - widget_class->expose_event = gst_video_widget_expose; - widget_class->size_request = gst_video_widget_size_request; - widget_class->size_allocate = gst_video_widget_allocate; + useless.red = useless.green = useless.blue = useless.pixel = 0; + + empty_bitmap = gdk_bitmap_create_from_data ( widget->window, + invisible_cursor_bits, + 1, 1); + + cursor = gdk_cursor_new_from_pixmap ( empty_bitmap, + empty_bitmap, + &useless, + &useless, 0, 0); + + gdk_window_set_cursor (widget->window, cursor); + gdk_cursor_unref (cursor); + + g_object_unref (empty_bitmap); + } } -/* Initing our widget */ +/* + * Method reordering event window and video window + * depending on event_catcher flag + */ static void -gst_video_widget_init (GstVideoWidget *vw) +gst_video_widget_reorder_windows (GstVideoWidget *vw) { + g_return_if_fail(vw != NULL); + g_return_if_fail(GST_IS_VIDEO_WIDGET(vw)); - GTK_WIDGET_SET_FLAGS (GTK_WIDGET(vw), GTK_CAN_FOCUS); + if (vw->event_catcher) { + if (GDK_IS_WINDOW(vw->event_window)) + gdk_window_raise(vw->event_window); + } + else { + if (GDK_IS_WINDOW(vw->video_window)) + gdk_window_raise(vw->video_window); + } - vw->source_width = 0; - vw->source_height = 0; -/* vw->x_align = 0.5; - vw->y_align = 0.5; */ - vw->scale_factor = 1.0; - vw->scale_override = FALSE; - vw->cursor_visible = TRUE; - vw->event_catcher = TRUE; - vw->logo_focused = TRUE; - vw->event_window = NULL; - vw->video_window = NULL; - vw->logo_pixbuf = NULL; + if ( (vw->logo_focused) && (GDK_IS_WINDOW(vw->video_window)) ) { + gdk_window_hide(vw->video_window); + } + else if ( (!vw->logo_focused) && (GDK_IS_WINDOW(vw->video_window)) ) { + gdk_window_show(vw->video_window); + } } -/** - * gst_video_widget_new: - * - * Create a new empty #GstVideoWidget. - * - * Return value: the new #GstVideoWidget. - **/ -GtkWidget * -gst_video_widget_new (void) -{ - GstVideoWidget *widget = g_object_new (GST_TYPE_VIDEO_WIDGET, NULL); - - return GTK_WIDGET(widget); -} +/* =========================================== */ +/* */ +/* Event Handlers, Callbacks */ +/* */ +/* =========================================== */ /* Realizing GstVideoWidget */ @@ -528,6 +433,249 @@ } } +/* GstVideoWidget methods to set properties */ + +static void +gst_video_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GstVideoWidget *vw; + + g_return_if_fail (object != NULL); + + vw = GST_VIDEO_WIDGET (object); + + switch (prop_id) { + case ARG_SCALE_FACTOR: + vw->scale_factor = g_value_get_float (value); + vw->scale_override = TRUE; + gtk_widget_queue_resize (GTK_WIDGET(vw)); + break; + case ARG_VISIBLE_CURSOR: + vw->cursor_visible = g_value_get_boolean (value); + gst_video_widget_update_cursor (vw); + break; + case ARG_LOGO_FOCUSED: + vw->logo_focused = g_value_get_boolean (value); + gst_video_widget_reorder_windows (vw); + break; + case ARG_EVENT_CATCHER: + vw->event_catcher = g_value_get_boolean (value); + gst_video_widget_reorder_windows (vw); + break; + case ARG_XID: + gst_video_widget_set_xembed_xid (vw, g_value_get_ulong(value)); + break; + case ARG_SOURCE_WIDTH: + vw->source_width = g_value_get_int (value); + break; + case ARG_SOURCE_HEIGHT: + vw->source_height = g_value_get_int (value); + break; + case ARG_LOGO: + { + GdkPixbuf *image; + + image = (GdkPixbuf*) g_value_get_object (value); + + gst_video_widget_set_logo (vw, image); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstVideoWidget methods to get properties */ + +static void +gst_video_widget_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GstVideoWidget *vw; + + g_return_if_fail (object != NULL); + + vw = GST_VIDEO_WIDGET (object); + + switch (prop_id) { + case ARG_SCALE_FACTOR: + g_value_set_float (value, vw->scale_factor); + break; + case ARG_VISIBLE_CURSOR: + g_value_set_boolean (value, vw->cursor_visible); + break; + case ARG_LOGO_FOCUSED: + g_value_set_boolean (value, vw->logo_focused); + break; + case ARG_EVENT_CATCHER: + g_value_set_boolean (value, vw->event_catcher); + break; + case ARG_XID: + g_value_set_ulong (value, vw->xembed_xid); + break; + case ARG_SOURCE_WIDTH: + g_value_set_int (value, vw->source_width); + break; + case ARG_SOURCE_HEIGHT: + g_value_set_int (value, vw->source_height); + break; + case ARG_LOGO: + g_value_set_object (value, + (GObject*) vw->logo_pixbuf); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* =========================================== */ +/* */ +/* Init & Class init */ +/* */ +/* =========================================== */ + +/* Class initialization for GstVideoWidget */ + +static void +gst_video_widget_class_init (GstVideoWidgetClass *klass) +{ + GObjectClass *gobject_class; + GtkWidgetClass *widget_class; + + gobject_class = (GObjectClass*) klass; + widget_class = (GtkWidgetClass*) klass; + + parent_class = gtk_type_class (gtk_widget_get_type ()); + + gobject_class->set_property = gst_video_widget_set_property; + gobject_class->get_property = gst_video_widget_get_property; + + g_object_class_install_property ( + gobject_class, + ARG_SCALE_FACTOR, + g_param_spec_float ( + "scale_factor", + "scale factor", + "size the video should be scaled to", + 0, G_MAXFLOAT / G_MAXINT, 1, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_VISIBLE_CURSOR, + g_param_spec_boolean ( + "visible_cursor", + "visible cursor", + "Is the mouse pointer (cursor) visible or not", + TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_LOGO_FOCUSED, + g_param_spec_boolean ( + "logo_focused", + "logo is focused", + "Is the logo focused or not", + TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_EVENT_CATCHER, + g_param_spec_boolean ( + "event_catcher", + "Event catcher", + "Should the widget catch events over the video window", + TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_XID, + g_param_spec_ulong ( + "video_xid", + "video window xid", + "Video playback Xwindow XID", + 0, G_MAXLONG, 1, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_SOURCE_WIDTH, + g_param_spec_int ( + "source_width", + "video source width", + "Video playback source width", + 0, G_MAXINT, 1, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_SOURCE_HEIGHT, + g_param_spec_int ( + "source_height", + "video source height", + "Video playback source height", + 0, G_MAXINT, 1, G_PARAM_READWRITE)); + + g_object_class_install_property ( + gobject_class, + ARG_LOGO, + g_param_spec_object ( + "logo", + "Logo", + "Picture that should appear as a logo when no video", + gdk_pixbuf_get_type (), G_PARAM_READWRITE)); + + widget_class->realize = gst_video_widget_realize; + widget_class->unrealize = gst_video_widget_unrealize; + widget_class->expose_event = gst_video_widget_expose; + widget_class->size_request = gst_video_widget_size_request; + widget_class->size_allocate = gst_video_widget_allocate; + +} + +/* Initing our widget */ + +static void +gst_video_widget_init (GstVideoWidget *vw) +{ + + GTK_WIDGET_SET_FLAGS (GTK_WIDGET(vw), GTK_CAN_FOCUS); + + vw->source_width = 0; + vw->source_height = 0; +/* vw->x_align = 0.5; + vw->y_align = 0.5; */ + vw->scale_factor = 1.0; + vw->scale_override = FALSE; + vw->cursor_visible = TRUE; + vw->event_catcher = TRUE; + vw->logo_focused = TRUE; + vw->event_window = NULL; + vw->video_window = NULL; + vw->logo_pixbuf = NULL; +} + +/* ============================================================= */ +/* */ +/* Public Methods */ +/* */ +/* ============================================================= */ + +gboolean +gst_video_widget_get_xv_support (GstVideoWidget *vw) +{ +#ifdef HAVE_XVIDEO + Display *display = XOpenDisplay(NULL); + gint ver, rel, req, ev, err; + + if (display == NULL) + return FALSE; + + if (Success == XvQueryExtension(display,&ver,&rel,&req,&ev,&err)) { + return TRUE; + } +#endif /* HAVE_XVIDEO */ + return FALSE; +} + /** * gst_video_widget_set_xembed_xid: * @vw: a #GstVideoWidget @@ -869,166 +1017,50 @@ return vw->logo_pixbuf; } -/* GstVideoWidget methods to set properties */ - -static void -gst_video_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - GstVideoWidget *vw; - - g_return_if_fail (object != NULL); - - vw = GST_VIDEO_WIDGET (object); - - switch (prop_id) { - case ARG_SCALE_FACTOR: - vw->scale_factor = g_value_get_float (value); - vw->scale_override = TRUE; - gtk_widget_queue_resize (GTK_WIDGET(vw)); - break; - case ARG_VISIBLE_CURSOR: - vw->cursor_visible = g_value_get_boolean (value); - gst_video_widget_update_cursor (vw); - break; - case ARG_LOGO_FOCUSED: - vw->logo_focused = g_value_get_boolean (value); - gst_video_widget_reorder_windows (vw); - break; - case ARG_EVENT_CATCHER: - vw->event_catcher = g_value_get_boolean (value); - gst_video_widget_reorder_windows (vw); - break; - case ARG_XID: - gst_video_widget_set_xembed_xid (vw, g_value_get_ulong(value)); - break; - case ARG_SOURCE_WIDTH: - vw->source_width = g_value_get_int (value); - break; - case ARG_SOURCE_HEIGHT: - vw->source_height = g_value_get_int (value); - break; - case ARG_LOGO: - { - GdkPixbuf *image; - - image = (GdkPixbuf*) g_value_get_object (value); - - gst_video_widget_set_logo (vw, image); - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} +/* =========================================== */ +/* */ +/* Widget typing & Creation */ +/* */ +/* =========================================== */ -/* GstVideoWidget methods to get properties */ +/* Get type function for GstVideoWidget */ -static void -gst_video_widget_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +GtkType +gst_video_widget_get_type (void) { - GstVideoWidget *vw; - - g_return_if_fail (object != NULL); - - vw = GST_VIDEO_WIDGET (object); + static GtkType vw_type = 0; - switch (prop_id) { - case ARG_SCALE_FACTOR: - g_value_set_float (value, vw->scale_factor); - break; - case ARG_VISIBLE_CURSOR: - g_value_set_boolean (value, vw->cursor_visible); - break; - case ARG_LOGO_FOCUSED: - g_value_set_boolean (value, vw->logo_focused); - break; - case ARG_EVENT_CATCHER: - g_value_set_boolean (value, vw->event_catcher); - break; - case ARG_XID: - g_value_set_ulong (value, vw->xembed_xid); - break; - case ARG_SOURCE_WIDTH: - g_value_set_int (value, vw->source_width); - break; - case ARG_SOURCE_HEIGHT: - g_value_set_int (value, vw->source_height); - break; - case ARG_LOGO: - g_value_set_object (value, - (GObject*) vw->logo_pixbuf); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + if (!vw_type) { + static const GtkTypeInfo vw_info = { + "GstVideoWidget", + sizeof (GstVideoWidget), + sizeof (GstVideoWidgetClass), + (GtkClassInitFunc) gst_video_widget_class_init, + (GtkObjectInitFunc) gst_video_widget_init, + NULL, + NULL, + (GtkClassInitFunc)NULL, + }; + vw_type = gtk_type_unique (gtk_widget_get_type (), &vw_info); } + return vw_type; } -/* Method updating cursor status depending on widget flag */ -static void -gst_video_widget_update_cursor (GstVideoWidget *vw) +/** + * gst_video_widget_new: + * + * Create a new empty #GstVideoWidget. + * + * Return value: the new #GstVideoWidget. + **/ +GtkWidget * +gst_video_widget_new (void) { - GtkWidget *widget; - - g_return_if_fail(vw != NULL); - g_return_if_fail(GST_IS_VIDEO_WIDGET(vw)); - - widget = GTK_WIDGET (vw); - - if (vw->cursor_visible) - gdk_window_set_cursor (widget->window, NULL); - else { + GstVideoWidget *widget = g_object_new (GST_TYPE_VIDEO_WIDGET, NULL); - GdkBitmap *empty_bitmap; - GdkColor useless; - GdkCursor *cursor; - char invisible_cursor_bits[] = { 0x0 }; - - useless.red = useless.green = useless.blue = useless.pixel = 0; - - empty_bitmap = gdk_bitmap_create_from_data ( widget->window, - invisible_cursor_bits, - 1, 1); - - cursor = gdk_cursor_new_from_pixmap ( empty_bitmap, - empty_bitmap, - &useless, - &useless, 0, 0); - - gdk_window_set_cursor (widget->window, cursor); - - gdk_cursor_unref (cursor); - - g_object_unref (empty_bitmap); - } + return GTK_WIDGET(widget); } -/* - * Method reordering event window and video window - * depending on event_catcher flag - */ -static void -gst_video_widget_reorder_windows (GstVideoWidget *vw) -{ - g_return_if_fail(vw != NULL); - g_return_if_fail(GST_IS_VIDEO_WIDGET(vw)); - - if (vw->event_catcher) { - if (GDK_IS_WINDOW(vw->event_window)) - gdk_window_raise(vw->event_window); - } - else { - if (GDK_IS_WINDOW(vw->video_window)) - gdk_window_raise(vw->video_window); - } - - if ( (vw->logo_focused) && (GDK_IS_WINDOW(vw->video_window)) ) { - gdk_window_hide(vw->video_window); - } - else if ( (!vw->logo_focused) && (GDK_IS_WINDOW(vw->video_window)) ) { - gdk_window_show(vw->video_window); - } -} + |
From: Julien M. <do...@us...> - 2003-03-29 20:59:00
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Sat Mar 29 2003 12:58:58 PST Log message: using new gst-gconf function for rendering visualisation plugin Implemented a first metadata manager in command line output Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.101&r2=1.102 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.101 retrieving revision 1.102 diff -u -d -r1.101 -r1.102 --- gstmediaplay.c 3 Mar 2003 18:34:32 -0000 1.101 +++ gstmediaplay.c 29 Mar 2003 20:58:45 -0000 1.102 @@ -524,6 +524,36 @@ } } +static void +gst_media_play_information ( GstPlay *play, + GstElement* element, + GParamSpec *param, + GstMediaPlay *mplay) +{ + GValue value = { 0, }; + GstCaps *metadata; + GstProps *props; + GList *p; + + if (strcmp (param->name, "metadata") == 0) { + g_message ("got metadata"); + g_value_init (&value, param->value_type); + g_object_get_property (G_OBJECT (element), param->name, &value); + metadata = g_value_peek_pointer (&value); + props = gst_caps_get_props (metadata); + p = props->properties; + while (p) { + const gchar *name; + const gchar *val; + GstPropsEntry *entry = (GstPropsEntry *) p->data; + name = gst_props_entry_get_name (entry); + gst_props_entry_get_string (entry, &val); + g_message ("%s = %s", name, val); + p = g_list_next (p); + } + } +} + /* =========================================== */ /* */ /* Init & Class init */ @@ -705,7 +735,7 @@ vis_queue = gst_element_factory_make ("queue", "vis_queue"); audio_queue = gst_element_factory_make ("queue", "audio_queue"); tee_element = gst_element_factory_make ("tee", "audio_tee"); - goom_element = gst_element_factory_make ("goom", "visual_filter"); + goom_element = gst_gconf_get_default_visualisation_element (); colorspace_element = gst_element_factory_make ("colorspace", "colorspace"); visual_video_sink = gst_gconf_get_default_video_sink (); @@ -780,6 +810,8 @@ g_signal_connect (G_OBJECT (mplay->play), "stream_end", G_CALLBACK (gst_media_play_stream_end), mplay); + g_signal_connect (G_OBJECT (mplay->play), "information", + G_CALLBACK (gst_media_play_information), mplay); g_signal_connect (G_OBJECT (mplay->play), "time_tick", G_CALLBACK (gst_media_play_time_tick), mplay); g_signal_connect (G_OBJECT (mplay->play), "stream_length", |
From: Julien M. <do...@us...> - 2003-03-29 21:04:41
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Sat Mar 29 2003 13:04:39 PST Log message: Changed some variables names and removed some debug messages Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.102&r2=1.103 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.102 retrieving revision 1.103 diff -u -d -r1.102 -r1.103 --- gstmediaplay.c 29 Mar 2003 20:58:45 -0000 1.102 +++ gstmediaplay.c 29 Mar 2003 21:04:24 -0000 1.103 @@ -302,7 +302,6 @@ g_return_if_fail(mplay != NULL); g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); - g_message ("app size is : %d,%d", GTK_WIDGET(mplay->video_widget)->allocation.width, GTK_WIDGET(mplay->video_widget)->allocation.height); if ( (mplay->video_widget) && (!mplay->media_has_video) ) { width = GTK_WIDGET(mplay->video_widget)->allocation.width; height = GTK_WIDGET(mplay->video_widget)->allocation.height; @@ -667,7 +666,7 @@ gst_media_play_init (GstMediaPlay *mplay) { GstElement *audio_sink, *video_sink; - GstElement *tee_element, *goom_element, *colorspace_element; + GstElement *tee_element, *visualisation_element, *colorspace_element; GstElement *vis_thread, *audio_thread, *vis_player_bin; GstElement *visual_video_sink, *visual_video_sink_element; GstElement *vis_queue, * audio_queue; @@ -718,7 +717,7 @@ /* Creating this bin - { queue ! goom ! colorspace ! video_sink } + { queue ! visualisation_element ! colorspace ! video_sink } / tee \ @@ -735,7 +734,7 @@ vis_queue = gst_element_factory_make ("queue", "vis_queue"); audio_queue = gst_element_factory_make ("queue", "audio_queue"); tee_element = gst_element_factory_make ("tee", "audio_tee"); - goom_element = gst_gconf_get_default_visualisation_element (); + visualisation_element = gst_gconf_get_default_visualisation_element (); colorspace_element = gst_element_factory_make ("colorspace", "colorspace"); visual_video_sink = gst_gconf_get_default_video_sink (); @@ -747,8 +746,8 @@ g_hash_table_insert(mplay->vis_elements, "audio_queue", audio_queue); g_return_if_fail(GST_IS_ELEMENT(tee_element)); g_hash_table_insert(mplay->vis_elements, "audio_tee", tee_element); - g_return_if_fail(GST_IS_ELEMENT(goom_element)); - g_hash_table_insert(mplay->vis_elements, "visual_filter", goom_element); + g_return_if_fail(GST_IS_ELEMENT(visualisation_element)); + g_hash_table_insert(mplay->vis_elements, "visual_filter", visualisation_element); g_return_if_fail(GST_IS_ELEMENT(colorspace_element)); g_hash_table_insert(mplay->vis_elements, "colorspace", colorspace_element); g_return_if_fail(GST_IS_ELEMENT(visual_video_sink)); @@ -764,13 +763,13 @@ g_hash_table_insert(mplay->vis_pads, "audio_queue_pad", audio_queue_sink_pad); gst_pad_link (tee_audio_pad, audio_queue_sink_pad); - gst_element_link (vis_queue, goom_element); - gst_element_link (goom_element, colorspace_element); + gst_element_link (vis_queue, visualisation_element); + gst_element_link (visualisation_element, colorspace_element); gst_element_link (colorspace_element, visual_video_sink); gst_element_link (audio_queue, audio_sink); gst_bin_add_many ( - GST_BIN (vis_thread), vis_queue, goom_element, + GST_BIN (vis_thread), vis_queue, visualisation_element, colorspace_element, visual_video_sink, NULL); gst_bin_add_many ( GST_BIN (audio_thread), audio_queue, audio_sink, NULL); |
From: Julien M. <do...@us...> - 2003-04-02 21:38:39
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Apr 02 2003 13:38:32 PST Log message: Updating gst-player according to new libgstplay. Visualisation support transfered in the library Modified files: libs/gst/player : gstmediaplay.c gstmediaplay.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.103&r2=1.104 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.h.diff?r1=1.36&r2=1.37 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.103 retrieving revision 1.104 diff -u -d -r1.103 -r1.104 --- gstmediaplay.c 29 Mar 2003 21:04:24 -0000 1.103 +++ gstmediaplay.c 2 Apr 2003 21:38:17 -0000 1.104 @@ -390,9 +390,7 @@ gst_media_play_have_xid ( GstPlay *play, gint xid, GstMediaPlay *mplay) -{ - GstPad *tee_vis_pad, *vis_queue_sink_pad; - +{ g_return_if_fail(mplay != NULL); g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); @@ -400,10 +398,7 @@ /* Disconnecting goom */ - tee_vis_pad = g_hash_table_lookup(mplay->vis_pads, "tee_visual_pad"); - vis_queue_sink_pad = g_hash_table_lookup(mplay->vis_pads, "visual_queue_pad"); - - gst_pad_unlink (tee_vis_pad, vis_queue_sink_pad); + gst_play_connect_visualisation ( mplay->play, FALSE); if (mplay->video_widget) gst_video_widget_set_xembed_xid( @@ -665,18 +660,12 @@ static void gst_media_play_init (GstMediaPlay *mplay) { - GstElement *audio_sink, *video_sink; - GstElement *tee_element, *visualisation_element, *colorspace_element; - GstElement *vis_thread, *audio_thread, *vis_player_bin; - GstElement *visual_video_sink, *visual_video_sink_element; - GstElement *vis_queue, * audio_queue; - GstPad *vis_queue_sink_pad, *audio_queue_sink_pad; - GstPad *tee_vis_pad, *tee_audio_pad; + GstElement *audio_sink, *video_sink, *vis_video_sink, *vis_element; GError *error = NULL; gchar *logo_path = NULL; /* play object */ - mplay->play = gst_play_new (GST_PLAY_PIPE_VIDEO, &error); + mplay->play = gst_play_new (GST_PLAY_PIPE_VIDEO_VISUALISATION, &error); if (error != NULL) { gst_media_error_dialog (error->message); @@ -685,11 +674,6 @@ g_return_if_fail(mplay->play != NULL); - /* Creating a Hash table which will hold our elements */ - - mplay->vis_elements = g_hash_table_new(g_str_hash, g_str_equal); - mplay->vis_pads = g_hash_table_new(g_str_hash, g_str_equal); - audio_sink = gst_gconf_get_default_audio_sink (); if (!GST_IS_ELEMENT (audio_sink)) @@ -703,8 +687,9 @@ } video_sink = gst_gconf_get_default_video_sink (); - - if (!GST_IS_ELEMENT (video_sink)) + vis_video_sink = gst_gconf_get_default_video_sink (); + + if (!GST_IS_ELEMENT (video_sink) || !GST_IS_ELEMENT (vis_video_sink)) { gst_media_error_dialog ( "Could not render default GStreamer video output sink " @@ -713,98 +698,20 @@ ); return; } - gst_play_set_video_sink (mplay->play, video_sink); - - /* Creating this bin - { queue ! visualisation_element ! colorspace ! video_sink } - / -tee - \ - { queue ! audio_sink } - */ - - - vis_thread = gst_thread_new ("vis_thread"); - g_return_if_fail (GST_IS_THREAD (vis_thread)); - audio_thread = gst_thread_new ("audio_thread"); - g_return_if_fail (GST_IS_THREAD (audio_thread)); - - vis_player_bin = gst_element_factory_make ("bin", "vis_player_bin"); - vis_queue = gst_element_factory_make ("queue", "vis_queue"); - audio_queue = gst_element_factory_make ("queue", "audio_queue"); - tee_element = gst_element_factory_make ("tee", "audio_tee"); - visualisation_element = gst_gconf_get_default_visualisation_element (); - colorspace_element = gst_element_factory_make ("colorspace", "colorspace"); - visual_video_sink = gst_gconf_get_default_video_sink (); - - g_return_if_fail(GST_IS_ELEMENT(vis_player_bin)); - g_hash_table_insert(mplay->vis_elements, "vis_player_bin", vis_player_bin); - g_return_if_fail(GST_IS_ELEMENT(vis_queue)); - g_hash_table_insert(mplay->vis_elements, "vis_queue", vis_queue); - g_return_if_fail(GST_IS_ELEMENT(audio_queue)); - g_hash_table_insert(mplay->vis_elements, "audio_queue", audio_queue); - g_return_if_fail(GST_IS_ELEMENT(tee_element)); - g_hash_table_insert(mplay->vis_elements, "audio_tee", tee_element); - g_return_if_fail(GST_IS_ELEMENT(visualisation_element)); - g_hash_table_insert(mplay->vis_elements, "visual_filter", visualisation_element); - g_return_if_fail(GST_IS_ELEMENT(colorspace_element)); - g_hash_table_insert(mplay->vis_elements, "colorspace", colorspace_element); - g_return_if_fail(GST_IS_ELEMENT(visual_video_sink)); - g_hash_table_insert(mplay->vis_elements, "visual_sink", visual_video_sink); - - tee_vis_pad = gst_element_get_request_pad (tee_element, "src%d"); - g_hash_table_insert(mplay->vis_pads, "tee_visual_pad", tee_vis_pad); - tee_audio_pad = gst_element_get_request_pad (tee_element, "src%d"); - g_hash_table_insert(mplay->vis_pads, "tee_audio_pad", tee_audio_pad); - vis_queue_sink_pad = gst_element_get_pad (vis_queue, "sink"); - g_hash_table_insert(mplay->vis_pads, "visual_queue_pad", vis_queue_sink_pad); - audio_queue_sink_pad = gst_element_get_pad (audio_queue, "sink"); - g_hash_table_insert(mplay->vis_pads, "audio_queue_pad", audio_queue_sink_pad); - - gst_pad_link (tee_audio_pad, audio_queue_sink_pad); - gst_element_link (vis_queue, visualisation_element); - gst_element_link (visualisation_element, colorspace_element); - gst_element_link (colorspace_element, visual_video_sink); - gst_element_link (audio_queue, audio_sink); - - gst_bin_add_many ( - GST_BIN (vis_thread), vis_queue, visualisation_element, - colorspace_element, visual_video_sink, NULL); - gst_bin_add_many ( - GST_BIN (audio_thread), audio_queue, audio_sink, NULL); - gst_bin_add_many ( - GST_BIN (vis_player_bin), tee_element, - vis_thread, audio_thread, NULL); - - gst_element_add_ghost_pad ( vis_player_bin, - gst_element_get_pad (tee_element, "sink"), - "sink"); - - gst_play_set_audio_sink (mplay->play, vis_player_bin); - - /* gst_play_set_audio_sink (mplay->play, audio_sink); */ + vis_element = gst_gconf_get_default_visualisation_element (); - /* Connecting a callback for the xwindow of the visualisation */ + gst_play_set_video_sink (mplay->play, video_sink); + + gst_play_set_audio_sink (mplay->play, audio_sink); - visual_video_sink_element = gst_play_get_sink_element ( - mplay->play, - visual_video_sink, - GST_PLAY_SINK_TYPE_VIDEO); + gst_play_set_visualisation_video_sink (mplay->play, vis_video_sink); - g_hash_table_insert( mplay->vis_elements, - "visual_sink_element", - visual_video_sink_element); + gst_play_set_visualisation_element (mplay->play, vis_element); mplay->media_has_video = FALSE; - - g_object_set( G_OBJECT(visual_video_sink_element), - "need_new_window", - TRUE, - "toplevel", - FALSE, NULL); - - g_signal_connect (G_OBJECT (visual_video_sink_element), "have_xid", + + g_signal_connect (G_OBJECT (mplay->play), "have_vis_xid", G_CALLBACK (gst_media_play_have_vis_window), mplay); g_signal_connect (G_OBJECT (mplay->play), "stream_end", @@ -1141,8 +1048,7 @@ gst_media_play_set_location (GstMediaPlay *mplay, const gchar *location) { GnomeVFSFileInfo info; - GstElement *datasrc = NULL, *visual_sink_element; - GstPad *tee_vis_pad, *vis_queue_sink_pad; + GstElement *datasrc = NULL; g_return_if_fail(GST_IS_MEDIA_PLAY(mplay)); g_return_if_fail(location != NULL); @@ -1157,20 +1063,7 @@ /* Connecting goom */ - tee_vis_pad = g_hash_table_lookup( mplay->vis_pads, - "tee_visual_pad"); - vis_queue_sink_pad = g_hash_table_lookup( mplay->vis_pads, - "visual_queue_pad"); - - gst_pad_link (tee_vis_pad, vis_queue_sink_pad); - - visual_sink_element = g_hash_table_lookup( mplay->vis_elements, - "visual_sink_element"); - - if (GST_IS_ELEMENT(visual_sink_element)){ - g_object_set( G_OBJECT(visual_sink_element), - "need_new_window", TRUE, NULL); - } + gst_play_connect_visualisation ( mplay->play, TRUE); gst_play_need_new_video_window ( mplay->play); Index: gstmediaplay.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.h,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- gstmediaplay.h 3 Mar 2003 18:34:37 -0000 1.36 +++ gstmediaplay.h 2 Apr 2003 21:38:18 -0000 1.37 @@ -69,8 +69,6 @@ const gchar *location_short; gint64 length_nanos; - GHashTable *vis_elements; - GHashTable *vis_pads; gboolean media_has_video; GstMediaPlayMode display_mode; |
From: Julien M. <do...@us...> - 2003-04-02 22:14:32
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Wed Apr 02 2003 14:14:30 PST Log message: Yahhh now it builds... sorry :) Modified files: libs/gst/player : gstmediaplay.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstmediaplay.c.diff?r1=1.104&r2=1.105 ====Begin Diffs==== Index: gstmediaplay.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v retrieving revision 1.104 retrieving revision 1.105 diff -u -d -r1.104 -r1.105 --- gstmediaplay.c 2 Apr 2003 21:38:17 -0000 1.104 +++ gstmediaplay.c 2 Apr 2003 22:14:09 -0000 1.105 @@ -592,16 +592,6 @@ mplay->control = NULL; } - if (mplay->vis_elements) { - g_hash_table_destroy (mplay->vis_elements); - mplay->vis_elements = NULL; - } - - if (mplay->vis_pads) { - g_hash_table_destroy (mplay->vis_pads); - mplay->vis_pads = NULL; - } - if (mplay->play) { g_object_unref (mplay->play); mplay->play = NULL; |
From: Julien M. <do...@us...> - 2003-04-05 20:24:16
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: dolphy Date: Sat Apr 05 2003 12:24:15 PST Log message: Fixed a problem when cursor was set to invisible before widget got realized Modified files: libs/gst/player : gstvideowidget.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/player/gstvideowidget.c.diff?r1=1.19&r2=1.20 ====Begin Diffs==== Index: gstvideowidget.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstvideowidget.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstvideowidget.c 29 Mar 2003 16:02:40 -0000 1.19 +++ gstvideowidget.c 5 Apr 2003 20:24:03 -0000 1.20 @@ -64,7 +64,10 @@ widget = GTK_WIDGET (vw); - if (vw->cursor_visible) + if (widget->window == NULL) + return; + + if (vw->cursor_visible) gdk_window_set_cursor (widget->window, NULL); else { @@ -183,6 +186,8 @@ gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); + gst_video_widget_update_cursor (vw); + } /* Unrealizing GstVideoWidget */ @@ -658,23 +663,6 @@ /* Public Methods */ /* */ /* ============================================================= */ - -gboolean -gst_video_widget_get_xv_support (GstVideoWidget *vw) -{ -#ifdef HAVE_XVIDEO - Display *display = XOpenDisplay(NULL); - gint ver, rel, req, ev, err; - - if (display == NULL) - return FALSE; - - if (Success == XvQueryExtension(display,&ver,&rel,&req,&ev,&err)) { - return TRUE; - } -#endif /* HAVE_XVIDEO */ - return FALSE; -} /** * gst_video_widget_set_xembed_xid: |