[vlc-devel] [PATCH 3/4] Qt: refactor vout resize

Anatoliy Anischovich lin.aaa.lin at gmail.com
Sat Aug 6 23:11:56 CEST 2016


---
 modules/gui/qt/components/interface_widgets.cpp | 52 ++++++++-----------
 modules/gui/qt/components/interface_widgets.hpp | 11 +++-
 modules/gui/qt/main_interface.cpp               | 68 +++++++++++--------------
 modules/gui/qt/main_interface.hpp               |  4 +-
 4 files changed, 62 insertions(+), 73 deletions(-)

diff --git a/modules/gui/qt/components/interface_widgets.cpp b/modules/gui/qt/components/interface_widgets.cpp
index db590c5..740d29f 100644
--- a/modules/gui/qt/components/interface_widgets.cpp
+++ b/modules/gui/qt/components/interface_widgets.cpp
@@ -74,10 +74,10 @@
  **********************************************************************/
 
 VideoWidget::VideoWidget( intf_thread_t *_p_i )
-            : QFrame( NULL ) , p_intf( _p_i )
+            : QFrame( NULL ) , p_intf( _p_i ) , i_width( 0 ), i_height( 0 )
 {
     /* Set the policy to expand in both directions */
-    // setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
+    setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
 
     layout = new QHBoxLayout( this );
     layout->setContentsMargins( 0, 0, 0, 0 );
@@ -106,8 +106,7 @@ void VideoWidget::sync( void )
 /**
  * Request the video to avoid the conflicts
  **/
-WId VideoWidget::request( struct vout_window_t *p_wnd, unsigned int *pi_width,
-                          unsigned int *pi_height, bool b_keep_size )
+WId VideoWidget::request( struct vout_window_t *p_wnd )
 {
     if( stable )
     {
@@ -116,12 +115,6 @@ WId VideoWidget::request( struct vout_window_t *p_wnd, unsigned int *pi_width,
     }
     assert( !p_window );
 
-    if( b_keep_size )
-    {
-        *pi_width  = size().width();
-        *pi_height = size().height();
-    }
-
     /* The owner of the video window needs a stable handle (WinId). Reparenting
      * in Qt4-X11 changes the WinId of the widget, so we need to create another
      * dummy widget that stays within the reparentable widget. */
@@ -178,38 +171,35 @@ WId VideoWidget::request( struct vout_window_t *p_wnd, unsigned int *pi_width,
     return stable->winId();
 }
 
+void VideoWidget::reportSize( int w, int h )
+{
+    if( !p_window )
+        return;
+
+    vout_window_ReportSize( p_window, w, h );
+}
+
 /* Set the Widget to the correct Size */
 /* Function has to be called by the parent
    Parent has to care about resizing itself */
-void VideoWidget::setSize( unsigned int w, unsigned int h )
+void VideoWidget::setSize( int w, int h )
 {
-    /* If the size changed, resizeEvent will be called, otherwise not,
-     * in which case we need to tell the vout what the size actually is
-     */
-    if( (unsigned)size().width() == w && (unsigned)size().height() == h )
-    {
-        if( p_window != NULL )
-            vout_window_ReportSize( p_window, w, h );
-        return;
-    }
+    i_width = w;
+    i_height = h;
 
-    resize( w, h );
     emit sizeChanged( w, h );
-    /* Work-around a bug?misconception? that would happen when vout core resize
-       twice to the same size and would make the vout not centered.
-       This cause a small flicker.
-       See #3621
-     */
-    if( (unsigned)size().width() == w && (unsigned)size().height() == h )
-        updateGeometry();
+
     sync();
 }
 
+QSize VideoWidget::sizeHint() const
+{
+    return QSize(i_width, i_height);
+}
+
 void VideoWidget::resizeEvent( QResizeEvent *event )
 {
-    if( p_window != NULL )
-        vout_window_ReportSize( p_window, event->size().width(),
-                                event->size().height() );
+    reportSize( event->size().width(), event->size().height() );
 
     QWidget::resizeEvent( event );
 }
diff --git a/modules/gui/qt/components/interface_widgets.hpp b/modules/gui/qt/components/interface_widgets.hpp
index a07119e..dc64413 100644
--- a/modules/gui/qt/components/interface_widgets.hpp
+++ b/modules/gui/qt/components/interface_widgets.hpp
@@ -59,7 +59,7 @@ public:
     VideoWidget( intf_thread_t * );
     virtual ~VideoWidget();
 
-    WId request( struct vout_window_t *, unsigned int *, unsigned int *, bool );
+    WId request( struct vout_window_t * );
     void  release( void );
     void  sync( void );
 
@@ -70,6 +70,7 @@ protected:
     }
 
     virtual void resizeEvent(QResizeEvent *) Q_DECL_OVERRIDE;
+    virtual QSize sizeHint() const Q_DECL_OVERRIDE;
 
 private:
     intf_thread_t *p_intf;
@@ -77,11 +78,17 @@ private:
 
     QWidget *stable;
     QLayout *layout;
+
+    int i_width;
+    int i_height;
+
+    void reportSize( int, int );
+
 signals:
     void sizeChanged( int, int );
 
 public slots:
-    void setSize( unsigned int, unsigned int );
+    void setSize( int, int );
 };
 
 /******************** Background Widget ****************/
diff --git a/modules/gui/qt/main_interface.cpp b/modules/gui/qt/main_interface.cpp
index 81eea83..5555fda 100644
--- a/modules/gui/qt/main_interface.cpp
+++ b/modules/gui/qt/main_interface.cpp
@@ -218,10 +218,10 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
         {
             CONNECT( videoWidget, sizeChanged( int, int ),
                      this, videoSizeChanged( int,  int ) );
-        }
-        CONNECT( this, askVideoToResize( unsigned int, unsigned int ),
-                 this, setVideoSize( unsigned int, unsigned int ) );
+            CONNECT( this, askVideoToResize( int, int ),
+                     this, setVideoSize( int, int ) );
 
+        }
         CONNECT( this, askVideoSetFullScreen( bool ),
                  this, setVideoFullScreen( bool ) );
     }
@@ -731,7 +731,7 @@ void MainInterface::getVideoSlot( WId *p_id, struct vout_window_t *p_wnd,
         toggleUpdateSystrayMenu();
 
     /* Request the videoWidget */
-    WId ret = videoWidget->request( p_wnd, pi_width, pi_height, !b_autoresize );
+    WId ret = videoWidget->request( p_wnd );
     *p_id = ret;
     if( ret ) /* The videoWidget is available */
     {
@@ -741,8 +741,7 @@ void MainInterface::getVideoSlot( WId *p_id, struct vout_window_t *p_wnd,
         showVideo();
 
         /* Ask videoWidget to resize correctly, if we are in normal mode */
-        if( b_autoresize )
-            videoWidget->setSize( *pi_width, *pi_height );
+        emit askVideoToResize( *pi_width, *pi_height );
     }
 }
 
@@ -777,43 +776,36 @@ void MainInterface::releaseVideoSlot( void )
     stackCentralOldWidget = bgWidget;
 }
 
-void MainInterface::setVideoSize( unsigned int w, unsigned int h )
+
+/* Resize video widget to video size */
+/* If the video size is too large for the screen, resize it to the screen
+   size. */
+void MainInterface::setVideoSize( int w, int h )
 {
-    if (!isFullScreen() && !isMaximized() )
+    if( isFullScreen() || isMaximized() )
+        return;
+
+    QRect screen = QApplication::desktop()->availableGeometry();
+    if( h > screen.height() )
     {
-        /* Resize video widget to video size, or keep it at the same
-         * size. Call setSize() either way so that vout_window_ReportSize
-         * will always get called.
-         * If the video size is too large for the screen, resize it
-         * to the screen size.
-         */
-        if (b_autoresize)
+        w = screen.width();
+        h = screen.height();
+        if( !b_minimalView )
         {
-            QRect screen = QApplication::desktop()->availableGeometry();
-            if( h > screen.height() )
-            {
-                w = screen.width();
-                h = screen.height();
-                if( !b_minimalView )
-                {
-                    if( menuBar()->isVisible() )
-                        h -= menuBar()->height();
-                    if( controls->isVisible() )
-                        h -= controls->height();
-                    if( statusBar()->isVisible() )
-                        h -= statusBar()->height();
-                    if( inputC->isVisible() )
-                        h -= inputC->height();
-                }
-                h -= style()->pixelMetric(QStyle::PM_TitleBarHeight);
-                h -= style()->pixelMetric(QStyle::PM_LayoutBottomMargin);
-                h -= 2 * style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
-            }
-            videoWidget->setSize( w, h );
+            if( menuBar()->isVisible() )
+                h -= menuBar()->height();
+            if( controls->isVisible() )
+                h -= controls->height();
+            if( statusBar()->isVisible() )
+                h -= statusBar()->height();
+            if( inputC->isVisible() )
+                h -= inputC->height();
         }
-        else
-            videoWidget->setSize( videoWidget->width(), videoWidget->height() );
+        h -= style()->pixelMetric(QStyle::PM_TitleBarHeight);
+        h -= style()->pixelMetric(QStyle::PM_LayoutBottomMargin);
+        h -= 2 * style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
     }
+    videoWidget->setSize( w, h );
 }
 
 void MainInterface::videoSizeChanged( int w, int h )
diff --git a/modules/gui/qt/main_interface.hpp b/modules/gui/qt/main_interface.hpp
index 18ab8ce..e4cf8e9 100644
--- a/modules/gui/qt/main_interface.hpp
+++ b/modules/gui/qt/main_interface.hpp
@@ -252,7 +252,7 @@ private slots:
         debug();
     }
 
-    void setVideoSize( unsigned int, unsigned int );
+    void setVideoSize( int, int );
     void videoSizeChanged( int, int );
     void setVideoFullScreen( bool );
     void setVideoOnTop( bool );
@@ -267,7 +267,7 @@ signals:
     void askGetVideo( WId *, struct vout_window_t *, unsigned *, unsigned *,
                       bool );
     void askReleaseVideo( );
-    void askVideoToResize( unsigned int, unsigned int );
+    void askVideoToResize( int, int );
     void askVideoSetFullScreen( bool );
     void askVideoOnTop( bool );
     void minimalViewToggled( bool );
-- 
2.7.3



More information about the vlc-devel mailing list