10DWORD GetWindowStyleForDialog(std::optional<HWND>
const& owner_window) {
11 DWORD window_style = WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME;
14 window_style |= WS_MINIMIZEBOX | WS_SYSMENU;
20DWORD GetExtendedWindowStyleForDialog(std::optional<HWND>
const& owner_window) {
21 DWORD extended_window_style = WS_EX_DLGMODALFRAME;
25 if (GetWindowLongPtr(*owner_window, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) {
26 extended_window_style |= WS_EX_TOOLWINDOW;
29 return extended_window_style;
40 std::optional<HWND>
const& owner_window)
44 .window_style = GetWindowStyleForDialog(owner_window),
45 .extended_window_style = GetExtendedWindowStyleForDialog(owner_window),
46 .box_constraints = constraints,
47 .initial_window_rect =
48 GetInitialRect(
engine, preferred_size, constraints, owner_window),
50 .owner_window = owner_window,
53 if (owner_window ==
nullptr) {
54 if (HMENU hMenu = GetSystemMenu(hwnd, FALSE)) {
55 EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
59 if (owner_window !=
nullptr) {
67 std::optional<HWND>
const& owner_window) {
68 auto const window_style = GetWindowStyleForDialog(owner_window);
69 auto const extended_window_style =
70 GetExtendedWindowStyleForDialog(owner_window);
71 std::optional<Size>
const window_size =
73 *
engine->windows_proc_table(),
77 extended_window_style, owner_window);
78 Point window_origin = {CW_USEDEFAULT, CW_USEDEFAULT};
79 if (owner_window && window_size.has_value()) {
82 DwmGetWindowAttribute(*owner_window, DWMWA_EXTENDED_FRAME_BOUNDS, &frame,
84 window_origin = {(frame.left + frame.right - window_size->width()) * 0.5,
85 (frame.top + frame.bottom - window_size->height()) * 0.5};
88 return {window_origin,
89 window_size ? *window_size :
Size{CW_USEDEFAULT, CW_USEDEFAULT}};
106 if (LOWORD(wparam) != WA_INACTIVE) {
109 if (!IsWindowEnabled(hwnd)) {
112 SetActiveWindow(enabled_descendant->GetWindowHandle());
125void HostWindowDialog::UpdateModalState() {
137 std::optional<FlutterEngineDisplayId> display_id) {}
HostWindowDialog(WindowManager *window_manager, FlutterWindowsEngine *engine, const WindowSizeRequest &preferred_size, const BoxConstraints &constraints, LPCWSTR title, std::optional< HWND > const &owner_window)
bool GetFullscreen() const override
void SetFullscreen(bool fullscreen, std::optional< FlutterEngineDisplayId > display_id) override
LRESULT HandleMessage(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) override
void InitializeFlutterView(HostWindowInitializationParams const ¶ms)
HostWindow * GetOwnerWindow() const
void UpdateModalStateLayer()
static void FocusRootViewOf(HostWindow *window)
virtual LRESULT HandleMessage(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
static std::optional< Size > GetWindowSizeForClientSize(WindowsProcTable const &win32, Size const &client_size, std::optional< Size > smallest, std::optional< Size > biggest, DWORD window_style, DWORD extended_window_style, std::optional< HWND > const &owner_hwnd)
HostWindow * FindFirstEnabledDescendant() const
WindowArchetype archetype
double preferred_view_height
double preferred_view_width