mangayomi-mirror/packages/media_kit_video/windows/utils.cc
kodjomoustapha 7cd4ab860c fix #206
2024-06-29 10:48:47 +01:00

81 lines
3 KiB
C++

// This file is a part of media_kit
// (https://github.com/media-kit/media-kit).
//
// Copyright © 2021 & onwards, Hitesh Kumar Saini <saini123hitesh@gmail.com>.
// All rights reserved.
// Use of this source code is governed by MIT license that can be found in the
// LICENSE file.
#include "utils.h"
void Utils::EnterNativeFullscreen(HWND window) {
if (fullscreen_) {
return;
}
fullscreen_ = true;
// The primary idea here is to revolve around |WS_OVERLAPPEDWINDOW| &
// detect/set fullscreen based on it. In the window procedure, this is
// separately handled. If there is no |WS_OVERLAPPEDWINDOW| style on the
// window i.e. in fullscreen, then no area is left for |WM_NCHITTEST|,
// accordingly client area is also expanded to fill whole monitor using
// |WM_NCCALCSIZE|.
auto style = ::GetWindowLongPtr(window, GWL_STYLE);
if (style & WS_OVERLAPPEDWINDOW) {
auto monitor = MONITORINFO{};
auto placement = WINDOWPLACEMENT{};
monitor.cbSize = sizeof(MONITORINFO);
placement.length = sizeof(WINDOWPLACEMENT);
::GetWindowPlacement(window, &placement);
rect_before_fullscreen_ = RECT{
placement.rcNormalPosition.left,
placement.rcNormalPosition.top,
placement.rcNormalPosition.right,
placement.rcNormalPosition.bottom,
};
::GetMonitorInfo(::MonitorFromWindow(window, MONITOR_DEFAULTTONEAREST),
&monitor);
::SetWindowLongPtr(window, GWL_STYLE, style & ~WS_OVERLAPPEDWINDOW);
::SetWindowPos(window, HWND_TOP, monitor.rcMonitor.left,
monitor.rcMonitor.top, monitor.rcMonitor.right - monitor.rcMonitor.left,
monitor.rcMonitor.bottom - monitor.rcMonitor.top,
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
}
void Utils::ExitNativeFullscreen(HWND window) {
if (!fullscreen_) {
return;
}
fullscreen_ = false;
auto style = ::GetWindowLongPtr(window, GWL_STYLE);
if (!(style & WS_OVERLAPPEDWINDOW)) {
::SetWindowLongPtr(window, GWL_STYLE, style | WS_OVERLAPPEDWINDOW);
if (::IsZoomed(window)) {
// Refresh the parent window.
::SetWindowPos(window, nullptr, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
SWP_FRAMECHANGED);
auto rect = RECT{};
::GetClientRect(window, &rect);
auto flutter_view =
::FindWindowEx(window, nullptr, kFlutterViewWindowClassName, nullptr);
::SetWindowPos(flutter_view, nullptr, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_NOACTIVATE | SWP_NOZORDER);
} else {
::SetWindowPos(
window, nullptr, rect_before_fullscreen_.left,
rect_before_fullscreen_.top,
rect_before_fullscreen_.right - rect_before_fullscreen_.left,
rect_before_fullscreen_.bottom - rect_before_fullscreen_.top,
SWP_NOACTIVATE | SWP_NOZORDER);
}
}
}
bool Utils::fullscreen_ = false;
RECT Utils::rect_before_fullscreen_ = RECT{};