[vlc-commits] window: add constant operations structure

Rémi Denis-Courmont git at videolan.org
Sun Dec 2 18:12:39 CET 2018


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Dec  1 16:12:16 2018 +0200| [928fa188029642b896cf07989491ebe613464a4d] | committer: Rémi Denis-Courmont

window: add constant operations structure

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=928fa188029642b896cf07989491ebe613464a4d
---

 include/vlc_vout_window.h                   | 26 +++++++++++++++-----------
 modules/gui/macosx/VLCVideoOutputProvider.m |  6 +++++-
 modules/gui/minimal_macosx/intf.m           |  6 +++++-
 modules/gui/qt/qt.cpp                       |  6 +++++-
 modules/gui/skins2/src/skin_main.cpp        |  6 +++++-
 modules/video_output/android/window.c       |  6 +++++-
 modules/video_output/drawable.c             |  6 +++++-
 modules/video_output/wayland/xdg-shell.c    |  6 +++++-
 modules/video_output/wdummy.c               |  6 +++++-
 modules/video_output/win32/glwin32.c        |  7 ++++++-
 modules/video_output/xcb/window.c           |  8 ++++++--
 src/video_output/window.c                   |  1 -
 12 files changed, 67 insertions(+), 23 deletions(-)

diff --git a/include/vlc_vout_window.h b/include/vlc_vout_window.h
index 55ed516c2a..9981fff10f 100644
--- a/include/vlc_vout_window.h
+++ b/include/vlc_vout_window.h
@@ -127,6 +127,19 @@ struct vout_window_callbacks {
     void (*output_event)(vout_window_t *, const char *id, const char *desc);
 };
 
