From 89903b7047173f3bb84bdc9937660f73f5b168e9 Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Mon, 19 Mar 2018 09:22:18 -0400 Subject: [PATCH] Possible fix for crash when deleting Widgets during events --- include/widgets.hpp | 1 + src/widgets/Widget.cpp | 1 + src/widgets/widgets.cpp | 1 + src/window.cpp | 44 ++++++++++++++++++++--------------------- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/include/widgets.hpp b/include/widgets.hpp index 0cc73451..2e021a8e 100644 --- a/include/widgets.hpp +++ b/include/widgets.hpp @@ -294,6 +294,7 @@ extern Widget *gHoveredWidget; extern Widget *gDraggedWidget; extern Widget *gDragHoveredWidget; extern Widget *gFocusedWidget; +extern Widget *gTempWidget; } // namespace rack diff --git a/src/widgets/Widget.cpp b/src/widgets/Widget.cpp index d6c6c0fc..935d44d5 100644 --- a/src/widgets/Widget.cpp +++ b/src/widgets/Widget.cpp @@ -13,6 +13,7 @@ Widget::~Widget() { if (gDraggedWidget == this) gDraggedWidget = NULL; if (gDragHoveredWidget == this) gDragHoveredWidget = NULL; if (gFocusedWidget == this) gFocusedWidget = NULL; + if (gTempWidget == this) gTempWidget = NULL; clearChildren(); } diff --git a/src/widgets/widgets.cpp b/src/widgets/widgets.cpp index 689ecd29..4c32fb7e 100644 --- a/src/widgets/widgets.cpp +++ b/src/widgets/widgets.cpp @@ -7,6 +7,7 @@ Widget *gHoveredWidget = NULL; Widget *gDraggedWidget = NULL; Widget *gDragHoveredWidget = NULL; Widget *gFocusedWidget = NULL; +Widget *gTempWidget = NULL; } // namespace rack diff --git a/src/window.cpp b/src/window.cpp index d7b24119..4fa28440 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -59,37 +59,37 @@ void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) { #endif if (action == GLFW_PRESS) { - Widget *w = NULL; + gTempWidget = NULL; // onMouseDown { EventMouseDown e; e.pos = gMousePos; e.button = button; gScene->onMouseDown(e); - w = e.target; + gTempWidget = e.target; } if (button == GLFW_MOUSE_BUTTON_LEFT) { - if (w) { + if (gTempWidget) { // onDragStart EventDragStart e; - w->onDragStart(e); + gTempWidget->onDragStart(e); } - gDraggedWidget = w; + gDraggedWidget = gTempWidget; - if (w != gFocusedWidget) { + if (gTempWidget != gFocusedWidget) { if (gFocusedWidget) { // onDefocus EventDefocus e; gFocusedWidget->onDefocus(e); } gFocusedWidget = NULL; - if (w) { + if (gTempWidget) { // onFocus EventFocus e; - w->onFocus(e); + gTempWidget->onFocus(e); if (e.consumed) { - gFocusedWidget = w; + gFocusedWidget = gTempWidget; } } } @@ -97,13 +97,13 @@ void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) { } else if (action == GLFW_RELEASE) { // onMouseUp - Widget *w = NULL; + gTempWidget = NULL; { EventMouseUp e; e.pos = gMousePos; e.button = button; gScene->onMouseUp(e); - w = e.target; + gTempWidget = e.target; } if (button == GLFW_MOUSE_BUTTON_LEFT) { @@ -111,7 +111,7 @@ void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) { // onDragDrop EventDragDrop e; e.origin = gDraggedWidget; - w->onDragDrop(e); + gTempWidget->onDragDrop(e); } // gDraggedWidget might have been set to null in the last event, recheck here if (gDraggedWidget) { @@ -169,14 +169,14 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { gMousePos = mousePos; - Widget *hovered = NULL; + gTempWidget = NULL; // onMouseMove { EventMouseMove e; e.pos = mousePos; e.mouseRel = mouseRel; gScene->onMouseMove(e); - hovered = e.target; + gTempWidget = e.target; } if (gDraggedWidget) { @@ -185,33 +185,33 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { e.mouseRel = mouseRel; gDraggedWidget->onDragMove(e); - if (hovered != gDragHoveredWidget) { + if (gTempWidget != gDragHoveredWidget) { if (gDragHoveredWidget) { EventDragEnter e; e.origin = gDraggedWidget; gDragHoveredWidget->onDragLeave(e); } - if (hovered) { + gDragHoveredWidget = gTempWidget; + if (gDragHoveredWidget) { EventDragEnter e; e.origin = gDraggedWidget; - hovered->onDragEnter(e); + gDragHoveredWidget->onDragEnter(e); } - gDragHoveredWidget = hovered; } } else { - if (hovered != gHoveredWidget) { + if (gTempWidget != gHoveredWidget) { if (gHoveredWidget) { // onMouseLeave EventMouseLeave e; gHoveredWidget->onMouseLeave(e); } - if (hovered) { + gHoveredWidget = gTempWidget; + if (gHoveredWidget) { // onMouseEnter EventMouseEnter e; - hovered->onMouseEnter(e); + gHoveredWidget->onMouseEnter(e); } - gHoveredWidget = hovered; } } if (glfwGetMouseButton(gWindow, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS) {