Mir ist aufgefallen, dass in der Windows-Portierung von GLFW3 die _glfwInputFramebufferSize
und _glfwInputWindowSize
unabhängig von der aktuellen Fenstergröße aufgerufen werden. Außerdem wird die Fensterbreite/-höhe nicht in der Struktur win32
gespeichert. Dies kann zu wiederholten Aufrufen des Rückrufs führen.
Ich schlage vor, den Code win32_window.c
wie folgt zu ändern.
case WM_SIZE:
{
const GLFWbool iconified = wParam == SIZE_MINIMIZED;
const GLFWbool maximized = wParam == SIZE_MAXIMIZED ||
(window->win32.maximized &&
wParam != SIZE_RESTORED);
const int width = LOWORD(lParam);
const int height = HIWORD(lParam);
if (_glfw.win32.disabledCursorWindow == window)
updateClipRect(window);
if (window->win32.iconified != iconified)
_glfwInputWindowIconify(window, iconified);
if (window->win32.maximized != maximized)
_glfwInputWindowMaximize(window, maximized);
if (window->win32.width != width || window->win32.height != height) {
_glfwInputFramebufferSize(window, width, height);
_glfwInputWindowSize(window, width, height);
}
if (window->monitor && window->win32.iconified != iconified)
{
if (iconified)
releaseMonitor(window);
else
{
acquireMonitor(window);
fitToMonitor(window);
}
}
window->win32.iconified = iconified;
window->win32.maximized = maximized;
window->win32.width = width;
window->win32.height = height;
return 0;
}
Dies wird möglicherweise den Code brechen, jemand kann sich auf dieses Verhalten verlassen.
Dies wird möglicherweise den Code brechen, jemand kann sich auf dieses Verhalten verlassen.
Sie könnten Recht haben, aber da die window
-Struktur die Breiten-/Höhenfelder enthält und sie nicht in der Windows-Portierung initialisiert werden, vermute ich, dass dies nur ein (geringfügiges) Versehen war.
OK, ich sehe jetzt, dass X11 dies seit a7ff236 und Cocoa - seit 1fe319d (#1085) handhabt.
Ich denke, Windows könnte den gleichen Trick verwenden.
Haben Sie ein Szenario, in dem dieses Ereignis aufgerufen werden könnte, wenn sich die Größe nicht geändert hat?
Ja. Tatsächlich stieß ich auf das Problem in einem meiner Projekte, wo ich zunächst ein verstecktes 1x1-Fenster öffnete, es dann auf eine richtige (berechnete) Größe änderte und es schließlich anzeigte.
Bei dieser Abfolge von Operationen würde der Callback, nachdem die Größe des Fensters eingestellt wurde, zweimal aufgerufen werden (das erste Mal nach der Größenänderung und ein zweites Mal, wenn es angezeigt wird).
Hilfreichster Kommentar
OK, ich sehe jetzt, dass X11 dies seit a7ff236 und Cocoa - seit 1fe319d (#1085) handhabt.
Ich denke, Windows könnte den gleichen Trick verwenden.
Haben Sie ein Szenario, in dem dieses Ereignis aufgerufen werden könnte, wenn sich die Größe nicht geändert hat?