Commit 5ddebbf9 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Qt: emit video window resize events

parent b5087f21
...@@ -35,8 +35,6 @@ ...@@ -35,8 +35,6 @@
#include "menus.hpp" /* Popup menu on bgWidget */ #include "menus.hpp" /* Popup menu on bgWidget */
#include <vlc_vout.h>
#include <QLabel> #include <QLabel>
#include <QToolButton> #include <QToolButton>
#include <QPalette> #include <QPalette>
...@@ -64,6 +62,9 @@ ...@@ -64,6 +62,9 @@
#include <math.h> #include <math.h>
#include <assert.h> #include <assert.h>
#include <vlc_vout.h>
#include <vlc_vout_window.h>
/********************************************************************** /**********************************************************************
* Video Widget. A simple frame on which video is drawn * Video Widget. A simple frame on which video is drawn
* This class handles resize issues * This class handles resize issues
...@@ -78,6 +79,7 @@ VideoWidget::VideoWidget( intf_thread_t *_p_i ) ...@@ -78,6 +79,7 @@ VideoWidget::VideoWidget( intf_thread_t *_p_i )
layout = new QHBoxLayout( this ); layout = new QHBoxLayout( this );
layout->setContentsMargins( 0, 0, 0, 0 ); layout->setContentsMargins( 0, 0, 0, 0 );
stable = NULL; stable = NULL;
p_window = NULL;
show(); show();
} }
...@@ -85,6 +87,7 @@ VideoWidget::~VideoWidget() ...@@ -85,6 +87,7 @@ VideoWidget::~VideoWidget()
{ {
/* Ensure we are not leaking the video output. This would crash. */ /* Ensure we are not leaking the video output. This would crash. */
assert( !stable ); assert( !stable );
assert( !p_window );
} }
void VideoWidget::sync( void ) void VideoWidget::sync( void )
...@@ -100,14 +103,16 @@ void VideoWidget::sync( void ) ...@@ -100,14 +103,16 @@ void VideoWidget::sync( void )
/** /**
* Request the video to avoid the conflicts * Request the video to avoid the conflicts
**/ **/
WId VideoWidget::request( unsigned int *pi_width, unsigned int *pi_height, WId VideoWidget::request( struct vout_window_t *p_wnd, unsigned int *pi_width,
bool b_keep_size ) unsigned int *pi_height, bool b_keep_size )
{ {
if( stable ) if( stable )
{ {
msg_Dbg( p_intf, "embedded video already in use" ); msg_Dbg( p_intf, "embedded video already in use" );
return 0; return 0;
} }
assert( !p_window );
if( b_keep_size ) if( b_keep_size )
{ {
*pi_width = size().width(); *pi_width = size().width();
...@@ -148,6 +153,7 @@ WId VideoWidget::request( unsigned int *pi_width, unsigned int *pi_height, ...@@ -148,6 +153,7 @@ WId VideoWidget::request( unsigned int *pi_width, unsigned int *pi_height,
XSelectInput( dpy, w, attr.your_event_mask ); XSelectInput( dpy, w, attr.your_event_mask );
#endif #endif
sync(); sync();
p_window = p_wnd;
return stable->winId(); return stable->winId();
} }
...@@ -168,6 +174,15 @@ void VideoWidget::SetSizing( unsigned int w, unsigned int h ) ...@@ -168,6 +174,15 @@ void VideoWidget::SetSizing( unsigned int w, unsigned int h )
sync(); sync();
} }
void VideoWidget::resizeEvent( QResizeEvent *event )
{
if( p_window != NULL )
vout_window_ReportSize( p_window, event->size().width(),
event->size().height() );
QWidget::resizeEvent( event );
}
void VideoWidget::release( void ) void VideoWidget::release( void )
{ {
msg_Dbg( p_intf, "Video is not needed anymore" ); msg_Dbg( p_intf, "Video is not needed anymore" );
...@@ -177,6 +192,7 @@ void VideoWidget::release( void ) ...@@ -177,6 +192,7 @@ void VideoWidget::release( void )
layout->removeWidget( stable ); layout->removeWidget( stable );
stable->deleteLater(); stable->deleteLater();
stable = NULL; stable = NULL;
p_window = NULL;
} }
updateGeometry(); updateGeometry();
......
...@@ -50,6 +50,7 @@ class QPixmap; ...@@ -50,6 +50,7 @@ class QPixmap;
class QHBoxLayout; class QHBoxLayout;
class QMenu; class QMenu;
class QSlider; class QSlider;
struct vout_window_t;
/******************** Video Widget ****************/ /******************** Video Widget ****************/
class VideoWidget : public QFrame class VideoWidget : public QFrame
...@@ -59,7 +60,7 @@ public: ...@@ -59,7 +60,7 @@ public:
VideoWidget( intf_thread_t * ); VideoWidget( intf_thread_t * );
virtual ~VideoWidget(); virtual ~VideoWidget();
WId request( unsigned int *, unsigned int *, bool ); WId request( struct vout_window_t *, unsigned int *, unsigned int *, bool );
void release( void ); void release( void );
void sync( void ); void sync( void );
...@@ -69,8 +70,11 @@ protected: ...@@ -69,8 +70,11 @@ protected:
return NULL; return NULL;
} }
virtual void resizeEvent(QResizeEvent *);
private: private:
intf_thread_t *p_intf; intf_thread_t *p_intf;
vout_window_t *p_window;
QWidget *stable; QWidget *stable;
QLayout *layout; QLayout *layout;
......
...@@ -203,8 +203,8 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) ...@@ -203,8 +203,8 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
/* VideoWidget connects for asynchronous calls */ /* VideoWidget connects for asynchronous calls */
b_videoFullScreen = false; b_videoFullScreen = false;
connect( this, SIGNAL(askGetVideo(WId*,unsigned*,unsigned *)), connect( this, SIGNAL(askGetVideo(WId*,struct vout_window_t*,unsigned*,unsigned *)),
this, SLOT(getVideoSlot(WId*,unsigned*,unsigned*)), this, SLOT(getVideoSlot(WId*,struct vout_window_t*,unsigned*,unsigned*)),
Qt::BlockingQueuedConnection ); Qt::BlockingQueuedConnection );
connect( this, SIGNAL(askReleaseVideo( void )), connect( this, SIGNAL(askReleaseVideo( void )),
this, SLOT(releaseVideoSlot( void )), this, SLOT(releaseVideoSlot( void )),
...@@ -681,7 +681,8 @@ void MainInterface::toggleFSC() ...@@ -681,7 +681,8 @@ void MainInterface::toggleFSC()
* All window provider queries must be handled through signals or events. * All window provider queries must be handled through signals or events.
* That's why we have all those emit statements... * That's why we have all those emit statements...
*/ */
WId MainInterface::getVideo( unsigned int *pi_width, unsigned int *pi_height ) WId MainInterface::getVideo( struct vout_window_t *p_wnd,
unsigned int *pi_width, unsigned int *pi_height )
{ {
if( !videoWidget ) if( !videoWidget )
return 0; return 0;
...@@ -689,11 +690,11 @@ WId MainInterface::getVideo( unsigned int *pi_width, unsigned int *pi_height ) ...@@ -689,11 +690,11 @@ WId MainInterface::getVideo( unsigned int *pi_width, unsigned int *pi_height )
/* This is a blocking call signal. Results are returned through pointers. /* This is a blocking call signal. Results are returned through pointers.
* Beware of deadlocks! */ * Beware of deadlocks! */
WId id; WId id;
emit askGetVideo( &id, pi_width, pi_height ); emit askGetVideo( &id, p_wnd, pi_width, pi_height );
return id; return id;
} }
void MainInterface::getVideoSlot( WId *p_id, void MainInterface::getVideoSlot( WId *p_id, struct vout_window_t *p_wnd,
unsigned *pi_width, unsigned *pi_height ) unsigned *pi_width, unsigned *pi_height )
{ {
/* Hidden or minimized, activate */ /* Hidden or minimized, activate */
...@@ -701,7 +702,7 @@ void MainInterface::getVideoSlot( WId *p_id, ...@@ -701,7 +702,7 @@ void MainInterface::getVideoSlot( WId *p_id,
toggleUpdateSystrayMenu(); toggleUpdateSystrayMenu();
/* Request the videoWidget */ /* Request the videoWidget */
WId ret = videoWidget->request( pi_width, pi_height, !b_autoresize ); WId ret = videoWidget->request( p_wnd, pi_width, pi_height, !b_autoresize );
*p_id = ret; *p_id = ret;
if( ret ) /* The videoWidget is available */ if( ret ) /* The videoWidget is available */
{ {
......
...@@ -55,6 +55,7 @@ class QVBoxLayout; ...@@ -55,6 +55,7 @@ class QVBoxLayout;
class QMenu; class QMenu;
class QSize; class QSize;
class StandardPLPanel; class StandardPLPanel;
struct vout_window_t;
class MainInterface : public QVLCMW class MainInterface : public QVLCMW
{ {
...@@ -70,7 +71,8 @@ public: ...@@ -70,7 +71,8 @@ public:
static const QEvent::Type ToolbarsNeedRebuild; static const QEvent::Type ToolbarsNeedRebuild;
/* Video requests from core */ /* Video requests from core */
WId getVideo( unsigned int *pi_width, unsigned int *pi_height ); WId getVideo( struct vout_window_t *,
unsigned int *pi_width, unsigned int *pi_height );
void releaseVideo( void ); void releaseVideo( void );
int controlVideo( int i_query, va_list args ); int controlVideo( int i_query, va_list args );
...@@ -208,7 +210,8 @@ public slots: ...@@ -208,7 +210,8 @@ public slots:
#endif #endif
/* Manage the Video Functions from the vout threads */ /* Manage the Video Functions from the vout threads */
void getVideoSlot( WId *p_id, unsigned *pi_width, unsigned *pi_height ); void getVideoSlot( WId *p_id, struct vout_window_t *,
unsigned *pi_width, unsigned *pi_height );
void releaseVideoSlot( void ); void releaseVideoSlot( void );
void emitBoss(); void emitBoss();
...@@ -259,7 +262,7 @@ private slots: ...@@ -259,7 +262,7 @@ private slots:
void continuePlayback(); void continuePlayback();
signals: signals:
void askGetVideo( WId *p_id, unsigned *pi_width, unsigned *pi_height ); void askGetVideo( WId *, struct vout_window_t *, unsigned *, unsigned * );
void askReleaseVideo( ); void askReleaseVideo( );
void askVideoToResize( unsigned int, unsigned int ); void askVideoToResize( unsigned int, unsigned int );
void askVideoSetFullScreen( bool ); void askVideoSetFullScreen( bool );
......
...@@ -672,7 +672,7 @@ static int WindowOpen( vout_window_t *p_wnd, const vout_window_cfg_t *cfg ) ...@@ -672,7 +672,7 @@ static int WindowOpen( vout_window_t *p_wnd, const vout_window_cfg_t *cfg )
unsigned i_width = cfg->width; unsigned i_width = cfg->width;
unsigned i_height = cfg->height; unsigned i_height = cfg->height;
WId wid = p_mi->getVideo( &i_width, &i_height ); WId wid = p_mi->getVideo( p_wnd, &i_width, &i_height );
if( !wid ) if( !wid )
return VLC_EGENERIC; return VLC_EGENERIC;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment