From 0eb3a28752d237c0a04b6aca265472d001c1796d Mon Sep 17 00:00:00 2001 From: DeadSix Date: Thu, 21 Sep 2023 23:13:07 +0200 Subject: [PATCH] win32: add an option to change window affinity --- DOCS/man/options.rst | 15 +++++++++++---- options/options.c | 2 ++ options/options.h | 1 + video/out/w32_common.c | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index 5f44567b97bfa..5e98a98528039 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -6074,6 +6074,7 @@ them. X11/GLX only. ``--opengl-dwmflush=`` + (Windows only) Calls ``DwmFlush`` after swapping buffers on Windows (default: auto). It also sets ``SwapInterval(0)`` to ignore the OpenGL timing. Values are: no (disabled), windowed (only in windowed mode), yes (also in full screen). @@ -6085,8 +6086,6 @@ them. high-fps clips - which might also reduce dropped frames. Typically, a value of ``windowed`` should be enough, since full screen may bypass the DWM. - Windows only. - ``--angle-d3d11-feature-level=<11_0|10_1|10_0|9_3>`` Selects a specific feature level when using the ANGLE backend with D3D11. By default, the highest available feature level is used. This option can be @@ -7112,12 +7111,20 @@ Miscellaneous This is a key/value list option. See `List Options`_ for details. +``--window-affinity=`` + (Windows only) + Controls the window affinity behavior for your program. + + :default: Default Windows behavior + :excludefromcapture: mpv's window will be completely excluded from capture by external applications or screen recording software. + :monitor: Blacks out the mpv window + ``--vo-mmcss-profile=`` - (Windows only.) + (Windows only) Set the MMCSS profile for the video renderer thread (default: ``Playback``). ``--priority=`` - (Windows only.) + (Windows only) Set process priority for mpv according to the predefined priorities available under Windows. diff --git a/options/options.c b/options/options.c index 1fc80ea3d626e..c53183a6ecaae 100644 --- a/options/options.c +++ b/options/options.c @@ -186,6 +186,8 @@ static const m_option_t mp_vo_opt_list[] = { {"photo", 1}, {"video", 2}, {"game", 3})}, #endif #if HAVE_WIN32_DESKTOP + {"window-affinity", OPT_CHOICE(window_affinity, {"default", WDA_NONE}, + {"excludefromcapture", WDA_EXCLUDEFROMCAPTURE}, {"monitor", WDA_MONITOR})}, {"vo-mmcss-profile", OPT_STRING(mmcss_profile)}, #endif #if HAVE_EGL_ANDROID diff --git a/options/options.h b/options/options.h index b7af6efb988d0..a272f46916692 100644 --- a/options/options.h +++ b/options/options.h @@ -63,6 +63,7 @@ typedef struct mp_vo_opts { bool force_render; bool force_window_position; + int window_affinity; char *mmcss_profile; double override_display_fps; diff --git a/video/out/w32_common.c b/video/out/w32_common.c index b3ad94979451f..4861d97cc00cc 100644 --- a/video/out/w32_common.c +++ b/video/out/w32_common.c @@ -963,6 +963,16 @@ static bool is_visible(HWND window) return GetWindowLongPtrW(window, GWL_STYLE) & WS_VISIBLE; } +//Set the mpv window's affinity. +//This will affect how it's displayed on the desktop and in system-level operations like taking screenshots. +static void update_affinity(struct vo_w32_state *w32) +{ + if (!w32 || w32->parent) { + return; + } + SetWindowDisplayAffinity(w32->window, w32->opts->window_affinity); +} + static void update_window_state(struct vo_w32_state *w32) { if (w32->parent) @@ -1612,6 +1622,8 @@ static void *gui_thread(void *ptr) } update_dark_mode(w32); + if (w32->opts->window_affinity) + update_affinity(w32); if (SUCCEEDED(OleInitialize(NULL))) { ole_ok = true; @@ -1786,6 +1798,8 @@ static int gui_thread_control(struct vo_w32_state *w32, int request, void *arg) if (changed_option == &vo_opts->fullscreen) { reinit_window_state(w32); + } else if (changed_option == &vo_opts->window_affinity) { + update_affinity(w32); } else if (changed_option == &vo_opts->ontop) { update_window_state(w32); } else if (changed_option == &vo_opts->border) {