Glfw: Rahmen-/Fenstergrößen-Callback, der unter Windows zweimal aufgerufen wurde

Erstellt am 13. Dez. 2019  ·  4Kommentare  ·  Quelle: glfw/glfw

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

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?

Alle 4 Kommentare

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).

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Itanq picture Itanq  ·  5Kommentare

elmindreda picture elmindreda  ·  4Kommentare

ocornut picture ocornut  ·  3Kommentare

Tbwas picture Tbwas  ·  4Kommentare

~
snbharath picture snbharath  ·  3Kommentare