Glfw: Обратный вызов размера кадра/окна вызывается дважды в Windows

Созданный на 13 дек. 2019  ·  4Комментарии  ·  Источник: glfw/glfw

Я заметил, что в версии GLFW3 для 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

Самый полезный комментарий

Хорошо, теперь я вижу, что X11 справляется с этим, начиная с a7ff236, а Cocoa - с 1fe319d (#1085).
Я думаю, что Windows может использовать тот же трюк.

Есть ли у вас сценарий, в котором это событие можно было бы вызвать, когда размер не изменился?

Все 4 Комментарий

Это потенциально сломает код, кто-то может полагаться на такое поведение.

Это потенциально сломает код, кто-то может полагаться на такое поведение.

Возможно, вы правы, но поскольку в структуре window есть поля ширины/высоты, и они не инициализируются при портировании Windows, я подозреваю, что это была (незначительная) оплошность.

Хорошо, теперь я вижу, что X11 справляется с этим, начиная с a7ff236, а Cocoa - с 1fe319d (#1085).
Я думаю, что Windows может использовать тот же трюк.

Есть ли у вас сценарий, в котором это событие можно было бы вызвать, когда размер не изменился?

да. На самом деле, я столкнулся с проблемой в моем проекте, где я сначала открыл скрытое окно 1x1, затем изменил его размер до правильного (расчетного) размера и, наконец, отобразил его.

При такой последовательности операций после установки размера окна обратный вызов будет вызываться дважды (первый раз после изменения размера и второй раз при его отображении).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги