Glfw: Retorno de chamada de tamanho de quadro/janela chamado duas vezes no Windows

Criado em 13 dez. 2019  ·  4Comentários  ·  Fonte: glfw/glfw

Percebi que na porta Windows do GLFW3, _glfwInputFramebufferSize e _glfwInputWindowSize são chamados independentemente do tamanho atual das janelas. Além disso, a largura/altura da janela não é armazenada na estrutura win32 . Isso pode causar chamadas repetidas para o retorno de chamada.

Sugiro alterar o código win32_window.c da seguinte forma.

        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

Comentários muito úteis

OK, vejo agora que o X11 lida com isso desde a7ff236 e Cocoa - desde 1fe319d (#1085).
Acho que o Windows poderia usar o mesmo truque.

Você tem algum cenário em que esse evento possa ser chamado quando o tamanho não for alterado?

Todos 4 comentários

Isso potencialmente quebrará o código, alguém pode confiar nesse comportamento.

Isso potencialmente quebrará o código, alguém pode confiar nesse comportamento.

Você pode estar certo, mas como a estrutura window apresenta os campos de largura/altura e eles não são inicializados na portabilidade do Windows, suspeito que isso tenha sido apenas um (pequeno) descuido.

OK, vejo agora que o X11 lida com isso desde a7ff236 e Cocoa - desde 1fe319d (#1085).
Acho que o Windows poderia usar o mesmo truque.

Você tem algum cenário em que esse evento possa ser chamado quando o tamanho não for alterado?

sim. Na verdade, eu estava encontrando o problema em um projeto meu em que inicialmente abri uma janela oculta 1x1, depois a redimensionei para um tamanho adequado (calculado) e finalmente a exibi.

Com esta seqüência de operações, após a definição do tamanho da janela, o callback seria chamado duas vezes (a primeira vez após o redimensionamento e a segunda vez ao exibi-la).

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

floooh picture floooh  ·  5Comentários

elmindreda picture elmindreda  ·  4Comentários

GraemeWilde picture GraemeWilde  ·  3Comentários

Itanq picture Itanq  ·  5Comentários

aleck099 picture aleck099  ·  3Comentários