|
32 | 32 | import org.lwjgl.glfw.GLFWScrollCallback;
|
33 | 33 | import org.lwjgl.glfw.GLFWVidMode;
|
34 | 34 | import org.lwjgl.glfw.GLFWWindowFocusCallback;
|
| 35 | +import org.lwjgl.glfw.Callbacks; |
35 | 36 |
|
36 | 37 | import java.nio.ByteBuffer;
|
37 | 38 | import java.nio.FloatBuffer;
|
@@ -317,12 +318,11 @@ public void accept(final String str) {
|
317 | 318 | prevUserCallbackScroll = glfwSetScrollCallback(windowId, this::scrollCallback);
|
318 | 319 | prevUserCallbackKey = glfwSetKeyCallback(windowId, this::keyCallback);
|
319 | 320 | prevUserCallbackChar = glfwSetCharCallback(windowId, this::charCallback);
|
320 |
| - prevUserCallbackMonitor = glfwSetMonitorCallback(this::monitorCallback); |
321 | 321 | }
|
322 |
| - |
323 | 322 | // Update monitors the first time (note: monitor callback are broken in GLFW 3.2 and earlier, see github.com/glfw/glfw/issues/784)
|
324 | 323 | updateMonitors();
|
325 |
| - glfwSetMonitorCallback(this::monitorCallback); |
| 324 | + prevUserCallbackMonitor = glfwSetMonitorCallback(this::monitorCallback); |
| 325 | + |
326 | 326 |
|
327 | 327 | // Our mouse update function expect PlatformHandle to be filled for the main viewport
|
328 | 328 | final ImGuiViewport mainViewport = ImGui.getMainViewport();
|
@@ -373,14 +373,19 @@ public void newFrame() {
|
373 | 373 | public void dispose() {
|
374 | 374 | shutdownPlatformInterface();
|
375 | 375 |
|
376 |
| - if (callbacksInstalled) { |
377 |
| - glfwSetWindowFocusCallback(windowPtr, prevUserCallbackWindowFocus); |
378 |
| - glfwSetCursorEnterCallback(windowPtr, prevUserCallbackCursorEnter); |
379 |
| - glfwSetMouseButtonCallback(windowPtr, prevUserCallbackMouseButton); |
380 |
| - glfwSetScrollCallback(windowPtr, prevUserCallbackScroll); |
381 |
| - glfwSetKeyCallback(windowPtr, prevUserCallbackKey); |
382 |
| - glfwSetCharCallback(windowPtr, prevUserCallbackChar); |
383 |
| - callbacksInstalled = false; |
| 376 | + try { |
| 377 | + if (callbacksInstalled) { |
| 378 | + glfwSetWindowFocusCallback(windowPtr, prevUserCallbackWindowFocus).free(); |
| 379 | + glfwSetCursorEnterCallback(windowPtr, prevUserCallbackCursorEnter).free(); |
| 380 | + glfwSetMouseButtonCallback(windowPtr, prevUserCallbackMouseButton).free(); |
| 381 | + glfwSetScrollCallback(windowPtr, prevUserCallbackScroll).free(); |
| 382 | + glfwSetKeyCallback(windowPtr, prevUserCallbackKey).free(); |
| 383 | + glfwSetCharCallback(windowPtr, prevUserCallbackChar).free(); |
| 384 | + callbacksInstalled = false; |
| 385 | + } |
| 386 | + glfwSetMonitorCallback(prevUserCallbackMonitor).free(); |
| 387 | + } catch (NullPointerException ignored) { |
| 388 | + // ignored |
384 | 389 | }
|
385 | 390 |
|
386 | 391 | for (int i = 0; i < ImGuiMouseCursor.COUNT; i++) {
|
@@ -693,6 +698,7 @@ public void accept(final ImGuiViewport vp) {
|
693 | 698 | }
|
694 | 699 | }
|
695 | 700 |
|
| 701 | + Callbacks.glfwFreeCallbacks(data.window); |
696 | 702 | glfwDestroyWindow(data.window);
|
697 | 703 | }
|
698 | 704 |
|
|
0 commit comments