Open martinsik opened 6 years ago
I suppose removing a widget inside its event callback function breaks mouse over iteration by changing its parrent children widget array. Could you test the following, to confirm: store widget in a temporary variable and call KW_DestroyWidget
in your main loop instead of calling it directly in the click callback.
I tried this and it seems to be fine. I haven't seen any crash after few tries:
// ... the rest of the code
int counter = 0;
KW_Widget *tmp_widgets[10];
for (i = 0; i < 10; i++) {
button = KW_CreateButtonAndLabel(gui, frame, "Text label", &geometry);
KW_AddWidgetMouseDownHandler(button, MouseDown);
geometry.y += geometry.h;
tmp_widgets[i] = button;
}
/* create another parent frame */
while (!SDL_QuitRequested()) {
while (SDL_PollEvent(&ev)) {
if (ev.type == SDL_WINDOWEVENT && ev.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
geometry.w = (unsigned)ev.window.data1;
geometry.h = (unsigned)ev.window.data2;
geometry.x = (unsigned)(geometry.w * 0.0625);
geometry.y = (unsigned)(geometry.h * .0625);
geometry.w *= .875f;
geometry.h *= .875;
KW_SetWidgetGeometry(frame, &geometry);
}
}
SDL_RenderClear(renderer);
if (++counter == 300) {
for (i = 0; i < 10; i++) {
KW_DestroyWidget(tmp_widgets[i], 1);
}
}
KW_ProcessEvents(gui);
KW_Paint(gui);
SDL_RenderPresent(renderer);
SDL_Delay(1);
}
// ... the rest of the code
The widgets disappear and the scrollarea is properly resized.
Great. It kind of confirms what I was thinking. Widget destruction must be postponed until event processing finishes. I'll find some time to work on this. Thanks for your report!
This is a little followup to #23. I'm wondering how can I remove a widget from its parent (completely destroy the widget). From the comments in the code I suppose I should be using the following to destroy eg. button with label:
However this sometimes throws an error ("Segmentation fault") as can be seen the following GIFs. It seems to be random, sometimes it fails, sometimes it's fine.
By clicking any of the buttons I want to remove them with
KW_DestroyWidget
.... or here
... or here
The error backtrace is always the same:
Test source code: