From 2e298fb87562b7a6470c24091a336b251be64bc4 Mon Sep 17 00:00:00 2001 From: Erwan Tulou Date: Sun, 18 Jul 2010 20:27:13 +0200 Subject: [PATCH] skins2: fix fullscreen issue (black screen when video terminates). fullscreen is now managed (activation and deactivation) in skins2 exactly as it is done in qt4. - activation when a VOUT_WINDOW_SETFULLSCREEN is received - deactivation when (and only when) a vout_window release is received. --- modules/gui/skins2/src/vlcproc.cpp | 5 ----- modules/gui/skins2/src/vout_manager.cpp | 31 +++++++++++++++++++++++-------- modules/gui/skins2/src/vout_manager.hpp | 5 ++++- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/modules/gui/skins2/src/vlcproc.cpp b/modules/gui/skins2/src/vlcproc.cpp index bdbeb49c83..78f58c7f39 100644 --- a/modules/gui/skins2/src/vlcproc.cpp +++ b/modules/gui/skins2/src/vlcproc.cpp @@ -486,11 +486,7 @@ void VlcProc::on_intf_event_changed( vlc_object_t* p_obj, vlc_value_t newVal ) vout_thread_t* pVout = input_GetVout( pInput ); SET_BOOL( m_cVarHasVout, pVout != NULL ); if( pVout ) - { - SET_BOOL( m_cVarFullscreen, - var_GetBool( pVout, "fullscreen" ) ); vlc_object_release( pVout ); - } break; } @@ -700,7 +696,6 @@ void VlcProc::reset_input() SET_BOOL( m_cVarRecordable, false ); SET_BOOL( m_cVarRecording, false ); SET_BOOL( m_cVarDvdActive, false ); - SET_BOOL( m_cVarFullscreen, false ); SET_BOOL( m_cVarHasAudio, false ); SET_BOOL( m_cVarHasVout, false ); SET_BOOL( m_cVarStopped, true ); diff --git a/modules/gui/skins2/src/vout_manager.cpp b/modules/gui/skins2/src/vout_manager.cpp index 86bd5e1e9c..fd38c846db 100644 --- a/modules/gui/skins2/src/vout_manager.cpp +++ b/modules/gui/skins2/src/vout_manager.cpp @@ -69,11 +69,17 @@ VoutManager::VoutManager( intf_thread_t *pIntf ): SkinObject( pIntf ), m_pVoutMainWindow->move( 0, 0 ); m_pVoutMainWindow->resize( width, height ); + + VarBool &rFullscreen = VlcProc::instance( getIntf() )->getFullscreenVar(); + rFullscreen.addObserver( this ); } VoutManager::~VoutManager( ) { + VarBool &rFullscreen = VlcProc::instance( getIntf() )->getFullscreenVar(); + rFullscreen.delObserver( this ); + delete m_pVoutMainWindow; } @@ -249,6 +255,9 @@ void VoutManager::releaseWnd( vout_window_t *pWnd ) break; } } + + // force fullscreen to false so that user regains control + VlcProc::instance( getIntf() )->setFullscreenVar( false ); } @@ -277,23 +286,29 @@ void VoutManager::setSizeWnd( vout_window_t *pWnd, int width, int height ) } } + void VoutManager::setFullscreenWnd( vout_window_t *pWnd, bool b_fullscreen ) { - msg_Dbg( pWnd, "setFullscreen (%d) received from vout thread", - b_fullscreen ? 1 : 0 ); + msg_Dbg( pWnd, "setFullscreen (%i) received from vout thread", + b_fullscreen ); VlcProc::instance( getIntf() )->setFullscreenVar( b_fullscreen ); +} - if( b_fullscreen ) - { - m_pVoutMainWindow->show(); - } - else + +void VoutManager::onUpdate( Subject &rVariable, void *arg ) +{ + VarBool &rFullscreen = VlcProc::instance( getIntf() )->getFullscreenVar(); + if( &rVariable == &rFullscreen ) { - m_pVoutMainWindow->hide(); + if( rFullscreen.get() ) + m_pVoutMainWindow->show(); + else + m_pVoutMainWindow->hide(); } } + // Functions called by window provider // /////////////////////////////////// diff --git a/modules/gui/skins2/src/vout_manager.hpp b/modules/gui/skins2/src/vout_manager.hpp index 095f25c2d5..643af52cd8 100644 --- a/modules/gui/skins2/src/vout_manager.hpp +++ b/modules/gui/skins2/src/vout_manager.hpp @@ -91,7 +91,7 @@ public: /// Singleton object handling VLC internal state and playlist -class VoutManager: public SkinObject +class VoutManager: public SkinObject, public Observer { public: /// Get the instance of VoutManager @@ -146,6 +146,9 @@ public: // test if vout are running bool hasVout() { return ( m_SavedWndVec.size() != 0 ) ; } + /// called when fullscreen variable changed + virtual void onUpdate( Subject &rVariable , void* ); + protected: // Protected because it is a singleton VoutManager( intf_thread_t *pIntf ); -- 2.11.4.GIT