Browse Source

Possible fix for crash when deleting Widgets during events

tags/v0.6.0
Andrew Belt 7 years ago
parent
commit
6455c1f034
4 changed files with 25 additions and 22 deletions
  1. +1
    -0
      include/widgets.hpp
  2. +1
    -0
      src/widgets/Widget.cpp
  3. +1
    -0
      src/widgets/widgets.cpp
  4. +22
    -22
      src/window.cpp

+ 1
- 0
include/widgets.hpp View File

@@ -294,6 +294,7 @@ extern Widget *gHoveredWidget;
extern Widget *gDraggedWidget; extern Widget *gDraggedWidget;
extern Widget *gDragHoveredWidget; extern Widget *gDragHoveredWidget;
extern Widget *gFocusedWidget; extern Widget *gFocusedWidget;
extern Widget *gTempWidget;




} // namespace rack } // namespace rack

+ 1
- 0
src/widgets/Widget.cpp View File

@@ -13,6 +13,7 @@ Widget::~Widget() {
if (gDraggedWidget == this) gDraggedWidget = NULL; if (gDraggedWidget == this) gDraggedWidget = NULL;
if (gDragHoveredWidget == this) gDragHoveredWidget = NULL; if (gDragHoveredWidget == this) gDragHoveredWidget = NULL;
if (gFocusedWidget == this) gFocusedWidget = NULL; if (gFocusedWidget == this) gFocusedWidget = NULL;
if (gTempWidget == this) gTempWidget = NULL;
clearChildren(); clearChildren();
} }




+ 1
- 0
src/widgets/widgets.cpp View File

@@ -7,6 +7,7 @@ Widget *gHoveredWidget = NULL;
Widget *gDraggedWidget = NULL; Widget *gDraggedWidget = NULL;
Widget *gDragHoveredWidget = NULL; Widget *gDragHoveredWidget = NULL;
Widget *gFocusedWidget = NULL; Widget *gFocusedWidget = NULL;
Widget *gTempWidget = NULL;




} // namespace rack } // namespace rack

+ 22
- 22
src/window.cpp View File

@@ -59,37 +59,37 @@ void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) {
#endif #endif


if (action == GLFW_PRESS) { if (action == GLFW_PRESS) {
Widget *w = NULL;
gTempWidget = NULL;
// onMouseDown // onMouseDown
{ {
EventMouseDown e; EventMouseDown e;
e.pos = gMousePos; e.pos = gMousePos;
e.button = button; e.button = button;
gScene->onMouseDown(e); gScene->onMouseDown(e);
w = e.target;
gTempWidget = e.target;
} }


if (button == GLFW_MOUSE_BUTTON_LEFT) { if (button == GLFW_MOUSE_BUTTON_LEFT) {
if (w) {
if (gTempWidget) {
// onDragStart // onDragStart
EventDragStart e; EventDragStart e;
w->onDragStart(e);
gTempWidget->onDragStart(e);
} }
gDraggedWidget = w;
gDraggedWidget = gTempWidget;


if (w != gFocusedWidget) {
if (gTempWidget != gFocusedWidget) {
if (gFocusedWidget) { if (gFocusedWidget) {
// onDefocus // onDefocus
EventDefocus e; EventDefocus e;
gFocusedWidget->onDefocus(e); gFocusedWidget->onDefocus(e);
} }
gFocusedWidget = NULL; gFocusedWidget = NULL;
if (w) {
if (gTempWidget) {
// onFocus // onFocus
EventFocus e; EventFocus e;
w->onFocus(e);
gTempWidget->onFocus(e);
if (e.consumed) { 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) { else if (action == GLFW_RELEASE) {
// onMouseUp // onMouseUp
Widget *w = NULL;
gTempWidget = NULL;
{ {
EventMouseUp e; EventMouseUp e;
e.pos = gMousePos; e.pos = gMousePos;
e.button = button; e.button = button;
gScene->onMouseUp(e); gScene->onMouseUp(e);
w = e.target;
gTempWidget = e.target;
} }


if (button == GLFW_MOUSE_BUTTON_LEFT) { if (button == GLFW_MOUSE_BUTTON_LEFT) {
@@ -111,7 +111,7 @@ void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) {
// onDragDrop // onDragDrop
EventDragDrop e; EventDragDrop e;
e.origin = gDraggedWidget; e.origin = gDraggedWidget;
w->onDragDrop(e);
gTempWidget->onDragDrop(e);
} }
// gDraggedWidget might have been set to null in the last event, recheck here // gDraggedWidget might have been set to null in the last event, recheck here
if (gDraggedWidget) { if (gDraggedWidget) {
@@ -169,14 +169,14 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) {


gMousePos = mousePos; gMousePos = mousePos;


Widget *hovered = NULL;
gTempWidget = NULL;
// onMouseMove // onMouseMove
{ {
EventMouseMove e; EventMouseMove e;
e.pos = mousePos; e.pos = mousePos;
e.mouseRel = mouseRel; e.mouseRel = mouseRel;
gScene->onMouseMove(e); gScene->onMouseMove(e);
hovered = e.target;
gTempWidget = e.target;
} }


if (gDraggedWidget) { if (gDraggedWidget) {
@@ -185,33 +185,33 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) {
e.mouseRel = mouseRel; e.mouseRel = mouseRel;
gDraggedWidget->onDragMove(e); gDraggedWidget->onDragMove(e);


if (hovered != gDragHoveredWidget) {
if (gTempWidget != gDragHoveredWidget) {
if (gDragHoveredWidget) { if (gDragHoveredWidget) {
EventDragEnter e; EventDragEnter e;
e.origin = gDraggedWidget; e.origin = gDraggedWidget;
gDragHoveredWidget->onDragLeave(e); gDragHoveredWidget->onDragLeave(e);
} }
if (hovered) {
gDragHoveredWidget = gTempWidget;
if (gDragHoveredWidget) {
EventDragEnter e; EventDragEnter e;
e.origin = gDraggedWidget; e.origin = gDraggedWidget;
hovered->onDragEnter(e);
gDragHoveredWidget->onDragEnter(e);
} }
gDragHoveredWidget = hovered;
} }
} }
else { else {
if (hovered != gHoveredWidget) {
if (gTempWidget != gHoveredWidget) {
if (gHoveredWidget) { if (gHoveredWidget) {
// onMouseLeave // onMouseLeave
EventMouseLeave e; EventMouseLeave e;
gHoveredWidget->onMouseLeave(e); gHoveredWidget->onMouseLeave(e);
} }
if (hovered) {
gHoveredWidget = gTempWidget;
if (gHoveredWidget) {
// onMouseEnter // onMouseEnter
EventMouseEnter e; EventMouseEnter e;
hovered->onMouseEnter(e);
gHoveredWidget->onMouseEnter(e);
} }
gHoveredWidget = hovered;
} }
} }
if (glfwGetMouseButton(gWindow, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS) { if (glfwGetMouseButton(gWindow, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS) {


Loading…
Cancel
Save