vo: change messy handling of fullscreen and other flags

Before this commit, all VOs had to toggle the option flag themselves,
now command.c does it.

I can't really comprehend why it required every VO to do this manually.
Maybe it was for rejecting the property/option change if the VO didn't
support a specific capability. But then it could have checked the VOCTRL
result. In any case, I don't care, and successfully changing the
property without doing anything (With some VOs) is fine too. Many things
work this way now, and it's simpler overall.

This change will be useful for cleaning up VO option handling.
This commit is contained in:
wm4 2016-08-30 23:52:16 +02:00
parent af1379c43d
commit 4d75514321
6 changed files with 7 additions and 20 deletions

View File

@ -2352,18 +2352,13 @@ static int panscan_property_helper(void *ctx, struct m_property *prop,
static int mp_property_vo_flag(struct m_property *prop, int action, void *arg, static int mp_property_vo_flag(struct m_property *prop, int action, void *arg,
int vo_ctrl, int *vo_var, MPContext *mpctx) int vo_ctrl, int *vo_var, MPContext *mpctx)
{ {
if (action == M_PROPERTY_SET) { int old = *vo_var;
int desired = !!*(int *) arg; int res = mp_property_generic_option(mpctx, prop, action, arg);
if (*vo_var == desired) if (action == M_PROPERTY_SET && old != *vo_var) {
return M_PROPERTY_OK; if (mpctx->video_out)
if (mpctx->video_out) {
vo_control(mpctx->video_out, vo_ctrl, 0); vo_control(mpctx->video_out, vo_ctrl, 0);
} else {
*vo_var = desired;
}
return *vo_var == desired ? M_PROPERTY_OK : M_PROPERTY_ERROR;
} }
return mp_property_generic_option(mpctx, prop, action, arg); return res;
} }
/// Fullscreen state (RW) /// Fullscreen state (RW)

View File

@ -449,7 +449,6 @@ static int vo_cocoa_ontop(struct vo *vo)
return VO_NOTIMPL; return VO_NOTIMPL;
struct mp_vo_opts *opts = vo->opts; struct mp_vo_opts *opts = vo->opts;
opts->ontop = !opts->ontop;
vo_set_level(vo, opts->ontop); vo_set_level(vo, opts->ontop);
return VO_TRUE; return VO_TRUE;
} }
@ -793,7 +792,6 @@ static int vo_cocoa_control_on_main_thread(struct vo *vo, int request, void *arg
switch (request) { switch (request) {
case VOCTRL_FULLSCREEN: case VOCTRL_FULLSCREEN:
opts->fullscreen = !opts->fullscreen;
return vo_cocoa_fullscreen(vo); return vo_cocoa_fullscreen(vo);
case VOCTRL_ONTOP: case VOCTRL_ONTOP:
return vo_cocoa_ontop(vo); return vo_cocoa_ontop(vo);

View File

@ -612,7 +612,6 @@ static int control(struct vo *vo, uint32_t request, void *data)
switch (request) { switch (request) {
case VOCTRL_FULLSCREEN: case VOCTRL_FULLSCREEN:
vo->opts->fullscreen = !vo->opts->fullscreen;
if (p->renderer_enabled) if (p->renderer_enabled)
set_geometry(vo); set_geometry(vo);
vo->want_redraw = true; vo->want_redraw = true;

View File

@ -975,7 +975,6 @@ static int control(struct vo *vo, uint32_t request, void *data)
switch (request) { switch (request) {
case VOCTRL_FULLSCREEN: case VOCTRL_FULLSCREEN:
vo->opts->fullscreen = !vo->opts->fullscreen;
set_fullscreen(vo); set_fullscreen(vo);
return 1; return 1;
case VOCTRL_REDRAW_FRAME: case VOCTRL_REDRAW_FRAME:

View File

@ -957,8 +957,9 @@ void vo_wayland_uninit(struct vo *vo)
static void vo_wayland_ontop(struct vo *vo) static void vo_wayland_ontop(struct vo *vo)
{ {
struct vo_wayland_state *wl = vo->wayland; struct vo_wayland_state *wl = vo->wayland;
if (!vo->opts->ontop)
return;
MP_DBG(wl, "going ontop\n"); MP_DBG(wl, "going ontop\n");
vo->opts->ontop = 1;
window_set_toplevel(wl); window_set_toplevel(wl);
schedule_resize(wl, 0, wl->window.width, wl->window.height); schedule_resize(wl, 0, wl->window.width, wl->window.height);
} }
@ -1046,7 +1047,6 @@ int vo_wayland_control(struct vo *vo, int *events, int request, void *arg)
wl->window.events = 0; wl->window.events = 0;
return VO_TRUE; return VO_TRUE;
case VOCTRL_FULLSCREEN: case VOCTRL_FULLSCREEN:
vo->opts->fullscreen = !vo->opts->fullscreen;
vo_wayland_fullscreen(vo); vo_wayland_fullscreen(vo);
return VO_TRUE; return VO_TRUE;
case VOCTRL_ONTOP: case VOCTRL_ONTOP:

View File

@ -1801,19 +1801,15 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg)
x11->pending_vo_events = 0; x11->pending_vo_events = 0;
return VO_TRUE; return VO_TRUE;
case VOCTRL_FULLSCREEN: case VOCTRL_FULLSCREEN:
opts->fullscreen = !opts->fullscreen;
vo_x11_fullscreen(vo); vo_x11_fullscreen(vo);
return VO_TRUE; return VO_TRUE;
case VOCTRL_ONTOP: case VOCTRL_ONTOP:
opts->ontop = !opts->ontop;
vo_x11_setlayer(vo, opts->ontop); vo_x11_setlayer(vo, opts->ontop);
return VO_TRUE; return VO_TRUE;
case VOCTRL_BORDER: case VOCTRL_BORDER:
opts->border = !opts->border;
vo_x11_decoration(vo, vo->opts->border); vo_x11_decoration(vo, vo->opts->border);
return VO_TRUE; return VO_TRUE;
case VOCTRL_ALL_WORKSPACES: { case VOCTRL_ALL_WORKSPACES: {
opts->all_workspaces = !opts->all_workspaces;
long params[5] = {0xFFFFFFFF, 1}; long params[5] = {0xFFFFFFFF, 1};
if (!opts->all_workspaces) { if (!opts->all_workspaces) {
x11_get_property_copy(x11, x11->rootwin, XA(x11, _NET_CURRENT_DESKTOP), x11_get_property_copy(x11, x11->rootwin, XA(x11, _NET_CURRENT_DESKTOP),