void gtk_gst_base_widget_finalize (GObject * object) { GtkGstBaseWidget *widget = GTK_GST_BASE_WIDGET (object); gst_buffer_replace (&widget->pending_buffer, NULL); gst_buffer_replace (&widget->buffer, NULL); g_mutex_clear (&widget->lock); g_weak_ref_clear (&widget->element); if (widget->draw_id) g_source_remove (widget->draw_id); }
static gboolean gtk_gst_base_widget_motion_event (GtkWidget * widget, GdkEventMotion * event) { GtkGstBaseWidget *base_widget = GTK_GST_BASE_WIDGET (widget); GstElement *element; if ((element = g_weak_ref_get (&base_widget->element))) { if (GST_IS_NAVIGATION (element)) { gdouble x, y; _display_size_to_stream_size (base_widget, event->x, event->y, &x, &y); gst_navigation_send_mouse_event (GST_NAVIGATION (element), "mouse-move", 0, x, y); } g_object_unref (element); } return TRUE; }
static void gtk_gst_base_widget_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GtkGstBaseWidget *gtk_widget = GTK_GST_BASE_WIDGET (object); switch (prop_id) { case PROP_FORCE_ASPECT_RATIO: g_value_set_boolean (value, gtk_widget->force_aspect_ratio); break; case PROP_PIXEL_ASPECT_RATIO: gst_value_set_fraction (value, gtk_widget->par_n, gtk_widget->par_d); break; case PROP_IGNORE_ALPHA: g_value_set_boolean (value, gtk_widget->ignore_alpha); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static GtkGstBaseWidget * gst_gtk_base_sink_get_widget (GstGtkBaseSink * gtk_sink) { if (gtk_sink->widget != NULL) return gtk_sink->widget; /* Ensure GTK is initialized, this has no side effect if it was already * initialized. Also, we do that lazily, so the application can be first */ if (!gtk_init_check (NULL, NULL)) { GST_ERROR_OBJECT (gtk_sink, "Could not ensure GTK initialization."); return NULL; } g_assert (GST_GTK_BASE_SINK_GET_CLASS (gtk_sink)->create_widget); gtk_sink->widget = (GtkGstBaseWidget *) GST_GTK_BASE_SINK_GET_CLASS (gtk_sink)->create_widget (); gtk_sink->bind_aspect_ratio = g_object_bind_property (gtk_sink, "force-aspect-ratio", gtk_sink->widget, "force-aspect-ratio", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); gtk_sink->bind_pixel_aspect_ratio = g_object_bind_property (gtk_sink, "pixel-aspect-ratio", gtk_sink->widget, "pixel-aspect-ratio", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); gtk_sink->bind_ignore_alpha = g_object_bind_property (gtk_sink, "ignore-alpha", gtk_sink->widget, "ignore-alpha", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); /* Take the floating ref, other wise the destruction of the container will * make this widget disapear possibly before we are done. */ gst_object_ref_sink (gtk_sink->widget); gtk_sink->widget_destroy_id = g_signal_connect (gtk_sink->widget, "destroy", G_CALLBACK (widget_destroy_cb), gtk_sink); /* back pointer */ gtk_gst_base_widget_set_element (GTK_GST_BASE_WIDGET (gtk_sink->widget), GST_ELEMENT (gtk_sink)); return gtk_sink->widget; }
static gboolean gtk_gst_base_widget_key_event (GtkWidget * widget, GdkEventKey * event) { GtkGstBaseWidget *base_widget = GTK_GST_BASE_WIDGET (widget); GstElement *element; if ((element = g_weak_ref_get (&base_widget->element))) { if (GST_IS_NAVIGATION (element)) { const gchar *str = _gdk_key_to_navigation_string (event->keyval); const gchar *key_type = event->type == GDK_KEY_PRESS ? "key-press" : "key-release"; if (!str) str = event->string; gst_navigation_send_key_event (GST_NAVIGATION (element), key_type, str); } g_object_unref (element); } return TRUE; }
static gboolean gtk_gst_base_widget_button_event (GtkWidget * widget, GdkEventButton * event) { GtkGstBaseWidget *base_widget = GTK_GST_BASE_WIDGET (widget); GstElement *element; if ((element = g_weak_ref_get (&base_widget->element))) { if (GST_IS_NAVIGATION (element)) { const gchar *key_type = event->type == GDK_BUTTON_PRESS ? "mouse-button-press" : "mouse-button-release"; gdouble x, y; _display_size_to_stream_size (base_widget, event->x, event->y, &x, &y); gst_navigation_send_mouse_event (GST_NAVIGATION (element), key_type, event->button, x, y); } g_object_unref (element); } return TRUE; }
static void gtk_gst_widget_init (GtkGstWidget * widget) { gtk_gst_base_widget_init (GTK_GST_BASE_WIDGET (widget)); }