[vlc-commits] [Git][videolan/vlc][master] 3 commits: qt: implement combined surface updates in `CompositorWin7`

Steve Lhomme (@robUx4) gitlab at videolan.org
Thu Dec 18 12:43:28 UTC 2025



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
dc65deb7 by Fatih Uzunoglu at 2025-12-18T12:02:02+00:00
qt: implement combined surface updates in `CompositorWin7`

- - - - -
6c619c4b by Fatih Uzunoglu at 2025-12-18T12:02:02+00:00
qt: implement combined surface updates in `CompositorPlatform`

- - - - -
d9e29546 by Fatih Uzunoglu at 2025-12-18T12:02:02+00:00
qt: implement combined surface updates in `CompositorX11`

- - - - -


8 changed files:

- modules/gui/qt/maininterface/compositor_platform.cpp
- modules/gui/qt/maininterface/compositor_platform.hpp
- modules/gui/qt/maininterface/compositor_win7.cpp
- modules/gui/qt/maininterface/compositor_win7.hpp
- modules/gui/qt/maininterface/compositor_x11.cpp
- modules/gui/qt/maininterface/compositor_x11.hpp
- modules/gui/qt/maininterface/compositor_x11_renderwindow.cpp
- modules/gui/qt/maininterface/compositor_x11_renderwindow.hpp


Changes:

=====================================
modules/gui/qt/maininterface/compositor_platform.cpp
=====================================
@@ -189,6 +189,33 @@ bool CompositorPlatform::eventFilter(QObject *watched, QEvent *event)
     return false;
 }
 
+void CompositorPlatform::commitSurface()
+{
+    if (!m_videoWindow)
+        return;
+
+    if (m_pendingPosition && m_pendingSize)
+    {
+        m_videoWindow->setGeometry(m_pendingPosition->x(), m_pendingPosition->y(),
+                                   m_pendingSize->width(), m_pendingSize->height());
+        m_pendingPosition.reset();
+        m_pendingSize.reset();
+    }
+    else
+    {
+        if (m_pendingSize)
+        {
+            m_videoWindow->resize(*m_pendingSize);
+            m_pendingSize.reset();
+        }
+        else if (m_pendingPosition)
+        {
+            m_videoWindow->setPosition(*m_pendingPosition);
+            m_pendingPosition.reset();
+        }
+    }
+}
+
 int CompositorPlatform::windowEnable(const vlc_window_cfg_t *)
 {
     commonWindowEnable();
@@ -203,11 +230,11 @@ void CompositorPlatform::windowDisable()
 void CompositorPlatform::onSurfacePositionChanged(const QPointF &position)
 {
     const QPointF point = position / m_videoWindow->devicePixelRatio();
-    m_videoWindow->setPosition({static_cast<int>(point.x()), static_cast<int>(point.y())});
+    m_pendingPosition = QPoint{static_cast<int>(point.x()), static_cast<int>(point.y())};
 }
 
 void CompositorPlatform::onSurfaceSizeChanged(const QSizeF &size)
 {
     const QSizeF area = (size / m_videoWindow->devicePixelRatio());
-    m_videoWindow->resize({static_cast<int>(std::ceil(area.width())), static_cast<int>(std::ceil(area.height()))});
+    m_pendingSize = QSize{static_cast<int>(std::ceil(area.width())), static_cast<int>(std::ceil(area.height()))};
 }


=====================================
modules/gui/qt/maininterface/compositor_platform.hpp
=====================================
@@ -49,6 +49,10 @@ public:
 
     bool eventFilter(QObject *watched, QEvent *event) override;
 
+protected:
+    bool canDoCombinedSurfaceUpdates() const override { return true; };
+    void commitSurface() override;
+
 private:
     int windowEnable(const vlc_window_cfg_t *) override;
     void windowDisable() override;
@@ -61,6 +65,9 @@ private:
     std::unique_ptr<QWindow> m_rootWindow;
     QPointer<QWindow> m_videoWindow;
     QPointer<QQuickView> m_quickWindow;
+
+    std::optional<QSize> m_pendingSize;
+    std::optional<QPoint> m_pendingPosition;
 };
 
 }


