From ec1a1670765f5e1a7fdda75a736f852f2e306c8a Mon Sep 17 00:00:00 2001
From: Pierre Lamot <pierre@videolabs.io>
Date: Wed, 12 May 2021 10:01:46 +0200
Subject: [PATCH] qt: allow passing a global vout close callback to the
 compositor

---
 modules/gui/qt/maininterface/compositor.cpp       |  6 ++++++
 modules/gui/qt/maininterface/compositor.hpp       | 10 +++++++++-
 modules/gui/qt/maininterface/compositor_dcomp.cpp |  5 ++++-
 modules/gui/qt/maininterface/compositor_dcomp.hpp |  2 +-
 modules/gui/qt/maininterface/compositor_dummy.cpp |  2 +-
 modules/gui/qt/maininterface/compositor_dummy.hpp |  2 +-
 modules/gui/qt/maininterface/compositor_win7.cpp  |  3 ++-
 modules/gui/qt/maininterface/compositor_win7.hpp  |  2 +-
 modules/gui/qt/qt.cpp                             |  9 +++++++--
 9 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/modules/gui/qt/maininterface/compositor.cpp b/modules/gui/qt/maininterface/compositor.cpp
index 36d41bb0999c..dc5b6933ba0d 100644
--- a/modules/gui/qt/maininterface/compositor.cpp
+++ b/modules/gui/qt/maininterface/compositor.cpp
@@ -50,4 +50,10 @@ Compositor* Compositor::createCompositor(qt_intf_t *p_intf)
     return new CompositorDummy(p_intf);
 }
 
+void Compositor::onWindowDestruction(vout_window_t *p_wnd)
+{
+    if (m_destroyCb)
+        m_destroyCb(p_wnd);
+}
+
 }
diff --git a/modules/gui/qt/maininterface/compositor.hpp b/modules/gui/qt/maininterface/compositor.hpp
index b992c8847d03..b03c0506649a 100644
--- a/modules/gui/qt/maininterface/compositor.hpp
+++ b/modules/gui/qt/maininterface/compositor.hpp
@@ -43,17 +43,25 @@ public:
         DirectCompositionCompositor
     };
 
+    typedef void (*VoutDestroyCb)(vout_window_t *p_wnd);
+
+public:
     virtual ~Compositor() = default;
 
     virtual MainInterface* makeMainInterface() = 0;
     virtual void destroyMainInterface() = 0;
 
-    virtual bool setupVoutWindow(vout_window_t *p_wnd) = 0;
+    virtual bool setupVoutWindow(vout_window_t *p_wnd, VoutDestroyCb destroyCb) = 0;
 
     virtual Type type() const = 0;
 
     //factory
     static Compositor* createCompositor(qt_intf_t *p_intf);
+
+protected:
+    void onWindowDestruction(vout_window_t *p_wnd);
+
+    VoutDestroyCb m_destroyCb = nullptr;
 };
 
 
diff --git a/modules/gui/qt/maininterface/compositor_dcomp.cpp b/modules/gui/qt/maininterface/compositor_dcomp.cpp
index 6b54f1de42dc..74086504cedc 100644
--- a/modules/gui/qt/maininterface/compositor_dcomp.cpp
+++ b/modules/gui/qt/maininterface/compositor_dcomp.cpp
@@ -101,6 +101,7 @@ void CompositorDirectComposition::window_destroy(struct vout_window_t * p_wnd)
     msg_Dbg(that->m_intf, "window_destroy");
     that->m_window = nullptr;
     that->m_videoVisual.Reset();
+    that->onWindowDestruction(p_wnd);
 }
 
 void CompositorDirectComposition::window_set_state(struct vout_window_t * p_wnd, unsigned state)
@@ -293,8 +294,10 @@ void CompositorDirectComposition::destroyMainInterface()
     m_ui.reset();
 }
 
-bool CompositorDirectComposition::setupVoutWindow(vout_window_t *p_wnd)
+bool CompositorDirectComposition::setupVoutWindow(vout_window_t *p_wnd, VoutDestroyCb destroyCb)
 {
+    m_destroyCb = destroyCb;
+
     //Only the first video is embedded
     if (m_videoVisual.Get())
         return false;
diff --git a/modules/gui/qt/maininterface/compositor_dcomp.hpp b/modules/gui/qt/maininterface/compositor_dcomp.hpp
index 357d33817411..acc1ca1ee099 100644
--- a/modules/gui/qt/maininterface/compositor_dcomp.hpp
+++ b/modules/gui/qt/maininterface/compositor_dcomp.hpp
@@ -50,7 +50,7 @@ public:
     MainInterface *makeMainInterface() override;
     void destroyMainInterface() override;
 
-    bool setupVoutWindow(vout_window_t *p_wnd) override;
+    bool setupVoutWindow(vout_window_t *p_wnd, VoutDestroyCb destroyCb) override;
 
     Type type() const override;
 
diff --git a/modules/gui/qt/maininterface/compositor_dummy.cpp b/modules/gui/qt/maininterface/compositor_dummy.cpp
index 600402190a18..75512fc05d6b 100644
--- a/modules/gui/qt/maininterface/compositor_dummy.cpp
+++ b/modules/gui/qt/maininterface/compositor_dummy.cpp
@@ -68,7 +68,7 @@ void CompositorDummy::destroyMainInterface()
     }
 }
 
-bool CompositorDummy::setupVoutWindow(vout_window_t*)
+bool CompositorDummy::setupVoutWindow(vout_window_t*, VoutDestroyCb)
 {
     //dummy compositor doesn't handle window intergration
     return false;
diff --git a/modules/gui/qt/maininterface/compositor_dummy.hpp b/modules/gui/qt/maininterface/compositor_dummy.hpp
index edd4bd5d1e63..ae5bdc947caa 100644
--- a/modules/gui/qt/maininterface/compositor_dummy.hpp
+++ b/modules/gui/qt/maininterface/compositor_dummy.hpp
@@ -40,7 +40,7 @@ public:
     virtual MainInterface *makeMainInterface() override;
     virtual void destroyMainInterface() override;
 
-    bool setupVoutWindow(vout_window_t *p_wnd) override;
+    bool setupVoutWindow(vout_window_t *p_wnd, VoutDestroyCb destroyCb) override;
 
     Type type() const override;
 
diff --git a/modules/gui/qt/maininterface/compositor_win7.cpp b/modules/gui/qt/maininterface/compositor_win7.cpp
index 7d586633f2a6..f3be15bbb48c 100644
--- a/modules/gui/qt/maininterface/compositor_win7.cpp
+++ b/modules/gui/qt/maininterface/compositor_win7.cpp
@@ -55,6 +55,7 @@ void CompositorWin7::window_destroy(struct vout_window_t * p_wnd)
 {
     CompositorWin7* that = static_cast<CompositorWin7*>(p_wnd->sys);
     msg_Dbg(that->m_intf, "window_destroy");
+    that->onWindowDestruction(p_wnd);
 }
 
 void CompositorWin7::window_set_state(struct vout_window_t * p_wnd, unsigned state)
@@ -241,7 +242,7 @@ void CompositorWin7::destroyMainInterface()
     }
 }
 
-bool CompositorWin7::setupVoutWindow(vout_window_t *p_wnd)
+bool CompositorWin7::setupVoutWindow(vout_window_t *p_wnd, VoutDestroyCb destroyCb)
 {
     BOOL isCompositionEnabled;
     HRESULT hr = DwmIsCompositionEnabled(&isCompositionEnabled);
diff --git a/modules/gui/qt/maininterface/compositor_win7.hpp b/modules/gui/qt/maininterface/compositor_win7.hpp
index 7ba256dc8042..18f5a2dd39c7 100644
--- a/modules/gui/qt/maininterface/compositor_win7.hpp
+++ b/modules/gui/qt/maininterface/compositor_win7.hpp
@@ -50,7 +50,7 @@ public:
 
     virtual MainInterface *makeMainInterface() override;
     virtual void destroyMainInterface() override;
-    virtual bool setupVoutWindow(vout_window_t*) override;
+    virtual bool setupVoutWindow(vout_window_t*, VoutDestroyCb destroyCb) override;
 
     Type type() const override;
 
diff --git a/modules/gui/qt/qt.cpp b/modules/gui/qt/qt.cpp
index 3ef3f46b4677..f7fb05b3bc28 100644
--- a/modules/gui/qt/qt.cpp
+++ b/modules/gui/qt/qt.cpp
@@ -835,6 +835,11 @@ static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg,
     QApplication::postEvent( THEDP, event );
 }
 
+static void WindowCloseCb( vout_window_t *p_wnd )
+{
+    //FIXME
+}
+
 /**
  * Video output window provider
  */
@@ -864,6 +869,6 @@ static int WindowOpen( vout_window_t *p_wnd )
     if (unlikely(open_state != OPEN_STATE_OPENED))
         return VLC_EGENERIC;
 
-    return p_intf->p_compositor->setupVoutWindow( p_wnd ) ? VLC_SUCCESS : VLC_EGENERIC;
-
+    bool ret  = p_intf->p_compositor->setupVoutWindow( p_wnd, &WindowCloseCb );
+    return ret ? VLC_SUCCESS : VLC_EGENERIC;
 }
-- 
GitLab