diff --git a/DOCS/interface-changes/term-size.txt b/DOCS/interface-changes/term-size.txt new file mode 100644 index 0000000000..dd65a66256 --- /dev/null +++ b/DOCS/interface-changes/term-size.txt @@ -0,0 +1 @@ +add `term-size` property diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 3d3163eb1c..cf4a43636b 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -2804,6 +2804,19 @@ Property list Any of these properties may be unavailable or set to dummy values if the VO window is not created or visible. +``term-size`` + The current terminal size. + + This has two sub-properties. + + ``term-size/w`` + width of the terminal in cells + ``term-size/h`` + height of the terminal in cells + + This property is not observable. Reacting to size changes requires + polling. + ``window-id`` Read-only - mpv's window id. May not always be available, i.e due to window not being opened yet or not being supported by the VO. diff --git a/player/command.c b/player/command.c index 82801131a8..27fadf91b1 100644 --- a/player/command.c +++ b/player/command.c @@ -74,6 +74,7 @@ #include "osdep/io.h" #include "osdep/subprocess.h" +#include "osdep/terminal.h" #include "core.h" @@ -2886,6 +2887,23 @@ static int mp_property_osd_ass(void *ctx, struct m_property *prop, return m_property_read_sub(props, action, arg); } +static int mp_property_term_size(void *ctx, struct m_property *prop, + int action, void *arg) +{ + int w = -1, h = -1; + terminal_get_size(&w, &h); + if (w == -1 || h == -1) + return M_PROPERTY_UNAVAILABLE; + + struct m_sub_property props[] = { + {"w", SUB_PROP_INT(w)}, + {"h", SUB_PROP_INT(h)}, + {0} + }; + + return m_property_read_sub(props, action, arg); +} + static int mp_property_mouse_pos(void *ctx, struct m_property *prop, int action, void *arg) { @@ -4092,6 +4110,7 @@ static const struct m_property mp_properties_base[] = { {"input-bindings", mp_property_bindings}, {"user-data", mp_property_udata}, + {"term-size", mp_property_term_size}, M_PROPERTY_ALIAS("video", "vid"), M_PROPERTY_ALIAS("audio", "aid"),