From f088896a74199f7f459f0ae47b9648dca4916246 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 21 Oct 2018 22:09:18 +0200 Subject: [PATCH] A few fixes, CD-ROM ejecting/reloading should no longer cause heap problems because they now allocate prev_image_path with the correct length, and the status bar should now work after a hard reset with no config change. --- src/cdrom/cdrom.c | 4 ++-- src/cdrom/cdrom_image.cc | 3 ++- src/pc.c | 5 +++-- src/ui.h | 2 +- src/win/win_cdrom.c | 4 +--- src/win/win_stbar.c | 28 ++++++++++++++++++++-------- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 0a6268013..1895f0b39 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -8,7 +8,7 @@ * * Generic CD-ROM drive core. * - * Version: @(#)cdrom.c 1.0.2 2018/10/17 + * Version: @(#)cdrom.c 1.0.3 2018/10/21 * * Author: Miran Grca, * @@ -300,7 +300,7 @@ cdrom_eject(uint8_t id) } if (dev->host_drive == 200) { - dev->prev_image_path = (wchar_t *) malloc(1024); + dev->prev_image_path = (wchar_t *) malloc(1024 * sizeof(wchar_t)); wcscpy(dev->prev_image_path, dev->image_path); } diff --git a/src/cdrom/cdrom_image.cc b/src/cdrom/cdrom_image.cc index de136dcdd..f7ac18742 100644 --- a/src/cdrom/cdrom_image.cc +++ b/src/cdrom/cdrom_image.cc @@ -8,7 +8,7 @@ * * CD-ROM image support. * - * Version: @(#)cdrom_image.cc 1.0.5 2018/10/21 + * Version: @(#)cdrom_image.cc 1.0.6 2018/10/21 * * Author: RichardG867, * Miran Grca, @@ -1084,6 +1084,7 @@ cdrom_image_open(cdrom_t *dev, const wchar_t *fn) if (!img->SetDevice(temp, false)) { cdrom_image_close(dev); cdrom->ops = NULL; + cdrom->host_drive = 0; cdrom_image_log("[f] image_open(): cdrom[%i]->ops = %08X\n", dev->id, dev->ops); return 1; } diff --git a/src/pc.c b/src/pc.c index 4145fb389..cb372f715 100644 --- a/src/pc.c +++ b/src/pc.c @@ -712,7 +712,7 @@ pc_send_cae(void) void pc_reset_hard_close(void) { - ui_sb_set_not_ready(); + ui_sb_set_ready(0); suppress_overscan = 0; @@ -822,7 +822,8 @@ pc_reset_hard_init(void) config_save(); config_changed = 0; - } + } else + ui_sb_set_ready(1); /* Needs the status bar... */ if (bugger_enabled) diff --git a/src/ui.h b/src/ui.h index e7a18fea7..19ae2ca3d 100644 --- a/src/ui.h +++ b/src/ui.h @@ -53,7 +53,7 @@ extern void ui_check_menu_item(int id, int checked); extern wchar_t *ui_window_title(wchar_t *s); extern void ui_status_update(void); extern int ui_sb_find_part(int tag); -extern void ui_sb_set_not_ready(void); +extern void ui_sb_set_ready(int ready); extern void ui_sb_update_panes(void); extern void ui_sb_update_tip(int meaning); extern void ui_sb_check_menu_item(int tag, int id, int chk); diff --git a/src/win/win_cdrom.c b/src/win/win_cdrom.c index b349cd8d6..cf801c309 100644 --- a/src/win/win_cdrom.c +++ b/src/win/win_cdrom.c @@ -8,7 +8,7 @@ * * Handle the platform-side of CDROM drives. * - * Version: @(#)win_cdrom.c 1.0.10 2018/10/17 + * Version: @(#)win_cdrom.c 1.0.11 2018/10/21 * * Authors: Sarah Walker, * Miran Grca, @@ -45,12 +45,10 @@ plat_cdrom_ui_update(uint8_t id, uint8_t reload) if (drv->host_drive == 0) { ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_CHECKED); - drv->host_drive = 0; ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_UNCHECKED); ui_sb_update_icon_state(SB_CDROM|id, 1); } else { ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_UNCHECKED); - drv->host_drive = 200; ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_CHECKED); ui_sb_update_icon_state(SB_CDROM|id, 0); } diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index c015aeca8..c549b06dd 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -470,9 +470,9 @@ StatusBarCreatePopupMenu(int part) /* API: mark the status bar as not ready. */ void -ui_sb_set_not_ready(void) +ui_sb_set_ready(int ready) { - sb_ready = 0; + sb_ready = ready; } @@ -486,8 +486,9 @@ ui_sb_update_panes(void) int c_ide, c_scsi; int do_net; - if (sb_ready) + if (sb_ready) { sb_ready = 0; + } hdint = (machines[machine].flags & MACHINE_HDC) ? 1 : 0; c_mfm = hdd_count(HDD_BUS_MFM); @@ -816,6 +817,9 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_FLOPPY_IMAGE_NEW: id = item_params & 0x0003; part = sb_map[SB_FLOPPY | id]; + if ((part == 0xff) || (sb_menu_handles == NULL)) + break; + NewFloppyDialogCreate(hwnd, id, part); break; @@ -875,11 +879,19 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_CDROM_EMPTY: id = item_params & 0x0007; + part = sb_map[SB_CDROM | id]; + if ((part == 0xff) || (sb_menu_handles == NULL)) + break; + cdrom_eject(id); break; case IDM_CDROM_RELOAD: id = item_params & 0x0007; + part = sb_map[SB_CDROM | id]; + if ((part == 0xff) || (sb_menu_handles == NULL)) + break; + cdrom_reload(id); break; @@ -887,30 +899,30 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) id = item_params & 0x0007; part = sb_map[SB_CDROM | id]; if ((part == 0xff) || (sb_menu_handles == NULL)) - break; + break; if (!file_dlg_w_st(hwnd, IDS_2075, cdrom[id].image_path, 0)) { cdrom[id].prev_host_drive = cdrom[id].host_drive; wcscpy(temp_path, wopenfilestring); if (!cdrom[id].prev_image_path) - cdrom[id].prev_image_path = (wchar_t *) malloc(1024); + cdrom[id].prev_image_path = (wchar_t *) malloc(1024 * sizeof(wchar_t)); wcscpy(cdrom[id].prev_image_path, cdrom[id].image_path); if (cdrom[id].ops && cdrom[id].ops->exit) cdrom[id].ops->exit(&(cdrom[id])); cdrom[id].ops = NULL; - memset(cdrom[id].image_path, 0, 2048); + memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path)); cdrom_image_open(&(cdrom[id]), temp_path); /* Signal media change to the emulated machine. */ if (cdrom[id].insert) cdrom[id].insert(cdrom[id].p); - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED); cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200; if (cdrom[id].host_drive == 200) { + CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED); CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_CHECKED); ui_sb_update_icon_state(SB_CDROM | id, 0); } else { CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_UNCHECKED); - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED); + CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_CHECKED); ui_sb_update_icon_state(SB_CDROM | id, 1); } EnableMenuItem(sb_menu_handles[part], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);