summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/options.rst11
-rw-r--r--options/m_option.c15
-rw-r--r--options/m_option.h1
-rw-r--r--video/out/x11_common.c5
4 files changed, 24 insertions, 8 deletions
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index f554186f04..b85b67c991 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -2936,7 +2936,7 @@ Window
(X11 only)
Show the video window on all virtual desktops.
-``--geometry=<[W[xH]][+-x+-y]>``, ``--geometry=<x:y>``
+``--geometry=<[W[xH]][+-x+-y][/WS]>``, ``--geometry=<x:y>``
Adjust the initial window position or size. ``W`` and ``H`` set the window
size in pixels. ``x`` and ``y`` set the window position, measured in pixels
from the top-left corner of the screen to the top-left corner of the image
@@ -2945,7 +2945,9 @@ Window
Positions are specified similar to the standard X11 ``--geometry`` option
format, in which e.g. +10-50 means "place 10 pixels from the left border and
50 pixels from the lower border" and "--20+-10" means "place 20 pixels
- beyond the right and 10 pixels beyond the top border".
+ beyond the right and 10 pixels beyond the top border". A trailing ``/``
+ followed by an integer denotes on which workspace (virtual desktop) the
+ window should appear (X11 only).
If an external window is specified using the ``--wid`` option, this
option is ignored.
@@ -2982,9 +2984,10 @@ Window
Forces the window width and height to half the screen width and
height. Will show black borders to compensate for the video aspect
ratio (with most VOs and without ``--no-keepaspect``).
- ``50%+10+10``
+ ``50%+10+10/2``
Sets the window to half the screen widths, and positions it 10
- pixels below/left of the top left corner of the screen.
+ pixels below/left of the top left corner of the screen, on the
+ second workspace.
See also ``--autofit`` and ``--autofit-larger`` for fitting the window into
a given size without changing aspect ratio.
diff --git a/options/m_option.c b/options/m_option.c
index 51e3c38801..9b0fd82779 100644
--- a/options/m_option.c
+++ b/options/m_option.c
@@ -2145,7 +2145,7 @@ static bool parse_geometry_str(struct m_geometry *gm, bstr s)
if (s.len == 0)
return true;
// Approximate grammar:
- // [[W][xH]][{+-}X{+-}Y] | [X:Y]
+ // [[W][xH]][{+-}X{+-}Y][/WS] | [X:Y]
// (meaning: [optional] {one character of} one|alternative)
// Every number can be followed by '%'
int num;
@@ -2181,6 +2181,14 @@ static bool parse_geometry_str(struct m_geometry *gm, bstr s)
READ_SIGN(y_sign);
READ_NUM(y, y_per);
}
+ if (bstr_eatstart0(&s, "/")) {
+ bstr rest;
+ long long v = bstrtoll(s, &rest, 10);
+ if (s.len == rest.len || v < 1 || v > INT_MAX)
+ goto error;
+ s = rest;
+ gm->ws = v;
+ }
} else {
gm->xy_valid = true;
READ_NUM(x, x_per);
@@ -2217,6 +2225,8 @@ static char *print_geometry(const m_option_t *opt, const void *val)
res = talloc_asprintf_append(res, gm->y_sign ? "-" : "+");
APPEND_PER(y, y_per);
}
+ if (gm->ws > 0)
+ res = talloc_asprintf_append(res, "/%d", gm->ws);
}
return res;
}
@@ -2301,7 +2311,8 @@ static bool geometry_equal(const m_option_t *opt, void *a, void *b)
ga->xy_valid == gb->xy_valid && ga->wh_valid == gb->wh_valid &&
ga->w_per == gb->w_per && ga->h_per == gb->h_per &&
ga->x_per == gb->x_per && ga->y_per == gb->y_per &&
- ga->x_sign == gb->x_sign && ga->y_sign == gb->y_sign;
+ ga->x_sign == gb->x_sign && ga->y_sign == gb->y_sign &&
+ ga->ws == gb->ws;
}
const m_option_type_t m_option_type_geometry = {
diff --git a/options/m_option.h b/options/m_option.h
index f51ca95fa8..25dc212482 100644
--- a/options/m_option.h
+++ b/options/m_option.h
@@ -98,6 +98,7 @@ struct m_geometry {
bool xy_valid : 1, wh_valid : 1;
bool w_per : 1, h_per : 1;
bool x_sign : 1, y_sign : 1, x_per : 1, y_per : 1;
+ int ws; // workspace; valid if !=0
};
void m_geometry_apply(int *xpos, int *ypos, int *widw, int *widh,
diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index 40228903b9..461ff378d0 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -1498,8 +1498,9 @@ static void vo_x11_map_window(struct vo *vo, struct mp_rect rc)
x11_send_ewmh_msg(x11, "_NET_WM_FULLSCREEN_MONITORS", params);
}
- if (x11->opts->all_workspaces) {
- long v = 0xFFFFFFFF;
+ if (x11->opts->all_workspaces || x11->opts->geometry.ws > 0) {
+ long v = x11->opts->all_workspaces
+ ? 0xFFFFFFFF : x11->opts->geometry.ws - 1;
XChangeProperty(x11->display, x11->window, XA(x11, _NET_WM_DESKTOP),
XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&v, 1);
}