X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/670f9935630beb2123a5ca62894ae92a3f0efa4f..9d5507f7a2701395e1d5c121bd877bb9066ee6ea:/src/unix/mediactrl.cpp diff --git a/src/unix/mediactrl.cpp b/src/unix/mediactrl.cpp index 8d4cde3400..2a333c3818 100644 --- a/src/unix/mediactrl.cpp +++ b/src/unix/mediactrl.cpp @@ -31,13 +31,14 @@ #ifndef WX_PRECOMP #include "wx/log.h" // wxLogDebug/wxLogSysError/wxLogTrace #include "wx/app.h" // wxTheApp->argc, wxTheApp->argv + #include "wx/timer.h" // wxTimer #endif #include "wx/thread.h" // wxMutex/wxMutexLocker -#include "wx/timer.h" // wxTimer #ifdef __WXGTK__ -# include "wx/gtk/win_gtk.h" // for /GDK_WINDOW_XWINDOW + #include +# include // for GDK_WINDOW_XWINDOW #endif //----------------------------------------------------------------------------- @@ -127,28 +128,6 @@ // Max wait time for element state waiting - GST_CLOCK_TIME_NONE for inf #define wxGSTREAMER_TIMEOUT (100 * GST_MSECOND) // Max 100 milliseconds -//----------------------------------------------------------------------------- -// wxGTK Debugging and idle stuff -//----------------------------------------------------------------------------- -#ifdef __WXGTK__ - -# ifdef __WXDEBUG__ -# if wxUSE_THREADS -# define DEBUG_MAIN_THREAD \ - if (wxThread::IsMain() && g_mainThreadLocked) \ - wxPrintf(wxT("gui reentrance")); -# else -# define DEBUG_MAIN_THREAD -# endif -# else -# define DEBUG_MAIN_THREAD -# endif // Debug - -extern void wxapp_install_idle_handler(); -extern bool g_isIdle; -extern bool g_mainThreadLocked; -#endif // wxGTK - //----------------------------------------------------------------------------- // wxLogTrace mask string //----------------------------------------------------------------------------- @@ -165,7 +144,7 @@ class WXDLLIMPEXP_MEDIA public: wxGStreamerMediaBackend(); - ~wxGStreamerMediaBackend(); + virtual ~wxGStreamerMediaBackend(); virtual bool CreateControl(wxControl* ctrl, wxWindow* parent, wxWindowID id, @@ -279,7 +258,7 @@ static gboolean gtk_window_expose_callback(GtkWidget *widget, if(event->count > 0) return FALSE; - GdkWindow *window = GTK_PIZZA(be->GetControl()->m_wxwindow)->bin_window; + GdkWindow *window = widget->window; // I've seen this reccommended somewhere... // TODO: Is this needed? Maybe it is just cruft... @@ -317,18 +296,12 @@ static gboolean gtk_window_expose_callback(GtkWidget *widget, //----------------------------------------------------------------------------- #ifdef __WXGTK__ extern "C" { -static gint gtk_window_realize_callback(GtkWidget* theWidget, +static gint gtk_window_realize_callback(GtkWidget* widget, wxGStreamerMediaBackend* be) { - DEBUG_MAIN_THREAD // TODO: Is this neccessary? - - if (g_isIdle) // FIXME: Why is needed? For wxYield? ?? - wxapp_install_idle_handler(); - - wxYield(); // FIXME: RN: X Server gets an error/crash if I don't do - // this or a messagebox beforehand?!?!?? - - GdkWindow *window = GTK_PIZZA(theWidget)->bin_window; + gdk_flush(); + + GdkWindow *window = widget->window; wxASSERT(window); gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay), @@ -731,8 +704,9 @@ void wxGStreamerMediaBackend::SetupXOverlay() } else { - wxYield(); // see realize callback... - GdkWindow *window = GTK_PIZZA(m_ctrl->m_wxwindow)->bin_window; + gdk_flush(); + + GdkWindow *window = m_ctrl->m_wxwindow->window; wxASSERT(window); #endif @@ -912,7 +886,7 @@ bool wxGStreamerMediaBackend::TryVideoSink(GstElement* videosink) // // Called when the media is about to stop //----------------------------------------------------------------------------- -void wxGStreamerMediaEventHandler::OnMediaFinish(wxMediaEvent& event) +void wxGStreamerMediaEventHandler::OnMediaFinish(wxMediaEvent& WXUNUSED(event)) { // (RN - I have no idea why I thought this was good behaviour.... // maybe it made sense for streaming/nonseeking data but @@ -954,7 +928,8 @@ void wxGStreamerMediaEventHandler::OnMediaFinish(wxMediaEvent& event) // Sets m_playbin to NULL signifying we havn't loaded anything yet //----------------------------------------------------------------------------- wxGStreamerMediaBackend::wxGStreamerMediaBackend() - : m_playbin(NULL) + : m_playbin(NULL), + m_eventHandler(NULL) { } @@ -1001,7 +976,11 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, char **argvGST = new char*[wxTheApp->argc + 1]; for ( i = 0; i < wxTheApp->argc; i++ ) { +#if wxUSE_UNICODE_WCHAR argvGST[i] = wxStrdupA(wxConvUTF8.cWX2MB(wxTheApp->argv[i])); +#else + argvGST[i] = wxStrdupA(wxTheApp->argv[i].utf8_str()); +#endif } argvGST[wxTheApp->argc] = NULL; @@ -1070,9 +1049,6 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, // so it doesn't draw over the video and cause sporadic // disappearances of the video gtk_widget_set_double_buffered(m_ctrl->m_wxwindow, FALSE); - - // Tell GtkPizza not to clear the background - gtk_pizza_set_clear(GTK_PIZZA(m_ctrl->m_wxwindow), FALSE); #endif // don't erase the background of our control window @@ -1082,12 +1058,12 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, // Create our playbin object m_playbin = gst_element_factory_make ("playbin", "play"); if (!GST_IS_ELEMENT(m_playbin)) - { + { if(G_IS_OBJECT(m_playbin)) g_object_unref(m_playbin); wxLogSysError(wxT("Got an invalid playbin")); return false; - } + } #if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR < 10 // Connect the glib events/callbacks we want to our playbin @@ -1123,7 +1099,7 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, if( !TryAudioSink(audiosink) ) { wxLogSysError(wxT("Could not find a valid audiosink")); - return false; + return false; } } } @@ -1148,7 +1124,7 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, g_object_unref(audiosink); wxLogSysError(wxT("Could not find a suitable video sink")); return false; - } + } } } } @@ -1238,6 +1214,9 @@ bool wxGStreamerMediaBackend::DoLoad(const wxString& locstring) return false; } + // free current media resources + gst_element_set_state (m_playbin, GST_STATE_NULL); + // Make sure the passed URI is valid and tell playbin to load it // non-file uris are encoded wxASSERT(gst_uri_protocol_is_valid("file"));