skins2: improve resizing when multiple layers are used and solve zoom misfunctioning...
authorErwan Tulou <brezhoneg1@yahoo.fr>
Fri, 12 Jun 2009 08:49:58 +0000 (10:49 +0200)
committerErwan Tulou <brezhoneg1@yahoo.fr>
Fri, 12 Jun 2009 16:13:23 +0000 (18:13 +0200)
modules/gui/skins2/commands/cmd_resize.cpp
modules/gui/skins2/commands/cmd_resize.hpp
modules/gui/skins2/controls/ctrl_video.cpp
modules/gui/skins2/controls/ctrl_video.hpp
modules/gui/skins2/src/vout_manager.cpp
modules/gui/skins2/src/vout_window.hpp

index 5a768da..2180ed5 100644 (file)
@@ -46,9 +46,9 @@ void CmdResize::execute()
 }
 
 
-CmdResizeVout::CmdResizeVout( intf_thread_t *pIntf, void *pWindow, int width,
-                              int height ):
-    CmdGeneric( pIntf ), m_pWindow( pWindow ), m_width( width ),
+CmdResizeVout::CmdResizeVout( intf_thread_t *pIntf, VoutWindow *pVoutWindow,
+                              int width, int height ):
+    CmdGeneric( pIntf ), m_pVoutWindow( pVoutWindow ), m_width( width ),
     m_height( height )
 {
 }
@@ -56,8 +56,17 @@ CmdResizeVout::CmdResizeVout( intf_thread_t *pIntf, void *pWindow, int width,
 
 void CmdResizeVout::execute()
 {
-    VarBox &rVoutSize = VlcProc::instance( getIntf() )->getVoutSizeVar();
-    rVoutSize.setSize( m_width, m_height );
+    if( m_pVoutWindow )
+    {
+        m_pVoutWindow->setOriginalWidth( m_width );
+        m_pVoutWindow->setOriginalHeight( m_height );
+
+        CtrlVideo* pCtrlVideo = m_pVoutWindow->getCtrlVideo();
+        if( pCtrlVideo )
+        {
+            pCtrlVideo->resizeControl( m_width, m_height );
+        }
+    }
 }
 
 
index 3233dd3..78f2bfa 100644 (file)
@@ -61,8 +61,8 @@ class CmdResizeVout: public CmdGeneric
 {
     public:
         /// Resize the given layout
-        CmdResizeVout( intf_thread_t *pIntf, void *pWindow, int width,
-                       int height );
+        CmdResizeVout( intf_thread_t *pIntf, VoutWindow *pVoutWindow,
+                       int width, int height );
         virtual ~CmdResizeVout() {}
 
         /// This method does the real job of the command
@@ -72,7 +72,7 @@ class CmdResizeVout: public CmdGeneric
         virtual string getType() const { return "resize vout"; }
 
     private:
-        void *m_pWindow;
+        VoutWindow *m_pVoutWindow;
         int m_width, m_height;
 };
 
index ce62d72..f8083d3 100644 (file)
@@ -187,10 +187,10 @@ void CtrlVideo::onUpdate( Subject<VarBool> &rVariable, void *arg  )
     }
 }
 
-void CtrlVideo::attachVoutWindow( VoutWindow* pVoutWindow )
+void CtrlVideo::attachVoutWindow( VoutWindow* pVoutWindow, int width, int height )
 {
-    int width = pVoutWindow->getOriginalWidth();
-    int height = pVoutWindow->getOriginalHeight();
+    width = ( width < 0 ) ? pVoutWindow->getOriginalWidth() : width;
+    height = ( height < 0 ) ? pVoutWindow->getOriginalHeight() : height;
 
     WindowManager &rWindowManager =
         getIntf()->p_sys->p_theme->getWindowManager();
index d7b67d5..c152664 100644 (file)
@@ -63,7 +63,8 @@ class CtrlVideo: public CtrlGeneric, public Observer<VarBox>
         virtual void onUpdate( Subject<VarBool> &rVariable , void* );
 
         // Attach a voutWindow to a Video Control
-        void attachVoutWindow( VoutWindow* pVoutWindow );
+        void attachVoutWindow( VoutWindow* pVoutWindow,
+                               int width = -1, int height = -1 );
 
         // Detach a voutWindow from a Video Control
         void detachVoutWindow( );
index 2315e58..65d8d89 100644 (file)
@@ -154,7 +154,8 @@ void VoutManager::requestVout( CtrlVideo* pCtrlVideo )
     {
         if( (*it).pCtrlVideo == NULL )
         {
-            pCtrlVideo->attachVoutWindow( (*it).pVoutWindow );
+            pCtrlVideo->attachVoutWindow( (*it).pVoutWindow,
+                                          (*it).width, (*it).height );
             (*it).pCtrlVideo = pCtrlVideo;
             break;
         }
@@ -274,6 +275,7 @@ int VoutManager::controlWindow( struct vout_window_t *pWnd,
 {
     intf_thread_t *pIntf = (intf_thread_t *)pWnd->p_private;
     VoutManager *pThis = pIntf->p_sys->p_voutManager;
+    vout_thread_t* pVout = pWnd->vout;
 
     switch( query )
     {
@@ -284,12 +286,27 @@ int VoutManager::controlWindow( struct vout_window_t *pWnd,
 
             if( i_width && i_height )
             {
-                // Post a resize vout command
-                CmdResizeVout *pCmd =
-                    new CmdResizeVout( pThis->getIntf(), pWnd->handle.hwnd,
-                                       i_width, i_height );
-                AsyncQueue *pQueue = AsyncQueue::instance( pThis->getIntf() );
-                pQueue->push( CmdGenericPtr( pCmd ) );
+                pThis->lockVout();
+
+                vector<SavedVout>::iterator it;
+                for( it = pThis->m_SavedVoutVec.begin();
+                     it != pThis->m_SavedVoutVec.end(); it++ )
+                {
+                    if( (*it).pVout == pVout )
+                    {
+                        // Post a vout resize command
+                        CmdResizeVout *pCmd =
+                            new CmdResizeVout( pThis->getIntf(),
+                                               (*it).pVoutWindow,
+                                               (int)i_width, (int)i_height );
+                        AsyncQueue *pQueue =
+                            AsyncQueue::instance( pThis->getIntf() );
+                        pQueue->push( CmdGenericPtr( pCmd ) );
+                        break;
+                    }
+                }
+
+                pThis->unlockVout();
             }
         }
 
index 90d8225..b355ad4 100644 (file)
@@ -59,13 +59,18 @@ class VoutWindow: private GenericWindow
         /// Refresh an area of the window
         virtual void refresh( int left, int top, int width, int height );
 
-        /// set Video Control for VoutWindow
+        /// set and get Video Control for VoutWindow
         virtual void setCtrlVideo( CtrlVideo* pCtrlVideo );
+        virtual CtrlVideo* getCtrlVideo( ) { return m_pCtrlVideo; }
 
         /// get original size of vout
         virtual int getOriginalWidth( ) { return original_width; }
         virtual int getOriginalHeight( ) { return original_height; }
 
+        /// set original size of vout
+        virtual void setOriginalWidth( int width ) { original_width = width; }
+        virtual void setOriginalHeight( int height ) { original_height = height; }
+
         virtual string getType() const { return "Vout"; }
 
     private: