mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-27 02:30:35 +00:00
d3d11videosink: Fix toggling between fullscreen and maximized
Use GetWindowPlacement() and SetWindowPlacement() APIs to remember and restore window status, such as maximized, position, restore position, etc. Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3016 Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5466>
This commit is contained in:
parent
81178eab42
commit
07a2f7ebcc
1 changed files with 7 additions and 13 deletions
|
@ -90,8 +90,8 @@ struct _GstD3D11WindowWin32
|
|||
gint pending_move_window;
|
||||
|
||||
/* fullscreen related */
|
||||
RECT restore_rect;
|
||||
LONG restore_style;
|
||||
WINDOWPLACEMENT restore_placement;
|
||||
|
||||
/* Handle set_render_rectangle */
|
||||
GstVideoRectangle render_rect;
|
||||
|
@ -177,6 +177,7 @@ static void
|
|||
gst_d3d11_window_win32_init (GstD3D11WindowWin32 * self)
|
||||
{
|
||||
self->main_context = g_main_context_new ();
|
||||
self->restore_placement.length = sizeof (WINDOWPLACEMENT);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -659,32 +660,25 @@ gst_d3d11_window_win32_change_fullscreen_mode_internal (GstD3D11WindowWin32 *
|
|||
/* Restore the window's attributes and size */
|
||||
SetWindowLongA (hwnd, GWL_STYLE, self->restore_style);
|
||||
|
||||
SetWindowPos (hwnd, HWND_NOTOPMOST,
|
||||
self->restore_rect.left,
|
||||
self->restore_rect.top,
|
||||
self->restore_rect.right - self->restore_rect.left,
|
||||
self->restore_rect.bottom - self->restore_rect.top,
|
||||
SWP_FRAMECHANGED | SWP_NOACTIVATE);
|
||||
|
||||
ShowWindow (hwnd, SW_NORMAL);
|
||||
SetWindowPlacement (hwnd, &self->restore_placement);
|
||||
} else {
|
||||
ComPtr < IDXGIOutput > output;
|
||||
DXGI_OUTPUT_DESC output_desc;
|
||||
IDXGISwapChain *swap_chain = window->swap_chain;
|
||||
|
||||
/* remember current placement to restore window later */
|
||||
GetWindowPlacement (hwnd, &self->restore_placement);
|
||||
|
||||
/* show window before change style */
|
||||
ShowWindow (hwnd, SW_SHOW);
|
||||
|
||||
/* Save the old window rect so we can restore it when exiting
|
||||
* fullscreen mode */
|
||||
GetWindowRect (hwnd, &self->restore_rect);
|
||||
self->restore_style = GetWindowLong (hwnd, GWL_STYLE);
|
||||
|
||||
/* Make the window borderless so that the client area can fill the screen */
|
||||
SetWindowLongA (hwnd, GWL_STYLE,
|
||||
self->restore_style &
|
||||
~(WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU |
|
||||
WS_THICKFRAME));
|
||||
WS_THICKFRAME | WS_MAXIMIZE));
|
||||
|
||||
swap_chain->GetContainingOutput (&output);
|
||||
output->GetDesc (&output_desc);
|
||||
|
|
Loading…
Reference in a new issue