[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