add: bvw); g_signal_connect_after (G_OBJECT (bvw->priv->vw), "expose-event", G_CALLBACK (bacon_video_widget_vw_exposed),
context: bacon_video_widget_new (int width, int height,			gboolean null_out, GError ** err){  BaconVideoWidget *bvw;  GstElement *audio_sink = NULL, *video_sink = NULL;  bvw = BACON_VIDEO_WIDGET (g_object_new			    (bacon_video_widget_get_type (), NULL));  bvw->priv->media_device = g_strdup ("/dev/dvd");    bvw->priv->metadata_hash =    g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);  bvw->priv->play = gst_play_new (NULL);  bvw->priv->init_width = bvw->priv->init_height = 0;  //FIXME  if (*err != NULL)    {      g_message ("error: %s", (*err)->message);      return NULL;    }  audio_sink = gst_gconf_get_default_audio_sink ();  if (!GST_IS_ELEMENT (audio_sink))    {      g_message ("failed to render default audio sink from gconf");      return NULL;    }  video_sink = gst_gconf_get_default_video_sink ();  if (!GST_IS_ELEMENT (video_sink))    {      g_message ("failed to render default video sink from gconf");      return NULL;    }  gst_play_set_video_sink (bvw->priv->play, video_sink);  gst_play_set_audio_sink (bvw->priv->play, audio_sink);  bvw->priv->vis_plugins_list = NULL;  g_signal_connect (G_OBJECT (bvw->priv->play),		    "have_video_size", (GtkSignalFunc) got_video_size,		    (gpointer) bvw);    g_signal_connect (G_OBJECT (bvw->priv->play), "eos",		    (GtkSignalFunc) got_eos, (gpointer) bvw);  g_signal_connect (G_OBJECT (bvw->priv->play), "stream_length",		    (GtkSignalFunc) got_stream_length, (gpointer) bvw);  g_signal_connect (G_OBJECT (bvw->priv->play), "found_tag",		    (GtkSignalFunc) got_found_tag, (gpointer) bvw);  g_signal_connect (G_OBJECT (bvw->priv->play), "time_tick",		    (GtkSignalFunc) got_time_tick, (gpointer) bvw);  g_signal_connect (G_OBJECT (bvw->priv->play), "error",		    (GtkSignalFunc) got_error, (gpointer) bvw);  bvw->priv->vw = GST_VIDEO_WIDGET (gst_video_widget_new ());  if (!GST_IS_VIDEO_WIDGET (bvw->priv->vw))    {      g_message ("failed to create video widget");      return NULL;    }  /* VideoWidget signals */  g_signal_connect (G_OBJECT (bvw->priv->vw), "motion-notify-event",                    G_CALLBACK (bacon_video_widget_motion_notify_callback),                    bvw);  g_signal_connect (G_OBJECT(bvw->priv->vw), "button-press-event",                    G_CALLBACK (bacon_video_widget_button_press),                    bvw);  g_signal_connect (G_OBJECT(bvw->priv->vw), "button-release-event",                    G_CALLBACK (bacon_video_widget_button_release),                    bvw);      g_signal_connect_after (G_OBJECT (bvw->priv->vw), "size_allocate",                          G_CALLBACK (bacon_video_widget_vw_allocate),                          bvw);  g_signal_connect_after (G_OBJECT (bvw->priv->vw), "realize",                          G_CALLBACK (bacon_video_widget_vw_realized),                          bvw);      gtk_box_pack_end (GTK_BOX (bvw), GTK_WIDGET (bvw->priv->vw), TRUE, TRUE, 0);  gtk_widget_show (GTK_WIDGET (bvw->priv->vw));  /* We try to get an element supporting XOverlay interface */  if (GST_IS_BIN (bvw->priv->play)) {    GstElement *element = NULL;    GList *elements = NULL, *l_elements = NULL;        element = gst_bin_get_by_interface (GST_BIN (bvw->priv->play),                                        GST_TYPE_X_OVERLAY);    if (GST_IS_X_OVERLAY (element))      bvw->priv->xoverlay = GST_X_OVERLAY (element);        /* Get them all and prefer hardware one */    elements = gst_bin_get_all_by_interface (GST_BIN (bvw->priv->play),                                             GST_TYPE_COLOR_BALANCE);    l_elements = elements;        /* We take the first one */    if (elements && GST_IS_COLOR_BALANCE (elements->data))      element = GST_ELEMENT (elements->data);        while (elements)      {        GstElement *local_element = NULL;        GstColorBalanceClass *cb_class = NULL;                if (elements->data && GST_IS_COLOR_BALANCE (elements->data))          {            local_element = GST_ELEMENT (elements->data);            cb_class = GST_COLOR_BALANCE_GET_CLASS (elements->data);                    /* If one of them is hardware type we use that one then */            if (GST_COLOR_BALANCE_TYPE (cb_class) == GST_COLOR_BALANCE_HARDWARE)              {                element = local_element;              }          }                  elements = g_list_next (elements);      }        if (l_elements)      g_list_free (l_elements);        elements = l_elements = NULL;        if (GST_IS_COLOR_BALANCE (element))      {        bvw->priv->balance = GST_COLOR_BALANCE (element);      }          /* Get them all and prefer software one */    elements = gst_bin_get_all_by_interface (GST_BIN (bvw->priv->play),                                             GST_TYPE_MIXER);    l_elements = elements;        /* We take the first one */    if (elements && GST_IS_MIXER (elements->data))      element = GST_ELEMENT (elements->data);        while (elements)      {        GstElement *local_element = NULL;        GstMixerClass *m_class = NULL;                if (elements->data && GST_IS_MIXER (elements->data))          {            local_element = GST_ELEMENT (elements->data);            m_class = GST_MIXER_GET_CLASS (elements->data);                    /* If one of them is hardware type we use that one then */            if (GST_MIXER_TYPE (m_class) == GST_MIXER_SOFTWARE)              {                element = local_element;              }          }                  elements = g_list_next (elements);      }        if (l_elements)      g_list_free (l_elements);        elements = l_elements = NULL;        if (GST_IS_MIXER (element)) {      const GList *tracks;      bvw->priv->mixer = GST_MIXER (element);      tracks = gst_mixer_list_tracks (GST_MIXER (element));      if (tracks)        bvw->priv->mixer_track = GST_MIXER_TRACK (tracks->data);    }    else      g_warning ("can't find any mixer element, no volume.");  }    return GTK_WIDGET (bvw);}