13 DWORD HostWindowDialog::GetWindowStyleForDialog(
14 std::optional<HWND>
const& owner_window,
16 DWORD window_style = WS_OVERLAPPED | WS_CAPTION;
18 window_style |= WS_THICKFRAME;
22 window_style |= WS_MINIMIZEBOX | WS_SYSMENU;
27 DWORD HostWindowDialog::GetExtendedWindowStyleForDialog(
28 std::optional<HWND>
const& owner_window) {
29 DWORD extended_window_style = WS_EX_DLGMODALFRAME;
33 if (GetWindowLongPtr(*owner_window, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) {
34 extended_window_style |= WS_EX_TOOLWINDOW;
37 return extended_window_style;
43 const BoxConstraints& constraints,
45 std::optional<HWND>
const& owner_window,
46 bool sized_to_content,
52 .window_style = GetWindowStyleForDialog(owner_window, resizable),
53 .extended_window_style = GetExtendedWindowStyleForDialog(owner_window),
54 .box_constraints = constraints,
55 .initial_window_rect =
56 GetInitialRect(engine, preferred_size, constraints, owner_window,
57 sized_to_content, resizable),
59 .owner_window = owner_window,
61 .is_sized_to_content = sized_to_content,
66 if (HMENU hMenu = GetSystemMenu(hwnd, FALSE)) {
67 EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
85 const BoxConstraints& constraints,
86 std::optional<HWND>
const& owner_window,
87 bool sized_to_content,
89 auto const window_style = GetWindowStyleForDialog(owner_window, resizable);
90 auto const extended_window_style =
91 GetExtendedWindowStyleForDialog(owner_window);
95 if (sized_to_content) {
98 client_width = std::max(1.0, constraints.smallest().width());
99 client_height = std::max(1.0, constraints.smallest().height());
105 std::optional<Size>
const window_size =
108 constraints.smallest(), constraints.biggest(), window_style,
109 extended_window_style, owner_window);
111 Point window_origin = {CW_USEDEFAULT, CW_USEDEFAULT};
112 if (!sized_to_content && owner_window && window_size.has_value()) {
115 DwmGetWindowAttribute(*owner_window, DWMWA_EXTENDED_FRAME_BOUNDS, &frame,
117 window_origin = {(frame.left + frame.right - window_size->width()) * 0.5,
118 (frame.top + frame.bottom - window_size->height()) * 0.5};
121 return {window_origin,
122 window_size ? *window_size : Size{CW_USEDEFAULT, CW_USEDEFAULT}};
142 if (
auto const result =
155 void HostWindowDialog::UpdateModalState() {
167 std::optional<FlutterEngineDisplayId> display_id) {}
std::shared_ptr< WindowsProcTable > windows_proc_table()
WindowProcDelegateManager * window_proc_delegate_manager()
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
HostWindowDialog(WindowManager *window_manager, FlutterWindowsEngine *engine, const WindowSizeRequest &preferred_size, const BoxConstraints &constraints, LPCWSTR title, std::optional< HWND > const &owner_window, bool sized_to_content, bool resizable)
~HostWindowDialog() override
void InitializeFlutterView(HostWindowInitializationParams const ¶ms)
void HandleWindowActivation(HWND hwnd, WPARAM wparam)
std::unique_ptr< FlutterWindowsViewController > view_controller_
HostWindow * GetOwnerWindow() const
void UpdateModalStateLayer()
static void FocusRootViewOf(HostWindow *window)
FlutterWindowsEngine * engine_
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)
FlutterWindowsViewSizingDelegate * AsSizingDelegate()
std::optional< LRESULT > OnTopLevelWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) const
WindowArchetype archetype
double preferred_view_height
double preferred_view_width
bool has_preferred_view_size