=====================================
modules/gui/qt/maininterface/compositor_win7.cpp
=====================================
@@ -208,6 +208,33 @@ bool CompositorWin7::eventFilter(QObject*, QEvent* ev)
     return false;
 }
 
+void CompositorWin7::commitSurface()
+{
+    if (!m_stable)
+        return;
+
+    if (m_pendingPosition && m_pendingSize)
+    {
+        m_stable->setGeometry(m_pendingPosition->x(), m_pendingPosition->y(),
+                              m_pendingSize->width(), m_pendingSize->height());
+        m_pendingPosition.reset();
+        m_pendingSize.reset();
+    }
+    else
+    {
+        if (m_pendingSize)
+        {
+            m_stable->resize(*m_pendingSize);
+            m_pendingSize.reset();
+        }
+        else if (m_pendingPosition)
+        {
+            m_stable->move(*m_pendingPosition);
+            m_pendingPosition.reset();
+        }
+    }
+}
+
 void CompositorWin7::resetVideoZOrder()
 {
     //Place the video wdiget right behind the interface
@@ -230,13 +257,13 @@ void CompositorWin7::resetVideoZOrder()
 void CompositorWin7::onSurfacePositionChanged(const QPointF& position)
 {
     const QPointF point = position / m_stable->window()->devicePixelRatioF();
-    m_stable->move({static_cast<int>(point.x()), static_cast<int>(point.y())});
+    m_pendingPosition = QPoint{static_cast<int>(point.x()), static_cast<int>(point.y())};
 }
 
 void CompositorWin7::onSurfaceSizeChanged(const QSizeF& size)
 {
     const QSizeF area = (size / m_stable->window()->devicePixelRatioF());
-    m_stable->resize({static_cast<int>(std::ceil(area.width())), static_cast<int>(std::ceil(area.height()))});
+    m_pendingSize = QSize{static_cast<int>(std::ceil(area.width())), static_cast<int>(std::ceil(area.height()))};
 }
 
 


=====================================
modules/gui/qt/maininterface/compositor_win7.hpp
=====================================
@@ -63,6 +63,9 @@ public:
 protected:
     bool eventFilter(QObject *obj, QEvent *ev) override;
 
+    bool canDoCombinedSurfaceUpdates() const override { return true; };
+    void commitSurface() override;
+
 private:
     int windowEnable(const vlc_window_cfg_t *) override;
     void windowDisable() override;
@@ -81,6 +84,8 @@ private:
     HWND m_qmlWindowHWND = nullptr;
     HWND m_videoWindowHWND = nullptr;
 
+    std::optional<QSize> m_pendingSize;
+    std::optional<QPoint> m_pendingPosition;
 };
 
 }


=====================================
modules/gui/qt/maininterface/compositor_x11.cpp
=====================================
@@ -245,13 +245,13 @@ void CompositorX11::unloadGUI()
 
 void CompositorX11::onSurfacePositionChanged(const QPointF& position)
 {
-    m_renderWindow->setVideoPosition({static_cast<int>(position.x()), static_cast<int>(position.y())});
+    m_pendingPosition = QPoint{static_cast<int>(position.x()), static_cast<int>(position.y())};
 }
 
 void CompositorX11::onSurfaceSizeChanged(const QSizeF& size)
 {
     const QSizeF area = (size / m_videoWidget->window()->devicePixelRatioF());
-    m_renderWindow->setVideoSize({static_cast<int>(std::ceil(area.width())), static_cast<int>(std::ceil(area.height()))});
+    m_pendingSize = QSize{static_cast<int>(std::ceil(area.width())), static_cast<int>(std::ceil(area.height()))};
 }
 
 bool CompositorX11::setupVoutWindow(vlc_window_t* p_wnd, VoutDestroyCb destroyCb)
