]> git.tdb.fi Git - xinema.git/blobdiff - source/xineengine.cpp
Pass expose events to Xine
[xinema.git] / source / xineengine.cpp
index 4175381b8d3a0a4b9f1782f9df00967a1b7121b4..656990e012ecbfafa7da5c0873ac9d350e35ecdb 100644 (file)
@@ -7,11 +7,12 @@
 using namespace std;
 using namespace Msp;
 
-XineEngine::XineEngine(const Graphics::Window &w, Mutex *m):
+XineEngine::XineEngine(Graphics::Window &w, Mutex *m):
        window(w),
        display_mutex(m),
        locked_thread(0),
-       lock_count(0)
+       lock_count(0),
+       pending_expose(0)
 {
        engine = xine_new();
 
@@ -44,6 +45,8 @@ XineEngine::XineEngine(const Graphics::Window &w, Mutex *m):
        video_driver = xine_open_video_driver(engine, "auto", XINE_VISUAL_TYPE_X11_2, &visual);
        if(!video_driver)
                throw runtime_error("Could not open video driver");
+
+       window.signal_expose.connect(sigc::mem_fun(this, &XineEngine::window_exposed));
 }
 
 XineEngine::~XineEngine()
@@ -53,6 +56,22 @@ XineEngine::~XineEngine()
        xine_exit(engine);
 }
 
+void XineEngine::tick()
+{
+       if(pending_expose)
+       {
+               xine_port_send_gui_data(video_driver, XINE_GUI_SEND_EXPOSE_EVENT, &pending_expose->xevent);
+               delete pending_expose;
+               pending_expose = 0;
+       }
+}
+
+void XineEngine::window_exposed(unsigned, unsigned, unsigned, unsigned, const Graphics::Window::Event &event)
+{
+       delete pending_expose;
+       pending_expose = new Graphics::Window::Event(event);
+}
+
 void XineEngine::dest_size_cb(void *user_data, int, int, double, int *dest_width, int *dest_height, double *dest_pixel_aspect)
 {
        XineEngine &engine = *reinterpret_cast<XineEngine *>(user_data);