Don't try opening error dialogues from the GL thread.
[dcpomatic.git] / src / wx / gl_video_view.cc
index a1be8ca301816f77e5b3e52017e0452d4a70d0de..836b3eb351584b790e9c6f077c4e090b3d73277a 100644 (file)
 
 #include "gl_video_view.h"
 #include "film_viewer.h"
+#include "wx_util.h"
 #include "lib/image.h"
 #include "lib/dcpomatic_assert.h"
 #include "lib/exceptions.h"
 #include "lib/cross.h"
 #include "lib/player_video.h"
+#include "lib/butler.h"
 #include <boost/bind.hpp>
 #include <iostream>
 
@@ -63,6 +65,10 @@ GLVideoView::GLVideoView (FilmViewer* viewer, wxWindow *parent)
        _canvas->Bind (wxEVT_SIZE, boost::bind(boost::ref(Sized)));
        _canvas->Bind (wxEVT_CREATE, boost::bind(&GLVideoView::create, this));
 
+       _canvas->Bind (wxEVT_TIMER, boost::bind(&GLVideoView::check_for_butler_errors, this));
+       _timer.reset (new wxTimer(_canvas));
+       _timer->Start (2000);
+
 #if defined(DCPOMATIC_LINUX) && defined(DCPOMATIC_HAVE_GLX_SWAP_INTERVAL_EXT)
        if (_canvas->IsExtensionSupported("GLX_EXT_swap_control")) {
                /* Enable vsync */
@@ -105,6 +111,16 @@ GLVideoView::~GLVideoView ()
        glDeleteTextures (1, &_id);
 }
 
+void
+GLVideoView::check_for_butler_errors ()
+{
+       try {
+               _viewer->butler()->rethrow ();
+       } catch (DecodeError& e) {
+               error_dialog (get(), e.what());
+       }
+}
+
 static void
 check_gl_error (char const * last)
 {