mirror of
https://github.com/godotengine/godot.git
synced 2024-11-22 20:23:53 +00:00
Fix errors when creating windows on Windows
Detecting the case where WM_SIZE is received during the window creation. There's no need to call window_resize on the Vulkan context. Also creating a WindowData entry early enough to avoid storing a separate WindowData wrongly associated to INVALID_WINDOW_ID. Fixes #39199
This commit is contained in:
parent
ff0583770a
commit
1043576ff3
@ -476,6 +476,7 @@ DisplayServer::WindowID DisplayServerWindows::create_sub_window(WindowMode p_mod
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
||||
WindowID window_id = _create_window(p_mode, p_flags, p_rect);
|
||||
ERR_FAIL_COND_V_MSG(window_id == INVALID_WINDOW_ID, INVALID_WINDOW_ID, "Failed to create sub window.");
|
||||
|
||||
WindowData &wd = windows[window_id];
|
||||
|
||||
@ -1773,14 +1774,22 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||
};
|
||||
|
||||
WindowID window_id = INVALID_WINDOW_ID;
|
||||
bool window_created = false;
|
||||
|
||||
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
|
||||
if (E->get().hWnd == hWnd) {
|
||||
window_id = E->key();
|
||||
window_created = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!window_created) {
|
||||
// Window creation in progress.
|
||||
window_id = window_id_counter;
|
||||
ERR_FAIL_COND_V(!windows.has(window_id), 0);
|
||||
}
|
||||
|
||||
switch (uMsg) // Check For Windows Messages
|
||||
{
|
||||
case WM_SETFOCUS: {
|
||||
@ -2493,7 +2502,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||
windows[window_id].height = window_h;
|
||||
|
||||
#if defined(VULKAN_ENABLED)
|
||||
if (rendering_driver == "vulkan") {
|
||||
if ((rendering_driver == "vulkan") && window_created) {
|
||||
context_vulkan->window_resize(window_id, windows[window_id].width, windows[window_id].height);
|
||||
}
|
||||
#endif
|
||||
@ -2849,7 +2858,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
||||
|
||||
WindowID id = window_id_counter;
|
||||
{
|
||||
WindowData wd;
|
||||
WindowData &wd = windows[id];
|
||||
|
||||
wd.hWnd = CreateWindowExW(
|
||||
dwExStyle,
|
||||
@ -2864,6 +2873,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
||||
nullptr, nullptr, hInstance, nullptr);
|
||||
if (!wd.hWnd) {
|
||||
MessageBoxW(nullptr, L"Window Creation Error.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
|
||||
windows.erase(id);
|
||||
return INVALID_WINDOW_ID;
|
||||
}
|
||||
#ifdef VULKAN_ENABLED
|
||||
@ -2872,7 +2882,8 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
||||
if (context_vulkan->window_create(id, wd.hWnd, hInstance, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top) == -1) {
|
||||
memdelete(context_vulkan);
|
||||
context_vulkan = nullptr;
|
||||
ERR_FAIL_V(INVALID_WINDOW_ID);
|
||||
windows.erase(id);
|
||||
ERR_FAIL_V_MSG(INVALID_WINDOW_ID, "Failed to create Vulkan Window.");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -2930,8 +2941,6 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
||||
wd.width = p_rect.size.width;
|
||||
wd.height = p_rect.size.height;
|
||||
|
||||
windows[id] = wd;
|
||||
|
||||
window_id_counter++;
|
||||
}
|
||||
|
||||
@ -3062,7 +3071,10 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||
Point2i window_position(
|
||||
(screen_get_size(0).width - p_resolution.width) / 2,
|
||||
(screen_get_size(0).height - p_resolution.height) / 2);
|
||||
|
||||
WindowID main_window = _create_window(p_mode, 0, Rect2i(window_position, p_resolution));
|
||||
ERR_FAIL_COND_MSG(main_window == INVALID_WINDOW_ID, "Failed to create main window.");
|
||||
|
||||
for (int i = 0; i < WINDOW_FLAG_MAX; i++) {
|
||||
if (p_flags & (1 << i)) {
|
||||
window_set_flag(WindowFlags(i), true, main_window);
|
||||
|
Loading…
Reference in New Issue
Block a user