+struct vout_window_operations {
+    /**
+     * Control callback (mandatory)
+     *
+     * This callback handles some control request regarding the window.
+     * See \ref vout_window_control.
+     *
+     * This field should not be used directly when manipulating a window.
+     * vout_window_Control() should be used instead.
+     */
+    int (*control)(vout_window_t *, int, va_list);
+};
+
 typedef struct vout_window_owner {
     const struct vout_window_callbacks *cbs;
     void *sys;
@@ -188,16 +201,7 @@ struct vout_window_t {
         struct wl_display *wl; /**< Wayland display (client pointer) */
     } display;
 
-    /**
-     * Control callback (mandatory)
-     *
-     * This callback handles some control request regarding the window.
-     * See \ref vout_window_control.
-     *
-     * This field should not be used directly when manipulating a window.
-     * vout_window_Control() should be used instead.
-     */
-    int (*control)(vout_window_t *, int query, va_list);
+    const struct vout_window_operations *ops;
 
     struct {
         bool has_double_click; /**< Whether double click events are sent,
@@ -233,7 +237,7 @@ void vout_window_SetInhibition(vout_window_t *window, bool enabled);
 static inline int vout_window_vaControl(vout_window_t *window, int query,
                                         va_list ap)
 {
-    return window->control(window, query, ap);
+    return window->ops->control(window, query, ap);
 }
 
 /**
diff --git a/modules/gui/macosx/VLCVideoOutputProvider.m b/modules/gui/macosx/VLCVideoOutputProvider.m
index 4837c2ac4e..92736c6721 100644
--- a/modules/gui/macosx/VLCVideoOutputProvider.m
+++ b/modules/gui/macosx/VLCVideoOutputProvider.m
@@ -43,6 +43,10 @@ static atomic_bool b_intf_starting = ATOMIC_VAR_INIT(false);
 
 static int WindowControl(vout_window_t *, int i_query, va_list);
 
+static const struct vout_window_operations ops = {
+    WindowControl,
+};
+
 int WindowOpen(vout_window_t *p_wnd, const vout_window_cfg_t *cfg)
 {
     @autoreleasepool {
@@ -74,7 +78,7 @@ int WindowOpen(vout_window_t *p_wnd, const vout_window_cfg_t *cfg)
         p_wnd->handle.nsobject = (void *)CFBridgingRetain(videoView);
 
         p_wnd->type = VOUT_WINDOW_TYPE_NSOBJECT;
-        p_wnd->control = WindowControl;
+        p_wnd->ops = &ops;
     }
     if (cfg->is_fullscreen)
         vout_window_SetFullScreen(p_wnd, NULL);
diff --git a/modules/gui/minimal_macosx/intf.m b/modules/gui/minimal_macosx/intf.m
index 6064e847c2..c3ab7fd1ac 100644
--- a/modules/gui/minimal_macosx/intf.m
+++ b/modules/gui/minimal_macosx/intf.m
@@ -102,6 +102,10 @@ static void Run(intf_thread_t *p_intf)
  *****************************************************************************/
 static int WindowControl(vout_window_t *, int i_query, va_list);
 
+static const struct vout_window_operations ops = {
+    WindowControl,
+};
+
 int WindowOpen(vout_window_t *p_wnd, const vout_window_cfg_t *cfg)
 {
     @autoreleasepool {
@@ -122,7 +126,7 @@ int WindowOpen(vout_window_t *p_wnd, const vout_window_cfg_t *cfg)
         p_wnd->handle.nsobject = (void *)CFBridgingRetain([o_window contentView]);
 
         p_wnd->type = VOUT_WINDOW_TYPE_NSOBJECT;
-        p_wnd->control = WindowControl;
+        p_wnd->ops = &ops;
     }
 
     if (cfg->is_fullscreen)
diff --git a/modules/gui/qt/qt.cpp b/modules/gui/qt/qt.cpp
index c7c6ee24d0..073a418e3d 100644
--- a/modules/gui/qt/qt.cpp
+++ b/modules/gui/qt/qt.cpp
@@ -694,6 +694,10 @@ static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg,
  */
 static int WindowControl( vout_window_t *, int i_query, va_list );
 
+static const struct vout_window_operations window_ops = {
+    WindowControl,
+};
+
 static int WindowOpen( vout_window_t *p_wnd, const vout_window_cfg_t *cfg )
 {
     if( cfg->is_standalone )
@@ -727,7 +731,7 @@ static int WindowOpen( vout_window_t *p_wnd, const vout_window_cfg_t *cfg )
         return VLC_EGENERIC;
 
     p_wnd->info.has_double_click = true;
-    p_wnd->control = WindowControl;
+    p_wnd->ops = &window_ops;
     p_wnd->sys = (vout_window_sys_t*)p_mi;
     return VLC_SUCCESS;
 }
diff --git a/modules/gui/skins2/src/skin_main.cpp b/modules/gui/skins2/src/skin_main.cpp
index 1872a1a1d1..de9554b2d1 100644
--- a/modules/gui/skins2/src/skin_main.cpp
+++ b/modules/gui/skins2/src/skin_main.cpp
@@ -342,6 +342,10 @@ static void WindowCloseLocal( intf_thread_t* pIntf, vlc_object_t *pObj )
     VoutManager::instance( pIntf )->releaseWnd( pWnd );
 }
 
+static const struct vout_window_operations window_ops = {
+    WindowControl,
+};
+
 static int WindowOpen( vout_window_t *pWnd, const vout_window_cfg_t *cfg )
 {
     if( var_InheritBool( pWnd, "video-wallpaper" ) )
@@ -375,7 +379,7 @@ static int WindowOpen( vout_window_t *pWnd, const vout_window_cfg_t *cfg )
     pWnd->sys = sys;
     pWnd->sys->cfg = *cfg;
     pWnd->sys->pIntf = pIntf;
-    pWnd->control = WindowControl;
+    pWnd->ops = &window_ops;
 
     pWnd->type = VOUT_WINDOW_TYPE_DUMMY;
 
diff --git a/modules/video_output/android/window.c b/modules/video_output/android/window.c
index 3101ccef2f..d0617cd47e 100644
--- a/modules/video_output/android/window.c
+++ b/modules/video_output/android/window.c
@@ -82,6 +82,10 @@ static void OnNewMouseCoords(vout_window_t *wnd,
     }
 }
 
+static const struct vout_window_operations ops = {
+    .control = Control,
+};
+
 /**
  * Create an Android native window.
  */
@@ -99,7 +103,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
 
     wnd->type = VOUT_WINDOW_TYPE_ANDROID_NATIVE;
     wnd->handle.anativewindow = p_sys->p_awh;
-    wnd->control = Control;
+    wnd->ops = &ops;
 
     return VLC_SUCCESS;
 
diff --git a/modules/video_output/drawable.c b/modules/video_output/drawable.c
index 71c897328b..db71e885dd 100644
--- a/modules/video_output/drawable.c
+++ b/modules/video_output/drawable.c
@@ -62,6 +62,10 @@ static int Control (vout_window_t *, int, va_list);
 static vlc_mutex_t serializer = VLC_STATIC_MUTEX;
 static uintptr_t *used = NULL;
 
+static const struct vout_window_operations ops = {
+    .control = Control,
+};
+
 /**
  * Find the drawable set by libvlc application.
  */
@@ -101,7 +105,7 @@ skip:
 
     wnd->type = VOUT_WINDOW_TYPE_HWND;
     wnd->handle.hwnd = (void *)val;
-    wnd->control = Control;
+    wnd->ops = &ops;
     wnd->sys = (void *)val;
     return VLC_SUCCESS;
 }
diff --git a/modules/video_output/wayland/xdg-shell.c b/modules/video_output/wayland/xdg-shell.c
index 636fd5db7e..d37f415c74 100644
--- a/modules/video_output/wayland/xdg-shell.c
+++ b/modules/video_output/wayland/xdg-shell.c
@@ -236,6 +236,10 @@ static int Control(vout_window_t *wnd, int cmd, va_list ap)
     return VLC_SUCCESS;
 }
 
+static const struct vout_window_operations ops = {
+    .control = Control,
+};
+
 #ifdef XDG_SHELL
 static void xdg_toplevel_configure_cb(void *data,
                                       struct xdg_toplevel *toplevel,
@@ -573,7 +577,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
     wnd->type = VOUT_WINDOW_TYPE_WAYLAND;
     wnd->handle.wl = surface;
     wnd->display.wl = display;
-    wnd->control = Control;
+    wnd->ops = &ops;
 
     if (vlc_clone(&sys->thread, Thread, wnd, VLC_THREAD_PRIORITY_LOW))
         goto error;
diff --git a/modules/video_output/wdummy.c b/modules/video_output/wdummy.c
index bfaf95b727..f3fc8630d5 100644
--- a/modules/video_output/wdummy.c
+++ b/modules/video_output/wdummy.c
@@ -55,10 +55,14 @@ static int Control(vout_window_t *wnd, int query, va_list ap)
     }
 }
 
+static const struct vout_window_operations ops = {
+    .control = Control,
+};
+
 static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
 {
     wnd->type = VOUT_WINDOW_TYPE_DUMMY;
-    wnd->control = Control;
+    wnd->ops = &ops;
     vout_window_ReportSize(wnd, cfg->width, cfg->height);
     return VLC_SUCCESS;
 }
diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c
index c3a074783d..e1fc112cf2 100644
--- a/modules/video_output/win32/glwin32.c
+++ b/modules/video_output/win32/glwin32.c
@@ -90,6 +90,11 @@ static int EmbedVideoWindow_Control(vout_window_t *wnd, int query, va_list ap)
     return VLC_EGENERIC;
 }
 
+static const struct vout_window_operations embedVideoWindow_Ops =
+{
+    .control = EmbedVideoWindow_Control,
+};
+
 static vout_window_t *EmbedVideoWindow_Create(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;
@@ -103,7 +108,7 @@ static vout_window_t *EmbedVideoWindow_Create(vout_display_t *vd)
 
     wnd->type = VOUT_WINDOW_TYPE_HWND;
     wnd->handle.hwnd = sys->sys.hvideownd;
-    wnd->control = EmbedVideoWindow_Control;
+    wnd->ops = &embedVideoWindow_Ops;
     return wnd;
 }
 
diff --git a/modules/video_output/xcb/window.c b/modules/video_output/xcb/window.c
index 6152d420ce..1cd830a120 100644
--- a/modules/video_output/xcb/window.c
+++ b/modules/video_output/xcb/window.c
@@ -561,6 +561,10 @@ 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 const struct vout_window_operations ops = {
+    .control = Control,
+};
+
 /**
  * Create an X11 window.
  */
@@ -631,7 +635,7 @@ static int Open (vout_window_t *wnd, const vout_window_cfg_t *cfg)
     wnd->type = VOUT_WINDOW_TYPE_XID;
     wnd->handle.xid = window;
     wnd->display.x11 = display;
-    wnd->control = Control;
+    wnd->ops = &ops;
     wnd->sys = p_sys;
 
     p_sys->conn = conn;
@@ -838,7 +842,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->control = Control;
+    wnd->ops = &ops;
     wnd->sys = p_sys;
 
     p_sys->conn = conn;
diff --git a/src/video_output/window.c b/src/video_output/window.c
index ebbfde191e..824709869d 100644
--- a/src/video_output/window.c
+++ b/src/video_output/window.c
@@ -63,7 +63,6 @@ vout_window_t *vout_window_New(vlc_object_t *obj, const char *module,
 
     memset(&window->handle, 0, sizeof(window->handle));
     window->info.has_double_click = false;
-    window->control = NULL;
     window->sys = NULL;
     assert(owner != NULL);
     window->owner = *owner;



More information about the vlc-commits mailing list