GLFW3のWindowsポートでは、現在のWindowsサイズに関係なく、 _glfwInputFramebufferSize
と_glfwInputWindowSize
が呼び出されることに気付きました。 また、ウィンドウの幅/高さはwin32
構造に格納されません。 これにより、コールバックが繰り返し呼び出される可能性があります。
win32_window.c
コードを次のように変更することをお勧めします。
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;
}
これによりコードが破損する可能性があり、誰かがこの動作に依存する可能性があります。
これはコードを壊す可能性があり、誰かがこの振る舞いに依存する可能性があります。
あなたは正しいかもしれませんが、 window
構造は幅/高さのフィールドを備えており、Windowsの移植では初期化されないため、これは単なる(マイナーな)見落としだったと思います。
OK、X11がa7ff236以降、Cocoa(1fe319d(#1085)以降)でこれを処理していることがわかります。
Windowsでも同じトリックを使用できると思います。
サイズが変わらないときにこのイベントを呼び出すことができるシナリオはありますか?
はい。 実際、私のプロジェクトでこの問題が発生しました。最初に1x1の非表示ウィンドウを開き、次に適切な(計算された)サイズにサイズ変更して、最後に表示しました。
この一連の操作では、ウィンドウのサイズが設定された後、コールバックが2回呼び出されます(1回目はサイズ変更後、2回目は表示時)。
最も参考になるコメント
OK、X11がa7ff236以降、Cocoa(1fe319d(#1085)以降)でこれを処理していることがわかります。
Windowsでも同じトリックを使用できると思います。
サイズが変わらないときにこのイベントを呼び出すことができるシナリオはありますか?