Browse Source

Fixes GLFW failing when SetPropW fails silently

pull/5069/head
Peru S 2 months ago
parent
commit
b70a3b8c6a
2 changed files with 25 additions and 3 deletions
  1. +3
    -2
      src/external/glfw/src/win32_init.c
  2. +22
    -1
      src/external/glfw/src/win32_window.c

+ 3
- 2
src/external/glfw/src/win32_init.c View File

@ -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

+ 22
- 1
src/external/glfw/src/win32_window.c View File

@ -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())
{

Loading…
Cancel
Save