@@ -286,6 +286,12 @@ QQuickItem * CompositorX11::activeFocusItem() const /* override */
     return m_qmlView->activeFocusItem();
 }
 
+void CompositorX11::commitSurface()
+{
+    if (m_renderWindow)
+        m_renderWindow->setVideoGeometry(m_pendingPosition, m_pendingSize);
+}
+
 ///////// DummyNativeWidget
 
 DummyNativeWidget::DummyNativeWidget(QWidget* parent, Qt::WindowFlags f)


=====================================
modules/gui/qt/maininterface/compositor_x11.hpp
=====================================
@@ -55,6 +55,10 @@ public:
 
     QQuickItem * activeFocusItem() const override;
 
+protected:
+    bool canDoCombinedSurfaceUpdates() const override { return true; };
+    void commitSurface() override;
+
 private:
     int windowEnable(const vlc_window_cfg_t *)  override;
     void windowDisable() override;
@@ -69,6 +73,9 @@ private:
     std::unique_ptr<QWidget> m_videoWidget;
     std::unique_ptr<CompositorX11UISurface> m_qmlView;
     std::unique_ptr<CompositorX11RenderWindow> m_renderWindow;
+
+    std::optional<QSize> m_pendingSize;
+    std::optional<QPoint> m_pendingPosition;
 };
 
 class DummyNativeWidget : public QWidget


=====================================
modules/gui/qt/maininterface/compositor_x11_renderwindow.cpp
=====================================
@@ -520,16 +520,17 @@ void CompositorX11RenderWindow::hideEvent(QHideEvent* event)
     emit visiblityChanged(false);
 }
 
-void CompositorX11RenderWindow::setVideoPosition(const QPoint& position)
+void CompositorX11RenderWindow::setVideoPosition(const QPoint& position, bool signalChange)
 {
     if (m_videoWindow && m_videoClient)
     {
         m_videoPosition.moveTopLeft(position);
-        emit videoPositionChanged(m_videoPosition);
+        if (signalChange)
+            emit videoPositionChanged(m_videoPosition);
     }
 }
 
-void CompositorX11RenderWindow::setVideoSize(const QSize& size)
+void CompositorX11RenderWindow::setVideoSize(const QSize& size, bool signalChange)
 {
     if (m_videoWindow && m_videoClient)
     {
@@ -542,7 +543,25 @@ void CompositorX11RenderWindow::setVideoSize(const QSize& size)
             m_videoClient->getPicture();
         }
         m_videoPosition.setSize(size * devicePixelRatio());
-        emit videoPositionChanged(m_videoPosition);
+        if (signalChange)
+            emit videoPositionChanged(m_videoPosition);
+    }
+}
+
+void CompositorX11RenderWindow::setVideoGeometry(const std::optional<QPoint> &position,
+                                                 const std::optional<QSize> &size)
+{
+    if (position && size)
+    {
+        setVideoSize(*size, false);
+        setVideoPosition(*position, true);
+    }
+    else
+    {
+        if (size)
+            setVideoSize(*size);
+        else if (position)
+            setVideoPosition(*position);
     }
 }
 


=====================================
modules/gui/qt/maininterface/compositor_x11_renderwindow.hpp
=====================================
@@ -163,8 +163,10 @@ public:
     bool startRendering();
     void stopRendering();
 
-    void setVideoPosition(const QPoint& position);
-    void setVideoSize(const QSize& size);
+    void setVideoPosition(const QPoint& position, bool signalChange = true);
+    void setVideoSize(const QSize& size, bool signalChange = true);
+    void setVideoGeometry(const std::optional<QPoint>& position,
+                          const std::optional<QSize>& size);
 
     inline bool hasAcrylic() const { return m_hasAcrylic; }
     void setAcrylic(bool value);



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/918c2d380ad4fc63a9af223e57be6d33ba6fd835...d9e29546dcd1b738946e58d899bb5aed7c283d0d

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/918c2d380ad4fc63a9af223e57be6d33ba6fd835...d9e29546dcd1b738946e58d899bb5aed7c283d0d
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list