ctrl_video.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * ctrl_video.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 the VideoLAN team
  5.  * $Id: ee7b883fefe869f842f721df522eb9e8e473d906 $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #include "ctrl_video.hpp"
  24. #include "../src/theme.hpp"
  25. #include "../src/vout_window.hpp"
  26. #include "../src/os_graphics.hpp"
  27. #include "../src/vlcproc.hpp"
  28. #include "../src/vout_manager.hpp"
  29. #include "../src/window_manager.hpp"
  30. #include "../commands/async_queue.hpp"
  31. #include "../commands/cmd_resize.hpp"
  32. CtrlVideo::CtrlVideo( intf_thread_t *pIntf, GenericLayout &rLayout,
  33.                       bool autoResize, const UString &rHelp,
  34.                       VarBool *pVisible ):
  35.     CtrlGeneric( pIntf, rHelp, pVisible ), m_rLayout( rLayout ),
  36.     m_xShift( 0 ), m_yShift( 0 ), m_bAutoResize( autoResize ),
  37.     m_pVoutWindow( NULL ), m_bIsUseable( false )
  38. {
  39.     // Observe the vout size variable if the control is auto-resizable
  40.     if( m_bAutoResize )
  41.     {
  42.         VarBox &rVoutSize = VlcProc::instance( pIntf )->getVoutSizeVar();
  43.         rVoutSize.addObserver( this );
  44.     }
  45. }
  46. CtrlVideo::~CtrlVideo()
  47. {
  48.     VarBox &rVoutSize = VlcProc::instance( getIntf() )->getVoutSizeVar();
  49.     rVoutSize.delObserver( this );
  50.     //m_pLayout->getActiveVar().delObserver( this );
  51. }
  52. void CtrlVideo::handleEvent( EvtGeneric &rEvent )
  53. {
  54. }
  55. bool CtrlVideo::mouseOver( int x, int y ) const
  56. {
  57.     return false;
  58. }
  59. void CtrlVideo::onResize()
  60. {
  61.     const Position *pPos = getPosition();
  62.     if( pPos && m_pVoutWindow )
  63.     {
  64.         m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
  65.         m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
  66.     }
  67. }
  68. void CtrlVideo::onPositionChange()
  69. {
  70.     // Compute the difference between layout size and video size
  71.     m_xShift = m_rLayout.getWidth() - getPosition()->getWidth();
  72.     m_yShift = m_rLayout.getHeight() - getPosition()->getHeight();
  73. }
  74. void CtrlVideo::draw( OSGraphics &rImage, int xDest, int yDest )
  75. {
  76.     GenericWindow *pParent = getWindow();
  77.     const Position *pPos = getPosition();
  78.     if( pParent && pPos )
  79.     {
  80.         // Draw a black rectangle under the video to avoid transparency
  81.         rImage.fillRect( pPos->getLeft(), pPos->getTop(), pPos->getWidth(),
  82.                          pPos->getHeight(), 0 );
  83.     }
  84. }
  85. void CtrlVideo::setLayout( GenericLayout *pLayout,
  86.                            const Position &rPosition )
  87. {
  88.     CtrlGeneric::setLayout( pLayout, rPosition );
  89.     m_pLayout->getActiveVar().addObserver( this );
  90.     m_bIsUseable = isVisible() && m_pLayout->getActiveVar().get();
  91.     // register Video Control
  92.     VoutManager::instance( getIntf() )->registerCtrlVideo( this );
  93.     msg_Dbg( getIntf(),"New VideoControl detected(%p), useability=%s",
  94.                            this, m_bIsUseable ? "true" : "false" );
  95. }
  96. void CtrlVideo::resizeControl( int width, int height )
  97. {
  98.     int newWidth = width + m_xShift;
  99.     int newHeight = height + m_yShift;
  100.     // Create a resize command
  101.     // FIXME: this way of getting the window manager kind of sucks
  102.     WindowManager &rWindowManager =
  103.         getIntf()->p_sys->p_theme->getWindowManager();
  104.     rWindowManager.startResize( m_rLayout, WindowManager::kResizeSE );
  105.     CmdGeneric *pCmd = new CmdResize( getIntf(), rWindowManager,
  106.                                       m_rLayout, newWidth, newHeight );
  107.     // Push the command in the asynchronous command queue
  108.     AsyncQueue *pQueue = AsyncQueue::instance( getIntf() );
  109.     pQueue->push( CmdGenericPtr( pCmd ), false );
  110.     // FIXME: this should be a command too
  111.     rWindowManager.stopResize();
  112.     pCmd = new CmdResizeInnerVout( getIntf(), this );
  113.     pQueue->push( CmdGenericPtr( pCmd ), false );
  114.     TopWindow* pWin = getWindow();
  115.     rWindowManager.show( *pWin );
  116. }
  117. void CtrlVideo::onUpdate( Subject<VarBox> &rVoutSize, void *arg )
  118. {
  119.     int newWidth = ((VarBox&)rVoutSize).getWidth() + m_xShift;
  120.     int newHeight = ((VarBox&)rVoutSize).getHeight() + m_yShift;
  121.     resizeControl( newWidth, newHeight );
  122. }
  123. void CtrlVideo::onUpdate( Subject<VarBool> &rVariable, void *arg  )
  124. {
  125.     // Visibility changed
  126.     if( &rVariable == m_pVisible )
  127.     {
  128.         msg_Dbg( getIntf(), "VideoCtrl : Visibility changed (visible=%d)",
  129.                                   isVisible() );
  130.     }
  131.     // Active Layout changed
  132.     if( &rVariable == &m_pLayout->getActiveVar() )
  133.     {
  134.         msg_Dbg( getIntf(), "VideoCtrl : Active Layout changed (isActive=%d)",
  135.                       m_pLayout->getActiveVar().get() );
  136.     }
  137.     m_bIsUseable = isVisible() && m_pLayout->getActiveVar().get();
  138.     if( m_bIsUseable && !isUsed() )
  139.     {
  140.         VoutManager::instance( getIntf() )->requestVout( this );
  141.     }
  142.     else if( !m_bIsUseable && isUsed() )
  143.     {
  144.         VoutManager::instance( getIntf() )->discardVout( this );
  145.     }
  146. }
  147. void CtrlVideo::attachVoutWindow( VoutWindow* pVoutWindow, int width, int height )
  148. {
  149.     width = ( width < 0 ) ? pVoutWindow->getOriginalWidth() : width;
  150.     height = ( height < 0 ) ? pVoutWindow->getOriginalHeight() : height;
  151.     WindowManager &rWindowManager =
  152.         getIntf()->p_sys->p_theme->getWindowManager();
  153.     TopWindow* pWin = getWindow();
  154.     rWindowManager.show( *pWin );
  155.     if( m_bAutoResize && width && height )
  156.     {
  157.         int newWidth = width + m_xShift;
  158.         int newHeight = height + m_yShift;
  159.         rWindowManager.startResize( m_rLayout, WindowManager::kResizeSE );
  160.         rWindowManager.resize( m_rLayout, newWidth, newHeight );
  161.         rWindowManager.stopResize();
  162.     }
  163.     pVoutWindow->setCtrlVideo( this );
  164.     m_pVoutWindow = pVoutWindow;
  165. }
  166. void CtrlVideo::detachVoutWindow( )
  167. {
  168.     m_pVoutWindow->setCtrlVideo( NULL );
  169.     m_pVoutWindow = NULL;
  170. }
  171. void CtrlVideo::resizeInnerVout( )
  172. {
  173.     if( m_pVoutWindow )
  174.     {
  175.         WindowManager &rWindowManager =
  176.              getIntf()->p_sys->p_theme->getWindowManager();
  177.         TopWindow* pWin = getWindow();
  178.         const Position *pPos = getPosition();
  179.         m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
  180.         m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
  181.         rWindowManager.show( *pWin );
  182.         m_pVoutWindow->show();
  183.     }
  184. }