Commit 6b61e7bd authored by Clément Stenac's avatar Clément Stenac

Give control back to the main interface for handling interaction with video.

Still probably broken
parent 9906af38
...@@ -22,11 +22,13 @@ ...@@ -22,11 +22,13 @@
*****************************************************************************/ *****************************************************************************/
#include "dialogs_provider.hpp" #include "dialogs_provider.hpp"
#include <vlc/vout.h>
#include "qt4.hpp" #include "qt4.hpp"
#include "components/interface_widgets.hpp" #include "components/interface_widgets.hpp"
#include "main_interface.hpp" #include "main_interface.hpp"
#include "input_manager.hpp" #include "input_manager.hpp"
#include <vlc/vout.h>
#include <QHBoxLayout> #include <QHBoxLayout>
#define ICON_SIZE 128 #define ICON_SIZE 128
...@@ -45,26 +47,9 @@ bool need_update; ...@@ -45,26 +47,9 @@ bool need_update;
VideoWidget::VideoWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i ) VideoWidget::VideoWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i )
{ {
vlc_mutex_init( p_intf, &lock ); vlc_mutex_init( p_intf, &lock );
p_intf->pf_request_window = ::DoRequest;
p_intf->pf_release_window = ::DoRelease;
p_intf->pf_control_window = ::DoControl;
p_intf->p_sys->p_video = this;
p_vout = NULL; p_vout = NULL;
setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
ON_TIMEOUT( update() );
need_update = false;
}
void VideoWidget::update()
{
if( need_update )
{
p_intf->p_sys->p_mi->resize( p_intf->p_sys->p_mi->sizeHint() );
need_update = false;
}
} }
VideoWidget::~VideoWidget() VideoWidget::~VideoWidget()
...@@ -83,9 +68,6 @@ VideoWidget::~VideoWidget() ...@@ -83,9 +68,6 @@ VideoWidget::~VideoWidget()
vout_Control( p_vout, VOUT_CLOSE ); vout_Control( p_vout, VOUT_CLOSE );
} }
} }
p_intf->pf_request_window = NULL;
p_intf->pf_release_window = NULL;
p_intf->pf_control_window = NULL;
vlc_mutex_unlock( &lock ); vlc_mutex_unlock( &lock );
vlc_mutex_destroy( &lock ); vlc_mutex_destroy( &lock );
} }
...@@ -95,13 +77,7 @@ QSize VideoWidget::sizeHint() const ...@@ -95,13 +77,7 @@ QSize VideoWidget::sizeHint() const
return widgetSize; return widgetSize;
} }
static void *DoRequest( intf_thread_t *p_intf, vout_thread_t *p_vout, void *VideoWidget::request( vout_thread_t *p_nvout, int *pi_x, int *pi_y,
int *pi1, int *pi2, unsigned int*pi3,unsigned int*pi4)
{
return p_intf->p_sys->p_video->Request( p_vout, pi1, pi2, pi3, pi4 );
}
void *VideoWidget::Request( vout_thread_t *p_nvout, int *pi_x, int *pi_y,
unsigned int *pi_width, unsigned int *pi_height ) unsigned int *pi_width, unsigned int *pi_height )
{ {
if( p_vout ) if( p_vout )
...@@ -110,76 +86,14 @@ void *VideoWidget::Request( vout_thread_t *p_nvout, int *pi_x, int *pi_y, ...@@ -110,76 +86,14 @@ void *VideoWidget::Request( vout_thread_t *p_nvout, int *pi_x, int *pi_y,
return NULL; return NULL;
} }
p_vout = p_nvout; p_vout = p_nvout;
setMinimumSize( 1,1 ); setMinimumSize( 1,1 );
widgetSize = QSize( *pi_width, *pi_height ); return (void*)winId();
updateGeometry();
need_update = true;
return (void*)winId();
}
static void DoRelease( intf_thread_t *p_intf, void *p_win )
{
return p_intf->p_sys->p_video->Release( p_win );
} }
void VideoWidget::Release( void *p_win ) void VideoWidget::release( void *p_win )
{ {
p_vout = NULL; p_vout = NULL;
if( config_GetInt( p_intf, "qt-always-video" ) == 0 )
{
widgetSize = QSize ( 1,1 );
updateGeometry();
need_update = true;
}
} }
static int DoControl( intf_thread_t *p_intf, void *p_win, int i_q, va_list a )
{
return p_intf->p_sys->p_video->Control( p_win, i_q, a );
}
int VideoWidget::Control( void *p_window, int i_query, va_list args )
{
int i_ret = VLC_EGENERIC;
vlc_mutex_lock( &lock );
switch( i_query )
{
case VOUT_GET_SIZE:
{
unsigned int *pi_width = va_arg( args, unsigned int * );
unsigned int *pi_height = va_arg( args, unsigned int * );
*pi_width = frame->width();
*pi_height = frame->height();
i_ret = VLC_SUCCESS;
break;
}
case VOUT_SET_SIZE:
{
unsigned int i_width = va_arg( args, unsigned int );
unsigned int i_height = va_arg( args, unsigned int );
if( !i_width && p_vout ) i_width = p_vout->i_window_width;
if( !i_height && p_vout ) i_height = p_vout->i_window_height;
widgetSize = QSize( i_width, i_height );
updateGeometry();
need_update = true;
i_ret = VLC_SUCCESS;
break;
}
case VOUT_SET_STAY_ON_TOP:
{
/// \todo
break;
}
default:
msg_Warn( p_intf, "unsupported control query" );
break;
}
vlc_mutex_unlock( &lock );
return i_ret;
}
/********************************************************************** /**********************************************************************
* Background Widget. Show a simple image background. Currently, * Background Widget. Show a simple image background. Currently,
* it's a static cone. * it's a static cone.
...@@ -192,6 +106,11 @@ BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) : ...@@ -192,6 +106,11 @@ BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) :
CONNECT( THEMIM->getIM(), audioStarted(), this, hasVideo() ); CONNECT( THEMIM->getIM(), audioStarted(), this, hasVideo() );
} }
BackgroundWidget::~BackgroundWidget()
{
CleanBackground();
}
int BackgroundWidget::DrawBackground() int BackgroundWidget::DrawBackground()
{ {
setAutoFillBackground( true ); setAutoFillBackground( true );
......
...@@ -43,10 +43,10 @@ public: ...@@ -43,10 +43,10 @@ public:
VideoWidget( intf_thread_t * ); VideoWidget( intf_thread_t * );
virtual ~VideoWidget(); virtual ~VideoWidget();
void *Request( vout_thread_t *, int *, int *, void *request( vout_thread_t *, int *, int *,
unsigned int *, unsigned int * ); unsigned int *, unsigned int * );
void Release( void * ); void release( void * );
int Control( void *, int, va_list ); int control( void *, int, va_list );
int i_video_height, i_video_width; int i_video_height, i_video_width;
vout_thread_t *p_vout; vout_thread_t *p_vout;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <assert.h> #include <assert.h>
#include <vlc_keys.h> #include <vlc_keys.h>
#include <vlc/vout.h>
#ifdef WIN32 #ifdef WIN32
#define PREF_W 410 #define PREF_W 410
...@@ -48,12 +49,28 @@ ...@@ -48,12 +49,28 @@
static int InteractCallback( vlc_object_t *, const char *, vlc_value_t, static int InteractCallback( vlc_object_t *, const char *, vlc_value_t,
vlc_value_t, void *); vlc_value_t, void *);
/* Video handling */
static void *DoRequest( intf_thread_t *p_intf, vout_thread_t *p_vout,
int *pi1, int *pi2, unsigned int*pi3,unsigned int*pi4)
{
return p_intf->p_sys->p_mi->requestVideo( p_vout, pi1, pi2, pi3, pi4 );
}
static void DoRelease( intf_thread_t *p_intf, void *p_win )
{
return p_intf->p_sys->p_mi->releaseVideo( p_win );
}
static int DoControl( intf_thread_t *p_intf, void *p_win, int i_q, va_list a )
{
return p_intf->p_sys->p_mi->controlVideo( p_win, i_q, a );
}
MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
{ {
settings = new QSettings( "VideoLAN", "VLC" ); settings = new QSettings( "VideoLAN", "VLC" );
settings->beginGroup( "MainWindow" ); settings->beginGroup( "MainWindow" );
need_components_update = false;
setWindowTitle( QString::fromUtf8( _("VLC media player") ) ); setWindowTitle( QString::fromUtf8( _("VLC media player") ) );
handleMainUi( settings ); handleMainUi( settings );
...@@ -99,6 +116,10 @@ MainInterface::~MainInterface() ...@@ -99,6 +116,10 @@ MainInterface::~MainInterface()
/// \todo Save everything /// \todo Save everything
p_intf->b_interaction = VLC_FALSE; p_intf->b_interaction = VLC_FALSE;
var_DelCallback( p_intf, "interaction", InteractCallback, this ); var_DelCallback( p_intf, "interaction", InteractCallback, this );
p_intf->pf_request_window = NULL;
p_intf->pf_release_window = NULL;
p_intf->pf_control_window = NULL;
} }
void MainInterface::handleMainUi( QSettings *settings ) void MainInterface::handleMainUi( QSettings *settings )
...@@ -149,6 +170,10 @@ void MainInterface::handleMainUi( QSettings *settings ) ...@@ -149,6 +170,10 @@ void MainInterface::handleMainUi( QSettings *settings )
videoWidget->resize( videoWidget->widgetSize ); videoWidget->resize( videoWidget->widgetSize );
ui.vboxLayout->insertWidget( 0, videoWidget ); ui.vboxLayout->insertWidget( 0, videoWidget );
p_intf->pf_request_window = ::DoRequest;
p_intf->pf_release_window = ::DoRelease;
p_intf->pf_control_window = ::DoControl;
if( config_GetInt( p_intf, "qt-always-video" )) if( config_GetInt( p_intf, "qt-always-video" ))
{ {
bgWidget = new BackgroundWidget( p_intf ); bgWidget = new BackgroundWidget( p_intf );
...@@ -170,6 +195,9 @@ void MainInterface::handleMainUi( QSettings *settings ) ...@@ -170,6 +195,9 @@ void MainInterface::handleMainUi( QSettings *settings )
setMinimumSize( PREF_W, addSize.height() ); setMinimumSize( PREF_W, addSize.height() );
} }
/**********************************************************************
* Handling of the components
**********************************************************************/
void MainInterface::calculateInterfaceSize() void MainInterface::calculateInterfaceSize()
{ {
int width = 0, height = 0; int width = 0, height = 0;
...@@ -178,7 +206,6 @@ void MainInterface::calculateInterfaceSize() ...@@ -178,7 +206,6 @@ void MainInterface::calculateInterfaceSize()
width += bgWidget->widgetSize.width(); width += bgWidget->widgetSize.width();
height += bgWidget->widgetSize.height(); height += bgWidget->widgetSize.height();
assert( !playlistWidget->isVisible() ); assert( !playlistWidget->isVisible() );
} }
if( playlistWidget->isVisible() ) if( playlistWidget->isVisible() )
{ {
...@@ -191,6 +218,7 @@ void MainInterface::calculateInterfaceSize() ...@@ -191,6 +218,7 @@ void MainInterface::calculateInterfaceSize()
addSize.height() ); addSize.height() );
} }
/// To update !!
void MainInterface::resizeEvent( QResizeEvent *e ) void MainInterface::resizeEvent( QResizeEvent *e )
{ {
videoWidget->widgetSize.setHeight( e->size().height() - addSize.height() ); videoWidget->widgetSize.setHeight( e->size().height() - addSize.height() );
...@@ -198,6 +226,96 @@ void MainInterface::resizeEvent( QResizeEvent *e ) ...@@ -198,6 +226,96 @@ void MainInterface::resizeEvent( QResizeEvent *e )
p_intf->p_sys->p_video->updateGeometry() ; p_intf->p_sys->p_video->updateGeometry() ;
} }
void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x,
int *pi_y, unsigned int *pi_width,
unsigned int *pi_height )
{
void *ret = videoWidget->request( p_nvout,pi_x, pi_y, pi_width, pi_height );
videoWidget->widgetSize = QSize( *pi_width, *pi_height );
videoWidget->updateGeometry(); /// FIXME: Needed ?
need_components_update = true;
return ret;
}
void MainInterface::releaseVideo( void *p_win )
{
videoWidget->release( p_win );
videoWidget->widgetSize = QSize( 1, 1 );
videoWidget->updateGeometry();
need_components_update = true;
}
int MainInterface::controlVideo( void *p_window, int i_query, va_list args )
{
int i_ret = VLC_EGENERIC;
switch( i_query )
{
case VOUT_GET_SIZE:
{
unsigned int *pi_width = va_arg( args, unsigned int * );
unsigned int *pi_height = va_arg( args, unsigned int * );
*pi_width = videoWidget->widgetSize.width();
*pi_height = videoWidget->widgetSize.height();
i_ret = VLC_SUCCESS;
break;
}
case VOUT_SET_SIZE:
{
unsigned int i_width = va_arg( args, unsigned int );
unsigned int i_height = va_arg( args, unsigned int );
// if( !i_width && p_vout ) i_width = p_vout->i_window_width;
// if( !i_height && p_vout ) i_height = p_vout->i_window_height;
videoWidget->widgetSize = QSize( i_width, i_height );
videoWidget->updateGeometry();
need_components_update = true;
i_ret = VLC_SUCCESS;
break;
}
case VOUT_SET_STAY_ON_TOP:
default:
msg_Warn( p_intf, "unsupported control query" );
break;
}
return i_ret;
}
void MainInterface::playlist()
{
// Toggle the playlist dialog
if( !playlistEmbeddedFlag )
{
if( playlistWidget )
{
/// \todo Destroy it
}
THEDP->playlistDialog();
return;
}
if( !playlistWidget )
{
PlaylistDialog::killInstance();
playlistWidget = new PlaylistWidget( p_intf );
ui.vboxLayout->insertWidget( 0, playlistWidget );
playlistWidget->widgetSize = settings->value( "playlistSize",
QSize( 600, 300 ) ).toSize();
}
/// Todo, reset its size ?
if( playlistWidget->isVisible() ) playlistWidget->show();
else playlistWidget->hide();
calculateInterfaceSize();
resize( mainSize );
}
void MainInterface::doComponentsUpdate()
{
}
/************************************************************************
* Other stuff
************************************************************************/
void MainInterface::keyPressEvent( QKeyEvent *e ) void MainInterface::keyPressEvent( QKeyEvent *e )
{ {
int i_vlck = 0; int i_vlck = 0;
...@@ -281,36 +399,6 @@ void MainInterface::next() ...@@ -281,36 +399,6 @@ void MainInterface::next()
playlist_Next( THEPL ); playlist_Next( THEPL );
} }
void MainInterface::playlist()
{
// Toggle the playlist dialog
if( !playlistEmbeddedFlag )
{
if( playlistWidget )
{
/// \todo Destroy it
}
THEDP->playlistDialog();
return;
}
if( !playlistWidget )
{
PlaylistDialog::killInstance();
playlistWidget = new PlaylistWidget( p_intf );
ui.vboxLayout->insertWidget( 0, playlistWidget );
playlistWidget->widgetSize = settings->value( "playlistSize",
QSize( 600, 300 ) ).toSize();
}
/// Todo, reset its size ?
if( playlistWidget->isVisible() ) playlistWidget->show();
else playlistWidget->hide();
calculateInterfaceSize();
resize( mainSize );
}
void MainInterface::setDisplay( float pos, int time, int length ) void MainInterface::setDisplay( float pos, int time, int length )
{ {
char psz_length[MSTRTIME_MAX_SIZE], psz_time[MSTRTIME_MAX_SIZE]; char psz_length[MSTRTIME_MAX_SIZE], psz_time[MSTRTIME_MAX_SIZE];
...@@ -344,6 +432,12 @@ void MainInterface::updateOnTimer() ...@@ -344,6 +432,12 @@ void MainInterface::updateOnTimer()
DialogsProvider::killInstance(); DialogsProvider::killInstance();
QApplication::quit(); QApplication::quit();
} }
if( need_components_update )
{
doComponentsUpdate();
need_components_update = false;
}
audio_volume_t i_volume; audio_volume_t i_volume;
aout_VolumeGet( p_intf, &i_volume ); aout_VolumeGet( p_intf, &i_volume );
i_volume = (i_volume * 200 )/ AOUT_VOLUME_MAX ; i_volume = (i_volume * 200 )/ AOUT_VOLUME_MAX ;
......
...@@ -49,9 +49,14 @@ public: ...@@ -49,9 +49,14 @@ public:
MainInterface( intf_thread_t *); MainInterface( intf_thread_t *);
virtual ~MainInterface(); virtual ~MainInterface();
void resizeEvent( QResizeEvent * );
void *requestVideo( vout_thread_t *p_nvout, int *pi_x,
int *pi_y, unsigned int *pi_width,
unsigned int *pi_height );
void releaseVideo( void *);
int controlVideo( void *p_window, int i_query, va_list args );
protected: protected:
void resizeEvent( QResizeEvent * );
void closeEvent( QCloseEvent *); void closeEvent( QCloseEvent *);
Ui::MainInterfaceUI ui; Ui::MainInterfaceUI ui;
friend class VolumeClickHandler; friend class VolumeClickHandler;
...@@ -59,13 +64,15 @@ private: ...@@ -59,13 +64,15 @@ private:
QSettings *settings; QSettings *settings;
QSize mainSize, addSize; QSize mainSize, addSize;
bool need_components_update;
void calculateInterfaceSize(); void calculateInterfaceSize();
void handleMainUi( QSettings* ); void handleMainUi( QSettings* );
void doComponentsUpdate();
virtual void keyPressEvent( QKeyEvent *);
/* All the stuff that goes in the main position */ /* Video */
VideoWidget *videoWidget; VideoWidget *videoWidget;
virtual void keyPressEvent( QKeyEvent *);
BackgroundWidget *bgWidget; BackgroundWidget *bgWidget;
PlaylistWidget *playlistWidget; PlaylistWidget *playlistWidget;
......
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