From 89684976acdfae7fdcec9a1b1819ab7f19012332 Mon Sep 17 00:00:00 2001 From: "Avi Halachmi (:avih)" Date: Thu, 27 May 2021 12:07:28 +0300 Subject: win32: support the property 'focused' And also change the existing WM_KILLFOCUS handler to return 0 instead of 'break' (which later calls DefWindowProcW), as MSDN says we should do for WM_{KILL,SET}FOCUS. It seems that the 'focused' property is now supported by all main VOs: x11, macOS, wayland, Windows. TCT/sixel/caca probably don't support it, and unknown with SDL. Fixes #8868 --- DOCS/man/input.rst | 3 +-- video/out/w32_common.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 63021280be..8a5601f207 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -2502,8 +2502,7 @@ Property list ways. The property is unavailable if no video is active. ``focused`` - Whether the window has focus. Currently works only on X11, Wayland and - macOS. + Whether the window has focus. Might not be supported by all VOs. ``display-names`` Names of the displays that the mpv window covers. On X11, these diff --git a/video/out/w32_common.c b/video/out/w32_common.c index c819803a63..86334688be 100644 --- a/video/out/w32_common.c +++ b/video/out/w32_common.c @@ -97,6 +97,8 @@ struct vo_w32_state { // Has the window seen a WM_DESTROY? If so, don't call DestroyWindow again. bool destroyed; + bool focused; + // whether the window position and size were intialized bool window_bounds_initialized; @@ -1210,7 +1212,13 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, break; case WM_KILLFOCUS: mp_input_put_key(w32->input_ctx, MP_INPUT_RELEASE_ALL); - break; + w32->focused = false; + signal_events(w32, VO_EVENT_FOCUS); + return 0; + case WM_SETFOCUS: + w32->focused = true; + signal_events(w32, VO_EVENT_FOCUS); + return 0; case WM_SETCURSOR: // The cursor should only be hidden if the mouse is in the client area // and if the window isn't in menu mode (HIWORD(lParam) is non-zero) @@ -1785,6 +1793,9 @@ static int gui_thread_control(struct vo_w32_state *w32, int request, void *arg) return p->len ? VO_TRUE : VO_FALSE; } return VO_FALSE; + case VOCTRL_GET_FOCUSED: + *(bool *)arg = w32->focused; + return VO_TRUE; } return VO_NOTIMPL; } -- cgit v1.2.3