Glfw: Windowsで2回呼び出されるフレーム/ウィンドウサイズのコールバック

作成日 2019年12月13日  ·  4コメント  ·  ソース: glfw/glfw

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;
        }
Windows enhancement

最も参考になるコメント

OK、X11がa7ff236以降、Cocoa(1fe319d(#1085)以降)でこれを処理していることがわかります。
Windowsでも同じトリックを使用できると思います。

サイズが変わらないときにこのイベントを呼び出すことができるシナリオはありますか?

全てのコメント4件

これによりコードが破損する可能性があり、誰かがこの動作に依存する可能性があります。

これはコードを壊す可能性があり、誰かがこの振る舞いに依存する可能性があります。

あなたは正しいかもしれませんが、 window構造は幅/高さのフィールドを備えており、Windowsの移植では初期化されないため、これは単なる(マイナーな)見落としだったと思います。

OK、X11がa7ff236以降、Cocoa(1fe319d(#1085)以降)でこれを処理していることがわかります。
Windowsでも同じトリックを使用できると思います。

サイズが変わらないときにこのイベントを呼び出すことができるシナリオはありますか?

はい。 実際、私のプロジェクトでこの問題が発生しました。最初に1x1の非表示ウィンドウを開き、次に適切な(計算された)サイズにサイズ変更して、最後に表示しました。

この一連の操作では、ウィンドウのサイズが設定された後、コールバックが2回呼び出されます(1回目はサイズ変更後、2回目は表示時)。

このページは役に立ちましたか?
0 / 5 - 0 評価