Fix crash choosing jukebox directory

newmenu_listbox1 returns immediately
This commit is contained in:
Kp 2014-12-22 04:35:47 +00:00
parent df46499f85
commit 1344fb2779
3 changed files with 14 additions and 8 deletions

View file

@ -232,6 +232,14 @@ listbox *newmenu_listbox1(const char *title, int nitems, const char *items[], in
return newmenu_listbox1(title, nitems, items, allow_abort_flag, default_item, (listbox_subfunction_t<void>::type)listbox_callback, (void *)userdata);
}
template <typename T>
listbox *newmenu_listbox1(const char *title, int nitems, const char *items[], int allow_abort_flag, int default_item, typename listbox_subfunction_t<T>::type listbox_callback, std::unique_ptr<T> userdata)
{
auto r = newmenu_listbox1(title, nitems, items, allow_abort_flag, default_item, (listbox_subfunction_t<void>::type)listbox_callback, (void *)userdata.get());
userdata.release();
return r;
}
template <typename T>
listbox *newmenu_listbox(const char *title, int nitems, const char *items[], int allow_abort_flag, typename listbox_subfunction_t<T>::type listbox_callback, T *userdata)
{

View file

@ -1469,8 +1469,7 @@ static int select_file_handler(listbox *menu,const d_event &event, browser *b)
if (b->new_path)
PHYSFS_removeFromSearchPath(b->view_path);
if (list)
d_free(list);
std::default_delete<browser>()(b);
break;
default:
@ -1563,7 +1562,8 @@ int select_file_recursive(const char *title, const char *orig_path, const file_e
return 0;
}
return newmenu_listbox1(title, b->list.ptr.size(), &b->list.ptr[0], 1, 0, select_file_handler, b.get()) != NULL;
auto pb = b.get();
return newmenu_listbox1(title, pb->list.ptr.size(), &pb->list.ptr[0], 1, 0, select_file_handler, std::move(b)) != NULL;
}
#define BROWSE_TXT " (browse...)"

View file

@ -973,11 +973,9 @@ static int mission_menu_handler(listbox *lb,const d_event &event, mission_menu *
}
}
return !(*mm->when_selected)();
break;
case EVENT_WINDOW_CLOSE:
d_free(list);
delete mm;
std::default_delete<mission_menu>()(mm);
break;
default:
@ -1021,8 +1019,8 @@ int select_mission(int anarchy_mode, const char *message, int (*when_selected)(v
}
mm->ml = move(mission_list);
mission_menu *pmm = mm.release();
newmenu_listbox1( message, pmm->ml.size(), m, 1, default_mission, mission_menu_handler, pmm);
auto pmm = mm.get();
newmenu_listbox1( message, pmm->ml.size(), m, 1, default_mission, mission_menu_handler, std::move(mm));
}
return 1; // presume success