*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include "ctrl_video.hpp"
#include "../src/vout_window.hpp"
#include "../src/os_graphics.hpp"
#include "../src/vlcproc.hpp"
+#include "../src/vout_manager.hpp"
+#include "../src/window_manager.hpp"
#include "../commands/async_queue.hpp"
#include "../commands/cmd_resize.hpp"
CtrlVideo::CtrlVideo( intf_thread_t *pIntf, GenericLayout &rLayout,
bool autoResize, const UString &rHelp,
VarBool *pVisible ):
- CtrlGeneric( pIntf, rHelp, pVisible ), m_pVout( NULL ),
- m_rLayout( rLayout ), m_xShift( 0 ), m_yShift( 0 )
+ CtrlGeneric( pIntf, rHelp, pVisible ), m_rLayout( rLayout ),
+ m_bAutoResize( autoResize), m_xShift( 0 ), m_yShift( 0 ),
+ m_bIsUseable( false), m_pVoutWindow( NULL )
{
- // Observe the vout size variable if the control is auto-resizable
- if( autoResize )
- {
- VarBox &rVoutSize = VlcProc::instance( pIntf )->getVoutSizeVar();
- rVoutSize.addObserver( this );
- }
+ VarBool &rFullscreen = VlcProc::instance( getIntf() )->getFullscreenVar();
+ rFullscreen.addObserver( this );
+
+ // if global parameter set to no resize, override skins behavior
+ if( !var_InheritBool( pIntf, "qt-video-autoresize" ) )
+ m_bAutoResize = false;
}
CtrlVideo::~CtrlVideo()
{
- VarBox &rVoutSize = VlcProc::instance( getIntf() )->getVoutSizeVar();
- rVoutSize.delObserver( this );
-
- if( m_pVout )
- {
- delete m_pVout;
- }
+ VarBool &rFullscreen = VlcProc::instance( getIntf() )->getFullscreenVar();
+ rFullscreen.delObserver( this );
}
void CtrlVideo::handleEvent( EvtGeneric &rEvent )
{
+ (void)rEvent;
}
bool CtrlVideo::mouseOver( int x, int y ) const
{
+ (void)x; (void)y;
return false;
}
void CtrlVideo::onResize()
{
const Position *pPos = getPosition();
- if( pPos && m_pVout )
+ if( pPos && m_pVoutWindow )
{
- m_pVout->move( pPos->getLeft(), pPos->getTop() );
- m_pVout->resize( pPos->getWidth(), pPos->getHeight() );
+ m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
+ m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
}
}
}
-void CtrlVideo::draw( OSGraphics &rImage, int xDest, int yDest )
+void CtrlVideo::draw( OSGraphics &rImage, int xDest, int yDest, int w, int h)
{
- GenericWindow *pParent = getWindow();
const Position *pPos = getPosition();
- if( pParent && pPos )
+ rect region( pPos->getLeft(), pPos->getTop(),
+ pPos->getWidth(), pPos->getHeight() );
+ rect clip( xDest, yDest, w, h );
+ rect inter;
+
+ if( rect::intersect( region, clip, &inter ) )
{
// Draw a black rectangle under the video to avoid transparency
- rImage.fillRect( pPos->getLeft(), pPos->getTop(), pPos->getWidth(),
- pPos->getHeight(), 0 );
+ rImage.fillRect( inter.x, inter.y, inter.width, inter.height, 0 );
+ }
+
+ if( m_pVoutWindow )
+ {
+ m_pVoutWindow->show();
+ }
+}
+
+
+void CtrlVideo::setLayout( GenericLayout *pLayout,
+ const Position &rPosition )
+{
+ CtrlGeneric::setLayout( pLayout, rPosition );
+ m_pLayout->getActiveVar().addObserver( this );
+
+ m_bIsUseable = isVisible() && m_pLayout->getActiveVar().get();
+
+ // register Video Control
+ VoutManager::instance( getIntf() )->registerCtrlVideo( this );
+
+ msg_Dbg( getIntf(),"New VideoControl detected(%p), useability=%s",
+ this, m_bIsUseable ? "true" : "false" );
+}
+
+
+void CtrlVideo::unsetLayout()
+{
+ m_pLayout->getActiveVar().delObserver( this );
+ CtrlGeneric::unsetLayout();
+}
+
+
+void CtrlVideo::resizeControl( int width, int height )
+{
+ if( !m_bAutoResize )
+ return;
+
+ WindowManager &rWindowManager =
+ getIntf()->p_sys->p_theme->getWindowManager();
+
+ const Position *pPos = getPosition();
+
+ if( width != pPos->getWidth() || height != pPos->getHeight() )
+ {
+ // new layout dimensions
+ int newWidth = width + m_xShift;
+ int newHeight = height + m_yShift;
- // Create a child window for the vout if it doesn't exist yet
- if (!m_pVout)
+ // Resize the layout
+ rWindowManager.startResize( m_rLayout, WindowManager::kResizeSE );
+ rWindowManager.resize( m_rLayout, newWidth, newHeight );
+ rWindowManager.stopResize();
+
+ if( m_pVoutWindow )
{
- m_pVout = new VoutWindow( getIntf(), pPos->getLeft(),
- pPos->getTop(), false, false, *pParent );
- m_pVout->resize( pPos->getWidth(), pPos->getHeight() );
- m_pVout->show();
+ m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
+ m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
}
}
}
-void CtrlVideo::onUpdate( Subject<VarBox> &rVoutSize )
+void CtrlVideo::onUpdate( Subject<VarBool> &rVariable, void *arg )
+{
+ (void)arg;
+
+ // Visibility changed
+ if( &rVariable == m_pVisible )
+ {
+ msg_Dbg( getIntf(), "VideoCtrl : Visibility changed (visible=%d)",
+ isVisible() );
+ notifyLayout();
+ }
+
+ // Active Layout changed
+ if( &rVariable == &m_pLayout->getActiveVar() )
+ {
+ msg_Dbg( getIntf(), "VideoCtrl : Active Layout changed (isActive=%d)",
+ m_pLayout->getActiveVar().get() );
+ }
+
+ VarBool &rFullscreen = VlcProc::instance( getIntf() )->getFullscreenVar();
+ if( &rVariable == &rFullscreen )
+ {
+ msg_Dbg( getIntf(), "VideoCtrl : fullscreen toggled (fullscreen = %d)",
+ rFullscreen.get() );
+ }
+
+ m_bIsUseable = isVisible() &&
+ m_pLayout->getActiveVar().get() &&
+ !rFullscreen.get();
+
+ if( m_bIsUseable && !isUsed() )
+ {
+ VoutManager::instance( getIntf() )->requestVout( this );
+ }
+ else if( !m_bIsUseable && isUsed() )
+ {
+ VoutManager::instance( getIntf() )->discardVout( this );
+ }
+}
+
+void CtrlVideo::attachVoutWindow( VoutWindow* pVoutWindow, int width, int height )
+{
+ width = ( width < 0 ) ? pVoutWindow->getOriginalWidth() : width;
+ height = ( height < 0 ) ? pVoutWindow->getOriginalHeight() : height;
+
+ WindowManager &rWindowManager =
+ getIntf()->p_sys->p_theme->getWindowManager();
+ TopWindow* pWin = getWindow();
+ rWindowManager.show( *pWin );
+
+ if( m_bAutoResize && width && height )
+ {
+ int newWidth = width + m_xShift;
+ int newHeight = height + m_yShift;
+
+ rWindowManager.startResize( m_rLayout, WindowManager::kResizeSE );
+ rWindowManager.resize( m_rLayout, newWidth, newHeight );
+ rWindowManager.stopResize();
+ }
+
+ pVoutWindow->setCtrlVideo( this );
+
+ m_pVoutWindow = pVoutWindow;
+}
+
+
+void CtrlVideo::detachVoutWindow( )
{
- int newWidth = ((VarBox&)rVoutSize).getWidth() + m_xShift;
- int newHeight = ((VarBox&)rVoutSize).getHeight() + m_yShift;
-
- // Create a resize command
- CmdGeneric *pCmd = new CmdResize( getIntf(), m_rLayout, newWidth,
- newHeight );
- // Push the command in the asynchronous command queue
- AsyncQueue *pQueue = AsyncQueue::instance( getIntf() );
- pQueue->push( CmdGenericPtr( pCmd ) );
+ m_pVoutWindow->setCtrlVideo( NULL );
+ m_pVoutWindow = NULL;
}