From fc524e8a0704670d2e7daad36e54b66daf93e3d8 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 16 Jan 2015 23:07:13 +0100 Subject: command: unify handling of fullscreen and other VO flags The "ontop" and "border" properties already used a common mp_property_vo_flag() function, and the corresponding VOCTRLs used the same conventions. "fullscreen" is pretty similar, but was handled slightly similar. Change how VOCTRL_FULLSCREEN behaves, and use the same helper function for "fullscreen" as the other flags. --- player/command.c | 33 ++++++++++++--------------------- video/out/cocoa_common.m | 2 ++ video/out/vo_sdl.c | 1 + video/out/w32_common.c | 1 + video/out/wayland_common.c | 1 + video/out/x11_common.c | 2 ++ 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/player/command.c b/player/command.c index 6dc450234c..14b3cac7c2 100644 --- a/player/command.c +++ b/player/command.c @@ -1986,25 +1986,6 @@ static int mp_property_hwdec(void *ctx, struct m_property *prop, return mp_property_generic_option(mpctx, prop, action, arg); } -/// Fullscreen state (RW) -static int mp_property_fullscreen(void *ctx, struct m_property *prop, - int action, void *arg) -{ - MPContext *mpctx = ctx; - if (!mpctx->video_out) - return M_PROPERTY_UNAVAILABLE; - struct mp_vo_opts *opts = mpctx->video_out->opts; - - if (action == M_PROPERTY_SET) { - int val = *(int *)arg; - opts->fullscreen = val; - if (mpctx->video_out->config_ok) - vo_control(mpctx->video_out, VOCTRL_FULLSCREEN, 0); - return opts->fullscreen == val ? M_PROPERTY_OK : M_PROPERTY_ERROR; - } - return mp_property_generic_option(mpctx, prop, action, arg); -} - #define VF_DEINTERLACE_LABEL "deinterlace" static bool probe_deint_filter(struct MPContext *mpctx, const char *filt) @@ -2254,15 +2235,25 @@ static int mp_property_vo_flag(struct m_property *prop, int action, void *arg, return M_PROPERTY_UNAVAILABLE; if (action == M_PROPERTY_SET) { - if (*vo_var == !!*(int *) arg) + int desired = !!*(int *) arg; + if (*vo_var == desired) return M_PROPERTY_OK; if (mpctx->video_out->config_ok) vo_control(mpctx->video_out, vo_ctrl, 0); - return M_PROPERTY_OK; + return *vo_var == desired ? M_PROPERTY_OK : M_PROPERTY_ERROR; } return mp_property_generic_option(mpctx, prop, action, arg); } +/// Fullscreen state (RW) +static int mp_property_fullscreen(void *ctx, struct m_property *prop, + int action, void *arg) +{ + MPContext *mpctx = ctx; + return mp_property_vo_flag(prop, action, arg, VOCTRL_FULLSCREEN, + &mpctx->opts->vo.fullscreen, mpctx); +} + /// Window always on top (RW) static int mp_property_ontop(void *ctx, struct m_property *prop, int action, void *arg) diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m index db36e15c97..796a67c832 100644 --- a/video/out/cocoa_common.m +++ b/video/out/cocoa_common.m @@ -581,6 +581,8 @@ static void vo_cocoa_fullscreen(struct vo *vo) if (s->embedded) return; + opts->fullscreen = !opts->fullscreen; + vo_cocoa_update_screen_info(vo, NULL); draw_changes_after_next_frame(vo); diff --git a/video/out/vo_sdl.c b/video/out/vo_sdl.c index 822b5009aa..693a543c94 100644 --- a/video/out/vo_sdl.c +++ b/video/out/vo_sdl.c @@ -1001,6 +1001,7 @@ static int control(struct vo *vo, uint32_t request, void *data) switch (request) { case VOCTRL_FULLSCREEN: + vo->opts->fullscreen = !vo->opts->fullscreen; set_fullscreen(vo); return 1; case VOCTRL_REDRAW_FRAME: diff --git a/video/out/w32_common.c b/video/out/w32_common.c index 0df65a1eac..f0366393ff 100644 --- a/video/out/w32_common.c +++ b/video/out/w32_common.c @@ -1215,6 +1215,7 @@ static int gui_thread_control(struct vo_w32_state *w32, int request, void *arg) { switch (request) { case VOCTRL_FULLSCREEN: + w32->opts->fullscreen = !w32->opts->fullscreen; if (w32->opts->fullscreen != w32->current_fs) reinit_window_state(w32); return VO_TRUE; diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c index bf318d7bbc..843049816e 100644 --- a/video/out/wayland_common.c +++ b/video/out/wayland_common.c @@ -1189,6 +1189,7 @@ int vo_wayland_control (struct vo *vo, int *events, int request, void *arg) *events |= vo_wayland_check_events(vo); return VO_TRUE; case VOCTRL_FULLSCREEN: + vo->opts->fullscreen = !vo->opts->fullscreen; vo_wayland_fullscreen(vo); return VO_TRUE; case VOCTRL_ONTOP: diff --git a/video/out/x11_common.c b/video/out/x11_common.c index f5a3f9e808..cb5f9c524c 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -1615,12 +1615,14 @@ static void vo_x11_border(struct vo *vo) int vo_x11_control(struct vo *vo, int *events, int request, void *arg) { + struct mp_vo_opts *opts = vo->opts; struct vo_x11_state *x11 = vo->x11; switch (request) { case VOCTRL_CHECK_EVENTS: *events |= vo_x11_check_events(vo); return VO_TRUE; case VOCTRL_FULLSCREEN: + opts->fullscreen = !opts->fullscreen; vo_x11_fullscreen(vo); *events |= VO_EVENT_RESIZE; return VO_TRUE; -- cgit v1.2.3