From eb5a83e1c110234b3e835b7a76d83e1ddaa7bfb5 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 16 Jan 2015 23:38:47 +0100 Subject: x11: add --on-all-workspaces option and property Fixes #1469. --- DOCS/man/input.rst | 3 +++ DOCS/man/options.rst | 4 ++++ options/options.c | 1 + options/options.h | 4 +++- player/command.c | 9 +++++++++ video/out/vo.h | 5 +++-- video/out/x11_common.c | 10 ++++++++++ 7 files changed, 33 insertions(+), 3 deletions(-) diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 2751c7348f..4ec29ba62d 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -1066,6 +1066,9 @@ Property list ``border`` (RW) See ``--border``. +``on-all-workspaces`` (RW) + See ``--on-all-workspaces``. Unsetting may not work on all WMs. + ``framedrop`` (RW) See ``--framedrop``. diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index b8d521eca6..ce57228c41 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -1548,6 +1548,10 @@ Window Play video with window border and decorations. Since this is on by default, use ``--no-border`` to disable the standard window decorations. +``--on-all-workspaces`` + (X11 only) + Show the video window on all virtual desktops. + ``--geometry=<[W[xH]][+-x+-y]>``, ``--geometry=`` 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 diff --git a/options/options.c b/options/options.c index 9033241605..aeec497b84 100644 --- a/options/options.c +++ b/options/options.c @@ -370,6 +370,7 @@ const m_option_t mp_opts[] = { OPT_FLAG("force-window", force_vo, CONF_GLOBAL), OPT_FLAG("ontop", vo.ontop, M_OPT_FIXED), OPT_FLAG("border", vo.border, M_OPT_FIXED), + OPT_FLAG("on-all-workspaces", vo.all_workspaces, M_OPT_FIXED), OPT_FLAG("window-dragging", allow_win_drag, CONF_GLOBAL), diff --git a/options/options.h b/options/options.h index 3784cf5546..00b4b588dd 100644 --- a/options/options.h +++ b/options/options.h @@ -10,6 +10,9 @@ typedef struct mp_vo_opts { int ontop; int fullscreen; + int border; + int all_workspaces; + int screen_id; int fsscreen_id; int fs_black_out_screens; @@ -30,7 +33,6 @@ typedef struct mp_vo_opts { int keepaspect; int keepaspect_window; - int border; int64_t WinID; diff --git a/player/command.c b/player/command.c index 14b3cac7c2..bfdc823018 100644 --- a/player/command.c +++ b/player/command.c @@ -2272,6 +2272,14 @@ static int mp_property_border(void *ctx, struct m_property *prop, &mpctx->opts->vo.border, mpctx); } +static int mp_property_all_workspaces(void *ctx, struct m_property *prop, + int action, void *arg) +{ + MPContext *mpctx = ctx; + return mp_property_vo_flag(prop, action, arg, VOCTRL_ALL_WORKSPACES, + &mpctx->opts->vo.all_workspaces, mpctx); +} + static int get_frame_count(struct MPContext *mpctx) { struct demuxer *demuxer = mpctx->demuxer; @@ -3309,6 +3317,7 @@ static const struct m_property mp_properties[] = { {"colormatrix-primaries", mp_property_primaries}, {"ontop", mp_property_ontop}, {"border", mp_property_border}, + {"on-all-workspaces", mp_property_all_workspaces}, {"framedrop", mp_property_framedrop}, {"gamma", mp_property_video_color}, {"brightness", mp_property_video_color}, diff --git a/video/out/vo.h b/video/out/vo.h index 20223493cd..5d136432e3 100644 --- a/video/out/vo.h +++ b/video/out/vo.h @@ -47,8 +47,6 @@ enum mp_voctrl { VOCTRL_RESET = 1, /* Handle input and redraw events, called by vo_check_events() */ VOCTRL_CHECK_EVENTS, - /* used to switch to fullscreen */ - VOCTRL_FULLSCREEN, /* signal a device pause */ VOCTRL_PAUSE, /* start/resume playback */ @@ -68,8 +66,11 @@ enum mp_voctrl { // be updated and redrawn. VOCTRL_REDRAW_FRAME, + VOCTRL_FULLSCREEN, VOCTRL_ONTOP, VOCTRL_BORDER, + VOCTRL_ALL_WORKSPACES, + VOCTRL_UPDATE_WINDOW_TITLE, // char* VOCTRL_SET_CURSOR_VISIBILITY, // bool* diff --git a/video/out/x11_common.c b/video/out/x11_common.c index e280349d24..be1f1b74ed 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -1619,6 +1619,16 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg) opts->border = !opts->border; vo_x11_decoration(vo, vo->opts->border); return VO_TRUE; + case VOCTRL_ALL_WORKSPACES: { + opts->all_workspaces = !opts->all_workspaces; + long params[5] = {0xFFFFFFFF, 1}; + if (!opts->all_workspaces) { + x11_get_property_copy(x11, x11->rootwin, XA(x11, _NET_CURRENT_DESKTOP), + XA_CARDINAL, 32, ¶ms[0], sizeof(params[0])); + } + x11_send_ewmh_msg(x11, "_NET_WM_DESKTOP", params); + return VO_TRUE; + } case VOCTRL_GET_UNFS_WINDOW_SIZE: { int *s = arg; if (!x11->window) -- cgit v1.2.3