| @@ -70,6 +70,10 @@ int nes_cart_init_mem(nes_cart* cart, void* mem, int len) { | |||||
| } | } | ||||
| void nes_cart_done(nes_cart* cart) { | void nes_cart_done(nes_cart* cart) { | ||||
| if (NULL != cart->mapper) { | |||||
| nes_map_done(cart->mapper); | |||||
| cart->mapper = NULL; | |||||
| } | |||||
| if (NULL != cart->ines_mem) { | if (NULL != cart->ines_mem) { | ||||
| unmap_file(cart->ines_mem, cart->ines_size); | unmap_file(cart->ines_mem, cart->ines_size); | ||||
| cart->ines_mem = NULL; | cart->ines_mem = NULL; | ||||
| @@ -124,7 +124,7 @@ static int select_rom(menu_state* menu, nes_Renderer* rend, | |||||
| nes_cart new_cart = {0}; | nes_cart new_cart = {0}; | ||||
| while (0 == status && NULL == cart.file) { | while (0 == status && NULL == cart.file) { | ||||
| // Display a load failure message? | |||||
| // Display a load failure message | |||||
| if (NULL != cart.filename) { | if (NULL != cart.filename) { | ||||
| char message[1024]; | char message[1024]; | ||||
| snprintf(message, sizeof(message) - 1, | snprintf(message, sizeof(message) - 1, | ||||
| @@ -134,10 +134,11 @@ static int select_rom(menu_state* menu, nes_Renderer* rend, | |||||
| // Program closed inside modal | // Program closed inside modal | ||||
| status = input_Result_Quit; | status = input_Result_Quit; | ||||
| } | } | ||||
| free(cart.filename); | |||||
| cart.filename = NULL; | |||||
| } | } | ||||
| if (0 == status) { | if (0 == status) { | ||||
| // If we didn't launch with a file, run the loader | |||||
| cart.filename = run_main_menu(menu, rend, | cart.filename = run_main_menu(menu, rend, | ||||
| input, sys); | input, sys); | ||||
| @@ -226,9 +227,9 @@ int main(int argc, char* argv[]) { | |||||
| } | } | ||||
| } | } | ||||
| menu_state main_menu = {0}; | |||||
| // If we didn't launch with a file, run the loader | |||||
| if (0 == status && NULL == cart.file) { | if (0 == status && NULL == cart.file) { | ||||
| status = select_rom(&main_menu, rend, input, | |||||
| status = select_rom(NULL, rend, input, | |||||
| &sys, &cart); | &sys, &cart); | ||||
| } | } | ||||
| @@ -10,6 +10,17 @@ int overlay_init(Overlay* overlay) { | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| void overlay_done(Overlay* overlay) { | |||||
| overlay_message* next = NULL; | |||||
| for ( overlay_message* message = overlay->messages; | |||||
| NULL != message; | |||||
| message = next) { | |||||
| next = message->next; | |||||
| free(message->string); | |||||
| free(message); | |||||
| } | |||||
| } | |||||
| int overlay_clear(Overlay* overlay) { | int overlay_clear(Overlay* overlay) { | ||||
| int n_cleared = 0; | int n_cleared = 0; | ||||
| for ( overlay_message* message = overlay->messages; | for ( overlay_message* message = overlay->messages; | ||||
| @@ -17,6 +17,7 @@ typedef struct { | |||||
| int overlay_init(Overlay*); | int overlay_init(Overlay*); | ||||
| void overlay_done(Overlay*); | |||||
| int overlay_add_message(Overlay*, const char*, int expiry); | int overlay_add_message(Overlay*, const char*, int expiry); | ||||
| int overlay_clear_message(Overlay*, int id); | int overlay_clear_message(Overlay*, int id); | ||||
| int overlay_clear(Overlay*); | int overlay_clear(Overlay*); | ||||
| @@ -43,8 +43,9 @@ typedef struct { | |||||
| SDL_Surface* background; | SDL_Surface* background; | ||||
| SDL_Surface* foreground; | SDL_Surface* foreground; | ||||
| SDL_Surface* target; | SDL_Surface* target; | ||||
| SDL_Texture* texture; | |||||
| sdl_overlay_font font; | sdl_overlay_font font; | ||||
| SDL_Texture* texture; | |||||
| int win_w; | int win_w; | ||||
| int win_h; | int win_h; | ||||
| } sdl_render_data; | } sdl_render_data; | ||||
| @@ -95,7 +96,6 @@ static int sdl_render_init(nes_Renderer* rend) { | |||||
| } else { | } else { | ||||
| overlay_init(&rend->overlay); | overlay_init(&rend->overlay); | ||||
| // TODO: Cleanup | |||||
| sdl_overlay_font_init(data->renderer, &data->font); | sdl_overlay_font_init(data->renderer, &data->font); | ||||
| } | } | ||||
| } | } | ||||
| @@ -169,6 +169,8 @@ static int sdl_render_init(nes_Renderer* rend) { | |||||
| static void sdl_render_done(nes_Renderer* rend) { | static void sdl_render_done(nes_Renderer* rend) { | ||||
| sdl_render_data* data = (sdl_render_data*)rend->data; | sdl_render_data* data = (sdl_render_data*)rend->data; | ||||
| overlay_done(&rend->overlay); | |||||
| sdl_overlay_font_done(&data->font); | |||||
| SDL_DestroyTexture(data->texture); | SDL_DestroyTexture(data->texture); | ||||
| SDL_FreeSurface(data->foreground); | SDL_FreeSurface(data->foreground); | ||||
| SDL_FreeSurface(data->background); | SDL_FreeSurface(data->background); | ||||