vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Sat Dec 1 16:24:01 2018 +0200| [204e8b5092932638146547526a0817bebaf66956] | committer: Rémi Denis-Courmont
window: add destroy callback > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=204e8b5092932638146547526a0817bebaf66956 --- include/vlc_vout_window.h | 7 +++++++ modules/gui/macosx/VLCVideoOutputProvider.m | 4 +++- modules/gui/macosx/macosx.m | 3 +-- modules/gui/minimal_macosx/intf.m | 4 +++- modules/gui/minimal_macosx/macosx.c | 3 +-- modules/gui/qt/qt.cpp | 3 ++- modules/gui/skins2/src/skin_main.cpp | 3 ++- modules/video_output/android/window.c | 3 ++- modules/video_output/drawable.c | 3 ++- modules/video_output/wayland/xdg-shell.c | 5 ++++- modules/video_output/xcb/window.c | 16 +++++++++++++--- src/video_output/window.c | 12 +++--------- 12 files changed, 43 insertions(+), 23 deletions(-) diff --git a/include/vlc_vout_window.h b/include/vlc_vout_window.h index 9981fff10f..0a28bd690e 100644 --- a/include/vlc_vout_window.h +++ b/include/vlc_vout_window.h @@ -138,6 +138,13 @@ struct vout_window_operations { * vout_window_Control() should be used instead. */ int (*control)(vout_window_t *, int, va_list); + + /** + * Destroy the window. + * + * Destroys the window and releases all associated resources. + */ + void (*destroy)(vout_window_t *); }; typedef struct vout_window_owner { diff --git a/modules/gui/macosx/VLCVideoOutputProvider.m b/modules/gui/macosx/VLCVideoOutputProvider.m index 92736c6721..950b4bee69 100644 --- a/modules/gui/macosx/VLCVideoOutputProvider.m +++ b/modules/gui/macosx/VLCVideoOutputProvider.m @@ -42,9 +42,11 @@ static atomic_bool b_intf_starting = ATOMIC_VAR_INIT(false); static int WindowControl(vout_window_t *, int i_query, va_list); +static void WindowClose(vout_window_t *); static const struct vout_window_operations ops = { WindowControl, + WindowClose, }; int WindowOpen(vout_window_t *p_wnd, const vout_window_cfg_t *cfg) @@ -157,7 +159,7 @@ static int WindowControl(vout_window_t *p_wnd, int i_query, va_list args) } } -void WindowClose(vout_window_t *p_wnd) +static void WindowClose(vout_window_t *p_wnd) { @autoreleasepool { VLCVideoOutputProvider *voutProvider = [[VLCMain sharedInstance] voutProvider]; diff --git a/modules/gui/macosx/macosx.m b/modules/gui/macosx/macosx.m index 4edd129bde..30410a1ca6 100644 --- a/modules/gui/macosx/macosx.m +++ b/modules/gui/macosx/macosx.m @@ -43,7 +43,6 @@ int OpenIntf (vlc_object_t *); void CloseIntf (vlc_object_t *); int WindowOpen (vout_window_t *, const vout_window_cfg_t *); -void WindowClose (vout_window_t *); /***************************************************************************** * Module descriptor @@ -188,7 +187,7 @@ vlc_module_begin() add_submodule() set_description("Mac OS X Video Output Provider") set_capability("vout window", 100) - set_callbacks(WindowOpen, WindowClose) + set_callbacks(WindowOpen, NULL) set_section(N_("Video output"), 0) add_integer("macosx-vdev", 0, VDEV_TEXT, VDEV_LONGTEXT, false) diff --git a/modules/gui/minimal_macosx/intf.m b/modules/gui/minimal_macosx/intf.m index c3ab7fd1ac..4afd8773ce 100644 --- a/modules/gui/minimal_macosx/intf.m +++ b/modules/gui/minimal_macosx/intf.m @@ -101,9 +101,11 @@ static void Run(intf_thread_t *p_intf) * Vout window management *****************************************************************************/ static int WindowControl(vout_window_t *, int i_query, va_list); +static void WindowClose(vout_window_t *); static const struct vout_window_operations ops = { WindowControl, + WindowClose, }; int WindowOpen(vout_window_t *p_wnd, const vout_window_cfg_t *cfg) @@ -185,7 +187,7 @@ static int WindowControl(vout_window_t *p_wnd, int i_query, va_list args) } } -void WindowClose(vout_window_t *p_wnd) +static void WindowClose(vout_window_t *p_wnd) { @autoreleasepool { NSWindow * o_window = [(__bridge id)p_wnd->handle.nsobject window]; diff --git a/modules/gui/minimal_macosx/macosx.c b/modules/gui/minimal_macosx/macosx.c index 291a05cdd1..f549b2e3cd 100644 --- a/modules/gui/minimal_macosx/macosx.c +++ b/modules/gui/minimal_macosx/macosx.c @@ -44,7 +44,6 @@ int OpenIntf ( vlc_object_t * ); void CloseIntf ( vlc_object_t * ); int WindowOpen ( vout_window_t *, const vout_window_cfg_t * ); -void WindowClose ( vout_window_t * ); /***************************************************************************** * Module descriptor @@ -64,6 +63,6 @@ vlc_module_begin () /* Will be loaded even without interface module. see voutgl.m */ set_description( "Minimal Mac OS X Video Output Provider" ) set_capability( "vout window", 50 ) - set_callbacks( WindowOpen, WindowClose ) + set_callbacks( WindowOpen, NULL ) vlc_module_end () diff --git a/modules/gui/qt/qt.cpp b/modules/gui/qt/qt.cpp index 073a418e3d..f7d973bcd6 100644 --- a/modules/gui/qt/qt.cpp +++ b/modules/gui/qt/qt.cpp @@ -346,7 +346,7 @@ vlc_module_begin () add_submodule () set_capability( "vout window", 0 ) - set_callbacks( WindowOpen, WindowClose ) + set_callbacks( WindowOpen, NULL ) vlc_module_end () @@ -696,6 +696,7 @@ static int WindowControl( vout_window_t *, int i_query, va_list ); static const struct vout_window_operations window_ops = { WindowControl, + WindowClose, }; static int WindowOpen( vout_window_t *p_wnd, const vout_window_cfg_t *cfg ) diff --git a/modules/gui/skins2/src/skin_main.cpp b/modules/gui/skins2/src/skin_main.cpp index de9554b2d1..ce42fa51b7 100644 --- a/modules/gui/skins2/src/skin_main.cpp +++ b/modules/gui/skins2/src/skin_main.cpp @@ -344,6 +344,7 @@ static void WindowCloseLocal( intf_thread_t* pIntf, vlc_object_t *pObj ) static const struct vout_window_operations window_ops = { WindowControl, + WindowClose, }; static int WindowOpen( vout_window_t *pWnd, const vout_window_cfg_t *cfg ) @@ -518,6 +519,6 @@ vlc_module_begin () add_submodule () set_capability( "vout window", 51 ) - set_callbacks( WindowOpen, WindowClose ) + set_callbacks( WindowOpen, NULL ) vlc_module_end () diff --git a/modules/video_output/android/window.c b/modules/video_output/android/window.c index d0617cd47e..05f7ccf477 100644 --- a/modules/video_output/android/window.c +++ b/modules/video_output/android/window.c @@ -50,7 +50,7 @@ vlc_module_begin() set_category(CAT_VIDEO) set_subcategory(SUBCAT_VIDEO_VOUT) set_capability("vout window", 10) - set_callbacks(Open, Close) + set_callbacks(Open, NULL) vlc_module_end() @@ -84,6 +84,7 @@ static void OnNewMouseCoords(vout_window_t *wnd, static const struct vout_window_operations ops = { .control = Control, + .destroy = Close, }; /** diff --git a/modules/video_output/drawable.c b/modules/video_output/drawable.c index db71e885dd..37f26c4a69 100644 --- a/modules/video_output/drawable.c +++ b/modules/video_output/drawable.c @@ -48,7 +48,7 @@ vlc_module_begin () set_category (CAT_VIDEO) set_subcategory (SUBCAT_VIDEO_VOUT) set_capability ("vout window", 70) - set_callbacks (Open, Close) + set_callbacks (Open, NULL) add_shortcut ("embed-hwnd") add_integer ("drawable-hwnd", 0, HWND_TEXT, HWND_LONGTEXT, true) @@ -64,6 +64,7 @@ static uintptr_t *used = NULL; static const struct vout_window_operations ops = { .control = Control, + .destroy = Close, }; /** diff --git a/modules/video_output/wayland/xdg-shell.c b/modules/video_output/wayland/xdg-shell.c index d37f415c74..e482c94320 100644 --- a/modules/video_output/wayland/xdg-shell.c +++ b/modules/video_output/wayland/xdg-shell.c @@ -236,8 +236,11 @@ static int Control(vout_window_t *wnd, int cmd, va_list ap) return VLC_SUCCESS; } +static void Close(vout_window_t *); + static const struct vout_window_operations ops = { .control = Control, + .destroy = Close, }; #ifdef XDG_SHELL @@ -674,7 +677,7 @@ vlc_module_begin() #else set_capability("vout window", 10) #endif - set_callbacks(Open, Close) + set_callbacks(Open, NULL) add_string("wl-display", NULL, DISPLAY_TEXT, DISPLAY_LONGTEXT, true) add_integer("wl-output", 0, OUTPUT_TEXT, OUTPUT_LONGTEXT, true) diff --git a/modules/video_output/xcb/window.c b/modules/video_output/xcb/window.c index 1cd830a120..f6ba98b516 100644 --- a/modules/video_output/xcb/window.c +++ b/modules/video_output/xcb/window.c @@ -561,8 +561,11 @@ static void set_wm_deco(xcb_connection_t *conn, xcb_window_t window, bool on) atom, 32, ARRAY_SIZE(motif_wm_hints), motif_wm_hints); } +static void Close(vout_window_t *); + static const struct vout_window_operations ops = { .control = Control, + .destroy = Close, }; /** @@ -821,6 +824,13 @@ static void ReleaseDrawable (vlc_object_t *obj, xcb_window_t window) var_Destroy (obj->obj.libvlc, "xid-in-use"); } +static void EmClose(vout_window_t *); + +static const struct vout_window_operations em_ops = { + .control = Control, + .destroy = EmClose, +}; + /** * Wrap an existing X11 window to embed the video. */ @@ -842,7 +852,7 @@ static int EmOpen (vout_window_t *wnd, const vout_window_cfg_t *cfg) wnd->type = VOUT_WINDOW_TYPE_XID; wnd->display.x11 = NULL; wnd->handle.xid = window; - wnd->ops = &ops; + wnd->ops = &em_ops; wnd->sys = p_sys; p_sys->conn = conn; @@ -923,7 +933,7 @@ vlc_module_begin () set_category (CAT_VIDEO) set_subcategory (SUBCAT_VIDEO_VOUT) set_capability ("vout window", 10) - set_callbacks (Open, Close) + set_callbacks(Open, NULL) /* Obsolete since 1.1.0: */ add_obsolete_bool ("x11-altfullscreen") @@ -937,7 +947,7 @@ vlc_module_begin () set_category (CAT_VIDEO) set_subcategory (SUBCAT_VIDEO_VOUT) set_capability ("vout window", 70) - set_callbacks (EmOpen, EmClose) + set_callbacks(EmOpen, NULL) add_shortcut ("embed-xid") add_string ("x11-display", NULL, DISPLAY_TEXT, DISPLAY_LONGTEXT, true) diff --git a/src/video_output/window.c b/src/video_output/window.c index 824709869d..bf8db2b24e 100644 --- a/src/video_output/window.c +++ b/src/video_output/window.c @@ -88,14 +88,6 @@ vout_window_t *vout_window_New(vlc_object_t *obj, const char *module, return window; } -static void vout_window_stop(void *func, va_list ap) -{ - int (*deactivate)(vout_window_t *) = func; - vout_window_t *wnd = va_arg(ap, vout_window_t *); - - deactivate(wnd); -} - void vout_window_Delete(vout_window_t *window) { if (!window) @@ -108,7 +100,9 @@ void vout_window_Delete(vout_window_t *window) vlc_inhibit_Destroy (w->inhibit); } - vlc_module_unload(window, w->module, vout_window_stop, window); + if (window->ops->destroy != NULL) + window->ops->destroy(window); + vlc_objres_clear(VLC_OBJECT(window)); vlc_object_release(window); } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits