mirror of https://code.videolan.org/videolan/vlc
window: use dedicated state callback
This removes the vararg control callback.
This commit is contained in:
parent
dbcf3e9d58
commit
240ab225db
|
@ -54,13 +54,6 @@ enum vout_window_type {
|
|||
VOUT_WINDOW_TYPE_WAYLAND /**< Wayland surface */,
|
||||
};
|
||||
|
||||
/**
|
||||
* Control query for vout_window_t
|
||||
*/
|
||||
enum vout_window_control {
|
||||
VOUT_WINDOW_SET_STATE, /* unsigned state */
|
||||
};
|
||||
|
||||
/**
|
||||
* Window management state.
|
||||
*/
|
||||
|
@ -143,17 +136,6 @@ struct vout_window_callbacks {
|
|||
struct vout_window_operations {
|
||||
void (*resize)(vout_window_t *, unsigned width, unsigned height);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* Destroy the window.
|
||||
*
|
||||
|
@ -161,6 +143,7 @@ struct vout_window_operations {
|
|||
*/
|
||||
void (*destroy)(vout_window_t *);
|
||||
|
||||
void (*set_state)(vout_window_t *, unsigned state);
|
||||
void (*unset_fullscreen)(vout_window_t *);
|
||||
void (*set_fullscreen)(vout_window_t *, const char *id);
|
||||
};
|
||||
|
@ -259,36 +242,13 @@ VLC_API void vout_window_Delete(vout_window_t *);
|
|||
|
||||
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->ops->control(window, query, ap);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reconfigures a window.
|
||||
*
|
||||
* @note The vout_window_* wrappers should be used instead of this function.
|
||||
*
|
||||
* @warning The caller must own the window, as vout_window_t is not thread safe.
|
||||
*/
|
||||
static inline int vout_window_Control(vout_window_t *window, int query, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, query);
|
||||
ret = vout_window_vaControl(window, query, ap);
|
||||
va_end(ap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures the window manager state for this window.
|
||||
*/
|
||||
static inline int vout_window_SetState(vout_window_t *window, unsigned state)
|
||||
static inline void vout_window_SetState(vout_window_t *window, unsigned state)
|
||||
{
|
||||
return vout_window_Control(window, VOUT_WINDOW_SET_STATE, state);
|
||||
if (window->ops->set_state != NULL)
|
||||
window->ops->set_state(window, state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -55,6 +55,31 @@ static void WindowResize(vout_window_t *p_wnd,
|
|||
}
|
||||
}
|
||||
|
||||
static void WindowSetState(vout_window_t *p_wnd, unsigned i_state)
|
||||
{
|
||||
if (i_state & VOUT_WINDOW_STATE_BELOW)
|
||||
{
|
||||
msg_Dbg(p_wnd, "Ignore change to VOUT_WINDOW_STATE_BELOW");
|
||||
return;
|
||||
}
|
||||
|
||||
@autoreleasepool {
|
||||
VLCVideoOutputProvider *voutProvider = [[VLCMain sharedInstance] voutProvider];
|
||||
if (!voutProvider) {
|
||||
return;
|
||||
}
|
||||
|
||||
NSInteger i_cooca_level = NSNormalWindowLevel;
|
||||
|
||||
if (i_state & VOUT_WINDOW_STATE_ABOVE)
|
||||
i_cooca_level = NSStatusWindowLevel;
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[voutProvider setWindowLevel:i_cooca_level forWindow:p_wnd];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
static const char windowed;
|
||||
|
||||
static void WindowSetFullscreen(vout_window_t *p_wnd, const char *psz_id)
|
||||
|
@ -88,13 +113,12 @@ static void WindowUnsetFullscreen(vout_window_t *wnd)
|
|||
|
||||
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 = {
|
||||
WindowResize,
|
||||
WindowControl,
|
||||
WindowClose,
|
||||
WindowSetState,
|
||||
WindowUnsetFullscreen,
|
||||
WindowSetFullscreen,
|
||||
};
|
||||
|
|
|
@ -116,6 +116,13 @@ static void WindowResize(vout_window_t *p_wnd,
|
|||
}
|
||||
}
|
||||
|
||||
static void WindowSetState(vout_window_t *p_wnd, unsigned state)
|
||||
{
|
||||
NSWindow* o_window = [(__bridge id)p_wnd->handle.nsobject window];
|
||||
|
||||
[o_window setLevel:i_state];
|
||||
}
|
||||
|
||||
static void WindowUnsetFullscreen(vout_window_t *p_wnd)
|
||||
{
|
||||
NSWindow* o_window = [(__bridge id)p_wnd->handle.nsobject window];
|
||||
|
@ -138,13 +145,12 @@ static void WindowSetFullscreen(vout_window_t *p_wnd, const char *psz_id)
|
|||
}
|
||||
}
|
||||
|
||||
static int WindowControl(vout_window_t *, int i_query, va_list);
|
||||
static void WindowClose(vout_window_t *);
|
||||
|
||||
static const struct vout_window_operations ops = {
|
||||
WindowResize,
|
||||
WindowControl,
|
||||
WindowClose,
|
||||
WindowSetState,
|
||||
WindowUnsetFullscreen,
|
||||
WindowSetFullscreen,
|
||||
};
|
||||
|
@ -177,29 +183,6 @@ int WindowOpen(vout_window_t *p_wnd, const vout_window_cfg_t *cfg)
|
|||
return VLC_SUCCESS;
|
||||
}
|
||||
|
||||
static int WindowControl(vout_window_t *p_wnd, int i_query, va_list args)
|
||||
{
|
||||
NSWindow* o_window = [(__bridge id)p_wnd->handle.nsobject window];
|
||||
if (!o_window) {
|
||||
msg_Err(p_wnd, "failed to recover cocoa window");
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
|
||||
switch (i_query) {
|
||||
case VOUT_WINDOW_SET_STATE:
|
||||
{
|
||||
unsigned i_state = va_arg(args, unsigned);
|
||||
|
||||
[o_window setLevel:i_state];
|
||||
|
||||
return VLC_SUCCESS;
|
||||
}
|
||||
default:
|
||||
msg_Warn(p_wnd, "unsupported control query");
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
}
|
||||
|
||||
static void WindowClose(vout_window_t *p_wnd)
|
||||
{
|
||||
@autoreleasepool {
|
||||
|
|
|
@ -731,8 +731,8 @@ bool MainInterface::getVideo( struct vout_window_t *p_wnd,
|
|||
{
|
||||
static const struct vout_window_operations ops = {
|
||||
MainInterface::resizeVideo,
|
||||
MainInterface::controlVideo,
|
||||
MainInterface::releaseVideo,
|
||||
MainInterface::requestVideoState,
|
||||
MainInterface::requestVideoWindowed,
|
||||
MainInterface::requestVideoFullScreen,
|
||||
};
|
||||
|
@ -1006,25 +1006,12 @@ void MainInterface::requestVideoFullScreen( vout_window_t *wnd, const char * )
|
|||
emit p_mi->askVideoSetFullScreen( true );
|
||||
}
|
||||
|
||||
int MainInterface::controlVideo( vout_window_t *p_wnd, int i_query,
|
||||
va_list args )
|
||||
void MainInterface::requestVideoState( vout_window_t *p_wnd, unsigned i_arg )
|
||||
{
|
||||
MainInterface *p_mi = (MainInterface *)p_wnd->sys;
|
||||
bool on_top = (i_arg & VOUT_WINDOW_STATE_ABOVE) != 0;
|
||||
|
||||
switch( i_query )
|
||||
{
|
||||
case VOUT_WINDOW_SET_STATE:
|
||||
{
|
||||
unsigned i_arg = va_arg( args, unsigned );
|
||||
unsigned on_top = i_arg & VOUT_WINDOW_STATE_ABOVE;
|
||||
|
||||
emit p_mi->askVideoOnTop( on_top != 0 );
|
||||
return VLC_SUCCESS;
|
||||
}
|
||||
default:
|
||||
msg_Warn( p_wnd, "unsupported control query" );
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
emit p_mi->askVideoOnTop( on_top );
|
||||
}
|
||||
|
||||
void MainInterface::releaseVideo( vout_window_t *p_wnd )
|
||||
|
|
|
@ -75,7 +75,7 @@ public:
|
|||
private:
|
||||
static void releaseVideo( struct vout_window_t * );
|
||||
static void resizeVideo( struct vout_window_t *, unsigned, unsigned );
|
||||
static int controlVideo( struct vout_window_t *, int, va_list );
|
||||
static void requestVideoState( struct vout_window_t *, unsigned );
|
||||
static void requestVideoWindowed( struct vout_window_t * );
|
||||
static void requestVideoFullScreen( struct vout_window_t *, const char * );
|
||||
|
||||
|
|
|
@ -320,7 +320,6 @@ end:
|
|||
|
||||
static int WindowOpen( vout_window_t *, const vout_window_cfg_t * );
|
||||
static void WindowClose( vout_window_t * );
|
||||
static int WindowControl( vout_window_t *, int, va_list );
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -360,6 +359,18 @@ static void WindowResize( vout_window_t *pWnd,
|
|||
pQueue->push( CmdGenericPtr( pCmd ) );
|
||||
}
|
||||
|
||||
static void WindowSetState( vout_window_t *pWnd, unsigned i_arg )
|
||||
{
|
||||
vout_window_skins_t* sys = (vout_window_skins_t *)pWnd->sys;
|
||||
intf_thread_t *pIntf = sys->pIntf;
|
||||
AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
|
||||
bool on_top = i_arg & VOUT_WINDOW_STATE_ABOVE;
|
||||
|
||||
// Post a SetOnTop command
|
||||
CmdSetOnTop* pCmd = new CmdSetOnTop( pIntf, on_top );
|
||||
pQueue->push( CmdGenericPtr( pCmd ) );
|
||||
}
|
||||
|
||||
static void WindowUnsetFullscreen( vout_window_t *pWnd )
|
||||
{
|
||||
vout_window_skins_t* sys = (vout_window_skins_t *)pWnd->sys;
|
||||
|
@ -383,8 +394,8 @@ static void WindowSetFullscreen( vout_window_t *pWnd, const char * )
|
|||
|
||||
static const struct vout_window_operations window_ops = {
|
||||
WindowResize,
|
||||
WindowControl,
|
||||
WindowClose,
|
||||
WindowSetState,
|
||||
WindowUnsetFullscreen,
|
||||
WindowSetFullscreen,
|
||||
};
|
||||
|
@ -448,32 +459,6 @@ static void WindowClose( vout_window_t *pWnd )
|
|||
delete sys;
|
||||
}
|
||||
|
||||
static int WindowControl( vout_window_t *pWnd, int query, va_list args )
|
||||
{
|
||||
vout_window_skins_t* sys = (vout_window_skins_t *)pWnd->sys;
|
||||
intf_thread_t *pIntf = sys->pIntf;
|
||||
AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
|
||||
|
||||
switch( query )
|
||||
{
|
||||
case VOUT_WINDOW_SET_STATE:
|
||||
{
|
||||
unsigned i_arg = va_arg( args, unsigned );
|
||||
unsigned on_top = i_arg & VOUT_WINDOW_STATE_ABOVE;
|
||||
|
||||
// Post a SetOnTop command
|
||||
CmdSetOnTop* pCmd =
|
||||
new CmdSetOnTop( pIntf, on_top );
|
||||
pQueue->push( CmdGenericPtr( pCmd ) );
|
||||
return VLC_SUCCESS;
|
||||
}
|
||||
|
||||
default:
|
||||
msg_Dbg( pIntf, "control query not supported" );
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Module descriptor
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
|
@ -55,15 +55,12 @@ vlc_module_begin ()
|
|||
change_volatile ()
|
||||
vlc_module_end ()
|
||||
|
||||
static int Control (vout_window_t *, int, va_list);
|
||||
|
||||
/* Keep a list of busy drawables, so we don't overlap videos if there are
|
||||
* more than one video track in the stream. */
|
||||
static vlc_mutex_t serializer = VLC_STATIC_MUTEX;
|
||||
static uintptr_t *used = NULL;
|
||||
|
||||
static const struct vout_window_operations ops = {
|
||||
.control = Control,
|
||||
.destroy = Close,
|
||||
};
|
||||
|
||||
|
@ -138,18 +135,3 @@ static void Close (vout_window_t *wnd)
|
|||
}
|
||||
vlc_mutex_unlock (&serializer);
|
||||
}
|
||||
|
||||
|
||||
static int Control (vout_window_t *wnd, int query, va_list ap)
|
||||
{
|
||||
VLC_UNUSED( ap );
|
||||
|
||||
switch (query)
|
||||
{
|
||||
case VOUT_WINDOW_SET_STATE: /* not allowed either, would be ugly */
|
||||
return VLC_EGENERIC;
|
||||
default:
|
||||
msg_Warn (wnd, "unsupported control query %d", query);
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -186,21 +186,6 @@ static void Resize(vout_window_t *wnd, unsigned width, unsigned height)
|
|||
wl_display_flush(wnd->display.wl);
|
||||
}
|
||||
|
||||
static int Control(vout_window_t *wnd, int cmd, va_list ap)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case VOUT_WINDOW_SET_STATE:
|
||||
return VLC_EGENERIC;
|
||||
|
||||
default:
|
||||
msg_Err(wnd, "request %d not implemented", cmd);
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
|
||||
return VLC_SUCCESS;
|
||||
}
|
||||
|
||||
static void Close(vout_window_t *);
|
||||
|
||||
static void UnsetFullscreen(vout_window_t *wnd)
|
||||
|
@ -240,7 +225,6 @@ static void SetFullscreen(vout_window_t *wnd, const char *idstr)
|
|||
|
||||
static const struct vout_window_operations ops = {
|
||||
.resize = Resize,
|
||||
.control = Control,
|
||||
.destroy = Close,
|
||||
.unset_fullscreen = UnsetFullscreen,
|
||||
.set_fullscreen = SetFullscreen,
|
||||
|
|
|
@ -30,23 +30,8 @@
|
|||
#include <vlc_plugin.h>
|
||||
#include <vlc_vout_window.h>
|
||||
|
||||
static int Control(vout_window_t *wnd, int query, va_list ap)
|
||||
{
|
||||
switch (query)
|
||||
{
|
||||
case VOUT_WINDOW_SET_STATE:
|
||||
/* These controls deserve a proper window provider. Move along. */
|
||||
return VLC_EGENERIC;
|
||||
|
||||
default:
|
||||
msg_Warn(wnd, "unsupported control query %d", query);
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct vout_window_operations ops = {
|
||||
.resize = vout_window_ReportSize,
|
||||
.control = Control,
|
||||
};
|
||||
|
||||
static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
|
||||
|
|
|
@ -84,15 +84,8 @@ static int Control(vout_display_t *vd, int query, va_list args)
|
|||
return CommonControl(vd, query, args);
|
||||
}
|
||||
|
||||
static int EmbedVideoWindow_Control(vout_window_t *wnd, int query, va_list ap)
|
||||
{
|
||||
VLC_UNUSED( ap ); VLC_UNUSED( query );
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
|
||||
static const struct vout_window_operations embedVideoWindow_Ops =
|
||||
{
|
||||
.control = EmbedVideoWindow_Control,
|
||||
};
|
||||
|
||||
static vout_window_t *EmbedVideoWindow_Create(vout_display_t *vd)
|
||||
|
|
|
@ -423,30 +423,15 @@ static void Resize(vout_window_t *wnd, unsigned width, unsigned height)
|
|||
xcb_flush(conn);
|
||||
}
|
||||
|
||||
static int Control (vout_window_t *wnd, int cmd, va_list ap)
|
||||
static void SetState(vout_window_t *wnd, unsigned state)
|
||||
{
|
||||
vout_window_sys_t *p_sys = wnd->sys;
|
||||
xcb_connection_t *conn = p_sys->conn;
|
||||
vout_window_sys_t *sys = wnd->sys;
|
||||
bool above = (state & VOUT_WINDOW_STATE_ABOVE) != 0;
|
||||
bool below = (state & VOUT_WINDOW_STATE_BELOW) != 0;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case VOUT_WINDOW_SET_STATE:
|
||||
{
|
||||
unsigned state = va_arg (ap, unsigned);
|
||||
bool above = (state & VOUT_WINDOW_STATE_ABOVE) != 0;
|
||||
bool below = (state & VOUT_WINDOW_STATE_BELOW) != 0;
|
||||
|
||||
change_wm_state (wnd, above, p_sys->wm_state_above);
|
||||
change_wm_state (wnd, below, p_sys->wm_state_below);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
msg_Err (wnd, "request %d not implemented", cmd);
|
||||
return VLC_EGENERIC;
|
||||
}
|
||||
xcb_flush (p_sys->conn);
|
||||
return VLC_SUCCESS;
|
||||
change_wm_state(wnd, above, sys->wm_state_above);
|
||||
change_wm_state(wnd, below, sys->wm_state_below);
|
||||
xcb_flush(sys->conn);
|
||||
}
|
||||
|
||||
static void UnsetFullscreen(vout_window_t *wnd)
|
||||
|
@ -573,8 +558,8 @@ static const struct vout_window_operations ops = {
|
|||
.resize = Resize,
|
||||
.set_fullscreen = SetFullscreen,
|
||||
.unset_fullscreen = UnsetFullscreen,
|
||||
.control = Control,
|
||||
.destroy = Close,
|
||||
.set_state = SetState,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -835,7 +820,6 @@ static void ReleaseDrawable (vlc_object_t *obj, xcb_window_t window)
|
|||
static void EmClose(vout_window_t *);
|
||||
|
||||
static const struct vout_window_operations em_ops = {
|
||||
.control = Control,
|
||||
.destroy = EmClose,
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue