Commit e17bf628 authored by Laurent Aimar's avatar Laurent Aimar

Fixed fullscreen controler race conditions and ugly static variables.

It is disabled by default, look for the two lines with
	//XXX uncomment for fullscreen controler
to enable it. Please report success/failure in order to enable it by
default (linux/win32).
parent ae059a3c
...@@ -887,8 +887,9 @@ void ControlsWidget::toggleAdvanced() ...@@ -887,8 +887,9 @@ void ControlsWidget::toggleAdvanced()
FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i,
MainInterface *_p_mi, bool b_advControls, bool b_shiny ) MainInterface *_p_mi, bool b_advControls, bool b_shiny )
: ControlsWidget( _p_i, _p_mi, b_advControls, b_shiny, true ), : ControlsWidget( _p_i, _p_mi, b_advControls, b_shiny, true ),
i_lastPosX( -1 ), i_lastPosY( -1 ), i_hideTimeout( 1 ), i_mouse_last_x( -1 ), i_mouse_last_y( -1 ), b_mouse_over(false),
b_mouseIsOver( false ), b_isFullscreen( false ) b_slow_hide_begin(false), i_slow_hide_timeout(1),
b_fullscreen( false ), i_hide_timeout( 1 )
{ {
setWindowFlags( Qt::ToolTip ); setWindowFlags( Qt::ToolTip );
...@@ -922,7 +923,7 @@ FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, ...@@ -922,7 +923,7 @@ FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i,
/* hiding timer */ /* hiding timer */
p_hideTimer = new QTimer( this ); p_hideTimer = new QTimer( this );
CONNECT( p_hideTimer, timeout(), this, hideFSControllerWidget() ); CONNECT( p_hideTimer, timeout(), this, hideFSC() );
p_hideTimer->setSingleShot( true ); p_hideTimer->setSingleShot( true );
/* slow hiding timer */ /* slow hiding timer */
...@@ -939,15 +940,42 @@ FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, ...@@ -939,15 +940,42 @@ FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i,
move( p_desktop->width() / 2 - width() / 2, move( p_desktop->width() / 2 - width() / 2,
p_desktop->height() - height() ); p_desktop->height() - height() );
#ifdef WIN32TRICK #ifdef WIN32TRICK
setWindowOpacity( 0.0 ); setWindowOpacity( 0.0 );
fscHidden = true; fscHidden = true;
show(); show();
#endif #endif
vlc_mutex_init_recursive( &lock );
} }
FullscreenControllerWidget::~FullscreenControllerWidget() FullscreenControllerWidget::~FullscreenControllerWidget()
{ {
vlc_mutex_destroy( &lock );
}
/**
* Show fullscreen controller
*/
void FullscreenControllerWidget::showFSC()
{
#ifdef WIN32TRICK
// after quiting and going to fs, we need to call show()
if( isHidden() )
show();
if( fscHidden )
{
fscHidden = false;
setWindowOpacity( 1.0 );
}
#else
show();
#endif
#if HAVE_TRANSPARENCY
setWindowOpacity( DEFAULT_OPACITY );
#endif
} }
/** /**
...@@ -955,14 +983,32 @@ FullscreenControllerWidget::~FullscreenControllerWidget() ...@@ -955,14 +983,32 @@ FullscreenControllerWidget::~FullscreenControllerWidget()
* FIXME: under windows it have to be done by moving out of screen * FIXME: under windows it have to be done by moving out of screen
* because hide() doesnt work * because hide() doesnt work
*/ */
void FullscreenControllerWidget::hideFSControllerWidget() void FullscreenControllerWidget::hideFSC()
{ {
#ifdef WIN32TRICK #ifdef WIN32TRICK
fscHidden = true; fscHidden = true;
setWindowOpacity( 0.0 ); // simulate hidding setWindowOpacity( 0.0 ); // simulate hidding
#else #else
hide(); hide();
#endif #endif
}
/**
* Plane to hide fullscreen controller
*/
void FullscreenControllerWidget::planHideFSC()
{
vlc_mutex_lock( &lock );
int i_timeout = i_hide_timeout;
vlc_mutex_unlock( &lock );
p_hideTimer->start( i_timeout );
#if HAVE_TRANSPARENCY
b_slow_hide_begin = true;
i_slow_hide_timeout = i_timeout;
p_slowHideTimer->start( i_slow_hide_timeout / 2 );
#endif
} }
/** /**
...@@ -973,16 +1019,14 @@ void FullscreenControllerWidget::hideFSControllerWidget() ...@@ -973,16 +1019,14 @@ void FullscreenControllerWidget::hideFSControllerWidget()
void FullscreenControllerWidget::slowHideFSC() void FullscreenControllerWidget::slowHideFSC()
{ {
#if HAVE_TRANSPARENCY #if HAVE_TRANSPARENCY
static bool first_call = true; if( b_slow_hide_begin )
if ( first_call )
{ {
first_call = false; b_slow_hide_begin = false;
p_slowHideTimer->stop(); p_slowHideTimer->stop();
/* the last part of time divided to 100 pieces */ /* the last part of time divided to 100 pieces */
p_slowHideTimer->start( p_slowHideTimer->start( (int)( i_slow_hide_timeout / 2 / ( windowOpacity() * 100 ) ) );
(int) ( i_hideTimeout / 2 / ( windowOpacity() * 100 ) ) );
} }
else else
{ {
...@@ -997,66 +1041,37 @@ void FullscreenControllerWidget::slowHideFSC() ...@@ -997,66 +1041,37 @@ void FullscreenControllerWidget::slowHideFSC()
setWindowOpacity( windowOpacity() - 0.02 ); setWindowOpacity( windowOpacity() - 0.02 );
} }
if ( windowOpacity() == 0.0 ) if ( windowOpacity() <= 0.0 )
{
first_call = true;
p_slowHideTimer->stop(); p_slowHideTimer->stop();
} }
}
#endif #endif
} }
/**
* Get state of visibility of FS controller on screen
* On windows control if it is on hidden position
*/
bool FullscreenControllerWidget::isFSCHidden()
{
#ifdef WIN32TRICK
return fscHidden;
#endif
return isHidden();
}
/** /**
* event handling * event handling
* events: show, hide, start timer for hidding * events: show, hide, start timer for hidding
*/ */
void FullscreenControllerWidget::customEvent( QEvent *event ) void FullscreenControllerWidget::customEvent( QEvent *event )
{ {
int type = event->type(); bool b_fs;
if ( type == FullscreenControlShow_Type && b_isFullscreen )
{
#ifdef WIN32TRICK
// after quiting and going to fs, we need to call show()
if ( isHidden() )
show();
if ( fscHidden ) switch( event->type() )
{ {
fscHidden = false; case FullscreenControlShow_Type:
setWindowOpacity( 1.0 ); vlc_mutex_lock( &lock );
} b_fs = b_fullscreen;
#else vlc_mutex_unlock( &lock );
show();
#endif if( b_fs ) // FIXME I am not sure about that one
showFSC();
#if HAVE_TRANSPARENCY break;
setWindowOpacity( DEFAULT_OPACITY ); case FullscreenControlHide_Type:
#endif hideFSC();
} break;
else if ( type == FullscreenControlHide_Type ) case FullscreenControlPlanHide_Type:
{ if( !b_mouse_over ) // Only if the mouse is not over FSC
hideFSControllerWidget(); planHideFSC();
} break;
else if ( type == FullscreenControlPlanHide_Type && !b_mouseIsOver )
{
p_hideTimer->start( i_hideTimeout );
#if HAVE_TRANSPARENCY
p_slowHideTimer->start( i_hideTimeout / 2 );
#endif
} }
} }
...@@ -1068,13 +1083,13 @@ void FullscreenControllerWidget::mouseMoveEvent( QMouseEvent *event ) ...@@ -1068,13 +1083,13 @@ void FullscreenControllerWidget::mouseMoveEvent( QMouseEvent *event )
{ {
if ( event->buttons() == Qt::LeftButton ) if ( event->buttons() == Qt::LeftButton )
{ {
int i_moveX = event->globalX() - i_lastPosX; int i_moveX = event->globalX() - i_mouse_last_x;
int i_moveY = event->globalY() - i_lastPosY; int i_moveY = event->globalY() - i_mouse_last_y;
move( x() + i_moveX, y() + i_moveY ); move( x() + i_moveX, y() + i_moveY );
i_lastPosX = event->globalX(); i_mouse_last_x = event->globalX();
i_lastPosY = event->globalY(); i_mouse_last_y = event->globalY();
} }
} }
...@@ -1084,8 +1099,8 @@ void FullscreenControllerWidget::mouseMoveEvent( QMouseEvent *event ) ...@@ -1084,8 +1099,8 @@ void FullscreenControllerWidget::mouseMoveEvent( QMouseEvent *event )
*/ */
void FullscreenControllerWidget::mousePressEvent( QMouseEvent *event ) void FullscreenControllerWidget::mousePressEvent( QMouseEvent *event )
{ {
i_lastPosX = event->globalX(); i_mouse_last_x = event->globalX();
i_lastPosY = event->globalY(); i_mouse_last_y = event->globalY();
} }
/** /**
...@@ -1093,11 +1108,12 @@ void FullscreenControllerWidget::mousePressEvent( QMouseEvent *event ) ...@@ -1093,11 +1108,12 @@ void FullscreenControllerWidget::mousePressEvent( QMouseEvent *event )
*/ */
void FullscreenControllerWidget::enterEvent( QEvent *event ) void FullscreenControllerWidget::enterEvent( QEvent *event )
{ {
b_mouse_over = true;
p_hideTimer->stop(); p_hideTimer->stop();
#if HAVE_TRANSPARENCY #if HAVE_TRANSPARENCY
p_slowHideTimer->stop(); p_slowHideTimer->stop();
#endif #endif
b_mouseIsOver = true;
} }
/** /**
...@@ -1105,11 +1121,9 @@ void FullscreenControllerWidget::enterEvent( QEvent *event ) ...@@ -1105,11 +1121,9 @@ void FullscreenControllerWidget::enterEvent( QEvent *event )
*/ */
void FullscreenControllerWidget::leaveEvent( QEvent *event ) void FullscreenControllerWidget::leaveEvent( QEvent *event )
{ {
p_hideTimer->start( i_hideTimeout ); planHideFSC();
#if HAVE_TRANSPARENCY
p_slowHideTimer->start( i_hideTimeout / 2 ); b_mouse_over = false;
#endif
b_mouseIsOver = false;
} }
/** /**
...@@ -1129,80 +1143,85 @@ void FullscreenControllerWidget::keyPressEvent( QKeyEvent *event ) ...@@ -1129,80 +1143,85 @@ void FullscreenControllerWidget::keyPressEvent( QKeyEvent *event )
event->ignore(); event->ignore();
} }
/** /* */
* It is called when video start static int FullscreenControllerWidgetFullscreenChanged( vlc_object_t *vlc_object, const char *variable,
*/ vlc_value_t old_val, vlc_value_t new_val,
void FullscreenControllerWidget::regFullscreenCallback( vout_thread_t *p_vout ) void *data )
{ {
if ( p_vout ) vout_thread_t *p_vout = (vout_thread_t *) vlc_object;
{ FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data;
var_AddCallback( p_vout, "fullscreen", regMouseMoveCallback, this );
}
}
/** p_fs->fullscreenChanged( p_vout, new_val.b_bool, var_GetInteger( p_vout, "mouse-hide-timeout" ) );
* It is called after turn off video, because p_vout is NULL now
* we cannt delete callback, just hide if FScontroller is visible
*/
void FullscreenControllerWidget::unregFullscreenCallback()
{
if ( isVisible() )
hide();
}
/** return VLC_SUCCESS;
* Register and unregister callback for mouse moving }
*/ /* */
static int regMouseMoveCallback( vlc_object_t *vlc_object, const char *variable, static int FullscreenControllerWidgetMouseMoved( vlc_object_t *vlc_object, const char *variable,
vlc_value_t old_val, vlc_value_t new_val, vlc_value_t old_val, vlc_value_t new_val,
void *data ) void *data )
{ {
vout_thread_t *p_vout = (vout_thread_t *) vlc_object; FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data;
static bool b_registered = false; /* Show event */
FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *) data; IMEvent *eShow = new IMEvent( FullscreenControlShow_Type, 0 );
QApplication::postEvent( p_fs, static_cast<QEvent *>(eShow) );
if ( var_GetBool( p_vout, "fullscreen" ) && !b_registered ) /* Plan hide event */
{ IMEvent *eHide = new IMEvent( FullscreenControlPlanHide_Type, 0 );
p_fs->setHideTimeout( var_GetInteger( p_vout, "mouse-hide-timeout" ) ); QApplication::postEvent( p_fs, static_cast<QEvent *>(eHide) );
p_fs->setIsFullscreen( true );
var_AddCallback( p_vout, "mouse-moved",
showFullscreenControllCallback, (void *) p_fs );
b_registered = true;
}
if ( !var_GetBool( p_vout, "fullscreen" ) && b_registered )
{
p_fs->setIsFullscreen( false );
p_fs->hide();
var_DelCallback( p_vout, "mouse-moved",
showFullscreenControllCallback, (void *) p_fs );
b_registered = false;
}
return VLC_SUCCESS; return VLC_SUCCESS;
} }
/** /**
* Show fullscreen controller after mouse move * It is called when video start
* after show immediately plan hide event
*/ */
static int showFullscreenControllCallback( vlc_object_t *vlc_object, const char *variable, void FullscreenControllerWidget::attachVout( vout_thread_t *p_vout )
vlc_value_t old_val, vlc_value_t new_val,
void *data )
{ {
FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *) data; assert( p_vout );
if ( p_fs->isFSCHidden() || p_fs->windowOpacity() < DEFAULT_OPACITY ) vlc_mutex_lock( &lock );
var_AddCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this ); /* I miss a add and fire */
fullscreenChanged( p_vout, var_GetBool( p_vout, "fullscreen" ), var_GetInteger( p_vout, "mouse-hide-timeout" ) );
vlc_mutex_unlock( &lock );
}
/**
* It is called after turn off video.
*/
void FullscreenControllerWidget::detachVout( vout_thread_t *p_vout )
{
assert( p_vout );
var_DelCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this );
vlc_mutex_lock( &lock );
fullscreenChanged( p_vout, false, 0 );
vlc_mutex_unlock( &lock );
}
/**
* Register and unregister callback for mouse moving
*/
void FullscreenControllerWidget::fullscreenChanged( vout_thread_t *p_vout, bool b_fs, int i_timeout )
{
vlc_mutex_lock( &lock );
if( b_fs && !b_fullscreen )
{ {
IMEvent *event = new IMEvent( FullscreenControlShow_Type, 0 ); b_fullscreen = true;
QApplication::postEvent( p_fs, static_cast<QEvent *>(event) ); i_hide_timeout = i_timeout;
var_AddCallback( p_vout, "mouse-moved", FullscreenControllerWidgetMouseMoved, this );
} }
else if( !b_fs && b_fullscreen )
{
b_fullscreen = false;
i_hide_timeout = i_timeout;
var_DelCallback( p_vout, "mouse-moved", FullscreenControllerWidgetMouseMoved, this );
IMEvent *e = new IMEvent( FullscreenControlPlanHide_Type, 0 ); /* Force fs hidding */
QApplication::postEvent( p_fs, static_cast<QEvent *>(e) ); IMEvent *eHide = new IMEvent( FullscreenControlHide_Type, 0 );
QApplication::postEvent( this, static_cast<QEvent *>(eHide) );
return VLC_SUCCESS; }
vlc_mutex_unlock( &lock );
} }
/********************************************************************** /**********************************************************************
......
...@@ -236,13 +236,6 @@ signals: ...@@ -236,13 +236,6 @@ signals:
/*********************************** /***********************************
* Fullscreen controller * Fullscreen controller
***********************************/ ***********************************/
static int showFullscreenControllCallback(vlc_object_t *vlc_object, const char *variable, vlc_value_t old_val,
vlc_value_t new_val, void *data);
static int regMouseMoveCallback(vlc_object_t *vlc_object, const char *variable, vlc_value_t old_val,
vlc_value_t new_val, void *data);
class FullscreenControllerWidget : public ControlsWidget class FullscreenControllerWidget : public ControlsWidget
{ {
Q_OBJECT Q_OBJECT
...@@ -250,14 +243,10 @@ public: ...@@ -250,14 +243,10 @@ public:
FullscreenControllerWidget( intf_thread_t *, MainInterface*, bool, bool ); FullscreenControllerWidget( intf_thread_t *, MainInterface*, bool, bool );
virtual ~FullscreenControllerWidget(); virtual ~FullscreenControllerWidget();
void setHideTimeout( int hideTimeout ) { i_hideTimeout = hideTimeout; } /* */
void setIsFullscreen( bool isFS ) { b_isFullscreen = isFS; } void attachVout( vout_thread_t *p_vout );
void regFullscreenCallback( vout_thread_t *p_vout ); void detachVout( vout_thread_t *p_vout );
void fullscreenChanged( vout_thread_t *, bool b_fs, int i_timeout );
bool isFSCHidden();
public slots:
void unregFullscreenCallback();
protected: protected:
friend class MainInterface; friend class MainInterface;
...@@ -270,27 +259,37 @@ protected: ...@@ -270,27 +259,37 @@ protected:
virtual void keyPressEvent( QKeyEvent *event ); virtual void keyPressEvent( QKeyEvent *event );
private slots: private slots:
void hideFSControllerWidget(); void showFSC();
void planHideFSC();
void hideFSC();
void slowHideFSC(); void slowHideFSC();
private: private:
QTimer *p_hideTimer; QTimer *p_hideTimer;
#if HAVE_TRANSPARENCY #if HAVE_TRANSPARENCY
QTimer *p_slowHideTimer; QTimer *p_slowHideTimer;
#endif #endif
int i_lastPosX; int i_mouse_last_x;
int i_lastPosY; int i_mouse_last_y;
int i_hideTimeout; /* FSC hiding timeout, same as mouse hiding timeout */
bool b_mouseIsOver; bool b_mouse_over;
bool b_isFullscreen;
bool b_slow_hide_begin;
int i_slow_hide_timeout;
#ifdef WIN32TRICK #ifdef WIN32TRICK
bool fscHidden; bool fscHidden;
#endif #endif
virtual void customEvent( QEvent *event ); virtual void customEvent( QEvent *event );
/* Shared variable between FSC and VLC (protected by a lock) */
vlc_mutex_t lock;
bool b_fullscreen;
int i_hide_timeout; /* FSC hiding timeout, same as mouse hiding timeout */
}; };
......
...@@ -99,7 +99,6 @@ void InputManager::setInput( input_thread_t *_p_input ) ...@@ -99,7 +99,6 @@ void InputManager::setInput( input_thread_t *_p_input )
p_input = NULL; p_input = NULL;
i_input_id = 0; i_input_id = 0;
emit rateChanged( INPUT_RATE_DEFAULT ); emit rateChanged( INPUT_RATE_DEFAULT );
emit inputUnset();
} }
} }
......
...@@ -119,8 +119,6 @@ signals: ...@@ -119,8 +119,6 @@ signals:
/// Play/pause status /// Play/pause status
void statusChanged( int ); void statusChanged( int );
void artChanged( QString ); void artChanged( QString );
/// Controll of fullscreen controller
void inputUnset();
/// Teletext /// Teletext
void teletextEnabled( bool ); void teletextEnabled( bool );
void toggleTelexButtons(); void toggleTelexButtons();
......
...@@ -228,10 +228,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) ...@@ -228,10 +228,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
CONNECT( fullscreenControls, advancedControlsToggled( bool ), CONNECT( fullscreenControls, advancedControlsToggled( bool ),
this, doComponentsUpdate() ); this, doComponentsUpdate() );
CONNECT( THEMIM->getIM(), inputUnset(),
fullscreenControls, unregFullscreenCallback() );
/* Size and placement of interface */ /* Size and placement of interface */
QVLCTools::restoreWidgetPosition(settings,this,QSize(350,60)); QVLCTools::restoreWidgetPosition(settings,this,QSize(350,60));
...@@ -682,12 +678,17 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, ...@@ -682,12 +678,17 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x,
// emit askVideoToResize( *pi_width, *pi_height ); // emit askVideoToResize( *pi_width, *pi_height );
emit askUpdate(); emit askUpdate();
//XXX uncomment for fullscreen controler
//fullscreenControls->attachVout( p_nvout );
} }
return ret; return ret;
} }
void MainInterface::releaseVideo( vout_thread_t *p_vout, void *p_win ) void MainInterface::releaseVideo( vout_thread_t *p_vout, void *p_win )
{ {
//XXX uncomment for fullscreen controler
//fullscreenControls->detachVout( p_vout );
emit askReleaseVideo( p_win ); emit askReleaseVideo( p_win );
} }
......
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