vlc | branch: master | Steve Lhomme <[email protected]> | Tue Mar 26 16:32:50 2019 +0100| [04e5b905451ea95c16c157bf9abe8359f79dd4b7] | committer: Steve Lhomme
vout:win32: handle the Always On Top of the non-parented window internally When we receive our IDM_TOGGLE_ON_TOP we post WM_VLC_SET_TOP_STATE to our window. No need to go through the vout_display_SendWindowState(). This is only used for the external window. In GUI/embedded mode the above/normal state is handled by the GUI and we don't have to change menus in the chromeless window. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=04e5b905451ea95c16c157bf9abe8359f79dd4b7 --- modules/video_output/win32/common.c | 22 ---------------------- modules/video_output/win32/direct3d9.c | 4 ++-- modules/video_output/win32/events.c | 32 +++++++++++++++++++++++++++++--- modules/video_output/win32/events.h | 3 ++- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/modules/video_output/win32/common.c b/modules/video_output/win32/common.c index ef634e0f7e..0cb2162d61 100644 --- a/modules/video_output/win32/common.c +++ b/modules/video_output/win32/common.c @@ -387,28 +387,6 @@ int CommonControl(vout_display_t *vd, display_win32_area_t *area, vout_display_s return VLC_SUCCESS; } #if !VLC_WINSTORE_APP - case VOUT_DISPLAY_CHANGE_WINDOW_STATE: { /* unsigned state */ - const unsigned state = va_arg(args, unsigned); - const bool is_on_top = (state & VOUT_WINDOW_STATE_ABOVE) != 0; - if (sys->event != NULL) - { -#ifdef MODULE_NAME_IS_direct3d9 - if (sys->use_desktop && is_on_top) - return VLC_EGENERIC; -#endif - HMENU hMenu = GetSystemMenu(sys->hwnd, FALSE); - - if (is_on_top && !(GetWindowLong(sys->hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)) { - CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_CHECKED); - SetWindowPos(sys->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); - } else if (!is_on_top && (GetWindowLong(sys->hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)) { - CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_UNCHECKED); - SetWindowPos(sys->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); - } - sys->is_on_top = is_on_top; - } - return VLC_SUCCESS; - } case VOUT_DISPLAY_CHANGE_FULLSCREEN: { bool fs = va_arg(args, int); if (sys->event != NULL) diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c index 2be530a354..41268ba0fb 100644 --- a/modules/video_output/win32/direct3d9.c +++ b/modules/video_output/win32/direct3d9.c @@ -923,13 +923,13 @@ static void UpdateDesktopMode(vout_display_t *vd) if (sys->desktop_save.is_fullscreen) vout_display_SendEventFullscreen(vd, false); if (sys->desktop_save.is_on_top) - vout_display_SendWindowState(vd, VOUT_WINDOW_STATE_NORMAL); + EventThreadSetAbove( sys->sys.event, false ); } else { /* Restore fullscreen/on_top */ if (sys->desktop_save.is_fullscreen) vout_display_SendEventFullscreen(vd, true); if (sys->desktop_save.is_on_top) - vout_display_SendWindowState(vd, VOUT_WINDOW_STATE_ABOVE); + EventThreadSetAbove( sys->sys.event, true ); } } diff --git a/modules/video_output/win32/events.c b/modules/video_output/win32/events.c index f65c0c1c88..6d040d5f8d 100644 --- a/modules/video_output/win32/events.c +++ b/modules/video_output/win32/events.c @@ -45,7 +45,8 @@ /***************************************************************************** * Local prototypes. *****************************************************************************/ -#define WM_VLC_CHANGE_TEXT (WM_APP + 1) +#define WM_VLC_CHANGE_TEXT (WM_APP + 1) +#define WM_VLC_SET_TOP_STATE (WM_APP + 2) struct event_thread_t { @@ -862,6 +863,18 @@ static void Win32VoutCloseWindow( event_thread_t *p_event ) CloseGestures( p_event->p_gesture); } +static void SetAbove( event_thread_t *p_event, bool is_on_top ) +{ + HMENU hMenu = GetSystemMenu(p_event->hwnd, FALSE); + if (is_on_top && !(GetWindowLong(p_event->hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)) { + CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_CHECKED); + SetWindowPos(p_event->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + } else if (!is_on_top && (GetWindowLong(p_event->hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)) { + CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_UNCHECKED); + SetWindowPos(p_event->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); + } +} + /***************************************************************************** * WinVoutEventProc: This is the window event processing function. ***************************************************************************** @@ -967,8 +980,12 @@ static long FAR PASCAL WinVoutEventProc( HWND hwnd, UINT message, { msg_Dbg(vd, "WinProc WM_SYSCOMMAND: IDM_TOGGLE_ON_TOP"); HMENU hMenu = GetSystemMenu(p_event->hwnd, FALSE); - vout_display_SendWindowState(vd, (GetMenuState(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND) & MF_CHECKED) ? - VOUT_WINDOW_STATE_NORMAL : VOUT_WINDOW_STATE_ABOVE); + const bool is_on_top = (GetMenuState(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND) & MF_CHECKED) == 0; +#ifdef MODULE_NAME_IS_direct3d9 + if (p_event->use_desktop && is_on_top) + return 0; +#endif + SetAbove( p_event, is_on_top); return 0; } default: @@ -976,6 +993,10 @@ static long FAR PASCAL WinVoutEventProc( HWND hwnd, UINT message, } break; + case WM_VLC_SET_TOP_STATE: + SetAbove( p_event, wParam != 0); + return 0; + case WM_PAINT: case WM_NCPAINT: case WM_ERASEBKGND: @@ -998,6 +1019,11 @@ static long FAR PASCAL WinVoutEventProc( HWND hwnd, UINT message, return DefWindowProc(hwnd, message, wParam, lParam); } +void EventThreadSetAbove( event_thread_t *p_event, bool is_on_top ) +{ + PostMessage( p_event->hwnd, WM_VLC_SET_TOP_STATE, is_on_top != 0, 0); +} + static struct { int i_dxkey; diff --git a/modules/video_output/win32/events.h b/modules/video_output/win32/events.h index c4e18593e1..15cdb05897 100644 --- a/modules/video_output/win32/events.h +++ b/modules/video_output/win32/events.h @@ -54,7 +54,8 @@ void EventThreadStop( event_thread_t * ); void EventThreadUpdateTitle( event_thread_t *, const char *psz_fallback ); int EventThreadGetWindowStyle( event_thread_t * ); void EventThreadUpdatePlace( event_thread_t *p_event, - const vout_display_place_t *p_place ); + const vout_display_place_t *p_place ); +void EventThreadSetAbove( event_thread_t *, bool ); bool EventThreadGetAndResetSizeChanged( event_thread_t * ); # ifdef __cplusplus _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
