diff options
-rw-r--r-- | DOCS/interface-changes.rst | 1 | ||||
-rw-r--r-- | DOCS/man/input.rst | 22 | ||||
-rw-r--r-- | etc/input.conf | 6 | ||||
-rw-r--r-- | player/command.c | 59 |
4 files changed, 46 insertions, 42 deletions
diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index b4927470fa..ee84bc8f1c 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -42,6 +42,7 @@ Interface changes instead be used to specifically set the contrast to any value. - add a `--watch-later-options` option to allow configuring which options quit-watch-later saves + - make `current-window-scale` writeable and use it in the default input.conf --- mpv 0.33.0 --- - add `--d3d11-exclusive-fs` flag to enable D3D11 exclusive fullscreen mode when the player enters fullscreen. diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 75841dba99..26735bf819 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -2518,26 +2518,20 @@ Property list enabled, or after precise seeking). Files with imprecise timestamps (such as Matroska) might lead to unstable results. -``window-scale`` (RW) +``current-window-scale`` (RW) Window size multiplier. Setting this will resize the video window to the values contained in ``dwidth`` and ``dheight`` multiplied with the value set with this property. Setting ``1`` will resize to original video size (or to be exact, the size the video filters output). ``2`` will set the - double size, ``0.5`` halves the size. + double size, ``0.5`` halves the size. When reading this property, this + returns the scale value calculated from the current window size. - See ``current-window-scale`` for the value derived from the actual window - size. - - Since mpv 0.31.0, this always returns the previously set value (or the - default value), instead of the value implied by the actual window size. - Before mpv 0.31.0, this returned what ``current-window-scale`` returns now, - after the window was created. + The similarly named ``window-scale`` option behaves like a typical mpv + option. It does not pay attention to realtime window changes and only + updates if the user changes its value. In most cases, you probably want + to set ``current-window-scale`` directly. -``current-window-scale`` - The ``window-scale`` value calculated from the current window size. This - has the same value as ``window-scale`` if the window size was not changed - since setting the option, and the window size was not restricted in other - ways. The property is unavailable if no video is active. + ``current-window-scale`` is unavailable if no video is active. ``focused`` Whether the window has focus. Might not be supported by all VOs. diff --git a/etc/input.conf b/etc/input.conf index 63da217f3c..f84c0b7fca 100644 --- a/etc/input.conf +++ b/etc/input.conf @@ -118,9 +118,9 @@ #6 add gamma 1 #7 add saturation -1 #8 add saturation 1 -#Alt+0 set window-scale 0.5 -#Alt+1 set window-scale 1.0 -#Alt+2 set window-scale 2.0 +#Alt+0 set current-window-scale 0.5 +#Alt+1 set current-window-scale 1.0 +#Alt+2 set current-window-scale 2.0 # toggle deinterlacer (automatically inserts or removes required filter) #d cycle deinterlace #r add sub-pos -1 # move subtitles up diff --git a/player/command.c b/player/command.c index 5119857986..0a66bbcbac 100644 --- a/player/command.c +++ b/player/command.c @@ -2316,46 +2316,55 @@ static int mp_property_video_frame_info(void *ctx, struct m_property *prop, return m_property_read_sub(props, action, arg); } -static int mp_property_current_window_scale(void *ctx, struct m_property *prop, - int action, void *arg) +static int update_window_scale(struct MPContext *mpctx, double scale) { - MPContext *mpctx = ctx; struct vo *vo = mpctx->video_out; if (!vo) - return M_PROPERTY_UNAVAILABLE; + return -1; struct mp_image_params params = get_video_out_params(mpctx); int vid_w, vid_h; mp_image_params_get_dsize(¶ms, &vid_w, &vid_h); if (vid_w < 1 || vid_h < 1) - return M_PROPERTY_UNAVAILABLE; - - int s[2]; - if (vo_control(vo, VOCTRL_GET_UNFS_WINDOW_SIZE, s) <= 0 || - s[0] < 1 || s[1] < 1) - return M_PROPERTY_UNAVAILABLE; + return -1; - double xs = (double)s[0] / vid_w; - double ys = (double)s[1] / vid_h; - return m_property_double_ro(action, arg, (xs + ys) / 2); + int s[2] = {vid_w * scale, vid_h * scale}; + if (s[0] > 0 && s[1] > 0) + vo_control(vo, VOCTRL_SET_UNFS_WINDOW_SIZE, s); + return 0; } -static void update_window_scale(struct MPContext *mpctx) +static int mp_property_current_window_scale(void *ctx, struct m_property *prop, + int action, void *arg) { + MPContext *mpctx = ctx; struct vo *vo = mpctx->video_out; if (!vo) - return; + return M_PROPERTY_UNAVAILABLE; - struct mp_image_params params = get_video_out_params(mpctx); - int vid_w, vid_h; - mp_image_params_get_dsize(¶ms, &vid_w, &vid_h); - if (vid_w < 1 || vid_h < 1) - return; + switch (action) { + case M_PROPERTY_SET: + if (update_window_scale(mpctx, *(double *)arg) < 0) + return M_PROPERTY_UNAVAILABLE; + return M_PROPERTY_OK; + case M_PROPERTY_GET_TYPE: + case M_PROPERTY_GET: ; + struct mp_image_params params = get_video_out_params(mpctx); + int vid_w, vid_h; + mp_image_params_get_dsize(¶ms, &vid_w, &vid_h); + if (vid_w < 1 || vid_h < 1) + return M_PROPERTY_UNAVAILABLE; - double scale = mpctx->opts->vo->window_scale; - int s[2] = {vid_w * scale, vid_h * scale}; - if (s[0] > 0 && s[1] > 0) - vo_control(vo, VOCTRL_SET_UNFS_WINDOW_SIZE, s); + int s[2]; + if (vo_control(vo, VOCTRL_GET_UNFS_WINDOW_SIZE, s) <= 0 || + s[0] < 1 || s[1] < 1) + return M_PROPERTY_UNAVAILABLE; + + double xs = (double)s[0] / vid_w; + double ys = (double)s[1] / vid_h; + return m_property_double_ro(action, arg, (xs + ys) / 2); + } + return M_PROPERTY_NOT_IMPLEMENTED; } static int mp_property_display_fps(void *ctx, struct m_property *prop, @@ -6701,7 +6710,7 @@ void mp_option_change_callback(void *ctx, struct m_config_option *co, int flags, } if (opt_ptr == &opts->vo->window_scale) - update_window_scale(mpctx); + update_window_scale(mpctx, opts->vo->window_scale); if (opt_ptr == &opts->cursor_autohide_delay) mpctx->mouse_timer = 0; |