]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/mediactrl.cpp
We don't use the old GtkCombo widget any more
[wxWidgets.git] / src / unix / mediactrl.cpp
index 8d4cde34009a0097199e624ae91d24b1c8f0826a..c3e72b52d1cd827be9bf5c5301feb3c72a48a96d 100644 (file)
 #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/gdkx.h>/GDK_WINDOW_XWINDOW
+    #include <gtk/gtk.h>
+#    include <gdk/gdkx.h>           // for GDK_WINDOW_XWINDOW
 #endif
 
 //-----------------------------------------------------------------------------
 #      define DEBUG_MAIN_THREAD
 #   endif // Debug
 
+#ifndef __WXGTK20__
 extern void wxapp_install_idle_handler();
 extern bool g_isIdle;
+#endif
 extern bool g_mainThreadLocked;
 #endif // wxGTK
 
@@ -165,7 +168,7 @@ class WXDLLIMPEXP_MEDIA
 public:
 
     wxGStreamerMediaBackend();
-    ~wxGStreamerMediaBackend();
+    virtual ~wxGStreamerMediaBackend();
 
     virtual bool CreateControl(wxControl* ctrl, wxWindow* parent,
                                      wxWindowID id,
@@ -279,7 +282,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 = be->GetControl()->GTKGetDrawingWindow();
 
     // I've seen this reccommended somewhere...
     // TODO: Is this needed? Maybe it is just cruft...
@@ -317,18 +320,20 @@ 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*,
                                         wxGStreamerMediaBackend* be)
 {
     DEBUG_MAIN_THREAD // TODO: Is this neccessary?
 
+#ifndef __WXGTK20__
     if (g_isIdle)   // FIXME: Why is needed? For wxYield? ??
         wxapp_install_idle_handler();
+#endif
 
     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;
+    GdkWindow *window = be->GetControl()->GTKGetDrawingWindow();
     wxASSERT(window);
 
     gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay),
@@ -732,7 +737,7 @@ void wxGStreamerMediaBackend::SetupXOverlay()
     else
     {
         wxYield(); // see realize callback...
-        GdkWindow *window = GTK_PIZZA(m_ctrl->m_wxwindow)->bin_window;
+        GdkWindow *window = m_ctrl->m_wxwindow->GTKGetDrawingWindow();
         wxASSERT(window);
 #endif
 
@@ -912,7 +917,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 +959,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)
 {
 }
 
@@ -1070,9 +1076,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 +1085,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 +1126,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 +1151,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 +1241,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"));