Don't try opening error dialogues from the GL thread.
authorCarl Hetherington <cth@carlh.net>
Wed, 20 Nov 2019 21:18:33 +0000 (22:18 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 8 Jan 2020 20:56:47 +0000 (21:56 +0100)
src/wx/gl_video_view.cc
src/wx/gl_video_view.h
src/wx/simple_video_view.cc
src/wx/video_view.cc

index a1be8ca..836b3eb 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)
 {
index a9264f0..6143930 100644 (file)
@@ -55,6 +55,7 @@ private:
        void thread ();
        void request_one_shot ();
        void create ();
+       void check_for_butler_errors ();
 
        wxGLCanvas* _canvas;
        wxGLContext* _context;
@@ -68,4 +69,6 @@ private:
        boost::condition _playing_condition;
        bool _playing;
        bool _one_shot;
+
+       boost::shared_ptr<wxTimer> _timer;
 };
index 7aeb317..f928770 100644 (file)
@@ -194,6 +194,12 @@ SimpleVideoView::display_next_frame (bool non_blocking)
 
        display_player_video ();
 
+       try {
+               _viewer->butler()->rethrow ();
+       } catch (DecodeError& e) {
+               error_dialog (get(), e.what());
+       }
+
        return true;
 }
 
index f8d44dc..ede0708 100644 (file)
@@ -59,13 +59,6 @@ VideoView::get_next_frame (bool non_blocking)
                _player_video.first->eyes() != EYES_BOTH
                );
 
-       /* XXX_b: this is called from the GL thread so it shouldn't be opening error dialogs */
-       try {
-               _viewer->butler()->rethrow ();
-       } catch (DecodeError& e) {
-               error_dialog (get(), e.what());
-       }
-
        return true;
 }