diff --git a/src/config.c b/src/config.c
index e1d0ad6d4..d385c7ed2 100644
--- a/src/config.c
+++ b/src/config.c
@@ -451,7 +451,7 @@ load_general(void)
video_fullscreen_scale = config_get_int(cat, "video_fullscreen_scale", 0);
- video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 0);
+ video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 1);
force_43 = !!config_get_int(cat, "force_43", 0);
scale = config_get_int(cat, "scale", 1);
@@ -713,9 +713,9 @@ load_network(void)
if (p != NULL) {
if ((network_dev_to_id(p) == -1) || (network_ndev == 1)) {
if ((network_ndev == 1) && strcmp(network_host, "none")) {
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2094);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2094, (wchar_t *) IDS_2129);
} else if (network_dev_to_id(p) == -1) {
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2095);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2095, (wchar_t *) IDS_2129);
}
strcpy(network_host, "none");
diff --git a/src/disk/hdd.c b/src/disk/hdd.c
index 15bb5743e..f1c0f1599 100644
--- a/src/disk/hdd.c
+++ b/src/disk/hdd.c
@@ -49,7 +49,7 @@ hdd_string_to_bus(char *str, int cdrom)
if (! strcmp(str, "mfm")) {
if (cdrom) {
no_cdrom:
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_4099);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2130, (wchar_t *) IDS_4099);
return(0);
}
@@ -93,9 +93,6 @@ no_cdrom:
if (! strcmp(str, "scsi"))
return(HDD_BUS_SCSI);
- if (! strcmp(str, "usb"))
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_4110);
-
return(0);
}
diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h
index 9f1fe7c92..bbb37895e 100644
--- a/src/include/86box/86box.h
+++ b/src/include/86box/86box.h
@@ -42,6 +42,10 @@
#endif
#define COPYRIGHT_YEAR "2020"
+/* Web URL info. */
+#define EMU_SITE L"86box.github.io"
+#define EMU_ROMS_URL L"https://github.com/86Box/roms/releases/latest"
+
/* Filename and pathname info. */
#define CONFIG_FILE L"86box.cfg"
#define NVR_PATH L"nvr"
diff --git a/src/include/86box/language.h b/src/include/86box/language.h
index d5a6d9b8f..0e603e92f 100644
--- a/src/include/86box/language.h
+++ b/src/include/86box/language.h
@@ -22,10 +22,10 @@
/* String IDs. */
#define IDS_STRINGS 2048 // "86Box"
-#define IDS_2049 2049 // "86Box Error"
-#define IDS_2050 2050 // "86Box Fatal Error"
-#define IDS_2051 2051 // "This will hard reset the.."
-#define IDS_2052 2052 // "Use CTRL+ALT+PAGE DOWN.."
+#define IDS_2049 2049 // "Error"
+#define IDS_2050 2050 // "Fatal error"
+#define IDS_2051 2051 // "Are you sure you want to save..."
+#define IDS_2052 2052 // "Press CTRL+ALT+PAGE DOWN..."
#define IDS_2053 2053 // "Speed"
#define IDS_2054 2054 // "ZIP %i (%03i): %ls"
#define IDS_2055 2055 // "ZIP images (*.IM?)\0*.IM..."
@@ -36,8 +36,8 @@
#define IDS_2060 2060 // "On"
#define IDS_2061 2061 // "Off"
#define IDS_2062 2062 // "All floppy images (*.DSK..."
-#define IDS_2063 2063 // "Configured ROM set not avai.."
-#define IDS_2064 2064 // "Configured video BIOS not.."
+#define IDS_2063 2063 // "Machine ""%S"" is not..."
+#define IDS_2064 2064 // "Video card ""%S"" is not..."
#define IDS_2065 2065 // "Machine"
#define IDS_2066 2066 // "Display"
#define IDS_2067 2067 // "Input devices"
@@ -62,7 +62,7 @@
#define IDS_2086 2086 // "MB"
#define IDS_2087 2087 // "Check BPB"
#define IDS_2088 2088 // "KB"
-#define IDS_2089 2089 // "Neither DirectDraw nor Dire.."
+#define IDS_2089 2089 // "Could not initialize the video..."
#define IDS_2090 2090 // "Default"
#define IDS_2091 2091 // "%i Wait state(s)"
#define IDS_2092 2092 // "Type"
@@ -77,8 +77,8 @@
#define IDS_2101 2101 // "Microsoft SideWinder Pad"
#define IDS_2102 2102 // "Thrustmaster Flight Cont.."
#define IDS_2103 2103 // "None"
-#define IDS_2104 2104 // "Unable to load Accelerators"
-#define IDS_2105 2105 // "Unable to register Raw Input"
+#define IDS_2104 2104 // "Unable to load keyboard..."
+#define IDS_2105 2105 // "Unable to register raw input."
#define IDS_2106 2106 // "%u"
#define IDS_2107 2107 // "%u MB (CHS: %i, %i, %i)"
#define IDS_2108 2108 // "Floppy %i (%s): %ls"
@@ -92,6 +92,26 @@
#define IDS_2116 2116 // "MO images (*.IM?)\0*.IM..."
#define IDS_2117 2117 // "Welcome to 86Box!"
#define IDS_2118 2118 // "Internal controller"
+#define IDS_2119 2119 // "Exit"
+#define IDS_2120 2120 // "No ROMs found"
+#define IDS_2121 2121 // "Save changes\nThis will hard..."
+#define IDS_2122 2122 // "Discard changes\nAll changes..."
+#define IDS_2123 2123 // "Cancel\nGo back to the..."
+#define IDS_2124 2124 // "About " EMU_NAME
+#define IDS_2125 2125 // EMU_NAME " v" EMU_VERSION
+#define IDS_2126 2126 // "An emulator of old computers..."
+#define IDS_2127 2127 // "OK"
+#define IDS_2128 2128 // "Hardware not available"
+#define IDS_2129 2129 // "Make sure " LIB_NAME_PCAP "..."
+#define IDS_2130 2130 // "Invalid configuration"
+#define IDS_2131 2131 // LIB_NAME_FREETYPE " is required..."
+#define IDS_2132 2132 // LIB_NAME_GS " is required for...
+#define IDS_2133 2133 // LIB_NAME_FLUIDSYNTH " is required..."
+#define IDS_2134 2134 // "Entering fullscreen mode"
+#define IDS_2135 2135 // "Don't show this message again"
+#define IDS_2136 2136 // "Don't Exit"
+#define IDS_2137 2137 // "Reset"
+#define IDS_2138 2138 // "Don't Reset"
#define IDS_4096 4096 // "Hard disk (%s)"
#define IDS_4097 4097 // "%01i:%01i"
@@ -101,16 +121,24 @@
#define IDS_4101 4101 // "Custom (large)..."
#define IDS_4102 4102 // "Add New Hard Disk"
#define IDS_4103 4103 // "Add Existing Hard Disk"
-#define IDS_4104 4104 // "Attempting to create a HDI ima.."
-#define IDS_4105 4105 // "Attempting to create a spurio.."
+#define IDS_4104 4104 // "HDI disk images cannot be..."
+#define IDS_4105 4105 // "Disk images cannot be larger..."
#define IDS_4106 4106 // "Hard disk images (*.HDI;*.HD.."
#define IDS_4107 4107 // "Unable to open the file for read"
#define IDS_4108 4108 // "Unable to open the file for write"
#define IDS_4109 4109 // "HDI or HDX image with a sect.."
#define IDS_4110 4110 // "USB is not yet supported"
-#define IDS_4111 4111 // "This image exists and will be.."
-#define IDS_4112 4112 // "Please enter a valid file name"
+#define IDS_4111 4111 // "Disk image file already exists"
+#define IDS_4112 4112 // "Please specify a valid file name."
#define IDS_4113 4113 // "Remember to partition and fo.."
+#define IDS_4114 4114 // "Make sure the file exists and..."
+#define IDS_4115 4115 // "Make sure the file is being..."
+#define IDS_4116 4116 // "Disk image too large"
+#define IDS_4117 4117 // "Remember to partition and format..."
+#define IDS_4118 4118 // "The selected file will be..."
+#define IDS_4119 4119 // "Unsupported disk image"
+#define IDS_4120 4120 // "Overwrite"
+#define IDS_4121 4121 // "Don't Overwrite"
#define IDS_4352 4352 // "MFM/RLL"
#define IDS_4353 4353 // "XT IDE"
diff --git a/src/include/86box/ui.h b/src/include/86box/ui.h
index ce9635cf1..f497fb857 100644
--- a/src/include/86box/ui.h
+++ b/src/include/86box/ui.h
@@ -36,8 +36,12 @@ extern "C" {
#define MBX_QUESTION_YN 4
#define MBX_FATAL 0x20
#define MBX_ANSI 0x80
+#define MBX_LINKS 0x100
+#define MBX_DONTASK 0x200
-extern int ui_msgbox(int type, void *arg);
+extern int ui_msgbox(int flags, void *message);
+extern int ui_msgbox_header(int flags, void *header, void *message);
+extern int ui_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn2, void *btn3);
extern void ui_check_menu_item(int id, int checked);
diff --git a/src/network/network.c b/src/network/network.c
index a32f232c1..77fbfa1ae 100644
--- a/src/network/network.c
+++ b/src/network/network.c
@@ -438,7 +438,7 @@ network_reset(void)
if (i < 0) {
/* Tell user we can't do this (at the moment.) */
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2093);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2093, (wchar_t *) IDS_2129);
// FIXME: we should ask in the dialog if they want to
// reconfigure or quit, and throw them into the
diff --git a/src/pc.c b/src/pc.c
index 6b1d57ce0..574b81d58 100644
--- a/src/pc.c
+++ b/src/pc.c
@@ -283,7 +283,7 @@ fatal(const char *fmt, ...)
to avoid things like threads getting stuck. */
do_stop();
- ui_msgbox(MBX_ERROR|MBX_FATAL|MBX_ANSI, temp);
+ ui_msgbox(MBX_ERROR | MBX_FATAL | MBX_ANSI, temp);
fflush(stdlog);
@@ -553,6 +553,7 @@ int
pc_init_modules(void)
{
int c, m;
+ wchar_t temp[512];
pc_log("Scanning for ROM images:\n");
c = m = 0;
@@ -568,11 +569,12 @@ pc_init_modules(void)
/* Load the ROMs for the selected machine. */
if (! machine_available(machine)) {
+ swprintf(temp, sizeof(temp), plat_get_string(IDS_2063), machine_getname());
c = 0;
machine = -1;
while (machine_get_internal_name_ex(c) != NULL) {
if (machine_available(c)) {
- ui_msgbox(MBX_INFO, (wchar_t *)IDS_2063);
+ ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2128, temp);
machine = c;
config_save();
break;
@@ -588,11 +590,12 @@ pc_init_modules(void)
/* Make sure we have a usable video card. */
if (! video_card_available(gfxcard)) {
+ swprintf(temp, sizeof(temp), plat_get_string(IDS_2064), video_card_getname(gfxcard));
c = 0;
while (video_get_internal_name(c) != NULL) {
gfxcard = -1;
if (video_card_available(c)) {
- ui_msgbox(MBX_INFO, (wchar_t *)IDS_2064);
+ ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2128, temp);
gfxcard = c;
config_save();
break;
diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c
index 9cfc2a762..b30d955ef 100644
--- a/src/printer/prt_escp.c
+++ b/src/printer/prt_escp.c
@@ -2036,7 +2036,7 @@ escp_init(void *lpt)
if (ft_handle == NULL) {
ft_handle = dynld_module(fn, ft_imports);
if (ft_handle == NULL) {
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2110);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2110, (wchar_t *) IDS_2131);
return(NULL);
}
}
@@ -2044,7 +2044,7 @@ escp_init(void *lpt)
/* Initialize FreeType. */
if (ft_lib == NULL) {
if (ft_Init_FreeType(&ft_lib)) {
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2110);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2110, (wchar_t *) IDS_2131);
dynld_close(ft_lib);
ft_lib = NULL;
return(NULL);
diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c
index b822ff17a..b3d7500d4 100644
--- a/src/printer/prt_ps.c
+++ b/src/printer/prt_ps.c
@@ -352,7 +352,7 @@ ps_init(void *lpt)
/* Try loading the DLL. */
ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL, ghostscript_imports);
if (ghostscript_handle == NULL) {
- ui_msgbox(MBX_ERROR, (wchar_t *) IDS_2114);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2114, (wchar_t *) IDS_2132);
} else {
if (gsapi_revision(&rev, sizeof(rev)) == 0) {
pclog("Loaded %s, rev %ld (%ld)\n", rev.product, rev.revision, rev.revisiondate);
diff --git a/src/sound/midi_fluidsynth.c b/src/sound/midi_fluidsynth.c
index 11c4a8b57..20f64b55a 100644
--- a/src/sound/midi_fluidsynth.c
+++ b/src/sound/midi_fluidsynth.c
@@ -230,7 +230,7 @@ void* fluidsynth_init(const device_t *info)
#endif
if (fluidsynth_handle == NULL)
{
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2080);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2080, (wchar_t *) IDS_2133);
return NULL;
}
diff --git a/src/win/86Box.rc b/src/win/86Box.rc
index 332373ddc..6ceab5ab7 100644
--- a/src/win/86Box.rc
+++ b/src/win/86Box.rc
@@ -163,7 +163,7 @@ BEGIN
#endif
POPUP "&Help"
BEGIN
- MENUITEM "&About 86Box...", IDM_ABOUT
+ MENUITEM "&About " EMU_NAME "...", IDM_ABOUT
END
END
@@ -274,19 +274,6 @@ END
//
// Dialog
//
-DLG_ABOUT DIALOG DISCARDABLE 0, 0, 209, 114
-STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "About 86Box"
-FONT 9, "Segoe UI"
-BEGIN
- DEFPUSHBUTTON "OK",IDOK,129,94,71,12
- ICON 100,IDC_ABOUT_ICON,7,7,20,20
- LTEXT "86Box v" EMU_VERSION " - An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information.",
- IDC_ABOUT_ICON,54,7,146,73
- CONTROL "",IDC_ABOUT_ICON,"Static",SS_BLACKFRAME | SS_SUNKEN,0,
- 86,208,1
-END
-
DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386
STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Status"
@@ -331,7 +318,7 @@ END
DLG_CONFIG DIALOG DISCARDABLE 0, 0, 366, 251
STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "86Box Settings"
+CAPTION EMU_NAME " Settings"
FONT 9, "Segoe UI"
BEGIN
DEFPUSHBUTTON "OK",IDOK,246,230,50,14
@@ -516,7 +503,7 @@ BEGIN
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_HDC,222,25,38,12
- LTEXT "FDC Controller:",IDT_1768,7,44,48,10
+ LTEXT "FD Controller:",IDT_1768,7,44,48,10
COMBOBOX IDC_COMBO_FDC,64,43,155,120,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_FDC,222,43,38,12
@@ -890,27 +877,27 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- 2048 "86Box"
- IDS_2049 "86Box Error"
- IDS_2050 "86Box Fatal Error"
- IDS_2051 "This will hard reset the emulated machine.\nAre you sure you want to save the settings?"
- IDS_2052 "Use CTRL+ALT+PAGE DOWN to return to windowed mode"
+ 2048 EMU_NAME
+ IDS_2049 "Error"
+ IDS_2050 "Fatal error"
+ IDS_2051 "Are you sure you want to save the settings?"
+ IDS_2052 "Press CTRL+ALT+PAGE DOWN to return to windowed mode."
IDS_2053 "Speed"
IDS_2054 "ZIP %03i %i (%s): %ls"
IDS_2055 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0"
- IDS_2056 "86Box could not find any usable ROM images.\n\nPlease download a ROM set from https://github.com/86Box/roms/releases/latest and extract it into the ""roms"" directory."
+ IDS_2056 EMU_NAME " could not find any usable ROM images.\n\nPlease download a ROM set from " EMU_ROMS_URL " and extract it into the ""roms"" directory."
IDS_2057 "(empty)"
IDS_2058 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0"
IDS_2059 "Turbo"
IDS_2060 "On"
IDS_2061 "Off"
IDS_2062 "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_2063 "Configured ROM set not available.\nDefaulting to an available ROM set."
+ IDS_2063 "Machine ""%S"" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine."
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_2064 "Configured video BIOS not available.\nDefaulting to an available video BIOS."
+ IDS_2064 "Video card ""%S"" is not available due to missing ROMs in the roms/video directory. Switching to an available video card."
IDS_2065 "Machine"
IDS_2066 "Display"
IDS_2067 "Input devices"
@@ -930,7 +917,7 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_2080 "Unable to initialize FluidSynth, libfluidsynth.dll is required"
+ IDS_2080 "Unable to initialize FluidSynth"
IDS_2081 "Bus"
IDS_2082 "File"
IDS_2083 "C"
@@ -939,11 +926,11 @@ BEGIN
IDS_2086 "MB"
IDS_2087 "Check BPB"
IDS_2088 "KB"
- IDS_2089 "86Box could not initialize the video renderer."
+ IDS_2089 "Could not initialize the video renderer."
IDS_2090 "Default"
IDS_2091 "%i Wait state(s)"
IDS_2092 "Type"
- IDS_2093 "PCap failed to set up because it may not be initialized"
+ IDS_2093 "Failed to set up PCap"
IDS_2094 "No PCap devices found"
IDS_2095 "Invalid PCap device"
IDS_2096 "Standard 2-button joystick(s)"
@@ -954,21 +941,61 @@ BEGIN
IDS_2101 "Microsoft SideWinder Pad"
IDS_2102 "Thrustmaster Flight Control System"
IDS_2103 "None"
- IDS_2104 "Unable to load Keyboard Accelerators!"
- IDS_2105 "Unable to register Raw Input!"
+ IDS_2104 "Unable to load keyboard accelerators."
+ IDS_2105 "Unable to register raw input."
IDS_2106 "%u"
IDS_2107 "%u MB (CHS: %i, %i, %i)"
IDS_2108 "Floppy %i (%s): %ls"
IDS_2109 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0"
- IDS_2110 "Unable to initialize FreeType, freetype.dll is required"
+ IDS_2110 "Unable to initialize FreeType"
IDS_2111 "Unable to initialize SDL, SDL2.dll is required"
IDS_2112 "Are you sure you want to hard reset the emulated machine?"
- IDS_2113 "Are you sure you want to quit 86Box?"
- IDS_2114 "Unable to initialize Ghostscript, gsdll32.dll is required for automatic convertion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript files (.ps)."
+ IDS_2113 "Are you sure you want to exit " EMU_NAME "?"
+ IDS_2114 "Unable to initialize Ghostscript"
IDS_2115 "MO %i (%03i): %ls"
IDS_2116 "MO images (*.IM?)\0*.IM?\0All files (*.*)\0*.*\0"
- IDS_2117 "Welcome to 86Box!"
- IDS_2118 "Internal controller"
+ IDS_2117 "Welcome to " EMU_NAME "!"
+ IDS_2118 "Internal controller"
+ IDS_2119 "Exit"
+ IDS_2120 "No ROMs found"
+ IDS_2121 "Save changes\nThis will hard reset the emulated machine."
+ IDS_2122 "Discard changes\nAll changes made to the settings will be lost."
+ IDS_2123 "Cancel\nGo back to the Settings window."
+ IDS_2124 "About " EMU_NAME
+ IDS_2125 EMU_NAME " v" EMU_VERSION
+ IDS_2126 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information."
+ IDS_2127 "OK"
+ IDS_2128 "Hardware not available"
+#ifdef _WIN32
+#define LIB_NAME_PCAP "WinPcap"
+#else
+#define LIB_NAME_PCAP "libpcap"
+#endif
+ IDS_2129 "Make sure " LIB_NAME_PCAP " is installed and that you are on a " LIB_NAME_PCAP "-compatible network connection."
+ IDS_2130 "Invalid configuration"
+#ifdef _WIN32
+#define LIB_NAME_FREETYPE "freetype.dll"
+#else
+#define LIB_NAME_FREETYPE "libfreetype"
+#endif
+ IDS_2131 LIB_NAME_FREETYPE " is required for ESC/P printer emulation."
+#ifdef _WIN32
+#define LIB_NAME_GS "gsdll32.dll"
+#else
+#define LIB_NAME_GS "libgs"
+#endif
+ IDS_2132 LIB_NAME_GS " is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files."
+#ifdef _WIN32
+#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll"
+#else
+#define LIB_NAME_FLUIDSYNTH "libfluidsynth"
+#endif
+ IDS_2133 LIB_NAME_FLUIDSYNTH " is required for FluidSynth MIDI output."
+ IDS_2134 "Entering fullscreen mode"
+ IDS_2135 "Don't show this message again"
+ IDS_2136 "Don't Exit"
+ IDS_2137 "Reset"
+ IDS_2138 "Don't Reset"
END
STRINGTABLE DISCARDABLE
@@ -981,16 +1008,24 @@ BEGIN
IDS_4101 "Custom (large)..."
IDS_4102 "Add New Hard Disk"
IDS_4103 "Add Existing Hard Disk"
- IDS_4104 "Attempting to create a HDI image larger than 4 GB"
- IDS_4105 "Attempting to create a hard disk image beyond the 28-bit LBA limit"
+ IDS_4104 "HDI disk images cannot be larger than 4 GB."
+ IDS_4105 "Disk images cannot be larger than 127 GB."
IDS_4106 "Hard disk images (*.HD?;*.IM?;*.VHD)\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 images with a sector size that is not 512 are not supported"
+ IDS_4107 "Unable to read file"
+ IDS_4108 "Unable to write file"
+ IDS_4109 "HDI or HDX images with a sector size other than 512 are not supported."
IDS_4110 "USB is not yet supported"
- IDS_4111 "This image exists and will be overwritten.\nAre you sure you want to use it?"
- IDS_4112 "Please enter a valid file name"
- IDS_4113 "The image has been successfully created."
+ IDS_4111 "Disk image file already exists"
+ IDS_4112 "Please specify a valid file name."
+ IDS_4113 "Disk image created"
+ IDS_4114 "Make sure the file exists and is readable."
+ IDS_4115 "Make sure the file is being saved to a writable directory."
+ IDS_4116 "Disk image too large"
+ IDS_4117 "Remember to partition and format the newly-created drive."
+ IDS_4118 "The selected file will be overwritten. Are you sure you want to use it?"
+ IDS_4119 "Unsupported disk image"
+ IDS_4120 "Overwrite"
+ IDS_4121 "Don't Overwrite"
IDS_4352 "MFM/RLL"
IDS_4353 "XTA"
diff --git a/src/win/win.c b/src/win/win.c
index 9bdb91a56..c109c9b8b 100644
--- a/src/win/win.c
+++ b/src/win/win.c
@@ -789,8 +789,8 @@ plat_setfullscreen(int on)
if (on && video_fullscreen) return;
if (on && video_fullscreen_first) {
- video_fullscreen_first = 0;
- ui_msgbox(MBX_INFO, (wchar_t *)IDS_2052);
+ if (ui_msgbox_header(MBX_INFO | MBX_DONTASK, (wchar_t *) IDS_2134, (wchar_t *) IDS_2052) == 10)
+ video_fullscreen_first = 0;
}
/* OK, claim the video. */
diff --git a/src/win/win_about.c b/src/win/win_about.c
index 0c57c346d..b09efa478 100644
--- a/src/win/win_about.c
+++ b/src/win/win_about.c
@@ -21,6 +21,7 @@
#include
#include
#undef BITMAP
+#include
#include
#include
#include
@@ -31,45 +32,29 @@
#include <86box/win.h>
-#if defined(__amd64__) || defined(__aarch64__)
-static LRESULT CALLBACK
-#else
-static BOOL CALLBACK
-#endif
-AboutDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
- HWND h;
- HANDLE ih;
-
- switch (message) {
- case WM_INITDIALOG:
- plat_pause(1);
- h = GetDlgItem(hdlg, IDC_ABOUT_ICON);
- ih = LoadImage(hinstance,(PCTSTR)10,IMAGE_ICON,64,64,0);
- SendMessage(h, STM_SETIMAGE, (WPARAM)IMAGE_ICON,
- (LPARAM)ih);
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDOK:
- case IDCANCEL:
- EndDialog(hdlg, 0);
- plat_pause(0);
- return TRUE;
-
- default:
- break;
- }
- break;
- }
-
- return(FALSE);
-}
-
-
void
AboutDialogCreate(HWND hwnd)
{
- DialogBox(hinstance, (LPCTSTR)DLG_ABOUT, hwnd, AboutDialogProcedure);
+ int i;
+ TASKDIALOGCONFIG tdconfig = {0};
+ TASKDIALOG_BUTTON tdbuttons[] = {
+ {IDOK, EMU_SITE},
+ {IDCANCEL, MAKEINTRESOURCE(IDS_2127)}
+ };
+
+ tdconfig.cbSize = sizeof(tdconfig);
+ tdconfig.hwndParent = hwnd;
+ tdconfig.hInstance = hinstance;
+ tdconfig.dwCommonButtons = 0;
+ tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_2124);
+ tdconfig.pszMainIcon = (PCWSTR) 10;
+ tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2125);
+ tdconfig.pszContent = MAKEINTRESOURCE(IDS_2126);
+ tdconfig.cButtons = ARRAYSIZE(tdbuttons);
+ tdconfig.pButtons = tdbuttons;
+ tdconfig.nDefaultButton = IDCANCEL;
+ TaskDialogIndirect(&tdconfig, &i, NULL, NULL);
+
+ if (i == IDOK)
+ ShellExecute(hwnd, L"open", L"https://" EMU_SITE, NULL, NULL, SW_SHOW);
}
diff --git a/src/win/win_dialog.c b/src/win/win_dialog.c
index 7844e1c8c..bc8964f95 100644
--- a/src/win/win_dialog.c
+++ b/src/win/win_dialog.c
@@ -34,93 +34,122 @@
#include <86box/win.h>
+
+#define STRING_OR_RESOURCE(s) ((!(s)) ? (NULL) : ((((uintptr_t)s) < ((uintptr_t)65636)) ? (MAKEINTRESOURCE(s)) : (s)))
+
+
WCHAR wopenfilestring[512];
char openfilestring[512];
uint8_t filterindex = 0;
int
-ui_msgbox(int flags, void *arg)
+ui_msgbox(int flags, void *message)
{
- WCHAR temp[512];
- DWORD fl = 0;
- WCHAR *str = NULL;
- WCHAR *cap = NULL;
+ return ui_msgbox_ex(flags, NULL, message, NULL, NULL, NULL);
+}
+
+int
+ui_msgbox_header(int flags, void *header, void *message)
+{
+ return ui_msgbox_ex(flags, header, message, NULL, NULL, NULL);
+}
+
+
+int
+ui_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn2, void *btn3) {
+ WCHAR temp[512];
+ TASKDIALOGCONFIG tdconfig = {0};
+ TASKDIALOG_BUTTON tdbuttons[3],
+ tdb_yes = {IDYES, STRING_OR_RESOURCE(btn1)},
+ tdb_no = {IDNO, STRING_OR_RESOURCE(btn2)},
+ tdb_cancel = {IDCANCEL, STRING_OR_RESOURCE(btn3)},
+ tdb_exit = {IDCLOSE, MAKEINTRESOURCE(IDS_2119)};
+ int ret = 0, checked = 0;
+
+ /* Configure the default OK button. */
+ tdconfig.cButtons = 0;
+ if (btn1)
+ tdbuttons[tdconfig.cButtons++] = tdb_yes;
+ else
+ tdconfig.dwCommonButtons = TDCBF_OK_BUTTON;
+
+ /* Configure the message type. */
switch(flags & 0x1f) {
case MBX_INFO: /* just an informational message */
- fl = (MB_OK | MB_ICONINFORMATION);
- cap = plat_get_string(IDS_STRINGS); /* "86Box" */
+ tdconfig.pszMainIcon = TD_INFORMATION_ICON;
break;
case MBX_ERROR: /* error message */
if (flags & MBX_FATAL) {
- fl = (MB_OK | MB_ICONERROR);
- cap = plat_get_string(IDS_2050); /* "Fatal Error"*/
+ tdconfig.pszMainIcon = TD_ERROR_ICON;
+ tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2050); /* "Fatal error" */
+
+ /* replace default "OK" button with "Exit" button */
+ if (btn1)
+ tdconfig.cButtons = 0;
+ else
+ tdconfig.dwCommonButtons = 0;
+ tdbuttons[tdconfig.cButtons++] = tdb_exit;
} else {
- fl = (MB_OK | MB_ICONWARNING);
- cap = plat_get_string(IDS_2049); /* "Error" */
+ tdconfig.pszMainIcon = TD_WARNING_ICON;
+ tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2049); /* "Error" */
}
break;
case MBX_QUESTION: /* question */
- fl = (MB_YESNOCANCEL | MB_ICONQUESTION);
- cap = plat_get_string(IDS_STRINGS); /* "86Box" */
- break;
+ case MBX_QUESTION_YN:
+ if (!btn1) /* replace default "OK" button with "Yes" button */
+ tdconfig.dwCommonButtons = TDCBF_YES_BUTTON;
- case MBX_QUESTION_YN: /* question */
- fl = (MB_YESNO | MB_ICONQUESTION);
- cap = plat_get_string(IDS_STRINGS); /* "86Box" */
+ if (btn2) /* "No" button */
+ tdbuttons[tdconfig.cButtons++] = tdb_no;
+ else
+ tdconfig.dwCommonButtons |= TDCBF_NO_BUTTON;
+
+ if (flags & MBX_QUESTION) {
+ if (btn3) /* "Cancel" button */
+ tdbuttons[tdconfig.cButtons++] = tdb_cancel;
+ else
+ tdconfig.dwCommonButtons |= TDCBF_CANCEL_BUTTON;
+ }
break;
}
- /* If ANSI string, convert it. */
- str = (WCHAR *)arg;
+ /* If the message is an ANSI string, convert it. */
+ tdconfig.pszContent = (WCHAR *) STRING_OR_RESOURCE(message);
if (flags & MBX_ANSI) {
- mbstowcs(temp, (char *)arg, strlen((char *)arg)+1);
- str = temp;
- } else {
- /*
- * It's a Unicode string.
- *
- * Well, no, maybe not. It could also be one of the
- * strings stored in the Resources. Those are wide,
- * but referenced by a numeric ID.
- *
- * The good news is, that strings are usually stored
- * in the executable near the end of the code/rodata
- * segment. This means, that *real* string pointers
- * usually have a pretty high (numeric) value, much
- * higher than the numeric ID's. So, we guesswork
- * that if the value of 'arg' is low, its an ID..
- */
- if (((uintptr_t)arg) < ((uintptr_t)65636))
- str = plat_get_string((intptr_t)arg);
+ mbstowcs(temp, (char *)message, strlen((char *)message)+1);
+ tdconfig.pszContent = temp;
}
- /* At any rate, we do have a valid (wide) string now. */
- fl = MessageBox(hwndMain, /* our main window */
- str, /* error message etc */
- cap, /* window caption */
- fl);
+ /* Configure the rest of the TaskDialog. */
+ tdconfig.cbSize = sizeof(tdconfig);
+ tdconfig.hwndParent = hwndMain;
+ if (flags & MBX_LINKS)
+ tdconfig.dwFlags = TDF_USE_COMMAND_LINKS;
+ tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_STRINGS);
+ if (header)
+ tdconfig.pszMainInstruction = STRING_OR_RESOURCE(header);
+ tdconfig.pButtons = tdbuttons;
+ if (flags & MBX_DONTASK)
+ tdconfig.pszVerificationText = MAKEINTRESOURCE(IDS_2135);
+
+ /* Run the TaskDialog. */
+ TaskDialogIndirect(&tdconfig, &ret, NULL, &checked);
/* Convert return values to generic ones. */
- if (fl == IDNO) fl = 1;
- else if (fl == IDCANCEL) fl = -1;
- else fl = 0;
+ if (ret == IDNO) ret = 1;
+ else if (ret == IDCANCEL) ret = -1;
+ else ret = 0;
- return(fl);
+ if (checked) ret += 10;
+
+ return(ret);
}
-#if 0
-int
-msgbox_reset_yn(HWND hwnd)
-{
- return(MessageBox(hwnd, plat_get_string(IDS_2051),
-#endif
-
-
int
file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, int save)
{
diff --git a/src/win/win_media_menu.c b/src/win/win_media_menu.c
index fe3d6153d..6340d36b4 100644
--- a/src/win/win_media_menu.c
+++ b/src/win/win_media_menu.c
@@ -429,7 +429,7 @@ media_menu_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
plat_pause(1);
ret = d86f_export(id, wopenfilestring);
if (!ret)
- ui_msgbox(MBX_ERROR, (wchar_t *)IDS_4108);
+ ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_4108, (wchar_t *) IDS_4115);
plat_pause(0);
}
break;
diff --git a/src/win/win_new_floppy.c b/src/win/win_new_floppy.c
index 78c51b497..33c83299f 100644
--- a/src/win/win_new_floppy.c
+++ b/src/win/win_new_floppy.c
@@ -515,7 +515,7 @@ static wchar_t fd_file_name[1024];
/* Show a MessageBox dialog. This is nasty, I know. --FvK */
static int
-new_floppy_msgbox(HWND hwnd, int type, void *arg)
+new_floppy_msgbox_header(HWND hwnd, int flags, void *header, void *message)
{
HWND h;
int i;
@@ -523,7 +523,24 @@ new_floppy_msgbox(HWND hwnd, int type, void *arg)
h = hwndMain;
hwndMain = hwnd;
- i = ui_msgbox(type, arg);
+ i = ui_msgbox_header(flags, header, message);
+
+ hwndMain = h;
+
+ return(i);
+}
+
+
+static int
+new_floppy_msgbox_ex(HWND hwnd, int flags, void *header, void *message, void *btn1, void *btn2, void *btn3)
+{
+ HWND h;
+ int i;
+
+ h = hwndMain;
+ hwndMain = hwnd;
+
+ i = ui_msgbox_ex(flags, header, message, btn1, btn2, btn3);
hwndMain = h;
@@ -607,7 +624,7 @@ NewFloppyDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
//ui_sb_mount_floppy_img(fdd_id, sb_part, 0, fd_file_name);
floppy_mount(fdd_id, fd_file_name, 0);
} else {
- new_floppy_msgbox(hdlg, MBX_ERROR, (wchar_t *)IDS_4108);
+ new_floppy_msgbox_header(hdlg, MBX_ERROR, (wchar_t *) IDS_4108, (wchar_t *) IDS_4115);
return TRUE;
}
/*FALLTHROUGH*/
@@ -637,7 +654,7 @@ NewFloppyDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
f = _wfopen(wopenfilestring, L"rb");
if (f != NULL) {
fclose(f);
- if (new_floppy_msgbox(hdlg, MBX_QUESTION, (wchar_t *)IDS_4111) != 0) /* yes */
+ if (new_floppy_msgbox_ex(hdlg, MBX_QUESTION, (wchar_t *) IDS_4111, (wchar_t *) IDS_4118, (wchar_t *) IDS_4120, (wchar_t *) IDS_4121, NULL) != 0) /* yes */
return FALSE;
}
SendMessage(h, WM_SETTEXT, 0, (LPARAM) wopenfilestring);
diff --git a/src/win/win_settings.c b/src/win/win_settings.c
index 3ddd0dffb..a908ef64d 100644
--- a/src/win/win_settings.c
+++ b/src/win/win_settings.c
@@ -178,7 +178,7 @@ image_list_init(HWND hwndList, const uint8_t *icon_ids)
/* Show a MessageBox dialog. This is nasty, I know. --FvK */
static int
-settings_msgbox(int type, void *arg)
+settings_msgbox_header(int flags, void *header, void *message)
{
HWND h;
int i;
@@ -186,7 +186,24 @@ settings_msgbox(int type, void *arg)
h = hwndMain;
hwndMain = hwndParentDialog;
- i = ui_msgbox(type, arg);
+ i = ui_msgbox_header(flags, header, message);
+
+ hwndMain = h;
+
+ return(i);
+}
+
+
+static int
+settings_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn2, void *btn3)
+{
+ HWND h;
+ int i;
+
+ h = hwndMain;
+ hwndMain = hwndParentDialog;
+
+ i = ui_msgbox_ex(flags, header, message, btn1, btn2, btn3);
hwndMain = h;
@@ -396,15 +413,21 @@ static int
settings_msgbox_reset(void)
{
int changed, i = 0;
+ HWND h;
changed = win_settings_changed();
if (changed) {
- i = settings_msgbox(MBX_QUESTION, (wchar_t *)IDS_2051);
+ h = hwndMain;
+ hwndMain = hwndParentDialog;
+
+ i = ui_msgbox_ex(MBX_QUESTION | MBX_LINKS, (wchar_t *) IDS_2051, NULL, (wchar_t *) IDS_2121, (wchar_t *) IDS_2122, (wchar_t *) IDS_2123);
+
+ hwndMain = h;
if (i == 1) return(1); /* no */
- if (i < 0) return(0); /* cancel */
+ if (i == -1) return(0); /* cancel */
return(2); /* yes */
} else
@@ -2862,7 +2885,7 @@ win_settings_hard_disks_add_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
/* Make sure no file name is allowed with removable SCSI hard disks. */
if (wcslen(hd_file_name) == 0) {
hdd_ptr->bus = HDD_BUS_DISABLED;
- settings_msgbox(MBX_ERROR, (wchar_t *)IDS_4112);
+ settings_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2130, (wchar_t *) IDS_4112);
return TRUE;
}
@@ -2906,14 +2929,14 @@ win_settings_hard_disks_add_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
if (size > 0x1FFFFFFE00ll) {
fclose(f);
- settings_msgbox(MBX_ERROR, (wchar_t *)IDS_4105);
+ settings_msgbox_header(MBX_ERROR, (wchar_t *) IDS_4116, (wchar_t *) IDS_4105);
return TRUE;
}
if (image_is_hdi(hd_file_name)) {
if (size >= 0x100000000ll) {
fclose(f);
- settings_msgbox(MBX_ERROR, (wchar_t *)IDS_4104);
+ settings_msgbox_header(MBX_ERROR, (wchar_t *) IDS_4116, (wchar_t *) IDS_4104);
return TRUE;
}
@@ -3008,7 +3031,7 @@ win_settings_hard_disks_add_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
free(big_buf);
fclose(f);
- settings_msgbox(MBX_INFO, (wchar_t *)IDS_4113);
+ settings_msgbox_header(MBX_INFO, (wchar_t *) IDS_4113, (wchar_t *) IDS_4117);
}
hard_disk_added = 1;
@@ -3037,7 +3060,7 @@ win_settings_hard_disks_add_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
f = _wfopen(wopenfilestring, L"rb");
if (f != NULL) {
fclose(f);
- if (settings_msgbox(MBX_QUESTION, (wchar_t *)IDS_4111) != 0) /* yes */
+ if (settings_msgbox_ex(MBX_QUESTION_YN, (wchar_t *) IDS_4111, (wchar_t *) IDS_4118, (wchar_t *) IDS_4120, (wchar_t *) IDS_4121, NULL) != 0) /* yes */
return FALSE;
}
}
@@ -3046,7 +3069,7 @@ win_settings_hard_disks_add_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
if (f == NULL) {
hdd_add_file_open_error:
fclose(f);
- settings_msgbox(MBX_ERROR, (existing & 1) ? (wchar_t *)IDS_4107 : (wchar_t *)IDS_4108);
+ settings_msgbox_header(MBX_ERROR, (existing & 1) ? (wchar_t *) IDS_4114 : (wchar_t *) IDS_4115, (existing & 1) ? (wchar_t *) IDS_4107 : (wchar_t *) IDS_4108);
return TRUE;
}
if (existing & 1) {
@@ -3054,7 +3077,7 @@ hdd_add_file_open_error:
fseeko64(f, 0x10, SEEK_SET);
fread(§or_size, 1, 4, f);
if (sector_size != 512) {
- settings_msgbox(MBX_ERROR, (wchar_t *)IDS_4109);
+ settings_msgbox_header(MBX_ERROR, (wchar_t *) IDS_4119, (wchar_t *) IDS_4109);
fclose(f);
return TRUE;
}
diff --git a/src/win/win_ui.c b/src/win/win_ui.c
index 1dfc57527..b2f01e215 100644
--- a/src/win/win_ui.c
+++ b/src/win/win_ui.c
@@ -312,7 +312,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case IDM_ACTION_HRESET:
win_notify_dlg_open();
- i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2112);
+ i = ui_msgbox_ex(MBX_QUESTION_YN, (wchar_t *) IDS_2112, NULL, (wchar_t *) IDS_2137, (wchar_t *) IDS_2138, NULL);
if (i == 0)
pc_reset_hard();
win_notify_dlg_closed();
@@ -327,7 +327,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
if (no_quit_confirm)
i = 0;
else
- i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2113);
+ i = ui_msgbox_ex(MBX_QUESTION_YN, (wchar_t *) IDS_2113, NULL, (wchar_t *) IDS_2119, (wchar_t *) IDS_2136, NULL);
if (i == 0) {
UnhookWindowsHookEx(hKeyboardHook);
KillTimer(hwnd, TIMER_1SEC);
@@ -695,7 +695,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
if (no_quit_confirm)
i = 0;
else
- i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2113);
+ i = ui_msgbox_ex(MBX_QUESTION_YN, (wchar_t *) IDS_2113, NULL, (wchar_t *) IDS_2119, (wchar_t *) IDS_2136, NULL);
if (i == 0) {
UnhookWindowsHookEx(hKeyboardHook);
KillTimer(hwnd, TIMER_1SEC);
@@ -731,7 +731,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
if (manager_wm)
break;
win_notify_dlg_open();
- i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2112);
+ i = ui_msgbox_ex(MBX_QUESTION_YN, (wchar_t *) IDS_2112, NULL, (wchar_t *) IDS_2137, (wchar_t *) IDS_2138, NULL);
if (i == 0)
pc_reset_hard();
win_notify_dlg_closed();
@@ -744,7 +744,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
if (no_quit_confirm)
i = 0;
else
- i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2113);
+ i = ui_msgbox_ex(MBX_QUESTION_YN, (wchar_t *) IDS_2113, NULL, (wchar_t *) IDS_2119, (wchar_t *) IDS_2136, NULL);
if (i == 0) {
UnhookWindowsHookEx(hKeyboardHook);
KillTimer(hwnd, TIMER_1SEC);
@@ -819,6 +819,20 @@ SubWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
}
+static HRESULT CALLBACK
+TaskDialogProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LONG_PTR lpRefData)
+{
+ switch (message) {
+ case TDN_HYPERLINK_CLICKED:
+ /* open linked URL */
+ ShellExecute(hwnd, L"open", (LPCWSTR) lParam, NULL, NULL, SW_SHOW);
+ break;
+ }
+
+ return S_OK;
+}
+
+
int
ui_init(int nCmdShow)
{
@@ -826,18 +840,31 @@ ui_init(int nCmdShow)
WNDCLASSEX wincl; /* buffer for main window's class */
RAWINPUTDEVICE ridev; /* RawInput device */
MSG messages; /* received-messages buffer */
- HWND hwnd = NULL; /* handle for our window */
+ HWND hwnd = NULL; /* handle for our window */
HACCEL haccel; /* handle to accelerator table */
- RECT sbar_rect; /* RECT of the status bar */
+ RECT sbar_rect; /* RECT of the status bar */
int bRet;
+ TASKDIALOGCONFIG tdconfig = {0};
+ TASKDIALOG_BUTTON tdbuttons[] = {{IDCANCEL, MAKEINTRESOURCE(IDS_2119)}};
+ /* Set up TaskDialog configuration. */
+ tdconfig.cbSize = sizeof(tdconfig);
+ tdconfig.dwFlags = TDF_ENABLE_HYPERLINKS;
+ tdconfig.dwCommonButtons = 0;
+ tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_STRINGS);
+ tdconfig.pszMainIcon = TD_ERROR_ICON;
+ tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2050);
+ tdconfig.cButtons = ARRAYSIZE(tdbuttons);
+ tdconfig.pButtons = tdbuttons;
+ tdconfig.pfCallback = TaskDialogProcedure;
+
+ /* Start settings-only mode if requested. */
if (settings_only) {
if (! pc_init_modules()) {
/* Dang, no ROMs found at all! */
- MessageBox(hwnd,
- plat_get_string(IDS_2056),
- plat_get_string(IDS_2050),
- MB_OK | MB_ICONERROR);
+ tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2120);
+ tdconfig.pszContent = MAKEINTRESOURCE(IDS_2056);
+ TaskDialogIndirect(&tdconfig, NULL, NULL, NULL);
return(6);
}
@@ -895,7 +922,7 @@ ui_init(int nCmdShow)
menuMain, /* menu */
hinstance, /* Program Instance handler */
NULL); /* no Window Creation data */
- hwndMain = hwnd;
+ hwndMain = tdconfig.hwndParent = hwnd;
ui_window_title(title);
@@ -925,10 +952,8 @@ ui_init(int nCmdShow)
ridev.dwFlags = RIDEV_NOHOTKEYS;
ridev.hwndTarget = NULL; /* current focus window */
if (! RegisterRawInputDevices(&ridev, 1, sizeof(ridev))) {
- MessageBox(hwndMain,
- plat_get_string(IDS_2105),
- plat_get_string(IDS_2050),
- MB_OK | MB_ICONERROR);
+ tdconfig.pszContent = MAKEINTRESOURCE(IDS_2105);
+ TaskDialogIndirect(&tdconfig, NULL, NULL, NULL);
return(4);
}
keyboard_getkeymap();
@@ -939,10 +964,8 @@ ui_init(int nCmdShow)
/* Load the accelerator table */
haccel = LoadAccelerators(hinstance, ACCEL_NAME);
if (haccel == NULL) {
- MessageBox(hwndMain,
- plat_get_string(IDS_2104),
- plat_get_string(IDS_2050),
- MB_OK | MB_ICONERROR);
+ tdconfig.pszContent = MAKEINTRESOURCE(IDS_2104);
+ TaskDialogIndirect(&tdconfig, NULL, NULL, NULL);
return(3);
}
@@ -972,19 +995,16 @@ ui_init(int nCmdShow)
/* All done, fire up the actual emulated machine. */
if (! pc_init_modules()) {
/* Dang, no ROMs found at all! */
- MessageBox(hwnd,
- plat_get_string(IDS_2056),
- plat_get_string(IDS_2050),
- MB_OK | MB_ICONERROR);
+ tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2120);
+ tdconfig.pszContent = MAKEINTRESOURCE(IDS_2056);
+ TaskDialogIndirect(&tdconfig, NULL, NULL, NULL);
return(6);
}
/* Initialize the configured Video API. */
if (! plat_setvid(vid_api)) {
- MessageBox(hwnd,
- plat_get_string(IDS_2089),
- plat_get_string(IDS_2050),
- MB_OK | MB_ICONERROR);
+ tdconfig.pszContent = MAKEINTRESOURCE(IDS_2089);
+ TaskDialogIndirect(&tdconfig, NULL, NULL, NULL);
return(5);
}