diff --git a/src/pc.c b/src/pc.c index a4f3ff7..e4372f3 100644 --- a/src/pc.c +++ b/src/pc.c @@ -8,7 +8,7 @@ * * Main emulator module where most things are controlled. * - * Version: @(#)pc.c 1.0.41 2018/05/09 + * Version: @(#)pc.c 1.0.42 2018/05/11 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -356,11 +356,10 @@ pc_version(const char *platform) void pc_path(wchar_t *dst, int sz, const wchar_t *src) { + const wchar_t *str = src; + wchar_t *ptr = dst; int i = wcslen(usr_path); - if ((src != NULL) && !wcsncasecmp(src, usr_path, i)) - src += i; - /* * Fix all the slashes. * @@ -368,18 +367,21 @@ pc_path(wchar_t *dst, int sz, const wchar_t *src) * now convert ALL paths to the latter format, so it * is always the same. */ - if (src == NULL) - src = dst; - while ((sz > 0) && (*src != L'\0')) { - if (*src == L'\\') - *dst = L'/'; + if (str == NULL) + str = ptr; + while ((sz > 0) && (*str != L'\0')) { + if (*str == L'\\') + *ptr = L'/'; else - *dst = *src; - src++; - dst++; + *ptr = *str; + str++; + ptr++; sz--; } - *dst = L'\0'; + *ptr = L'\0'; + + if ((src != NULL) && !wcsncasecmp(dst, usr_path, i)) + wcscpy(dst, &dst[i]); } diff --git a/src/ui/ui.h b/src/ui/ui.h index ccf67ad..005bca6 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -8,7 +8,7 @@ * * Define the various UI functions. * - * Version: @(#)ui.h 1.0.8 2018/05/09 + * Version: @(#)ui.h 1.0.9 2018/05/11 * * Author: Fred N. van Kempen, * @@ -61,6 +61,11 @@ #define MBX_FATAL 0x20 #define MBX_ANSI 0x80 +/* FileDialog flags. */ +#define DLG_FILE_LOAD 0x00 +#define DLG_FILE_SAVE 0x01 +#define DLG_FILE_RO 0x80 + /* Status Bar definitions. */ #define SB_ICON_WIDTH 24 #define SB_FLOPPY 0x00 diff --git a/src/ui/ui_main.c b/src/ui/ui_main.c index 898e1c3..332cb8a 100644 --- a/src/ui/ui_main.c +++ b/src/ui/ui_main.c @@ -11,7 +11,7 @@ * This code is called by the UI frontend modules, and, also, * depends on those same modules for lower-level functions. * - * Version: @(#)ui_main.c 1.0.14 2018/05/09 + * Version: @(#)ui_main.c 1.0.15 2018/05/11 * * Author: Fred N. van Kempen, * @@ -497,17 +497,18 @@ ui_menu_command(int idm) /* FIXME: need to fix these.. */ case IDM_LOAD: /* TOOLS menu */ plat_pause(1); - if (! dlg_file(get_string(IDS_2160), NULL, temp, 0) && - (ui_msgbox(MBX_QUESTION, (wchar_t *)IDS_2051) == 0)) { + i = dlg_file(get_string(IDS_2160), NULL, temp, DLG_FILE_LOAD); + if (i && (ui_msgbox(MBX_QUESTION, (wchar_t *)IDS_2051) == 0)) { pc_reload(temp); ui_menu_reset_all(); + config_ro = !!(i & DLG_FILE_RO); } plat_pause(0); break; case IDM_SAVE: /* TOOLS menu */ plat_pause(1); - if (! dlg_file(get_string(IDS_2160), NULL, temp, 1)) { + if (dlg_file(get_string(IDS_2160), NULL, temp, DLG_FILE_SAVE)) { config_write(temp); } plat_pause(0); diff --git a/src/ui/ui_resource.h b/src/ui/ui_resource.h index d6439c5..c6c8cb3 100644 --- a/src/ui/ui_resource.h +++ b/src/ui/ui_resource.h @@ -8,7 +8,7 @@ * * Platform-independent resource identifiers. * - * Version: @(#)ui_resource.h 1.0.7 2018/05/09 + * Version: @(#)ui_resource.h 1.0.8 2018/05/11 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -167,9 +167,8 @@ #define IDM_FLOPPY_IMAGE_NEW (IDM_SBAR + 0x0000) #define IDM_FLOPPY_IMAGE_EXISTING (IDM_SBAR + 0x0100) -#define IDM_FLOPPY_IMAGE_EXISTING_WP (IDM_SBAR + 0x0200) -#define IDM_FLOPPY_EXPORT_TO_86F (IDM_SBAR + 0x0300) -#define IDM_FLOPPY_EJECT (IDM_SBAR + 0x0400) +#define IDM_FLOPPY_EXPORT_TO_86F (IDM_SBAR + 0x0200) +#define IDM_FLOPPY_EJECT (IDM_SBAR + 0x0300) #define IDM_CDROM_MUTE (IDM_SBAR + 0x0800) #define IDM_CDROM_EMPTY (IDM_SBAR + 0x0900) @@ -179,15 +178,13 @@ #define IDM_ZIP_IMAGE_NEW (IDM_SBAR + 0x1000) #define IDM_ZIP_IMAGE_EXISTING (IDM_SBAR + 0x1100) -#define IDM_ZIP_IMAGE_EXISTING_WP (IDM_SBAR + 0x1200) -#define IDM_ZIP_EJECT (IDM_SBAR + 0x1300) -#define IDM_ZIP_RELOAD (IDM_SBAR + 0x1400) +#define IDM_ZIP_EJECT (IDM_SBAR + 0x1200) +#define IDM_ZIP_RELOAD (IDM_SBAR + 0x1300) #define IDM_RDISK_EJECT (IDM_SBAR + 0x1800) #define IDM_RDISK_RELOAD (IDM_SBAR + 0x1900) #define IDM_RDISK_SEND_CHANGE (IDM_SBAR + 0x1a00) #define IDM_RDISK_IMAGE (IDM_SBAR + 0x1b00) -#define IDM_RDISK_IMAGE_WP (IDM_SBAR + 0x1c00) #define IDM_SOUND (IDM_SBAR + 8192) @@ -304,13 +301,13 @@ #define IDS_2160 2160 // "Configuration files (*.CF.." #define IDS_2161 2161 // "&New image..." #define IDS_2162 2162 // "&Existing image..." -#define IDS_2163 2163 // "Existing image (&Write-pr..." +#define IDS_2163 2163 // "[WP]" #define IDS_2164 2164 // "E&ject" #define IDS_2165 2165 // "&Mute" #define IDS_2166 2166 // "E&mpty" #define IDS_2167 2167 // "&Reload previous image" #define IDS_2168 2168 // "&Image..." -#define IDS_2169 2169 // "Image (&Write-protected)..." +/* IDS_2169 available */ #define IDS_2170 2170 // "Check BPB" #define IDS_2171 2171 // "Unable to initialize Flui.." #define IDS_2172 2172 // "E&xport to 86F..." diff --git a/src/ui/ui_stbar.c b/src/ui/ui_stbar.c index 1c33d19..a983f40 100644 --- a/src/ui/ui_stbar.c +++ b/src/ui/ui_stbar.c @@ -8,7 +8,7 @@ * * Common UI support functions for the Status Bar module. * - * Version: @(#)ui_stbar.c 1.0.6 2018/05/09 + * Version: @(#)ui_stbar.c 1.0.7 2018/05/11 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -215,6 +215,8 @@ ui_sb_tip_update(int tag) str = get_string(IDS_2057); /*"empty"*/ swprintf(tip, sizeof_w(tip), get_string(IDS_2158), drive+1, temp, str); + if (ui_writeprot[drive]) + wcscat(tip, get_string(IDS_2163)); break; case SB_CDROM: @@ -252,6 +254,8 @@ ui_sb_tip_update(int tag) str = get_string(IDS_2057); /*"empty"*/ swprintf(tip, sizeof_w(tip), get_string(IDS_2177), drive+1, type, str); + if (zip_drives[drive].ui_writeprot) + wcscat(tip, get_string(IDS_2163)); break; case SB_RDISK: @@ -261,6 +265,8 @@ ui_sb_tip_update(int tag) str = get_string(IDS_2057); /*"empty"*/ swprintf(tip, sizeof_w(tip), get_string(IDS_4115), drive, str); + if (0) + wcscat(tip, get_string(IDS_2163)); break; case SB_HDD: @@ -269,6 +275,8 @@ ui_sb_tip_update(int tag) str = get_string(id); swprintf(tip, sizeof_w(tip), get_string(IDS_4096), str); + if (0) + wcscat(tip, get_string(IDS_2163)); break; case SB_NETWORK: @@ -320,8 +328,6 @@ menu_floppy(int part, int drive) sb_menu_add_item(part, -1, NULL); sb_menu_add_item(part, IDM_FLOPPY_IMAGE_EXISTING | drive, get_string(IDS_2162)); - sb_menu_add_item(part, IDM_FLOPPY_IMAGE_EXISTING_WP | drive, - get_string(IDS_2163)); sb_menu_add_item(part, -1, NULL); sb_menu_add_item(part, IDM_FLOPPY_EXPORT_TO_86F | drive, get_string(IDS_2172)); @@ -405,8 +411,6 @@ menu_zip(int part, int drive) sb_menu_add_item(part, -1, NULL); sb_menu_add_item(part, IDM_ZIP_IMAGE_EXISTING | drive, get_string(IDS_2162)); - sb_menu_add_item(part, IDM_ZIP_IMAGE_EXISTING_WP | drive, - get_string(IDS_2163)); sb_menu_add_item(part, -1, NULL); sb_menu_add_item(part, IDM_ZIP_EJECT | drive, get_string(IDS_2164)); sb_menu_add_item(part, IDM_ZIP_RELOAD | drive, get_string(IDS_2167)); @@ -435,8 +439,6 @@ menu_remov(int part, int drive) sb_menu_add_item(part, -1, NULL); sb_menu_add_item(part, IDM_RDISK_IMAGE | drive, get_string(IDS_2168)); - sb_menu_add_item(part, IDM_RDISK_IMAGE_WP | drive, - get_string(IDS_2169)); } @@ -791,6 +793,7 @@ ui_sb_menu_command(int idm, int tag) { wchar_t temp[512]; int new_cdrom_drive; + wchar_t *str; int drive; int part; int i; @@ -805,15 +808,16 @@ ui_sb_menu_command(int idm, int tag) break; case IDM_FLOPPY_IMAGE_EXISTING: - case IDM_FLOPPY_IMAGE_EXISTING_WP: drive = tag & 0x0003; part = find_tag(SB_FLOPPY | drive); if (part == -1) break; - i = (idm == IDM_FLOPPY_IMAGE_EXISTING_WP) ? 0x80 : 0; - if (! dlg_file(get_string(IDS_2159), - floppyfns[drive], temp, i)) - ui_sb_mount_floppy(drive, part, i ? 1 : 0, temp); + str = floppyfns[drive]; + i = dlg_file(get_string(IDS_2159), str, temp, DLG_FILE_LOAD); + if (i) { + ui_sb_mount_floppy(drive, part, + !!(i & DLG_FILE_RO), temp); + } break; case IDM_FLOPPY_EJECT: @@ -834,7 +838,8 @@ ui_sb_menu_command(int idm, int tag) part = find_tag(SB_FLOPPY | drive); if (part == -1) break; - if (! dlg_file(get_string(IDS_2173), floppyfns[drive], temp, 1)) { + str = floppyfns[drive]; + if (dlg_file(get_string(IDS_2173), str, temp, DLG_FILE_SAVE)) { plat_pause(1); if (! d86f_export(drive, temp)) ui_msgbox(MBX_ERROR, (wchar_t *)IDS_4108); @@ -869,13 +874,14 @@ ui_sb_menu_command(int idm, int tag) part = find_tag(SB_CDROM | drive); if (part == -1) break; - if (dlg_file(get_string(IDS_2075), - cdrom_image[drive].image_path, temp, 0x80)) break; + str = cdrom_image[drive].image_path; + if (! dlg_file(get_string(IDS_2075), str, temp, + DLG_FILE_LOAD|DLG_FILE_RO)) break; cdrom_drives[drive].prev_host_drive = cdrom_drives[drive].host_drive; if (! cdrom_image[drive].prev_image_path) cdrom_image[drive].prev_image_path = (wchar_t *)malloc(1024); - wcscpy(cdrom_image[drive].prev_image_path, cdrom_image[drive].image_path); + wcscpy(cdrom_image[drive].prev_image_path, str); cdrom_drives[drive].handler->exit(drive); cdrom_close(drive); image_open(drive, temp); @@ -946,15 +952,16 @@ ui_sb_menu_command(int idm, int tag) break; case IDM_ZIP_IMAGE_EXISTING: - case IDM_ZIP_IMAGE_EXISTING_WP: drive = tag & 0x0003; part = find_tag(SB_ZIP | drive); if (part == -1) break; - i = (idm == IDM_ZIP_IMAGE_EXISTING_WP) ? 0x80 : 0; - if (dlg_file(get_string(IDS_2175), - zip_drives[drive].image_path, temp, i)) break; - ui_sb_mount_zip(drive, part, i ? 1 : 0, temp); + str = zip_drives[drive].image_path; + i = dlg_file(get_string(IDS_2175), str, temp, DLG_FILE_LOAD); + if (i) { + ui_sb_mount_zip(drive, part, + !!(i & DLG_FILE_RO), temp); + } break; case IDM_ZIP_EJECT: @@ -983,19 +990,18 @@ ui_sb_menu_command(int idm, int tag) break; case IDM_RDISK_IMAGE: - case IDM_RDISK_IMAGE_WP: drive = tag & 0x001f; part = find_tag(idm | drive); - i = (idm == IDM_RDISK_IMAGE_WP) ? 0x80 : 0; - if (dlg_file(get_string(IDS_4106), - hdd[drive].fn, temp, i)) break; + str = hdd[drive].fn; + i = dlg_file(get_string(IDS_4106), str, temp, DLG_FILE_LOAD); + if (! i) break; removable_disk_unload(drive); memset(hdd[drive].fn, 0x00, sizeof(hdd[drive].fn)); wcscpy(hdd[drive].fn, temp); - hdd[drive].wp = i ? 1 : 0; + hdd[drive].wp = !!(i & DLG_FILE_RO); scsi_loadhd(hdd[drive].id.scsi.id, hdd[drive].id.scsi.lun, drive); scsi_disk_insert(drive); diff --git a/src/win/VARCem.rc b/src/win/VARCem.rc index a1c1cc3..81e2a87 100644 --- a/src/win/VARCem.rc +++ b/src/win/VARCem.rc @@ -8,7 +8,7 @@ * * Application resource script for Windows. * - * Version: @(#)VARCem.rc 1.0.27 2018/05/10 + * Version: @(#)VARCem.rc 1.0.28 2018/05/11 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -954,7 +954,7 @@ BEGIN IDS_2072 "Hard disks" IDS_2073 "Floppy drives" IDS_2074 "Other removable devices" - IDS_2075 "CD-ROM images (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" + IDS_2075 "CD-ROM images\0*.iso;*.cue\0All files (*.*)\0*.*\0" IDS_2076 "Host CD/DVD Drive (%c:)" IDS_2077 "Click to capture mouse" IDS_2078 "Press F8+F12 to release mouse" @@ -1032,24 +1032,24 @@ BEGIN IDS_2156 "%" PRIu64 IDS_2157 "%" PRIu64 " MB (CHS: %u, %u, %u)" IDS_2158 "Floppy %i (%s): %ls" - IDS_2159 "All images (*.0??;*.1??;*.360;*.720;*.86F;*.BIN;*.CQ?;*.DSK;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.XDF)\0*.0??;*.1??;*.360;*.720;*.86F;*.BIN;*.CQ?;*.DSK;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.360;*.720;*.BIN;*.CQ?;*.DSK;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.360;*.720;*.BIN;*.CQ?;*.DSK;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F)\0*.86F\0All files (*.*)\0*.*\0" - IDS_2160 "Configuration files (*.VARC)\0*.VARC\0All files (*.*)\0*.*\0" + IDS_2159 "All images\0*.0??;*.1??;*.360;*.720;*.86f;*.bin;*.cq?;*.dsk;*.flp;*.hdm;*.ima;*.json;*.td0;*.*fd?;*.xdf\0Advanced sector images\0*.imd;*.json;*.td0\0Basic sector images\0*.0??;*.1??;*.360;*.720;*.bin;*.cq?;*.dsk;*.flp;*.hdm;*.im?;*.xdf;*.*fd?\0Flux images\0*.fdi\0Surface images\0*.86f\0All files\0*.*\0" + IDS_2160 "Configuration files\0*.varc\0All files\0*.*\0" IDS_2161 "&New image..." IDS_2162 "&Existing image..." - IDS_2163 "Existing image (&Write-protected)..." + IDS_2163 " [Write Protected]" IDS_2164 "E&ject" IDS_2165 "&Mute" IDS_2166 "E&mpty" IDS_2167 "&Reload previous image" IDS_2168 "&Image..." - IDS_2169 "Image (&Write-protected)..." + /* 2169 available */ IDS_2170 "Check BPB" IDS_2171 "Unable to initialize FluidSynth, make sure you have the following library\nin your program folder:\n\nlibfluidsynth.dll" IDS_2172 "E&xport to 86F..." - IDS_2173 "Surface images (*.86F)\0*.86F\0" - IDS_2174 "All images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" - IDS_2175 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" - IDS_2176 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2173 "Surface images\0*.86f\0" + IDS_2174 "All images\0*.86f;*.dsk;*.flp;*.im?;*.*fd?\0Basic sector images\0*.dsk;*.flp;*.im?;*.img;*.*fd?\0Surface images\0*.86f\0" + IDS_2175 "ZIP images\0*.im?;*.zdi\0All files\0*.*\0" + IDS_2176 "ZIP images\0*.im?;*.zdi\0" IDS_2177 "ZIP %i (%03i): %ls" IDS_2178 "Unable to initialize OpenAL, make sure you have the following library\nin your program folder:\n\nlibopenal-1.dll" IDS_2179 "Speed:" @@ -1067,7 +1067,7 @@ BEGIN IDS_4103 "Add Existing Hard Disk" IDS_4104 "Attempting to create a HDI image larger than 4 GB" IDS_4105 "Attempting to create a spuriously large hard disk image" - IDS_4106 "Hard disk images (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" + IDS_4106 "Hard disk images\0*.hd?;*.im?;*.vhd\0All files\0*.*\0" IDS_4107 "Unable to open the file for read" IDS_4108 "Unable to open the file for write" IDS_4109 "HDI or HDX image with a sector size that is not 512 are not supported" diff --git a/src/win/msvc/Makefile.VC b/src/win/msvc/Makefile.VC index b1efec3..f121844 100644 --- a/src/win/msvc/Makefile.VC +++ b/src/win/msvc/Makefile.VC @@ -253,7 +253,7 @@ OPTS := $(EXTRAS) $(STUFF) $(VCOPTS) \ -D_CRT_SECURE_NO_WARNINGS \ $(WPCAPINC) $(SYSINC) AFLAGS := /arch:SSE2 -RFLAGS := +RFLAGS := /n COPTS := -W3 CXXOPTS := -EHsc DOPTS := diff --git a/src/win/win.c b/src/win/win.c index d50e4bf..0ab9789 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -8,7 +8,7 @@ * * Platform main support module for Windows. * - * Version: @(#)win.c 1.0.12 2018/05/10 + * Version: @(#)win.c 1.0.13 2018/05/11 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -139,7 +139,8 @@ LoadCommonStrings(void) tbl->id = i; str = (wchar_t *)malloc((c + 1) * sizeof(wchar_t)); - wcscpy(str, temp); + memset(str, 0x00, (c + 1) * sizeof(wchar_t)); + memcpy(str, temp, c * sizeof(wchar_t)); tbl->str = str; tbl++; diff --git a/src/win/win_devconf.c b/src/win/win_devconf.c index 9b4004c..bd94b8e 100644 --- a/src/win/win_devconf.c +++ b/src/win/win_devconf.c @@ -12,7 +12,7 @@ * and builds a complete Win32 DIALOG resource block in a * buffer in memory, and then passes that to the API handler. * - * Version: @(#)win_devconf.c 1.0.16 2018/05/04 + * Version: @(#)win_devconf.c 1.0.17 2018/05/11 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -425,7 +425,7 @@ dlg_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if (ws[c] == L'|') ws[c] = 0; - if (! dlg_file_ex(hdlg, ws, NULL, temp, 0)) + if (dlg_file_ex(hdlg, ws, NULL, temp, DLG_FILE_LOAD)) SendMessage(h, WM_SETTEXT, 0, (LPARAM)temp); } break; diff --git a/src/win/win_dialog.c b/src/win/win_dialog.c index ab5c686..4fc12b0 100644 --- a/src/win/win_dialog.c +++ b/src/win/win_dialog.c @@ -191,12 +191,13 @@ dlg_file_hook(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) /* Implement the main GetFileName dialog. */ int -dlg_file_ex(HWND hwnd, const wchar_t *filt, const wchar_t *ifn, wchar_t *fn, int save) +dlg_file_ex(HWND h, const wchar_t *f, const wchar_t *ifn, wchar_t *fn, int fl) { wchar_t temp[512]; OPENFILENAME ofn; - BOOL r; DWORD err; + BOOL r; + int ret; /* Clear the temp path. */ memset(temp, 0x00, sizeof(temp)); @@ -204,7 +205,7 @@ dlg_file_ex(HWND hwnd, const wchar_t *filt, const wchar_t *ifn, wchar_t *fn, int /* Initialize OPENFILENAME. */ memset(&ofn, 0x00, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = hwnd; + ofn.hwndOwner = h; ofn.lpfnHook = dlg_file_hook; /* This is the buffer in which to place the resulting filename. */ @@ -212,7 +213,7 @@ dlg_file_ex(HWND hwnd, const wchar_t *filt, const wchar_t *ifn, wchar_t *fn, int ofn.nMaxFile = sizeof_w(temp); /* Set up the "file types" filter. */ - ofn.lpstrFilter = filt; + ofn.lpstrFilter = f; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; @@ -221,20 +222,20 @@ dlg_file_ex(HWND hwnd, const wchar_t *filt, const wchar_t *ifn, wchar_t *fn, int if (ifn == NULL) ifn = usr_path; ofn.lpstrInitialDir = ifn; + wcscpy(fn, ifn); /* Set up the flags for this dialog. */ - r = (save & 0x80) ? TRUE : FALSE; - save &= 0x7f; + r = (fl & DLG_FILE_RO) ? TRUE : FALSE; ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER | OFN_PATHMUSTEXIST; - if (! save) { + if (! (fl & DLG_FILE_SAVE)) { ofn.Flags |= OFN_FILEMUSTEXIST; if (r == TRUE) ofn.Flags |= OFN_READONLY; } /* Display the Open dialog box. */ - if (save) + if (fl & DLG_FILE_SAVE) r = GetSaveFileName(&ofn); else r = GetOpenFileName(&ofn); @@ -249,23 +250,28 @@ dlg_file_ex(HWND hwnd, const wchar_t *filt, const wchar_t *ifn, wchar_t *fn, int /* Remember the file type for next time. */ filterindex = ofn.nFilterIndex; - return(0); + ret = 1; + if (ofn.Flags & OFN_READONLY) + ret |= DLG_FILE_RO; + } else { + /* If an error occurred, log this. */ + if ((err = CommDlgExtendedError()) != NO_ERROR) { + sprintf((char *)temp, + "%sFile(%ls, %02x):\n\n error 0x%08lx", + (fl & DLG_FILE_SAVE)?"Save":"Open", ifn, fl, err); + pclog("%s\n", (char *)temp); + (void)ui_msgbox(MBX_ERROR|MBX_ANSI, (char *)temp); + } + + ret = 0; } - /* If an error occurred, log this. */ - if ((err = CommDlgExtendedError()) != NO_ERROR) { - sprintf((char *)temp, - "OpenFile(%ls, %d):\n\n error 0x%08lx", ifn, save, err); - pclog("%s\n", (char *)temp); - (void)ui_msgbox(MBX_ERROR|MBX_ANSI, (char *)temp); - } - - return(1); + return(ret); } int -dlg_file(const wchar_t *filt, const wchar_t *ifn, wchar_t *ofn, int save) +dlg_file(const wchar_t *filt, const wchar_t *ifn, wchar_t *ofn, int flags) { - return(dlg_file_ex(hwndMain, filt, ifn, ofn, save)); + return(dlg_file_ex(hwndMain, filt, ifn, ofn, flags)); } diff --git a/src/win/win_new_floppy.c b/src/win/win_new_floppy.c index 33c9c04..604440a 100644 --- a/src/win/win_new_floppy.c +++ b/src/win/win_new_floppy.c @@ -8,7 +8,7 @@ * * Implementation of the New Floppy Image dialog. * - * Version: @(#)win_new_floppy.c 1.0.14 2018/05/09 + * Version: @(#)win_new_floppy.c 1.0.15 2018/05/11 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -181,7 +181,7 @@ dlg_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) return TRUE; case IDC_CFILE: - if (! dlg_file_ex(hdlg, get_string(is_zip ? IDS_2176 : IDS_2174), NULL, temp_path, 1)) { + if (dlg_file_ex(hdlg, get_string(is_zip ? IDS_2176 : IDS_2174), NULL, temp_path, DLG_FILE_SAVE)) { if (! wcschr(temp_path, L'.')) { if (wcslen(temp_path) && (wcslen(temp_path) <= 256)) { twcs = &temp_path[wcslen(temp_path)]; diff --git a/src/win/win_settings_disk.h b/src/win/win_settings_disk.h index 2dc8624..31eb9a9 100644 --- a/src/win/win_settings_disk.h +++ b/src/win/win_settings_disk.h @@ -8,7 +8,7 @@ * * Implementation of the Settings dialog. * - * Version: @(#)win_settings_disk.h 1.0.8 2018/05/09 + * Version: @(#)win_settings_disk.h 1.0.9 2018/05/11 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -1065,7 +1065,8 @@ hd_add_ok_common: return TRUE; case IDC_CFILE: - if (! dlg_file_ex(hdlg, get_string(IDS_4106), NULL, temp_path, !(existing & 1))) { + b = (existing&1)?DLG_FILE_LOAD:DLG_FILE_SAVE; + if (dlg_file_ex(hdlg, get_string(IDS_4106), NULL, temp_path, b)) { if (! wcschr(temp_path, L'.')) { if (wcslen(temp_path) && (wcslen(temp_path) <= 256)) { twcs = &temp_path[wcslen(temp_path)]; @@ -1076,7 +1077,7 @@ hd_add_ok_common: } } - if (!(existing & 1)) { + if (! (existing & 1)) { f = _wfopen(temp_path, L"rb"); if (f != NULL) { fclose(f);