diff --git a/modules/gui/qt/maininterface/compositor.cpp b/modules/gui/qt/maininterface/compositor.cpp index 36d41bb0999c0496abf802c849f629e99b93c44c..dc5b6933ba0da0ad0f2428ca794c53e2584c129c 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 b992c8847d033e2eb51ecfd331011fc3862e8f88..b03c0506649ac993257637a0799365c618345cbd 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 6b54f1de42dcd759bc2661b9dd17b52eb2017062..74086504cedcd0ca2b35cb8bd8d74533ff862b92 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 357d338174119d5236ff474543ff3a46fe6619ad..acc1ca1ee099c03ce09b2a78cdd027daf065f650 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 600402190a1816fa0932c92fc536500fbc1ca744..75512fc05d6b71ef05e518626cefd347d25c1cb7 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 edd4bd5d1e6311157399f615c4f199cc1c347b31..ae5bdc947caab4ea2e9c3f137919d1cbd1d9a27c 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 7d586633f2a6f735881958002c7bdc01f3ba7bd1..f3be15bbb48cb0e46309fa6d32b6bc2a305fd109 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 7ba256dc8042f3056c9c1c46cfecb96343a628c0..18f5a2dd39c7eed94f5db8b7f3c362b78c39985a 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 3ef3f46b4677b7d7c122e200eaaa0244ed4a1f68..f7fb05b3bc28916519655cf042dca1169ef66fd8 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; }