|
@@ -1622,6 +1622,12 @@ DisplayServer::WindowID DisplayServerWindows::create_sub_window(WindowMode p_mod
|
|
|
if (p_flags & WINDOW_FLAG_RESIZE_DISABLED_BIT) {
|
|
|
wd.resizable = false;
|
|
|
}
|
|
|
+ if (p_flags & WINDOW_FLAG_MINIMIZE_DISABLED_BIT) {
|
|
|
+ wd.no_min_btn = true;
|
|
|
+ }
|
|
|
+ if (p_flags & WINDOW_FLAG_MAXIMIZE_DISABLED_BIT) {
|
|
|
+ wd.no_max_btn = true;
|
|
|
+ }
|
|
|
if (p_flags & WINDOW_FLAG_BORDERLESS_BIT) {
|
|
|
wd.borderless = true;
|
|
|
}
|
|
@@ -2303,7 +2309,7 @@ Size2i DisplayServerWindows::window_get_size_with_decorations(WindowID p_window)
|
|
|
return Size2();
|
|
|
}
|
|
|
|
|
|
-void DisplayServerWindows::_get_window_style(bool p_main_window, bool p_initialized, bool p_fullscreen, bool p_multiwindow_fs, bool p_borderless, bool p_resizable, bool p_minimized, bool p_maximized, bool p_maximized_fs, bool p_no_activate_focus, bool p_embed_child, DWORD &r_style, DWORD &r_style_ex) {
|
|
|
+void DisplayServerWindows::_get_window_style(bool p_main_window, bool p_initialized, bool p_fullscreen, bool p_multiwindow_fs, bool p_borderless, bool p_resizable, bool p_no_min_btn, bool p_no_max_btn, bool p_minimized, bool p_maximized, bool p_maximized_fs, bool p_no_activate_focus, bool p_embed_child, DWORD &r_style, DWORD &r_style_ex) {
|
|
|
// Windows docs for window styles:
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles
|
|
@@ -2331,9 +2337,11 @@ void DisplayServerWindows::_get_window_style(bool p_main_window, bool p_initiali
|
|
|
r_style |= WS_MAXIMIZE;
|
|
|
}
|
|
|
if (!p_fullscreen) {
|
|
|
- r_style |= WS_SYSMENU | WS_MINIMIZEBOX;
|
|
|
-
|
|
|
- if (p_resizable) {
|
|
|
+ r_style |= WS_SYSMENU;
|
|
|
+ if (!p_no_min_btn) {
|
|
|
+ r_style |= WS_MINIMIZEBOX;
|
|
|
+ }
|
|
|
+ if (!p_no_max_btn) {
|
|
|
r_style |= WS_MAXIMIZEBOX;
|
|
|
}
|
|
|
}
|
|
@@ -2346,11 +2354,23 @@ void DisplayServerWindows::_get_window_style(bool p_main_window, bool p_initiali
|
|
|
} else {
|
|
|
r_style = WS_OVERLAPPEDWINDOW;
|
|
|
}
|
|
|
+ if (p_no_min_btn) {
|
|
|
+ r_style &= ~WS_MINIMIZEBOX;
|
|
|
+ }
|
|
|
+ if (p_no_max_btn) {
|
|
|
+ r_style &= ~WS_MAXIMIZEBOX;
|
|
|
+ }
|
|
|
} else {
|
|
|
if (p_minimized) {
|
|
|
- r_style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MINIMIZE;
|
|
|
+ r_style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZE;
|
|
|
} else {
|
|
|
- r_style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
|
|
|
+ r_style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU;
|
|
|
+ }
|
|
|
+ if (!p_no_min_btn) {
|
|
|
+ r_style |= WS_MINIMIZEBOX;
|
|
|
+ }
|
|
|
+ if (!p_no_max_btn) {
|
|
|
+ r_style |= WS_MAXIMIZEBOX;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -2380,7 +2400,7 @@ void DisplayServerWindows::_update_window_style(WindowID p_window, bool p_repain
|
|
|
DWORD style = 0;
|
|
|
DWORD style_ex = 0;
|
|
|
|
|
|
- _get_window_style(p_window == MAIN_WINDOW_ID, wd.initialized, wd.fullscreen, wd.multiwindow_fs, wd.borderless, wd.resizable, wd.minimized, wd.maximized, wd.maximized_fs, wd.no_focus || wd.is_popup, wd.parent_hwnd, style, style_ex);
|
|
|
+ _get_window_style(p_window == MAIN_WINDOW_ID, wd.initialized, wd.fullscreen, wd.multiwindow_fs, wd.borderless, wd.resizable, wd.no_min_btn, wd.no_max_btn, wd.minimized, wd.maximized, wd.maximized_fs, wd.no_focus || wd.is_popup, wd.parent_hwnd, style, style_ex);
|
|
|
|
|
|
SetWindowLongPtr(wd.hWnd, GWL_STYLE, style);
|
|
|
SetWindowLongPtr(wd.hWnd, GWL_EXSTYLE, style_ex);
|
|
@@ -2535,10 +2555,10 @@ bool DisplayServerWindows::window_is_maximize_allowed(WindowID p_window) const {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
ERR_FAIL_COND_V(!windows.has(p_window), false);
|
|
|
+ const WindowData &wd = windows[p_window];
|
|
|
|
|
|
- // FIXME: Implement this, or confirm that it should always be true.
|
|
|
-
|
|
|
- return true;
|
|
|
+ const DWORD style = GetWindowLongPtr(wd.hWnd, GWL_STYLE);
|
|
|
+ return (style & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX;
|
|
|
}
|
|
|
|
|
|
void DisplayServerWindows::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) {
|
|
@@ -2547,6 +2567,14 @@ void DisplayServerWindows::window_set_flag(WindowFlags p_flag, bool p_enabled, W
|
|
|
ERR_FAIL_COND(!windows.has(p_window));
|
|
|
WindowData &wd = windows[p_window];
|
|
|
switch (p_flag) {
|
|
|
+ case WINDOW_FLAG_MINIMIZE_DISABLED: {
|
|
|
+ wd.no_min_btn = p_enabled;
|
|
|
+ _update_window_style(p_window);
|
|
|
+ } break;
|
|
|
+ case WINDOW_FLAG_MAXIMIZE_DISABLED: {
|
|
|
+ wd.no_max_btn = p_enabled;
|
|
|
+ _update_window_style(p_window);
|
|
|
+ } break;
|
|
|
case WINDOW_FLAG_RESIZE_DISABLED: {
|
|
|
if (p_enabled && wd.parent_hwnd) {
|
|
|
print_line("Embedded window resize can't be disabled.");
|
|
@@ -2642,6 +2670,12 @@ bool DisplayServerWindows::window_get_flag(WindowFlags p_flag, WindowID p_window
|
|
|
ERR_FAIL_COND_V(!windows.has(p_window), false);
|
|
|
const WindowData &wd = windows[p_window];
|
|
|
switch (p_flag) {
|
|
|
+ case WINDOW_FLAG_MAXIMIZE_DISABLED: {
|
|
|
+ return wd.no_max_btn;
|
|
|
+ } break;
|
|
|
+ case WINDOW_FLAG_MINIMIZE_DISABLED: {
|
|
|
+ return wd.no_min_btn;
|
|
|
+ } break;
|
|
|
case WINDOW_FLAG_RESIZE_DISABLED: {
|
|
|
return !wd.resizable;
|
|
|
} break;
|
|
@@ -6153,7 +6187,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
|
|
DWORD dwExStyle;
|
|
|
DWORD dwStyle;
|
|
|
|
|
|
- _get_window_style(window_id_counter == MAIN_WINDOW_ID, false, (p_mode == WINDOW_MODE_FULLSCREEN || p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN), p_mode != WINDOW_MODE_EXCLUSIVE_FULLSCREEN, p_flags & WINDOW_FLAG_BORDERLESS_BIT, !(p_flags & WINDOW_FLAG_RESIZE_DISABLED_BIT), p_mode == WINDOW_MODE_MINIMIZED, p_mode == WINDOW_MODE_MAXIMIZED, false, (p_flags & WINDOW_FLAG_NO_FOCUS_BIT) | (p_flags & WINDOW_FLAG_POPUP_BIT), p_parent_hwnd, dwStyle, dwExStyle);
|
|
|
+ _get_window_style(window_id_counter == MAIN_WINDOW_ID, false, (p_mode == WINDOW_MODE_FULLSCREEN || p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN), p_mode != WINDOW_MODE_EXCLUSIVE_FULLSCREEN, p_flags & WINDOW_FLAG_BORDERLESS_BIT, !(p_flags & WINDOW_FLAG_RESIZE_DISABLED_BIT), p_flags & WINDOW_FLAG_MINIMIZE_DISABLED_BIT, p_flags & WINDOW_FLAG_MAXIMIZE_DISABLED_BIT, p_mode == WINDOW_MODE_MINIMIZED, p_mode == WINDOW_MODE_MAXIMIZED, false, (p_flags & WINDOW_FLAG_NO_FOCUS_BIT) | (p_flags & WINDOW_FLAG_POPUP_BIT), p_parent_hwnd, dwStyle, dwExStyle);
|
|
|
|
|
|
int rq_screen = get_screen_from_rect(p_rect);
|
|
|
if (rq_screen < 0) {
|