Skip to content

Commit 62377c7

Browse files
[API] Add callback freeing to ImGuiImplGlfw (#146)
Co-authored-by: SpaiR <[email protected]>
1 parent f4214c2 commit 62377c7

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

imgui-lwjgl3/src/main/java/imgui/glfw/ImGuiImplGlfw.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.lwjgl.glfw.GLFWScrollCallback;
3333
import org.lwjgl.glfw.GLFWVidMode;
3434
import org.lwjgl.glfw.GLFWWindowFocusCallback;
35+
import org.lwjgl.glfw.Callbacks;
3536

3637
import java.nio.ByteBuffer;
3738
import java.nio.FloatBuffer;
@@ -317,12 +318,11 @@ public void accept(final String str) {
317318
prevUserCallbackScroll = glfwSetScrollCallback(windowId, this::scrollCallback);
318319
prevUserCallbackKey = glfwSetKeyCallback(windowId, this::keyCallback);
319320
prevUserCallbackChar = glfwSetCharCallback(windowId, this::charCallback);
320-
prevUserCallbackMonitor = glfwSetMonitorCallback(this::monitorCallback);
321321
}
322-
323322
// Update monitors the first time (note: monitor callback are broken in GLFW 3.2 and earlier, see github.com/glfw/glfw/issues/784)
324323
updateMonitors();
325-
glfwSetMonitorCallback(this::monitorCallback);
324+
prevUserCallbackMonitor = glfwSetMonitorCallback(this::monitorCallback);
325+
326326

327327
// Our mouse update function expect PlatformHandle to be filled for the main viewport
328328
final ImGuiViewport mainViewport = ImGui.getMainViewport();
@@ -373,14 +373,19 @@ public void newFrame() {
373373
public void dispose() {
374374
shutdownPlatformInterface();
375375

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
384389
}
385390

386391
for (int i = 0; i < ImGuiMouseCursor.COUNT; i++) {
@@ -693,6 +698,7 @@ public void accept(final ImGuiViewport vp) {
693698
}
694699
}
695700

701+
Callbacks.glfwFreeCallbacks(data.window);
696702
glfwDestroyWindow(data.window);
697703
}
698704

0 commit comments

Comments
 (0)