From c2bd3b1eccd90c6b579e6661ffc2d077119508c2 Mon Sep 17 00:00:00 2001 From: Philip Langdale Date: Tue, 26 Nov 2019 08:46:47 +0800 Subject: command: add `window-maximized` and make `window-minimized` settable If we want to implement window pseudo-decorations via OSC, we need a way to tell the vo to minimize and maximize the window. Today, we have minimized as a read-only property, and no property for maximized. Let's made minimized settable and add a maximized property to go with it. In turn, that requires us to add VOCTRLs for minimizing or maximizing a window, and an additional WIN_STATE to indicate a maximized window. --- player/command.c | 40 ++++++++++++++++++++++++++++++++++++++-- video/out/vo.h | 6 +++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/player/command.c b/player/command.c index cd8a7959c8..475552e28e 100644 --- a/player/command.c +++ b/player/command.c @@ -2299,7 +2299,40 @@ static int mp_property_win_minimized(void *ctx, struct m_property *prop, if (vo_control(vo, VOCTRL_GET_WIN_STATE, &state) < 1) return M_PROPERTY_UNAVAILABLE; - return m_property_flag_ro(action, arg, state & VO_WIN_STATE_MINIMIZED); + switch (action) { + case M_PROPERTY_SET: + vo_control(vo, VOCTRL_MINIMIZE, 0); + return M_PROPERTY_OK; + case M_PROPERTY_GET: + case M_PROPERTY_GET_TYPE: + return m_property_flag_ro(action, arg, state & VO_WIN_STATE_MINIMIZED); + default: + return M_PROPERTY_NOT_IMPLEMENTED; + } +} + +static int mp_property_win_maximized(void *ctx, struct m_property *prop, + int action, void *arg) +{ + MPContext *mpctx = ctx; + struct vo *vo = mpctx->video_out; + if (!vo) + return M_PROPERTY_UNAVAILABLE; + + int state = 0; + if (vo_control(vo, VOCTRL_GET_WIN_STATE, &state) < 1) + return M_PROPERTY_UNAVAILABLE; + + switch (action) { + case M_PROPERTY_SET: + vo_control(vo, VOCTRL_MAXIMIZE, 0); + return M_PROPERTY_OK; + case M_PROPERTY_GET: + case M_PROPERTY_GET_TYPE: + return m_property_flag_ro(action, arg, state & VO_WIN_STATE_MAXIMIZED); + default: + return M_PROPERTY_NOT_IMPLEMENTED; + } } static int mp_property_display_fps(void *ctx, struct m_property *prop, @@ -3405,6 +3438,7 @@ static const struct m_property mp_properties_base[] = { PROPERTY_BITRATE("sub-bitrate", false, STREAM_SUB), {"window-minimized", mp_property_win_minimized}, + {"window-maximized", mp_property_win_maximized}, {"display-names", mp_property_display_names}, {"display-fps", mp_property_display_fps}, {"estimated-display-fps", mp_property_estimated_display_fps}, @@ -3484,7 +3518,7 @@ static const char *const *const mp_event_property_change[] = { "demuxer-cache-state"), E(MP_EVENT_WIN_RESIZE, "window-scale", "osd-width", "osd-height", "osd-par"), E(MP_EVENT_WIN_STATE, "window-minimized", "display-names", "display-fps", - "fullscreen"), + "fullscreen", "window-maximized"), E(MP_EVENT_CHANGE_PLAYLIST, "playlist", "playlist-pos", "playlist-pos-1", "playlist-count", "playlist/count"), E(MP_EVENT_CORE_IDLE, "core-idle", "eof-reached"), @@ -3704,6 +3738,8 @@ static const struct property_osd_display { // By default, don't display the following properties on OSD {"pause", NULL}, {"fullscreen", NULL}, + {"window-minimized", NULL}, + {"window-maximized", NULL}, {0} }; diff --git a/video/out/vo.h b/video/out/vo.h index 08ca1219a1..a02412a8ea 100644 --- a/video/out/vo.h +++ b/video/out/vo.h @@ -126,10 +126,14 @@ enum mp_voctrl { /* private to vo_gpu */ VOCTRL_EXTERNAL_RESIZE, + + VOCTRL_MAXIMIZE, + VOCTRL_MINIMIZE, }; // VOCTRL_GET_WIN_STATE -#define VO_WIN_STATE_MINIMIZED 1 +#define VO_WIN_STATE_MINIMIZED (1 << 0) +#define VO_WIN_STATE_MAXIMIZED (1 << 1) #define VO_TRUE true #define VO_FALSE false -- cgit v1.2.3