]> git.sesse.net Git - vlc/commitdiff
Qt4: wait for VideoWidget::paintEvent
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Fri, 20 Jun 2008 18:39:06 +0000 (21:39 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Fri, 20 Jun 2008 18:39:27 +0000 (21:39 +0300)
This seems to solve the invalid handle problem, as pointed out by
Laurent. However, I get a poststamp-sized video output now...

modules/gui/qt4/components/interface_widgets.cpp
modules/gui/qt4/components/interface_widgets.hpp

index f31e75b8d826b3d9e876b9bdaf571c3a05929696..f702181090df449418d58d316e726e1e7a090233 100644 (file)
@@ -47,6 +47,7 @@
 #include <QPalette>
 #include <QResizeEvent>
 #include <QDate>
+#include <QMutexLocker>
 
 /**********************************************************************
  * Video Widget. A simple frame on which video is drawn
@@ -58,6 +59,7 @@ VideoWidget::VideoWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i )
     /* Init */
     vlc_mutex_init( &lock );
     p_vout = NULL;
+    handleReady = false;
     hide(); setMinimumSize( 16, 16 );
     videoSize.rwidth() = -1;
     videoSize.rheight() = -1;
@@ -80,6 +82,13 @@ VideoWidget::VideoWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i )
    // CONNECT( this, askResize( int, int ), this, SetSizing( int, int ) );
 }
 
+void VideoWidget::paintEvent(QPaintEvent *ev)
+{
+    QFrame::paintEvent(ev);
+    handleReady = true;
+    handleWait.wakeAll();
+}
+
 VideoWidget::~VideoWidget()
 {
     vlc_mutex_lock( &lock );
@@ -106,6 +115,7 @@ VideoWidget::~VideoWidget()
 void *VideoWidget::request( vout_thread_t *p_nvout, int *pi_x, int *pi_y,
                            unsigned int *pi_width, unsigned int *pi_height )
 {
+    QMutexLocker locker( &handleLock );
     msg_Dbg( p_intf, "Video was requested %i, %i", *pi_x, *pi_y );
     emit askVideoWidgetToShow();
     if( p_vout )
@@ -114,7 +124,12 @@ void *VideoWidget::request( vout_thread_t *p_nvout, int *pi_x, int *pi_y,
         return NULL;
     }
     p_vout = p_nvout;
-    msg_Dbg( p_intf, "embedded video handle %p", winId() );
+    while( !handleReady )
+    {
+        msg_Dbg( p_intf, "embedded video pending (handle %p)", winId() );
+        handleWait.wait( &handleLock );
+    }
+    msg_Dbg( p_intf, "embedded video ready (handle %p)", winId() );
     return ( void* )winId();
 }
 
index a64d266c4e369e7b30c6bfdf518670fcf42c19b5..f0b6586d125716541c197c74275ea85ef6f90951 100644 (file)
@@ -40,6 +40,8 @@
 
 #include <QWidget>
 #include <QFrame>
+#include <QMutex>
+#include <QWaitCondition>
 
 #define VOLUME_MAX 200
 
@@ -89,6 +91,9 @@ private:
 
     vlc_mutex_t lock;
     QSize videoSize;
+    QMutex         handleLock;
+    QWaitCondition handleWait;
+    bool           handleReady;
 
 signals:
     void askVideoWidgetToShow();
@@ -96,6 +101,9 @@ signals:
 
 public slots:
     void SetSizing( unsigned int, unsigned int );
+
+protected:
+    virtual void paintEvent(QPaintEvent *);
 };
 
 /******************** Background Widget ****************/