From 1344fb27790d4d219f4e3a2c7fb7545f4b3ab9d3 Mon Sep 17 00:00:00 2001 From: Kp Date: Mon, 22 Dec 2014 04:35:47 +0000 Subject: [PATCH] Fix crash choosing jukebox directory newmenu_listbox1 returns immediately --- common/main/newmenu.h | 8 ++++++++ similar/main/menu.cpp | 6 +++--- similar/main/mission.cpp | 8 +++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/common/main/newmenu.h b/common/main/newmenu.h index 84811a195..ede96794e 100644 --- a/common/main/newmenu.h +++ b/common/main/newmenu.h @@ -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::type)listbox_callback, (void *)userdata); } +template +listbox *newmenu_listbox1(const char *title, int nitems, const char *items[], int allow_abort_flag, int default_item, typename listbox_subfunction_t::type listbox_callback, std::unique_ptr userdata) +{ + auto r = newmenu_listbox1(title, nitems, items, allow_abort_flag, default_item, (listbox_subfunction_t::type)listbox_callback, (void *)userdata.get()); + userdata.release(); + return r; +} + template listbox *newmenu_listbox(const char *title, int nitems, const char *items[], int allow_abort_flag, typename listbox_subfunction_t::type listbox_callback, T *userdata) { diff --git a/similar/main/menu.cpp b/similar/main/menu.cpp index 3957972f6..4aaa20793 100644 --- a/similar/main/menu.cpp +++ b/similar/main/menu.cpp @@ -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()(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...)" diff --git a/similar/main/mission.cpp b/similar/main/mission.cpp index cc61522fb..293aaf509 100644 --- a/similar/main/mission.cpp +++ b/similar/main/mission.cpp @@ -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()(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