diff --git a/src/external/glfw/src/win32_init.c b/src/external/glfw/src/win32_init.c index d86e35e32..b86d9b5df 100644 --- a/src/external/glfw/src/win32_init.c +++ b/src/external/glfw/src/win32_init.c @@ -498,18 +498,19 @@ void _glfwInputErrorWin32(int error, const char* description) WCHAR buffer[_GLFW_MESSAGE_SIZE] = L""; char message[_GLFW_MESSAGE_SIZE] = ""; + DWORD lastError = GetLastError(); FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, - GetLastError() & 0xffff, + lastError & 0xffff, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer) / sizeof(WCHAR), NULL); WideCharToMultiByte(CP_UTF8, 0, buffer, -1, message, sizeof(message), NULL, NULL); - _glfwInputError(error, "%s: %s", description, message); + _glfwInputError(error, "%s (0x%lx / %lu): %s", description, lastError, lastError, message); } // Updates key names according to the current keyboard layout diff --git a/src/external/glfw/src/win32_window.c b/src/external/glfw/src/win32_window.c index 3762b7699..81736659e 100644 --- a/src/external/glfw/src/win32_window.c +++ b/src/external/glfw/src/win32_window.c @@ -551,9 +551,24 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l EnableNonClientDpiScaling(hWnd); } } + else + { + // HACK: SetPropW returns FALSE in some instances (GetLastError() = 0x8 Insufficient resources). + // We already have the global list of windows, check against it. It's not many, and we are already + // doing this in the (one of the callers) PollEvents below. + window = _glfw.windowListHead; + while (window) + { + if (window->win32.handle == hWnd) { break; } + window = window->next; + } + } + if (!window) + { return DefWindowProcW(hWnd, uMsg, wParam, lParam); } + } switch (uMsg) { @@ -1405,7 +1420,13 @@ static int createNativeWindow(_GLFWwindow* window, return GLFW_FALSE; } - SetPropW(window->win32.handle, L"GLFW", window); + if (!SetPropW(window->win32.handle, L"GLFW", window)) + { + // In some cases, SetPropW returns FALSE: GetLastError() returns 0x8 (Insufficient resources). + // The message pump fails to work because windowProc cannot look up the GLFW property. + // Instead of failing the program completely by raising an error instead, windowProc looks up + // the global window list to find the hWnd under consideration. + } if (IsWindows7OrGreater()) {