summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--player/playloop.c9
-rw-r--r--video/out/vo.h7
-rw-r--r--video/out/x11_common.c16
3 files changed, 19 insertions, 13 deletions
diff --git a/player/playloop.c b/player/playloop.c
index c2795e0d40..fc4cfe859e 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -28,6 +28,7 @@
#include "options/options.h"
#include "common/common.h"
#include "common/encode.h"
+#include "options/m_config.h"
#include "options/m_property.h"
#include "common/playlist.h"
#include "input/input.h"
@@ -722,6 +723,14 @@ static void handle_vo_events(struct MPContext *mpctx)
mp_notify(mpctx, MP_EVENT_WIN_RESIZE, NULL);
if (events & VO_EVENT_WIN_STATE)
mp_notify(mpctx, MP_EVENT_WIN_STATE, NULL);
+ if (events & VO_EVENT_FULLSCREEN_STATE) {
+ // The only purpose of this is to update the fullscreen flag on the
+ // playloop side if it changes "from outside" on the VO.
+ int fs = mpctx->opts->vo->fullscreen;
+ vo_control(vo, VOCTRL_GET_FULLSCREEN, &fs);
+ m_config_set_option_raw_direct(mpctx->mconfig,
+ m_config_get_co(mpctx->mconfig, bstr0("fullscreen")), &fs, 0);
+ }
}
static void handle_sstep(struct MPContext *mpctx)
diff --git a/video/out/vo.h b/video/out/vo.h
index d76329ffeb..5dbdc3fa89 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -43,9 +43,12 @@ enum {
VO_EVENT_AMBIENT_LIGHTING_CHANGED = 1 << 4,
// Special mechanism for making resizing with Cocoa react faster
VO_EVENT_LIVE_RESIZING = 1 << 5,
+ // Window fullscreen state changed via external influence.
+ VO_EVENT_FULLSCREEN_STATE = 1 << 6,
// Set of events the player core may be interested in.
- VO_EVENTS_USER = (VO_EVENT_RESIZE | VO_EVENT_WIN_STATE),
+ VO_EVENTS_USER = VO_EVENT_RESIZE | VO_EVENT_WIN_STATE |
+ VO_EVENT_FULLSCREEN_STATE,
};
enum mp_voctrl {
@@ -75,6 +78,8 @@ enum mp_voctrl {
VOCTRL_BORDER,
VOCTRL_ALL_WORKSPACES,
+ VOCTRL_GET_FULLSCREEN,
+
VOCTRL_UPDATE_WINDOW_TITLE, // char*
VOCTRL_UPDATE_PLAYBACK_STATE, // struct voctrl_playback_state*
diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index 32f5c6c723..46e68d6e71 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -977,17 +977,6 @@ static void vo_x11_update_composition_hint(struct vo *vo)
XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&hint, 1);
}
-// Maximally awful hack to get MPOpts.vo.fullscreen set. The awful part is that
-// this sets a variable which is accessed by command.c without synchronization
-// (and which isn't supposed to need any). The need for this is that there's no
-// way to update this flag in any other way at all.
-static void set_global_fs_flag(struct vo *vo, int fs)
-{
- struct m_config *rootconfig = mp_get_root_config(vo->global);
- struct MPOpts *opts = rootconfig->optstruct;
- opts->vo->fullscreen = fs;
-}
-
static void vo_x11_check_net_wm_state_fullscreen_change(struct vo *vo)
{
struct vo_x11_state *x11 = vo->x11;
@@ -1013,7 +1002,7 @@ static void vo_x11_check_net_wm_state_fullscreen_change(struct vo *vo)
{
vo->opts->fullscreen = is_fullscreen;
x11->fs = is_fullscreen;
- set_global_fs_flag(vo, is_fullscreen);
+ x11->pending_vo_events |= VO_EVENT_FULLSCREEN_STATE;
if (!is_fullscreen && (x11->pos_changed_during_fs ||
x11->size_changed_during_fs))
@@ -1815,6 +1804,9 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg)
case VOCTRL_FULLSCREEN:
vo_x11_fullscreen(vo);
return VO_TRUE;
+ case VOCTRL_GET_FULLSCREEN:
+ *(int *)arg = x11->fs;
+ return VO_TRUE;
case VOCTRL_ONTOP:
vo_x11_setlayer(vo, opts->ontop);
return VO_TRUE;