Skip to content

Commit

Permalink
win32: add an option to change window affinity
Browse files Browse the repository at this point in the history
  • Loading branch information
DeadSix27 committed Sep 21, 2023
1 parent 4c39e79 commit b779634
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 0 deletions.
8 changes: 8 additions & 0 deletions DOCS/man/options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3135,6 +3135,14 @@ Window
Play video with window border and decorations. Since this is on by
default, use ``--no-border`` to disable the standard window decorations.

``--window-affinity=<default|excludefromcapture|monitor>``
(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

``--on-all-workspaces``
(X11 and macOS only)
Show the video window on all virtual desktops.
Expand Down
2 changes: 2 additions & 0 deletions options/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions options/options.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
14 changes: 14 additions & 0 deletions video/out/w32_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit b779634

Please sign in to comment.