From 81bc032b00e1f2cff852acc60e6f901cc4e122be Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 29 Dec 2021 09:48:56 +0500 Subject: [PATCH 01/62] Handle the internal name change for the S3 ViRGE/GX (formerly ViRGE/DX VBE 2.0) --- src/config.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index bda66d417..6c5e4e0b5 100644 --- a/src/config.c +++ b/src/config.c @@ -888,7 +888,10 @@ load_video(void) } free_p = 1; } - gfxcard = video_get_video_from_internal_name(p); + if (!strcmp(p, "virge375_vbe20_pci")) /* migrate renamed cards */ + gfxcard = video_get_video_from_internal_name("virge385_pci"); + else + gfxcard = video_get_video_from_internal_name(p); if (free_p) free(p); } From 00640bdc44b87e3c0b5422140fc95012a293cf09 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 29 Dec 2021 09:49:38 +0500 Subject: [PATCH 02/62] Fix a typo in CH Flightstick Pro's internal name --- src/config.c | 4 +++- src/game/gameport.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 6c5e4e0b5..c37d0b18b 100644 --- a/src/config.c +++ b/src/config.c @@ -917,7 +917,7 @@ load_input_devices(void) p = config_get_string(cat, "joystick_type", NULL); if (p != NULL) { - if (!strcmp(p, "standard_2button")) + if (!strcmp(p, "standard_2button")) /* migrate renamed types */ joystick_type = joystick_get_from_internal_name("2axis_2button"); else if (!strcmp(p, "standard_4button")) joystick_type = joystick_get_from_internal_name("2axis_4button"); @@ -925,6 +925,8 @@ load_input_devices(void) joystick_type = joystick_get_from_internal_name("2axis_6button"); else if (!strcmp(p, "standard_8button")) joystick_type = joystick_get_from_internal_name("2axis_8button"); + else if (!strcmp(p, "ch_flighstick_pro")) + joystick_type = joystick_get_from_internal_name("ch_flightstick_pro"); joystick_type = joystick_get_from_internal_name(p); if (!joystick_type) { diff --git a/src/game/gameport.c b/src/game/gameport.c index 145262278..0d48444fd 100644 --- a/src/game/gameport.c +++ b/src/game/gameport.c @@ -88,7 +88,7 @@ static const struct { { "3axis_2button", &joystick_3axis_2button }, { "3axis_4button", &joystick_3axis_4button }, { "4axis_4button", &joystick_4axis_4button }, - { "ch_flighstick_pro", &joystick_ch_flightstick_pro }, + { "ch_flightstick_pro", &joystick_ch_flightstick_pro }, { "sidewinder_pad", &joystick_sw_pad }, { "thrustmaster_fcs", &joystick_tm_fcs }, { "", NULL } From 29595ce4f774cb81eb5fc4843bb7644d599f97f8 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 29 Dec 2021 09:51:42 +0500 Subject: [PATCH 03/62] Fix joystick type migration not working as intended Map legacy integer-based joystick type options directly --- src/config.c | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/config.c b/src/config.c index c37d0b18b..08326da71 100644 --- a/src/config.c +++ b/src/config.c @@ -927,21 +927,41 @@ load_input_devices(void) joystick_type = joystick_get_from_internal_name("2axis_8button"); else if (!strcmp(p, "ch_flighstick_pro")) joystick_type = joystick_get_from_internal_name("ch_flightstick_pro"); + else + joystick_type = joystick_get_from_internal_name(p); - joystick_type = joystick_get_from_internal_name(p); if (!joystick_type) { /* Try to read an integer for backwards compatibility with old configs */ - c = config_get_int(cat, "joystick_type", 8); - switch (c) { - case 0: case 1: case 2: case 3: /* 2-axis joysticks */ - joystick_type = c + 1; - break; - case 4: case 5: case 6: case 7: /* other joysticks */ - joystick_type = c + 3; - break; - default: /* "None" (8) or invalid value */ - joystick_type = 0; - break; + if (!strcmp(p, "0")) /* workaround for config_get_int returning 0 on non-integer data */ + joystick_type = joystick_get_from_internal_name("2axis_2button"); + else { + c = config_get_int(cat, "joystick_type", 8); + switch (c) { + case 1: + joystick_type = joystick_get_from_internal_name("2axis_4button"); + break; + case 2: + joystick_type = joystick_get_from_internal_name("2axis_6button"); + break; + case 3: + joystick_type = joystick_get_from_internal_name("2axis_8button"); + break; + case 4: + joystick_type = joystick_get_from_internal_name("4axis_4button"); + break; + case 5: + joystick_type = joystick_get_from_internal_name("ch_flightstick_pro"); + break; + case 6: + joystick_type = joystick_get_from_internal_name("sidewinder_pad"); + break; + case 7: + joystick_type = joystick_get_from_internal_name("thrustmaster_fcs"); + break; + default: + joystick_type = 0; + break; + } } } } else From bc26bc3ea64241d426a3b271c133b2a498ba9abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Wed, 29 Dec 2021 17:39:56 +0100 Subject: [PATCH 04/62] [opti495] fix read/writes to the scratch area --- src/chipset/opti495.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/chipset/opti495.c b/src/chipset/opti495.c index 5d2313ef9..20dc23bc5 100644 --- a/src/chipset/opti495.c +++ b/src/chipset/opti495.c @@ -151,8 +151,10 @@ opti495_write(uint16_t addr, uint8_t val, void *priv) break; case 0xe1: + dev->scratch[0] = val; + break; case 0xe2: - dev->scratch[addr] = val; + dev->scratch[1] = val; break; } } @@ -175,8 +177,10 @@ opti495_read(uint16_t addr, void *priv) } break; case 0xe1: + ret = dev->scratch[0]; + break; case 0xe2: - ret = dev->scratch[addr]; + ret = dev->scratch[1]; break; } From abacd105b2ac1c4c92247e195f7ff6a76563875e Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 29 Dec 2021 18:00:01 +0100 Subject: [PATCH 05/62] OPTi 49x scratch register writes no longer write out of the array's bounds. --- src/chipset/opti495.c | 4 ++-- src/chipset/opti499.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/chipset/opti495.c b/src/chipset/opti495.c index 5d2313ef9..cdde85300 100644 --- a/src/chipset/opti495.c +++ b/src/chipset/opti495.c @@ -152,7 +152,7 @@ opti495_write(uint16_t addr, uint8_t val, void *priv) case 0xe1: case 0xe2: - dev->scratch[addr] = val; + dev->scratch[~addr & 0x01] = val; break; } } @@ -176,7 +176,7 @@ opti495_read(uint16_t addr, void *priv) break; case 0xe1: case 0xe2: - ret = dev->scratch[addr]; + ret = dev->scratch[~addr & 0x01]; break; } diff --git a/src/chipset/opti499.c b/src/chipset/opti499.c index 87bc39c8d..1768908a4 100644 --- a/src/chipset/opti499.c +++ b/src/chipset/opti499.c @@ -162,7 +162,7 @@ opti499_write(uint16_t addr, uint8_t val, void *priv) break; case 0xe1: case 0xe2: - dev->scratch[addr] = val; + dev->scratch[~addr & 0x01] = val; break; } } @@ -189,7 +189,7 @@ opti499_read(uint16_t addr, void *priv) break; case 0xe1: case 0xe2: - ret = dev->scratch[addr]; + ret = dev->scratch[~addr & 0x01]; break; } From 31067d63a077e8d0fc88aaf72d6bfca4be8ab523 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 29 Dec 2021 18:45:07 +0100 Subject: [PATCH 06/62] The Image Manager 1024 no longer does a double free. --- src/include/86box/vid_pgc.h | 1 + src/video/vid_im1024.c | 2 +- src/video/vid_pgc.c | 11 ++++++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/include/86box/vid_pgc.h b/src/include/86box/vid_pgc.h index 1a179a775..ecfc61c2b 100644 --- a/src/include/86box/vid_pgc.h +++ b/src/include/86box/vid_pgc.h @@ -133,6 +133,7 @@ extern void pgc_wake(pgc_t *); extern void pgc_sleep(pgc_t *); extern void pgc_setdisplay(pgc_t *, int cga); extern void pgc_speed_changed(void *priv); +extern void pgc_close_common(void *priv); extern void pgc_close(void *priv); extern void pgc_init(pgc_t *, int maxw, int maxh, int visw, int vish, diff --git a/src/video/vid_im1024.c b/src/video/vid_im1024.c index a1fe6491d..aebc95a5d 100644 --- a/src/video/vid_im1024.c +++ b/src/video/vid_im1024.c @@ -1007,7 +1007,7 @@ im1024_close(void *priv) { im1024_t *dev = (im1024_t *)priv; - pgc_close(&dev->pgc); + pgc_close_common(&dev->pgc); free(dev); } diff --git a/src/video/vid_pgc.c b/src/video/vid_pgc.c index 32e8b31ac..47b4a4541 100644 --- a/src/video/vid_pgc.c +++ b/src/video/vid_pgc.c @@ -2600,7 +2600,7 @@ pgc_speed_changed(void *priv) void -pgc_close(void *priv) +pgc_close_common(void *priv) { pgc_t *dev = (pgc_t *)priv; @@ -2633,6 +2633,15 @@ pgc_close(void *priv) free(dev->cga_vram); if (dev->vram) free(dev->vram); +} + + +void +pgc_close(void *priv) +{ + pgc_t *dev = (pgc_t *)priv; + + pgc_close_common(priv); free(dev); } From d042648dbe6a10e0995bbc9cf17eac425fc13c7f Mon Sep 17 00:00:00 2001 From: dob205 Date: Wed, 29 Dec 2021 20:33:11 +0100 Subject: [PATCH 07/62] Adjusts the macOS specific CMakeLists.txt This should fix the icon setting for macOS bundle for potential Jenkins builds in the future. --- src/mac/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mac/CMakeLists.txt b/src/mac/CMakeLists.txt index 91759690f..f8891cf69 100644 --- a/src/mac/CMakeLists.txt +++ b/src/mac/CMakeLists.txt @@ -18,11 +18,11 @@ # # Pick the bundle icon depending on the release channel -if(RELEASE_BUILD) +if(BUILD_TYPE STREQUAL "release") set(APP_ICON_MACOSX icons/release/86Box.icns) -elseif(BETA_BUILD) +elseif(BUILD_TYPE STREQUAL "beta") set(APP_ICON_MACOSX icons/beta/86Box.icns) -elseif(ALPHA_BUILD) +elseif(BUILD_TYPE STREQUAL "alpha") set(APP_ICON_MACOSX icons/dev/86Box.icns) else() set(APP_ICON_MACOSX icons/branch/86Box.icns) @@ -50,4 +50,4 @@ set_target_properties(86Box #set(XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "YES") #set(XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "-") -#set(XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/mac/codesign/dev/app.entitlements) \ No newline at end of file +#set(XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/mac/codesign/dev/app.entitlements) From 394768f5acf66ad76e62106534ac9870c3b31ec7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 29 Dec 2021 20:53:32 +0100 Subject: [PATCH 08/62] In default mode, the SDL2 renderers now use UpdateTexture(). --- src/include/86box/plat.h | 1 + src/win/win.c | 8 ++++++++ src/win/win_sdl.c | 40 +++++++++++++++++++++++++++++++++++++++- src/win/win_ui.c | 2 ++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 78795d757..3a605fe6b 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -126,6 +126,7 @@ extern void plat_vidsize(int x, int y); extern void plat_setfullscreen(int on); extern void plat_resize(int x, int y); extern void plat_vidapi_enable(int enabled); +extern void plat_vidapi_reload(void); extern void plat_vid_reload_options(void); extern uint32_t plat_language_code(char* langcode); extern void plat_language_code_r(uint32_t lcid, char* outbuf, int len); diff --git a/src/win/win.c b/src/win/win.c index 7f35f6d0b..27386b5b7 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -1194,6 +1194,14 @@ plat_vid_reload_options(void) vid_apis[vid_api].reload(); } + +void +plat_vidapi_reload(void) +{ + vid_apis[vid_api].reload(); +} + + /* Sets up the program language before initialization. */ uint32_t plat_language_code(char* langcode) diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index 3a898f43c..11315c3b5 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -230,6 +230,42 @@ sdl_stretch(int *w, int *h, int *x, int *y) static void sdl_blit(int x, int y, int w, int h) +{ + SDL_Rect r_src; + int ret; + + if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) { + video_blit_complete(); + return; + } + + SDL_LockMutex(sdl_mutex); + + r_src.x = x; + r_src.y = y; + r_src.w = w; + r_src.h = h; + SDL_UpdateTexture(sdl_tex, &r_src, &(buffer32->line[y][x]), 2048 * sizeof(uint32_t)); + video_blit_complete(); + + SDL_RenderClear(sdl_render); + + r_src.x = x; + r_src.y = y; + r_src.w = w; + r_src.h = h; + + ret = SDL_RenderCopy(sdl_render, sdl_tex, &r_src, 0); + if (ret) + sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError()); + + SDL_RenderPresent(sdl_render); + SDL_UnlockMutex(sdl_mutex); +} + + +static void +sdl_blit_ex(int x, int y, int w, int h) { SDL_Rect r_src; void *pixeldata; @@ -478,7 +514,7 @@ sdl_init_common(int flags) atexit(sdl_close); /* Register our renderer! */ - video_setblit(sdl_blit); + video_setblit((video_grayscale || invert_display) ? sdl_blit_ex : sdl_blit); sdl_enabled = 1; sdl_mutex = SDL_CreateMutex(); @@ -582,4 +618,6 @@ sdl_reload(void) SDL_UnlockMutex(sdl_mutex); } + + video_setblit((video_grayscale || invert_display) ? sdl_blit_ex : sdl_blit); } diff --git a/src/win/win_ui.c b/src/win/win_ui.c index f2d00ef1c..40f9068b0 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -805,6 +805,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_VID_INVERT: video_toggle_option(hmenu, &invert_display, IDM_VID_INVERT); video_copy = (video_grayscale || invert_display) ? video_transform_copy : memcpy; + plat_vidapi_reload(); break; case IDM_VID_OVERSCAN: @@ -838,6 +839,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) CheckMenuItem(hmenu, IDM_VID_GRAY_RGB+video_grayscale, MF_UNCHECKED); video_grayscale = LOWORD(wParam) - IDM_VID_GRAY_RGB; video_copy = (video_grayscale || invert_display) ? video_transform_copy : memcpy; + plat_vidapi_reload(); CheckMenuItem(hmenu, IDM_VID_GRAY_RGB+video_grayscale, MF_CHECKED); device_force_redraw(); config_save(); From c982f0ac89522089735c3028b45c0b42a0c00e75 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 29 Dec 2021 23:41:10 +0100 Subject: [PATCH 09/62] Fixed taking screenshots with effects off. --- src/win/win_sdl.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index 11315c3b5..4fc735a1c 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -246,6 +246,10 @@ sdl_blit(int x, int y, int w, int h) r_src.w = w; r_src.h = h; SDL_UpdateTexture(sdl_tex, &r_src, &(buffer32->line[y][x]), 2048 * sizeof(uint32_t)); + + if (screenshots) + video_screenshot((uint32_t *) buffer32->dat, x, y, 2048); + video_blit_complete(); SDL_RenderClear(sdl_render); From 4361199fa627ddb5a4e8a205080b61351f8ef263 Mon Sep 17 00:00:00 2001 From: dob205 Date: Wed, 29 Dec 2021 23:42:42 +0100 Subject: [PATCH 10/62] Revert "Adjusts the macOS specific CMakeLists.txt" This reverts commit d042648dbe6a10e0995bbc9cf17eac425fc13c7f. --- src/mac/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mac/CMakeLists.txt b/src/mac/CMakeLists.txt index f8891cf69..91759690f 100644 --- a/src/mac/CMakeLists.txt +++ b/src/mac/CMakeLists.txt @@ -18,11 +18,11 @@ # # Pick the bundle icon depending on the release channel -if(BUILD_TYPE STREQUAL "release") +if(RELEASE_BUILD) set(APP_ICON_MACOSX icons/release/86Box.icns) -elseif(BUILD_TYPE STREQUAL "beta") +elseif(BETA_BUILD) set(APP_ICON_MACOSX icons/beta/86Box.icns) -elseif(BUILD_TYPE STREQUAL "alpha") +elseif(ALPHA_BUILD) set(APP_ICON_MACOSX icons/dev/86Box.icns) else() set(APP_ICON_MACOSX icons/branch/86Box.icns) @@ -50,4 +50,4 @@ set_target_properties(86Box #set(XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "YES") #set(XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "-") -#set(XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/mac/codesign/dev/app.entitlements) +#set(XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/mac/codesign/dev/app.entitlements) \ No newline at end of file From b56b721650eaa3caccbbec11e48802705c7a0cf7 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 2 Jan 2022 20:02:33 +0300 Subject: [PATCH 11/62] =?UTF-8?q?=D0=9F=D0=B0=D1=80=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20//=20A=20couple=20of=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/win/languages/ru-RU.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 36ebf4ee3..413b0c5f3 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -481,8 +481,8 @@ BEGIN IDS_2121 "Хотите ли вы сохранить настройки?" IDS_2122 "Это приведет к холодной перезагрузке эмулируемой машины." IDS_2123 "Сохранить" - IDS_2124 "О программе 86Box" - IDS_2125 "86Box v" EMU_VERSION + IDS_2124 "О 86Box" + IDS_2125 "86Box v." EMU_VERSION IDS_2126 "Эмулятор старых компьютеров\n\nАвторы: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nВыпускается под лицензией GNU General Public License версии 2 или более поздней. Дополнительную информацию см. в файле LICENSE." IDS_2127 "OK" From f3758c065828787f7bf0393583cf7e32714bded2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sun, 2 Jan 2022 23:27:06 +0100 Subject: [PATCH 12/62] Update hu-HU.rc --- src/win/languages/hu-HU.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 3a8dfe756..731ef0e42 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -532,8 +532,8 @@ BEGIN IDS_2149 "Magnókazetta-képek (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Minden fájl (*.*)\0*.*\0" IDS_2150 "ROM-kazetta %i: %ls" IDS_2151 "ROM-kazetta képek (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Minden fájl (*.*)\0*.*\0" - IDS_2152 "Error initializing renderer" - IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2152 "Hiba történt a renderelő inicializálásakor" + IDS_2153 "Az OpenGL (3.0 Core) megjelenítő-motort nem sikerült inicializálni. Kérem használjon másik renderelőt." END STRINGTABLE DISCARDABLE From 499a74121e7ffc0b186ebf18a53d2d64130314f6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 5 Jan 2022 19:28:39 +0100 Subject: [PATCH 13/62] Fixed the configuration file section the MIDI input device is obtained from. --- src/sound/midi_rtmidi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/midi_rtmidi.cpp b/src/sound/midi_rtmidi.cpp index e150159e4..3354568f6 100644 --- a/src/sound/midi_rtmidi.cpp +++ b/src/sound/midi_rtmidi.cpp @@ -166,7 +166,7 @@ rtmidi_input_init(const device_t *info) return nullptr; } - midi_in_id = config_get_int((char*)SYSTEM_MIDI_NAME, (char*)"midi_input", 0); + midi_in_id = config_get_int((char*)MIDI_INPUT_NAME, (char*)"midi_input", 0); try { midiin->openPort(midi_in_id); From d8f45bcaef370508a3d7ee6af2e6d4e03ce91d1e Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 5 Jan 2022 23:58:07 +0100 Subject: [PATCH 14/62] Explicitly tell RTMIDI to not ignore any midi in message types. --- src/sound/midi_rtmidi.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sound/midi_rtmidi.cpp b/src/sound/midi_rtmidi.cpp index 3354568f6..50246cac8 100644 --- a/src/sound/midi_rtmidi.cpp +++ b/src/sound/midi_rtmidi.cpp @@ -183,7 +183,10 @@ rtmidi_input_init(const device_t *info) } } - midiin->setCallback(rtmidi_input_callback); + midiin->setCallback(&rtmidi_input_callback); + + // Don't ignore sysex, timing, or active sensing messages. + midiin->ignoreTypes(false, false, false); midi_in_init(dev, &midi_in); From d8c94093ff315d6f8a9cd61522ad27656e713572 Mon Sep 17 00:00:00 2001 From: dob205 Date: Thu, 6 Jan 2022 12:25:03 +0100 Subject: [PATCH 15/62] Smaller fixes to the German translation Fixes some smaller awkward translations and translates the previously untranslated strings. --- src/win/languages/de-DE.rc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index eaaa28171..b42761e70 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -47,7 +47,7 @@ BEGIN #endif END MENUITEM SEPARATOR - MENUITEM "Dimensionen spezifizieren...", IDM_VID_SPECIFY_DIM + MENUITEM "Fenstergröße einstellen...", IDM_VID_SPECIFY_DIM MENUITEM "&4:3-Seitenverhältnis erzwingen", IDM_VID_FORCE43 POPUP "&Fensterskalierungsfaktor" BEGIN @@ -104,7 +104,7 @@ BEGIN MENUITEM "&Einstellungen...", IDM_PREFERENCES MENUITEM "&Discord-Integration aktivieren", IDM_DISCORD MENUITEM SEPARATOR - MENUITEM "&Schallverstärkung...", IDM_SND_GAIN + MENUITEM "&Klangverstärkung...", IDM_SND_GAIN #ifdef MTR_ENABLED MENUITEM SEPARATOR MENUITEM "Tracing starten\tStrg+T", IDM_ACTION_BEGIN_TRACE @@ -288,13 +288,13 @@ END #define STR_WIDTH "Breite:" #define STR_HEIGHT "Höhe:" -#define STR_LOCK_TO_SIZE "Auf diese Größe festlegen" +#define STR_LOCK_TO_SIZE "Feste Größe" #define STR_MACHINE_TYPE "Maschinentyp:" #define STR_MACHINE "Maschine:" #define STR_CONFIGURE "Einstellen" #define STR_CPU_TYPE "CPU-Typ:" -#define STR_SPEED "Takt:" +#define STR_SPEED "Geschwindigkeit:" #define STR_FPU "FPU-Einheit:" #define STR_WAIT_STATES "Wartezustände:" #define STR_MB "MB" @@ -377,13 +377,13 @@ END #define STR_250 "ZIP 250" #define STR_ISARTC "ISA-Echtzeituhr:" -#define STR_ISAMEM "ISA-Speichererweiterung" +#define STR_ISAMEM "ISA-Speichererweiterung:" #define STR_ISAMEM_1 "Steckkarte 1:" #define STR_ISAMEM_2 "Steckkarte 2:" #define STR_ISAMEM_3 "Steckkarte 3:" #define STR_ISAMEM_4 "Steckkarte 4:" -#define STR_BUGGER "ISABugger-Gerät" -#define STR_POSTCARD "POST-Code-Karte" +#define STR_BUGGER "ISABugger-Gerät:" +#define STR_POSTCARD "POST-Code-Karte:" #define FONT_SIZE 9 #define FONT_NAME "Segoe UI" @@ -418,7 +418,7 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_2064 "Die Videokarte ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird auf eine verfügbare Videokarte gewechselt." - IDS_2065 "Maschine" + IDS_2065 "System" IDS_2066 "Anzeige" IDS_2067 "Eingabegeräte" IDS_2068 "Multimedia" @@ -469,7 +469,7 @@ BEGIN IDS_2109 "Alle 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\0Fortgeschrittene Sektorimages (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basissektorimages (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Fluximages (*.FDI)\0*.FDI\0Oberflächenimages (*.86F;*.MFM)\0*.86F;*.MFM\0Alle Dateien (*.*)\0*.*\0" IDS_2110 "FreeType konnte nicht initialisiert werden" IDS_2111 "SDL konnte nicht initialisiert werden, die Datei SDL2.dll wird benötigt" - IDS_2112 "Sind Sie sich sicher, dass Sie einen Hard-Reset für die emulierte Maschine durchführen wollen?" + IDS_2112 "Sind Sie sich sicher, dass Sie einen Hard-Reset für das emulierte System durchführen wollen?" IDS_2113 "Sind Sie sich sicher, dass Sie 86Box beenden wollen?" IDS_2114 "Ghostscript konnte nicht initialisiert werden" IDS_2115 "MO %i (%ls): %ls" @@ -524,14 +524,14 @@ BEGIN IDS_2143 "OpenGL-Shader (*.GLSL)\0*.GLSL\0Alle Dateien (*.*)\0*.*\0" IDS_2144 "OpenGL-Optionen" IDS_2145 "Sie laden gerade eine nicht unterstützte Konfiguration" - IDS_2146 "Das Filtern der CPU-Typen basierend auf der ausgewählten Maschine ist für diese Maschine deaktiviert.\n\nDies ermöglicht es, dass man eine sonst nicht mit der ausgewählten Maschine inkompatible CPU auswählen kann. Allerdings kann dies zu Inkompatiblilitäten mit dem BIOS der Maschine oder anderen Programmen kommen.\n\nDas Aktivieren dieser Einstellung wird nicht unterstützt und sämtliche Bugreports können als ""invalid"" geschlossen werden." + IDS_2146 "Das Filtern der CPU-Typen basierend auf dem ausgewählten System ist für dieses System deaktiviert.\n\nDies ermöglicht es, dass man eine sonst nicht mit dem ausgewählten System inkompatible CPU auswählen kann. Allerdings kann dies zu Inkompatiblilitäten mit dem BIOS des Systems oder anderen Programmen kommen.\n\nDas Aktivieren dieser Einstellung wird nicht unterstützt und sämtliche Bugreports können als ""invalid"" geschlossen werden." IDS_2147 "Fortfahren" IDS_2148 "Kassette: %s" IDS_2149 "Kassettenimages (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Alle Dateien (*.*)\0*.*\0" IDS_2150 "Cartridge %i: %ls" IDS_2151 "Cartridgeimages (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Alle Dateien (*.*)\0*.*\0" - IDS_2152 "Error initializing renderer" - IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2152 "Fehler bei der Rendererinitialisierung" + IDS_2153 "Der OpenGL (3.0-Kern)-Renderer konnte nicht initialisiert werden. Bitte benutzen Sie einen anderen Renderer." END STRINGTABLE DISCARDABLE From 6d9e9969c2b453696cc1d7ac0db80feef7353b99 Mon Sep 17 00:00:00 2001 From: dob205 Date: Thu, 6 Jan 2022 13:18:38 +0100 Subject: [PATCH 16/62] Further adjustments to the German translation --- src/win/languages/de-DE.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index b42761e70..0f1e35650 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -270,7 +270,7 @@ END #define STR_SND_GAIN "Klangverstärkung" #define STR_NEW_FLOPPY "Neues Image" #define STR_CONFIG "Optionen" -#define STR_SPECIFY_DIM "Abmessungen des Hauptfensters einstellen" +#define STR_SPECIFY_DIM "Fenstergröße einstellen" #define STR_OK "OK" #define STR_CANCEL "Abbrechen" @@ -290,7 +290,7 @@ END #define STR_HEIGHT "Höhe:" #define STR_LOCK_TO_SIZE "Feste Größe" -#define STR_MACHINE_TYPE "Maschinentyp:" +#define STR_MACHINE_TYPE "Systemtyp:" #define STR_MACHINE "Maschine:" #define STR_CONFIGURE "Einstellen" #define STR_CPU_TYPE "CPU-Typ:" @@ -412,7 +412,7 @@ BEGIN IDS_2060 "An" IDS_2061 "Aus" IDS_2062 "Alle Images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basissektorimages (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Oberflächenimages (*.86F)\0*.86F\0" - IDS_2063 "Die Maschine ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/machines nicht verfügbar. Es wird auf eine verfügbare Maschine gewechselt." + IDS_2063 "Das System ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/machines nicht verfügbar. Es wird auf ein verfügbares System gewechselt." END STRINGTABLE DISCARDABLE From f83d386d35622a1d2ba44e3cc5d73c286dd700f2 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 6 Jan 2022 20:35:01 +0600 Subject: [PATCH 17/62] Change MO vendor length to 9 Makes sure the string doesn't overflow its field into other fields --- src/include/86box/mo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/86box/mo.h b/src/include/86box/mo.h index e99d5e381..caf5f2417 100644 --- a/src/include/86box/mo.h +++ b/src/include/86box/mo.h @@ -51,7 +51,7 @@ static const mo_type_t mo_types[KNOWN_MO_TYPES] = { typedef struct { - const char vendor[8]; + const char vendor[9]; const char model[16]; const char revision[5]; int8_t supported_media[KNOWN_MO_TYPES]; From 2da187c0bd9e0eb7c5f98222032bfee88527b699 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 7 Jan 2022 14:58:59 +0600 Subject: [PATCH 18/62] Fix plat_mmap on FreeBSD (#1980) * Fix plat_mmap on FreeBSD * Same for old codegen backend * ...and for new codegen backend --- src/codegen/codegen_x86-64.c | 2 +- src/codegen_new/codegen_allocator.c | 4 ++-- src/unix/unix.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/codegen/codegen_x86-64.c b/src/codegen/codegen_x86-64.c index 289411b37..ff1e1c682 100644 --- a/src/codegen/codegen_x86-64.c +++ b/src/codegen/codegen_x86-64.c @@ -67,7 +67,7 @@ void codegen_init() #if _WIN64 codeblock = VirtualAlloc(NULL, BLOCK_SIZE * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); #elif defined(__unix__) || defined(__APPLE__) - codeblock = mmap(NULL, BLOCK_SIZE * sizeof(codeblock_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, 0, 0); + codeblock = mmap(NULL, BLOCK_SIZE * sizeof(codeblock_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); #else codeblock = malloc(BLOCK_SIZE * sizeof(codeblock_t)); #endif diff --git a/src/codegen_new/codegen_allocator.c b/src/codegen_new/codegen_allocator.c index ad07afd73..7b8b04323 100644 --- a/src/codegen_new/codegen_allocator.c +++ b/src/codegen_new/codegen_allocator.c @@ -39,9 +39,9 @@ void codegen_allocator_init() /* TODO: check deployment target: older Intel-based versions of macOS don't play nice with MAP_JIT. */ #elif defined(__APPLE__) && defined(MAP_JIT) - mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE|MAP_JIT, 0, 0); + mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE|MAP_JIT, -1, 0); #else - mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, 0, 0); + mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0); #endif for (c = 0; c < MEM_BLOCK_NR; c++) diff --git a/src/unix/unix.c b/src/unix/unix.c index d7db5cbef..f707757fb 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -374,9 +374,9 @@ void * plat_mmap(size_t size, uint8_t executable) { #if defined __APPLE__ && defined MAP_JIT - void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE | (executable ? MAP_JIT : 0), 0, 0); + void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE | (executable ? MAP_JIT : 0), -1, 0); #else - void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE, 0, 0); + void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE, -1, 0); #endif return (ret < 0) ? NULL : ret; } From e9332cf67067ffab07db5814bb4ceee044310275 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Fri, 7 Jan 2022 08:18:15 +0200 Subject: [PATCH 19/62] Fixes for midi input - Fix buffer overflow in midi input messages - Detect sysex messages by starting byte instead of length --- src/include/86box/midi.h | 8 ++++---- src/include/86box/snd_mpu401.h | 2 +- src/include/86box/snd_sb_dsp.h | 2 +- src/sound/midi.c | 6 +++--- src/sound/midi_rtmidi.cpp | 6 +++--- src/sound/snd_gus.c | 4 ++-- src/sound/snd_mpu401.c | 4 ++-- src/sound/snd_sb_dsp.c | 8 ++++---- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/include/86box/midi.h b/src/include/86box/midi.h index e80fe79d6..155965b5a 100644 --- a/src/include/86box/midi.h +++ b/src/include/86box/midi.h @@ -10,7 +10,7 @@ extern uint8_t MIDI_evt_len[256]; extern int midi_device_current; extern int midi_input_device_current; -extern void (*input_msg)(void *p, uint8_t *msg); +extern void (*input_msg)(void *p, uint8_t *msg, uint32_t len); extern int (*input_sysex)(void *p, uint8_t *buf, uint32_t len, int abort); extern void *midi_in_p; @@ -44,7 +44,7 @@ typedef struct midi_in_handler_t int cnt; uint32_t len; - void (*msg)(void *p, uint8_t *msg); + void (*msg)(void *p, uint8_t *msg, uint32_t len); int (*sysex)(void *p, uint8_t *buffer, uint32_t len, int abort); struct midi_in_handler_t *p; struct midi_in_handler_t *prev, *next; @@ -73,9 +73,9 @@ extern void midi_raw_out_byte(uint8_t val); extern void midi_clear_buffer(void); extern void midi_poll(); -extern void midi_in_handler(int set, void (*msg)(void *p, uint8_t *msg), int (*sysex)(void *p, uint8_t *buffer, uint32_t len, int abort), void *p); +extern void midi_in_handler(int set, void (*msg)(void *p, uint8_t *msg, uint32_t len), int (*sysex)(void *p, uint8_t *buffer, uint32_t len, int abort), void *p); extern void midi_in_handlers_clear(void); -extern void midi_in_msg(uint8_t *msg); +extern void midi_in_msg(uint8_t *msg, uint32_t len); extern void midi_in_sysex(uint8_t *buffer, uint32_t len); #if 0 diff --git a/src/include/86box/snd_mpu401.h b/src/include/86box/snd_mpu401.h index 75eeb8261..93df18a80 100644 --- a/src/include/86box/snd_mpu401.h +++ b/src/include/86box/snd_mpu401.h @@ -159,4 +159,4 @@ extern void mpu401_device_add(void); extern void mpu401_irq_attach(mpu_t *mpu, void (*ext_irq_update)(void *priv, int set), int (*ext_irq_pending)(void *priv), void *priv); extern int MPU401_InputSysex(void *p, uint8_t *buffer, uint32_t len, int abort); -extern void MPU401_InputMsg(void *p, uint8_t *msg); +extern void MPU401_InputMsg(void *p, uint8_t *msg, uint32_t len); diff --git a/src/include/86box/snd_sb_dsp.h b/src/include/86box/snd_sb_dsp.h index 2e6e7eb8f..067e05b3e 100644 --- a/src/include/86box/snd_sb_dsp.h +++ b/src/include/86box/snd_sb_dsp.h @@ -102,7 +102,7 @@ typedef struct sb_dsp_t } sb_dsp_t; -void sb_dsp_input_msg(void *p, uint8_t *msg); +void sb_dsp_input_msg(void *p, uint8_t *msg, uint32_t len); int sb_dsp_input_sysex(void *p, uint8_t *buffer, uint32_t len, int abort); diff --git a/src/sound/midi.c b/src/sound/midi.c index 8a195e2f9..b09e75e78 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -396,7 +396,7 @@ midi_clear_buffer(void) void -midi_in_handler(int set, void (*msg)(void *p, uint8_t *msg), int (*sysex)(void *p, uint8_t *buffer, uint32_t len, int abort), void *p) +midi_in_handler(int set, void (*msg)(void *p, uint8_t *msg, uint32_t len), int (*sysex)(void *p, uint8_t *buffer, uint32_t len, int abort), void *p) { midi_in_handler_t *temp = NULL, *next; @@ -479,7 +479,7 @@ midi_in_handlers_clear(void) void -midi_in_msg(uint8_t *msg) +midi_in_msg(uint8_t *msg, uint32_t len) { midi_in_handler_t *temp = mih_first; @@ -488,7 +488,7 @@ midi_in_msg(uint8_t *msg) break; if (temp->msg) - temp->msg(temp->p, msg); + temp->msg(temp->p, msg, len); temp = temp->next; diff --git a/src/sound/midi_rtmidi.cpp b/src/sound/midi_rtmidi.cpp index 50246cac8..b6df5c48b 100644 --- a/src/sound/midi_rtmidi.cpp +++ b/src/sound/midi_rtmidi.cpp @@ -145,10 +145,10 @@ rtmidi_get_dev_name(int num, char *s) void rtmidi_input_callback(double timeStamp, std::vector *message, void *userData) { - if (message->size() <= 3) - midi_in_msg(message->data()); + if (message->front() == 0xF0) + midi_in_sysex(message->data(), message->size()); else - midi_in_sysex(message->data(), message->size()); + midi_in_msg(message->data(), message->size()); } diff --git a/src/sound/snd_gus.c b/src/sound/snd_gus.c index 003b93b58..afe19bc2a 100644 --- a/src/sound/snd_gus.c +++ b/src/sound/snd_gus.c @@ -1125,7 +1125,7 @@ static void gus_get_buffer(int32_t *buffer, int len, void *p) gus->pos = 0; } -static void gus_input_msg(void *p, uint8_t *msg) +static void gus_input_msg(void *p, uint8_t *msg, uint32_t len) { gus_t *gus = (gus_t *)p; uint8_t i; @@ -1136,7 +1136,7 @@ static void gus_input_msg(void *p, uint8_t *msg) if (gus->uart_in) { gus->midi_status |= MIDI_INT_RECEIVE; - for (i=0;imidi_queue[gus->midi_w++] = msg[i]; gus->midi_w &= 63; } diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index d79776fb8..1002e72f5 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -1422,12 +1422,12 @@ MPU401_InputSysex(void *p, uint8_t *buffer, uint32_t len, int abort) /*Input handler for MIDI*/ void -MPU401_InputMsg(void *p, uint8_t *msg) +MPU401_InputMsg(void *p, uint8_t *msg, uint32_t len) { mpu_t *mpu = (mpu_t *)p; int i, tick; static uint8_t old_msg = 0; - uint8_t len = msg[3], key; + uint8_t key; uint8_t recdata[2], recmsg[4]; int send = 1, send_thru = 0; int retrigger_thru = 0, chan, chrefnum; diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index d41467bb5..001d0e94f 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -1036,15 +1036,15 @@ sb_read(uint16_t a, void *priv) void -sb_dsp_input_msg(void *p, uint8_t *msg) +sb_dsp_input_msg(void *p, uint8_t *msg, uint32_t len) { sb_dsp_t *dsp = (sb_dsp_t *) p; - uint8_t len = msg[3], i = 0; + uint8_t i = 0; - sb_dsp_log("MIDI in sysex = %d, uart irq = %d, msg = %d\n", dsp->midi_in_sysex, dsp->uart_irq, msg[3]); + sb_dsp_log("MIDI in sysex = %d, uart irq = %d, msg = %d\n", dsp->midi_in_sysex, dsp->uart_irq, len); if (!dsp->uart_irq && !dsp->midi_in_poll && (dsp->mpu != NULL)) { - MPU401_InputMsg(dsp->mpu, msg); + MPU401_InputMsg(dsp->mpu, msg, len); return; } From a4081be22c8f39b343e68c4f798cd8f1be828115 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Fri, 7 Jan 2022 18:09:16 +0200 Subject: [PATCH 20/62] Pass sysex messages in mpu-401 uart mode --- src/sound/snd_mpu401.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index 1002e72f5..5ada36829 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -1385,6 +1385,17 @@ MPU401_InputSysex(void *p, uint8_t *buffer, uint32_t len, int abort) mpu401_log("MPU401 Input Sysex\n"); +#ifdef DOSBOX_CODE + if (mpu->mode == M_UART) { +#else + if (!mpu->intelligent && mpu->mode == M_UART) { +#endif + /* UART mode input. */ + for (i = 0; i < len; i++) + MPU401_QueueByte(mpu, buffer[i]); + return 0; + } + if (mpu->filter.sysex_in) { if (abort) { mpu->state.sysex_in_finished=1; From c4448492e816bf01bec5ac73dfe0734e7c429156 Mon Sep 17 00:00:00 2001 From: dob205 Date: Fri, 7 Jan 2022 17:16:18 +0100 Subject: [PATCH 21/62] Adjustments to the German translation Aligns the German translation to the CHS used in the disk overview table and fixes smaller mishaps --- src/win/languages/de-DE.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 0f1e35650..5a5ca5914 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -382,8 +382,8 @@ END #define STR_ISAMEM_2 "Steckkarte 2:" #define STR_ISAMEM_3 "Steckkarte 3:" #define STR_ISAMEM_4 "Steckkarte 4:" -#define STR_BUGGER "ISABugger-Gerät:" -#define STR_POSTCARD "POST-Code-Karte:" +#define STR_BUGGER "ISABugger-Gerät" +#define STR_POSTCARD "POST-Code-Karte" #define FONT_SIZE 9 #define FONT_NAME "Segoe UI" @@ -464,7 +464,7 @@ BEGIN IDS_2104 "Tastaturbeschleuniger konnten nicht geladen werden." IDS_2105 "Roheingaben konnten nicht registriert werden." IDS_2106 "%u" - IDS_2107 "%u MB (ZKS: %i, %i, %i)" + IDS_2107 "%u MB (CHS: %i, %i, %i)" IDS_2108 "Diskette %i (%s): %ls" IDS_2109 "Alle 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\0Fortgeschrittene Sektorimages (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basissektorimages (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Fluximages (*.FDI)\0*.FDI\0Oberflächenimages (*.86F;*.MFM)\0*.86F;*.MFM\0Alle Dateien (*.*)\0*.*\0" IDS_2110 "FreeType konnte nicht initialisiert werden" From 6122aff602b699a40f41eb0e84bb2d49f5676ed3 Mon Sep 17 00:00:00 2001 From: dob205 Date: Fri, 7 Jan 2022 17:22:59 +0100 Subject: [PATCH 22/62] Updates to hr-HR.rc Translates previously untranslated renderer messages and fixes small glitches --- src/win/languages/hr-HR.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index c6d4c4cc5..61fc0c475 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -376,7 +376,7 @@ END #define STR_ZIP_DRIVES "ZIP pogoni:" #define STR_250 "ZIP 250" -#define STR_ISARTC "Ura u stvarnom vrijemenu RTC:" +#define STR_ISARTC "Sat stvarnog vremena (RTC):" #define STR_ISAMEM "Proširenje memorije ISA" #define STR_ISAMEM_1 "Kartica 1:" #define STR_ISAMEM_2 "Kartica 2:" @@ -530,8 +530,8 @@ BEGIN IDS_2149 "Slike audio kasete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Sve datoteke (*.*)\0*.*\0" IDS_2150 "Kaseta %i: %ls" IDS_2151 "Slike kasete (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Sve datoteke (*.*)\0*.*\0" - IDS_2152 "Error initializing renderer" - IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2152 "Nije moguće inicijalizirati renderer" + IDS_2153 "Nije moguće inicijalizirati OpenGL (3.0 jezgra) renderer. Molimte koristite drugi renderer." END STRINGTABLE DISCARDABLE From edc8c88062ae6eebbf82513bf47a8adb5fba35b7 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Fri, 7 Jan 2022 23:36:25 +0200 Subject: [PATCH 23/62] Properly UART-mode detection on input sysex messages --- src/sound/snd_mpu401.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index 5ada36829..12e92b905 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -1388,7 +1388,7 @@ MPU401_InputSysex(void *p, uint8_t *buffer, uint32_t len, int abort) #ifdef DOSBOX_CODE if (mpu->mode == M_UART) { #else - if (!mpu->intelligent && mpu->mode == M_UART) { + if (!mpu->intelligent || mpu->mode == M_UART) { #endif /* UART mode input. */ for (i = 0; i < len; i++) From 65310e01419d1ce79edc8dea14558c98344d5d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sat, 8 Jan 2022 21:43:04 +0100 Subject: [PATCH 24/62] Delay load `SetCurrentProcessExplicitAppUserModelID` Appears to be the only thing preventing 86Box from running on Vista. Note that this doesn't mean a change in the official system requirements. --- src/win/win.c | 3 --- src/win/win_ui.c | 12 ++++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/win/win.c b/src/win/win.c index 27386b5b7..a4854f65f 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -450,9 +450,6 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) { char **argv = NULL; int argc, i; - wchar_t * AppID = L"86Box.86Box\0"; - - SetCurrentProcessExplicitAppUserModelID(AppID); /* Initialize the COM library for the main thread. */ CoInitializeEx(NULL, COINIT_MULTITHREADED); diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 40f9068b0..912eef8cf 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -92,6 +92,13 @@ static dllimp_t user32_imports[] = { { NULL, NULL } }; +/* Taskbar application ID API, Windows 7+ */ +void* shell32_handle = NULL; +static HRESULT (WINAPI *pSetCurrentProcessExplicitAppUserModelID)(PCWSTR AppID); +static dllimp_t shell32_imports[]= { +{ "SetCurrentProcessExplicitAppUserModelID", &pSetCurrentProcessExplicitAppUserModelID } +}; + int win_get_dpi(HWND hwnd) { if (user32_handle != NULL) { @@ -1244,6 +1251,11 @@ ui_init(int nCmdShow) /* Load DPI related Windows 10 APIs */ user32_handle = dynld_module("user32.dll", user32_imports); + /* Set the application ID for the taskbar. */ + shell32_handle = dynld_module("shell32.dll", shell32_imports); + if (shell32_handle) + pSetCurrentProcessExplicitAppUserModelID(L"86Box.86Box"); + /* Set up TaskDialog configuration. */ tdconfig.cbSize = sizeof(tdconfig); tdconfig.dwFlags = TDF_ENABLE_HYPERLINKS; From 9a566a501c5c42c032b4bada254052f696840cd4 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Sun, 9 Jan 2022 16:46:44 +0200 Subject: [PATCH 25/62] Add hide_tool_bar config file setting In preparation for toolbar implementation --- src/config.c | 7 +++++++ src/include/86box/plat.h | 2 +- src/unix/unix.c | 1 + src/win/win_ui.c | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index bda66d417..eebc4462e 100644 --- a/src/config.c +++ b/src/config.c @@ -561,6 +561,7 @@ load_general(void) kbd_req_capture = config_get_int(cat, "kbd_req_capture", 0); hide_status_bar = config_get_int(cat, "hide_status_bar", 0); + hide_tool_bar = config_get_int(cat, "hide_tool_bar", 0); confirm_reset = config_get_int(cat, "confirm_reset", 1); confirm_exit = config_get_int(cat, "confirm_exit", 1); @@ -2036,6 +2037,7 @@ config_load(void) kbd_req_capture = 0; hide_status_bar = 0; + hide_tool_bar = 0; scale = 1; machine = machine_get_machine_from_internal_name("ibmpc"); dpi_scale = 1; @@ -2222,6 +2224,11 @@ save_general(void) else config_delete_var(cat, "hide_status_bar"); + if (hide_tool_bar != 0) + config_set_int(cat, "hide_tool_bar", hide_tool_bar); + else + config_delete_var(cat, "hide_tool_bar"); + if (confirm_reset != 1) config_set_int(cat, "confirm_reset", confirm_reset); else diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 3a605fe6b..ff8b31b02 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -90,7 +90,7 @@ extern int update_icons; extern int unscaled_size_x, /* current unscaled size X */ unscaled_size_y; /* current unscaled size Y */ -extern int kbd_req_capture, hide_status_bar; +extern int kbd_req_capture, hide_status_bar, hide_tool_bar; /* System-related functions. */ extern char *fix_exe_path(char *str); diff --git a/src/unix/unix.c b/src/unix/unix.c index f707757fb..3727e1f63 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -40,6 +40,7 @@ int rctrl_is_lalt; int update_icons; int kbd_req_capture; int hide_status_bar; +int hide_tool_bar; int fixed_size_x = 640; int fixed_size_y = 480; extern int title_set; diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 912eef8cf..f866ed5bf 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -65,6 +65,7 @@ int user_resize = 0; int fixed_size_x = 0, fixed_size_y = 0; int kbd_req_capture = 0; int hide_status_bar = 0; +int hide_tool_bar = 0; int dpi = 96; extern char openfilestring[512]; From 929ee5123446d619617929cab1cc74fdfafea071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 9 Jan 2022 18:38:18 +0100 Subject: [PATCH 26/62] Add a toolbar to the Windows GUI --- src/include/86box/win.h | 7 +++- src/win/CMakeLists.txt | 2 +- src/win/win.c | 10 +---- src/win/win_specify_dim.c | 2 +- src/win/win_toolbar.c | 85 +++++++++++++++++++++++++++++++++++++++ src/win/win_ui.c | 44 +++++++++++--------- 6 files changed, 119 insertions(+), 31 deletions(-) create mode 100644 src/win/win_toolbar.c diff --git a/src/include/86box/win.h b/src/include/86box/win.h index d776cccdf..6c061ef4a 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -107,7 +107,7 @@ extern HANDLE ghMutex; extern HICON hIcon[256]; extern int dpi; extern RECT oldclip; -extern int sbar_height, user_resize; +extern int sbar_height, tbar_height, user_resize; extern int acp_utf8; // extern int status_is_open; @@ -213,6 +213,11 @@ extern void StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst extern int MediaMenuHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); +/* Functions in win_toolbar.c */ +extern HWND hwndRebar; +extern void ToolBarCreate(HWND hwndParent, HINSTANCE hInst); + + /* Functions in win_dialog.c: */ /* Pass NULL in the title param to use the default title. */ extern int file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save); diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt index 36c3dc9ac..0d1fb00cc 100644 --- a/src/win/CMakeLists.txt +++ b/src/win/CMakeLists.txt @@ -21,7 +21,7 @@ add_library(plat OBJECT win.c win_dynld.c win_cdrom.c win_keyboard.c add_library(ui OBJECT win_ui.c win_icon.c win_stbar.c win_sdl.c win_dialog.c win_about.c win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.c win_new_floppy.c win_jsconf.c win_media_menu.c win_preferences.c win_discord.c glad.c win_opengl.c - win_opengl_glslp.c 86Box.rc) + win_opengl_glslp.c win_toolbar.c 86Box.rc) if(NOT CPPTHREADS) target_sources(plat PRIVATE win_thread.c) diff --git a/src/win/win.c b/src/win/win.c index a4854f65f..7d127efa6 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -1118,10 +1118,7 @@ plat_setfullscreen(int on) GetClientRect(hwndMain, &rect); temp_x = rect.right - rect.left + 1; - if (hide_status_bar) - temp_y = rect.bottom - rect.top + 1; - else - temp_y = rect.bottom - rect.top + 1 - sbar_height; + temp_y = rect.bottom - rect.top + 1 - (hide_status_bar ? 0 : sbar_height) - (hide_tool_bar ? 0 : tbar_height); } else { if (dpi_scale) { temp_x = MulDiv((vid_resize & 2) ? fixed_size_x : unscaled_size_x, dpi, 96); @@ -1135,10 +1132,7 @@ plat_setfullscreen(int on) if (vid_resize >= 2) MoveWindow(hwndMain, window_x, window_y, window_w, window_h, TRUE); - if (hide_status_bar) - ResizeWindowByClientArea(hwndMain, temp_x, temp_y); - else - ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height); + ResizeWindowByClientArea(hwndMain, temp_x, temp_y + (hide_status_bar ? 0 : sbar_height) + (hide_tool_bar ? 0 : tbar_height)); } /* Render window. */ diff --git a/src/win/win_specify_dim.c b/src/win/win_specify_dim.c index 96ae0403c..64a95cef4 100644 --- a/src/win/win_specify_dim.c +++ b/src/win/win_specify_dim.c @@ -119,7 +119,7 @@ SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM temp_y = MulDiv(temp_y, dpi, 96); } - ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height); + ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height + tbar_height); if (vid_resize) { CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED); diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c new file mode 100644 index 000000000..faf9712f8 --- /dev/null +++ b/src/win/win_toolbar.c @@ -0,0 +1,85 @@ +#define UNICODE +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/resource.h> +#include <86box/ui.h> +#include <86box/win.h> + +HWND hwndRebar; +static HWND hwndToolbar; +static HIMAGELIST hImageList; + +static TBBUTTON buttons[] = { + { 0, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Pause + { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, + { 0, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Del + { 0, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Esc + { 0, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Hard reset + { 0, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, // ACPI shutdown + { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, + { 0, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } // Settings +}; + +void +ToolBarCreate(HWND hwndParent, HINSTANCE hInst) +{ + REBARINFO rbi = { 0 }; + REBARBANDINFO rbbi = { 0 }; + int btnSize; + + // Create the toolbar. + hwndToolbar = CreateWindowEx(WS_EX_PALETTEWINDOW, TOOLBARCLASSNAME, NULL, + WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | + WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS | + TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE | + CCS_NOPARENTALIGN | CCS_NORESIZE | + CCS_NODIVIDER, + 0, 0, 0, 0, + hwndParent, NULL, hInst, NULL); + + // Create the image list. + hImageList = ImageList_Create(win_get_system_metrics(SM_CXSMICON, dpi), + win_get_system_metrics(SM_CYSMICON, dpi), + ILC_MASK | ILC_COLOR32, 1, 1); + + ImageList_AddIcon(hImageList, hIcon[241]); + + SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList); + + // Add buttons. + SendMessage(hwndToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); + SendMessage(hwndToolbar, TB_ADDBUTTONS, sizeof(buttons) / sizeof(TBBUTTON), (LPARAM) &buttons); + + // Autosize the toolbar and determine its size. + btnSize = LOWORD(SendMessage(hwndToolbar, TB_GETBUTTONSIZE, 0,0)); + + // Create the containing Rebar. + hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL, + WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_CLIPCHILDREN | RBS_VARHEIGHT | + RBS_BANDBORDERS | CCS_NODIVIDER | + CCS_NOPARENTALIGN, + 0, 0, 0, 0, + hwndParent, NULL, hInst, NULL); + + // Create and send the REBARINFO structure. + rbi.cbSize = sizeof(rbi); + SendMessage(hwndRebar, RB_SETBARINFO, 0, (LPARAM)&rbi); + + // Add the toolbar to the rebar. + rbbi.cbSize = sizeof(rbbi); + rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE; + rbbi.hwndChild = hwndToolbar; + rbbi.cxMinChild = 0; + rbbi.cyMinChild = btnSize; + SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM)&rbbi); + SendMessage(hwndRebar, RB_MAXIMIZEBAND, 0, 0); + + ShowWindow(hwndRebar, TRUE); + + return; +} \ No newline at end of file diff --git a/src/win/win_ui.c b/src/win/win_ui.c index f866ed5bf..362ab3343 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -58,6 +58,7 @@ HWND hwndMain = NULL, /* application main window */ HMENU menuMain; /* application main menu */ RECT oldclip; /* mouse rect */ int sbar_height = 23; /* statusbar height */ +int tbar_height = 23; /* toolbar height */ int minimized = 0; int infocus = 1, button_down = 0; int rctrl_is_lalt = 0; @@ -658,10 +659,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) temp_y = unscaled_size_y; } - if (hide_status_bar) - ResizeWindowByClientArea(hwnd, temp_x, temp_y); - else - ResizeWindowByClientArea(hwnd, temp_x, temp_y + sbar_height); + ResizeWindowByClientArea(hwnd, temp_x, temp_y + (hide_status_bar ? 0 : sbar_height) + (hide_tool_bar ? 0 : tbar_height)); if (mouse_capture) { ClipCursor(&rect); @@ -939,6 +937,8 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) dpi = HIWORD(wParam); GetWindowRect(hwndSBAR, &rect); sbar_height = rect.bottom - rect.top; + GetWindowRect(hwndRebar, &rect); + tbar_height = rect.bottom - rect.top; rect_p = (RECT*)lParam; if (vid_resize == 1) MoveWindow(hwnd, rect_p->left, rect_p->top, rect_p->right - rect_p->left, rect_p->bottom - rect_p->top, TRUE); @@ -951,10 +951,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } /* Main Window. */ - if (hide_status_bar) - ResizeWindowByClientArea(hwndMain, temp_x, temp_y); - else - ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height); + ResizeWindowByClientArea(hwndMain, temp_x, temp_y + (hide_status_bar ? 0 : sbar_height) + (hide_tool_bar ? 0 : tbar_height)); } else if (!user_resize) atomic_flag_clear(&doresize); break; @@ -986,12 +983,13 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if (!(pos->flags & SWP_NOSIZE) || !user_resize) { plat_vidapi_enable(0); - if (hide_status_bar) - MoveWindow(hwndRender, 0, 0, rect.right, rect.bottom, TRUE); - else { + if (!hide_status_bar) MoveWindow(hwndSBAR, 0, rect.bottom - sbar_height, sbar_height, rect.right, TRUE); - MoveWindow(hwndRender, 0, 0, rect.right, rect.bottom - sbar_height, TRUE); - } + + if (!hide_tool_bar) + MoveWindow(hwndRebar, 0, 0, rect.right, tbar_height, TRUE); + + MoveWindow(hwndRender, 0, hide_tool_bar ? 0 : tbar_height, rect.right, rect.bottom - (hide_status_bar ? 0 : sbar_height) - (hide_tool_bar ? 0 : tbar_height), TRUE); GetClientRect(hwndRender, &rect); if (dpi_scale) { @@ -1244,7 +1242,7 @@ ui_init(int nCmdShow) MSG messages = {0}; /* received-messages buffer */ HWND hwnd = NULL; /* handle for our window */ HACCEL haccel; /* handle to accelerator table */ - RECT sbar_rect; /* RECT of the status bar */ + RECT rect; int bRet; TASKDIALOGCONFIG tdconfig = {0}; TASKDIALOG_BUTTON tdbuttons[] = {{IDCANCEL, MAKEINTRESOURCE(IDS_2119)}}; @@ -1358,11 +1356,20 @@ ui_init(int nCmdShow) StatusBarCreate(hwndMain, IDC_STATUS, hinstance); /* Get the actual height of the status bar */ - GetWindowRect(hwndSBAR, &sbar_rect); - sbar_height = sbar_rect.bottom - sbar_rect.top; + GetWindowRect(hwndSBAR, &rect); + sbar_height = rect.bottom - rect.top; if (hide_status_bar) ShowWindow(hwndSBAR, SW_HIDE); + /* Create the toolbar window. */ + ToolBarCreate(hwndMain, hinstance); + + /* Get the actual height of the toolbar */ + GetWindowRect(hwndRebar, &rect); + tbar_height = rect.bottom - rect.top; + if (hide_tool_bar) + ShowWindow(hwndRebar, SW_HIDE); + /* Set up main window for resizing if configured. */ if (vid_resize == 1) SetWindowLongPtr(hwnd, GWL_STYLE, @@ -1632,10 +1639,7 @@ plat_resize(int x, int y) x = MulDiv(x, dpi, 96); y = MulDiv(y, dpi, 96); } - if (hide_status_bar) - ResizeWindowByClientArea(hwndMain, x, y); - else - ResizeWindowByClientArea(hwndMain, x, y + sbar_height); + ResizeWindowByClientArea(hwndMain, x, y + (hide_status_bar ? 0 : sbar_height) + (hide_tool_bar ? 0 : tbar_height)); } } From e5b56e882096c0cd6256ce8c0948b8f389078fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 9 Jan 2022 19:12:08 +0100 Subject: [PATCH 27/62] Move machine information to the toolbar --- src/win/win_toolbar.c | 40 +++++++++++++++++++++++++++++++++++----- src/win/win_ui.c | 22 +--------------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index faf9712f8..e2addf3e5 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -5,6 +5,7 @@ #include #include #include <86box/86box.h> +#include <86box/plat.h> #include <86box/resource.h> #include <86box/ui.h> #include <86box/win.h> @@ -12,6 +13,7 @@ HWND hwndRebar; static HWND hwndToolbar; static HIMAGELIST hImageList; +static wchar_t wTitle[512]; static TBBUTTON buttons[] = { { 0, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Pause @@ -61,8 +63,7 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst) hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_VARHEIGHT | - RBS_BANDBORDERS | CCS_NODIVIDER | - CCS_NOPARENTALIGN, + CCS_NODIVIDER | CCS_NOPARENTALIGN, 0, 0, 0, 0, hwndParent, NULL, hInst, NULL); @@ -72,14 +73,43 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst) // Add the toolbar to the rebar. rbbi.cbSize = sizeof(rbbi); - rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE; + rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE; rbbi.hwndChild = hwndToolbar; rbbi.cxMinChild = 0; rbbi.cyMinChild = btnSize; + rbbi.fStyle = RBBS_NOGRIPPER; SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM)&rbbi); - SendMessage(hwndRebar, RB_MAXIMIZEBAND, 0, 0); + // Add a label for machine information. + rbbi.fMask = RBBIM_TEXT | RBBIM_STYLE; + rbbi.lpText = TEXT("Test"); + rbbi.fStyle = RBBS_NOGRIPPER; + SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM)&rbbi); + + SendMessage(hwndRebar, RB_MAXIMIZEBAND, 0, 0); ShowWindow(hwndRebar, TRUE); return; -} \ No newline at end of file +} + +wchar_t * +ui_window_title(wchar_t *s) +{ + REBARBANDINFO rbbi = { 0 }; + if (! video_fullscreen) { + if (s != NULL) { + wcsncpy(wTitle, s, sizeof_w(wTitle) - 1); + } else + s = wTitle; + + rbbi.cbSize = sizeof(rbbi); + rbbi.fMask = RBBIM_TEXT; + rbbi.lpText = s; + SendMessage(hwndRebar, RB_SETBANDINFO, 1, (LPARAM) &rbbi); + } else { + if (s == NULL) + s = wTitle; + } + + return(s); +} diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 362ab3343..95061cbf6 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -74,7 +74,6 @@ extern WCHAR wopenfilestring[512]; /* Local data. */ -static wchar_t wTitle[512]; static int manager_wm = 0; static int save_window_pos = 0, pause_state = 0; static int padded_frame = 0; @@ -1328,7 +1327,7 @@ ui_init(int nCmdShow) return(2); /* Now create our main window. */ - mbstowcs(title, emu_version, sizeof_w(title)); + swprintf_s(title, sizeof_w(title), L"%hs - %hs", vm_name, EMU_NAME); hwnd = CreateWindowEx ( 0, /* no extended possibilites */ CLASS_NAME, /* class name */ @@ -1560,25 +1559,6 @@ ui_init(int nCmdShow) } -wchar_t * -ui_window_title(wchar_t *s) -{ - if (! video_fullscreen) { - if (s != NULL) { - wcsncpy(wTitle, s, sizeof_w(wTitle) - 1); - } else - s = wTitle; - - SetWindowText(hwndMain, s); - } else { - if (s == NULL) - s = wTitle; - } - - return(s); -} - - /* We should have the language ID as a parameter. */ void plat_pause(int p) From b1664a258d8830ca115bd081e2791f9fdc6cd631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 9 Jan 2022 19:56:53 +0100 Subject: [PATCH 28/62] Fix blank space between toolbar and render area --- src/win/win_toolbar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index e2addf3e5..7a4d75011 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -64,7 +64,7 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst) WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_VARHEIGHT | CCS_NODIVIDER | CCS_NOPARENTALIGN, - 0, 0, 0, 0, + 0, 0, scrnsz_x, 0, hwndParent, NULL, hInst, NULL); // Create and send the REBARINFO structure. From 9abdb1e048f09332a08b095e9e16004db8c91a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 9 Jan 2022 19:58:06 +0100 Subject: [PATCH 29/62] Add the toolbar code to the MinGW makefile --- src/win/Makefile.mingw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 303e13961..de29effc5 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -691,7 +691,7 @@ UIOBJ := win_ui.o win_icon.o win_stbar.o win_discord.o \ win_dialog.o win_about.o \ win_settings.o win_devconf.o win_snd_gain.o win_specify_dim.o win_preferences.o \ win_new_floppy.o win_jsconf.o \ - win_media_menu.o + win_media_menu.o win_toolbar.o ifeq ($(DINPUT), y) PLATOBJ += win_joystick.o From 3323f26a1fb2992f92305c51d249d39352dad60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 9 Jan 2022 20:01:59 +0100 Subject: [PATCH 30/62] Fix missing terminator of DLL import array --- src/win/win_ui.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/win/win_ui.c b/src/win/win_ui.c index f866ed5bf..97084858c 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -97,7 +97,8 @@ static dllimp_t user32_imports[] = { void* shell32_handle = NULL; static HRESULT (WINAPI *pSetCurrentProcessExplicitAppUserModelID)(PCWSTR AppID); static dllimp_t shell32_imports[]= { -{ "SetCurrentProcessExplicitAppUserModelID", &pSetCurrentProcessExplicitAppUserModelID } +{ "SetCurrentProcessExplicitAppUserModelID", &pSetCurrentProcessExplicitAppUserModelID }, +{ NULL, NULL } }; int From 50679f8faa0fe80aa13a2b30128c78bbfa55a87a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 9 Jan 2022 20:36:59 +0100 Subject: [PATCH 31/62] Fix link to WinBox in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e270bb2f4..0f48bc59e 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ System requirements and recommendations Performance may vary depending on both host and guest configuration. Most emulation logic is executed in a single thread, therefore generally systems with better IPC (instructions per clock) should be able to emulate higher clock speeds. It is also recommended to use a manager application with 86Box for easier handling of multiple virtual machines. -* [WinBox for 86Box](https://github.com/laciba96/WinBox-for-86Box) by [Laci bá'](https://github.com/laciba96) +* [WinBox for 86Box](https://github.com/86Box/WinBox-for-86Box) by Laci bá' * The new manager with improved new user experience; installer, automatic updates of emulator files and more. * [86Box Manager](https://github.com/86Box/86BoxManager) by [daviunic](https://github.com/daviunic) (Overdoze) * The traditional 86Box manager with simple interface. From a284ddd45bab70fb20c79c076a8c8d9dfd170aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Mon, 10 Jan 2022 01:20:21 +0100 Subject: [PATCH 32/62] Reduce the status message to speed and mouse capture --- src/86box.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/86box.c b/src/86box.c index 393ce90af..0970a6cb6 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1068,7 +1068,13 @@ void update_mouse_msg() if (wcp) /* remove parentheses */ *(wcp - 1) = L'\0'; mbstowcs(wcpu, cpu_s->name, strlen(cpu_s->name)+1); - +#ifdef _WIN32 + swprintf(mouse_msg[0], sizeof_w(mouse_msg[0]), L"%%i%%%% - %ls", + plat_get_string(IDS_2077)); + swprintf(mouse_msg[1], sizeof_w(mouse_msg[1]), L"%%i%%%% - %ls", + (mouse_get_buttons() > 2) ? plat_get_string(IDS_2078) : plat_get_string(IDS_2079)); + wcsncpy(mouse_msg[2], L"%i%%", sizeof_w(mouse_msg[2])); +#else swprintf(mouse_msg[0], sizeof_w(mouse_msg[0]), L"%ls v%ls - %%i%%%% - %ls - %ls/%ls - %ls", EMU_NAME_W, EMU_VERSION_FULL_W, wmachine, wcpufamily, wcpu, plat_get_string(IDS_2077)); @@ -1077,6 +1083,7 @@ void update_mouse_msg() (mouse_get_buttons() > 2) ? plat_get_string(IDS_2078) : plat_get_string(IDS_2079)); swprintf(mouse_msg[2], sizeof_w(mouse_msg[2]), L"%ls v%ls - %%i%%%% - %ls - %ls/%ls", EMU_NAME_W, EMU_VERSION_FULL_W, wmachine, wcpufamily, wcpu); +#endif } void From 529889d21ea6038e94da019c4356ac0f7bc673c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Mon, 10 Jan 2022 01:25:35 +0100 Subject: [PATCH 33/62] Show full version string in the title bar --- src/win/win_ui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 17005ca7c..863701b2d 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -1328,7 +1328,7 @@ ui_init(int nCmdShow) return(2); /* Now create our main window. */ - swprintf_s(title, sizeof_w(title), L"%hs - %hs", vm_name, EMU_NAME); + swprintf_s(title, sizeof_w(title), L"%hs - %s %s", vm_name, EMU_NAME_W, EMU_VERSION_FULL_W); hwnd = CreateWindowEx ( 0, /* no extended possibilites */ CLASS_NAME, /* class name */ From 513100b7206abb4619a885602b622b01fcefb6ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Mon, 10 Jan 2022 01:49:00 +0100 Subject: [PATCH 34/62] Add a menu option to hide the toolbar --- src/include/86box/resource.h | 1 + src/win/languages/cs-CZ.rc | 1 + src/win/languages/de-DE.rc | 1 + src/win/languages/en-GB.rc | 1 + src/win/languages/en-US.rc | 1 + src/win/languages/es-ES.rc | 1 + src/win/languages/fi-FI.rc | 1 + src/win/languages/fr-FR.rc | 1 + src/win/languages/hr-HR.rc | 1 + src/win/languages/hu-HU.rc | 1 + src/win/languages/it-IT.rc | 1 + src/win/languages/ja-JP.rc | 1 + src/win/languages/ko-KR.rc | 1 + src/win/languages/pt-BR.rc | 1 + src/win/languages/pt-PT.rc | 1 + src/win/languages/ru-RU.rc | 1 + src/win/languages/sl-SI.rc | 1 + src/win/languages/tr-TR.rc | 1 + src/win/languages/zh-CN.rc | 1 + src/win/win_ui.c | 17 +++++++++++++++++ 20 files changed, 36 insertions(+) diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index b5a67b85b..f35be6465 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -313,6 +313,7 @@ #endif #define IDM_CONFIG 40020 #define IDM_VID_HIDE_STATUS_BAR 40021 +#define IDM_VID_HIDE_TOOLBAR 40022 #define IDM_UPDATE_ICONS 40030 #define IDM_SND_GAIN 40031 #define IDM_VID_RESIZE 40040 diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index b63d8a176..d9f392cc9 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Zobrazení" BEGIN MENUITEM "&Schovat stavový řádek", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Schovat panel &nástrojů", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Měnitelná velikost okna", IDM_VID_RESIZE MENUITEM "&Pamatovat velikost a pozici", IDM_VID_REMEMBER diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 5a5ca5914..38a562cd5 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Ansicht" BEGIN MENUITEM "&Statusleiste ausblenden", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Größenverstellbares Fenster", IDM_VID_RESIZE MENUITEM "&Größe && Position merken", IDM_VID_REMEMBER diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index 61749d954..939d96f5c 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&View" BEGIN MENUITEM "&Hide status bar", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Resizeable window", IDM_VID_RESIZE MENUITEM "R&emember size && position", IDM_VID_REMEMBER diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 3bee70556..c010e9a90 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&View" BEGIN MENUITEM "&Hide status bar", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Resizeable window", IDM_VID_RESIZE MENUITEM "R&emember size && position", IDM_VID_REMEMBER diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 2232e69c5..44fadfc6e 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Vista" BEGIN MENUITEM "&Ocultar barra de estado", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Ventana redimensionable", IDM_VID_RESIZE MENUITEM "&Recordar tamaño y posición", IDM_VID_REMEMBER diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 56430464d..bedc9d3f7 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Näytä" BEGIN MENUITEM "&Piilota tilapalkki", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Salli koon muuttaminen", IDM_VID_RESIZE MENUITEM "&Muista koko ja sijainti", IDM_VID_REMEMBER diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 6b58bd593..a59c78dab 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Vue" BEGIN MENUITEM "&Masquer la barre de status", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "Fenètre &Retaillable", IDM_VID_RESIZE MENUITEM "S&auvegarder taille && position", IDM_VID_REMEMBER diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 61fc0c475..ba384f5a6 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Pogled" BEGIN MENUITEM "&Sakrij statusni redak", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Prozor s promjenjivim veličinama", IDM_VID_RESIZE MENUITEM "&Zapamtite veličinu i položaj", IDM_VID_REMEMBER diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 731ef0e42..1b7dfbe43 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -35,6 +35,7 @@ BEGIN POPUP "&Nézet" BEGIN MENUITEM "Állapotsor &elrejtése", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Átméretezhető ablak", IDM_VID_RESIZE MENUITEM "Méret és pozíció &megjegyzése", IDM_VID_REMEMBER diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 461b76e71..2656a2d5d 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Visualizza" BEGIN MENUITEM "&Nascondi barra di stato", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Finestra ridimensionabile", IDM_VID_RESIZE MENUITEM "R&icorda dimensioni e posizione", IDM_VID_REMEMBER diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index e88e1822c..c74b99d81 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -32,6 +32,7 @@ BEGIN POPUP "表示(&V)" BEGIN MENUITEM "ステータスバーを隠す(&H)", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "ウィンドウのサイズを変更可能にする(&R)", IDM_VID_RESIZE MENUITEM "ウィンドウのサイズと位置を記憶する(&E)", IDM_VID_REMEMBER diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index a46c8f6d7..510bc8c60 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -32,6 +32,7 @@ BEGIN POPUP "표시(&V)" BEGIN MENUITEM "상태 바 숨기기(&H)", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "창 크기 조절 가능하게 하기(&R)", IDM_VID_RESIZE MENUITEM "창 크기와 위치를 기억하기(&E)", IDM_VID_REMEMBER diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 06a000458..58ae5f6b4 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -35,6 +35,7 @@ BEGIN POPUP "&Exibir" BEGIN MENUITEM "&Ocultar barra de status", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Janela redimensionável", IDM_VID_RESIZE MENUITEM "&Lembrar tamanho e posição", IDM_VID_REMEMBER diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index a424ad141..c30f6d50d 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Ver" BEGIN MENUITEM "&Ocultar barra de estado", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Janela redimensionável", IDM_VID_RESIZE MENUITEM "&Lembrar tamanho e posição", IDM_VID_REMEMBER diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 413b0c5f3..72b4e7e66 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Вид" BEGIN MENUITEM "&Скрыть строку статуса", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Изменяемый размер окна", IDM_VID_RESIZE MENUITEM "&Запомнить размер и положение", IDM_VID_REMEMBER diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index fb1c80b8b..815c08603 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Pogled" BEGIN MENUITEM "&Skrij statusno vrstico", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "S&premenljiva velikost okna", IDM_VID_RESIZE MENUITEM "&Zapomni si velikost in položaj", IDM_VID_REMEMBER diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 5d2ef2c50..91ee1480e 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -32,6 +32,7 @@ BEGIN POPUP "&Görüntüleme" BEGIN MENUITEM "&Durum çubuğunu gizle", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Yeniden boyutlandırılabilir pencere", IDM_VID_RESIZE MENUITEM "&Pencere boyut ve pozisyonunu hatırla", IDM_VID_REMEMBER diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 37c5621ab..628ce1210 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -32,6 +32,7 @@ BEGIN POPUP "查看(&V)" BEGIN MENUITEM "隐藏状态栏(&H)", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "窗口大小可调(&R)", IDM_VID_RESIZE MENUITEM "记住窗口大小和位置(&E)", IDM_VID_REMEMBER diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 863701b2d..63b3c64b8 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -276,6 +276,7 @@ ResetAllMenus(void) #endif CheckMenuItem(menuMain, IDM_VID_HIDE_STATUS_BAR, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_HIDE_TOOLBAR, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_FORCE43, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_OVERSCAN, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_INVERT, MF_UNCHECKED); @@ -344,6 +345,7 @@ ResetAllMenus(void) #endif CheckMenuItem(menuMain, IDM_VID_HIDE_STATUS_BAR, hide_status_bar ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_HIDE_TOOLBAR, hide_tool_bar ? MF_CHECKED : MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_FORCE43, force_43?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_OVERSCAN, enable_overscan?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_INVERT, invert_display ? MF_CHECKED : MF_UNCHECKED); @@ -641,6 +643,21 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) config_save(); break; + case IDM_VID_HIDE_TOOLBAR: + hide_tool_bar ^= 1; + CheckMenuItem(hmenu, IDM_VID_HIDE_TOOLBAR, hide_tool_bar ? MF_CHECKED : MF_UNCHECKED); + ShowWindow(hwndRebar, hide_tool_bar ? SW_HIDE : SW_SHOW); + GetWindowRect(hwnd, &rect); + if (hide_tool_bar) { + MoveWindow(hwnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top - tbar_height, TRUE); + SetWindowPos(hwndRender, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); + } else { + MoveWindow(hwnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top + tbar_height, TRUE); + SetWindowPos(hwndRender, NULL, 0, tbar_height, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); + } + config_save(); + break; + case IDM_VID_RESIZE: vid_resize ^= 1; CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize & 1) ? MF_CHECKED : MF_UNCHECKED); From 273d5af048bc0f62bc8f38ff4bcad0d779c470d3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 10 Jan 2022 14:36:53 +0100 Subject: [PATCH 35/62] READ CD, READ CD OLD, and READ CD MSF with all flag bits cleared, are now treated as a non-data command. --- src/scsi/scsi_cdrom.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index a69413596..a53af6435 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1623,7 +1623,12 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->sector_len -= dev->sector_pos; dev->sector_len++; + msf = 1; + + /* If all the flag bits are cleared, then treat it as a non-data command. */ + if (cdb[9] == 0x00) + dev->sector_len = 0; break; case GPCMD_READ_CD_OLD: case GPCMD_READ_CD: @@ -1632,6 +1637,10 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; msf = 0; + + /* If all the flag bits are cleared, then treat it as a non-data command. */ + if (cdb[9] == 0x00) + dev->sector_len = 0; break; } From 28b772b1f73caf3f5dc2f48fb4dd6e021f41214a Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 10 Jan 2022 19:53:07 +0100 Subject: [PATCH 36/62] More READ CD fixes. --- src/cdrom/cdrom.c | 4 ++-- src/scsi/scsi_cdrom.c | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 37615a32e..b89232a46 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -1031,8 +1031,8 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c memset(raw_buffer, 0, 2448); memset(extra_buffer, 0, 296); - if (!(cdrom_sector_flags & 0xf0)) { /* 0x00 and 0x08 are illegal modes */ - cdrom_log("CD-ROM %i: [Mode 1] 0x00 and 0x08 are illegal modes\n", dev->id); + if ((cdrom_sector_flags & 0xf8) == 0x08) { /* 0x08 is an illegal mode */ + cdrom_log("CD-ROM %i: [Mode 1] 0x08 is an illegal mode\n", dev->id); return 0; } diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index a53af6435..e099efe07 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1626,8 +1626,14 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) msf = 1; + if ((cdb[9] & 0xf8) == 0x08) { + /* 0x08 is an illegal mode */ + scsi_cdrom_invalid_field(dev); + break; + } + /* If all the flag bits are cleared, then treat it as a non-data command. */ - if (cdb[9] == 0x00) + if ((cdb[9] == 0x00) && ((cdb[10] & 0x07) == 0x00)) dev->sector_len = 0; break; case GPCMD_READ_CD_OLD: @@ -1638,8 +1644,14 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) msf = 0; + if ((cdb[9] & 0xf8) == 0x08) { + /* 0x08 is an illegal mode */ + scsi_cdrom_invalid_field(dev); + break; + } + /* If all the flag bits are cleared, then treat it as a non-data command. */ - if (cdb[9] == 0x00) + if ((cdb[9] == 0x00) && ((cdb[10] & 0x07) == 0x00)) dev->sector_len = 0; break; } From 6b7e674877e40fd849baa97a940c87a0597d6614 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 10 Jan 2022 20:12:26 +0100 Subject: [PATCH 37/62] And another fix. --- src/cdrom/cdrom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index b89232a46..31f875a77 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -737,8 +737,8 @@ cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, in static int track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2) { - if (!(flags & 0x70)) { /* 0x00/0x08/0x80/0x88 are illegal modes */ - cdrom_log("CD-ROM %i: [Any Mode] 0x00/0x08/0x80/0x88 are illegal modes\n", id); + if (!(flags & 0x70) && (flags & 0xf8)) { /* 0x08/0x80/0x88 are illegal modes */ + cdrom_log("CD-ROM %i: [Any Mode] 0x08/0x80/0x88 are illegal modes\n", id); return 0; } From e0578fbf5baeb71732b5f719b4d46652d44d0387 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 10 Jan 2022 20:26:36 +0100 Subject: [PATCH 38/62] And another fix. --- src/scsi/scsi_cdrom.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index e099efe07..842b8cc28 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1635,6 +1635,10 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) /* If all the flag bits are cleared, then treat it as a non-data command. */ if ((cdb[9] == 0x00) && ((cdb[10] & 0x07) == 0x00)) dev->sector_len = 0; + else if ((cdb[9] == 0x00) && ((cdb[10] & 0x07) != 0x00)) { + scsi_cdrom_invalid_field(dev); + break; + } break; case GPCMD_READ_CD_OLD: case GPCMD_READ_CD: @@ -1653,6 +1657,10 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) /* If all the flag bits are cleared, then treat it as a non-data command. */ if ((cdb[9] == 0x00) && ((cdb[10] & 0x07) == 0x00)) dev->sector_len = 0; + else if ((cdb[9] == 0x00) && ((cdb[10] & 0x07) != 0x00)) { + scsi_cdrom_invalid_field(dev); + break; + } break; } From bf8227dd6c98ee57f4e472ed904a9d86830b1ac2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 10 Jan 2022 20:41:43 +0100 Subject: [PATCH 39/62] And another. --- src/scsi/scsi_cdrom.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 842b8cc28..8a443dd77 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1629,7 +1629,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) if ((cdb[9] & 0xf8) == 0x08) { /* 0x08 is an illegal mode */ scsi_cdrom_invalid_field(dev); - break; + return; } /* If all the flag bits are cleared, then treat it as a non-data command. */ @@ -1637,7 +1637,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->sector_len = 0; else if ((cdb[9] == 0x00) && ((cdb[10] & 0x07) != 0x00)) { scsi_cdrom_invalid_field(dev); - break; + return; } break; case GPCMD_READ_CD_OLD: @@ -1651,7 +1651,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) if ((cdb[9] & 0xf8) == 0x08) { /* 0x08 is an illegal mode */ scsi_cdrom_invalid_field(dev); - break; + return; } /* If all the flag bits are cleared, then treat it as a non-data command. */ @@ -1659,7 +1659,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->sector_len = 0; else if ((cdb[9] == 0x00) && ((cdb[10] & 0x07) != 0x00)) { scsi_cdrom_invalid_field(dev); - break; + return; } break; } From 3198a844b0cc425c8882eee303fd5ebd0c95d9c1 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Mon, 10 Jan 2022 20:55:12 -0300 Subject: [PATCH 40/62] Update pt-BR.rc --- src/win/languages/pt-BR.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 06a000458..645587d99 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -478,7 +478,7 @@ BEGIN IDS_2115 "Magneto-óptico %i (%ls): %ls" IDS_2116 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os arquivos (*.*)\0*.*\0" IDS_2117 "Bem-vindo ao 86Box!" - IDS_2118 "Controle interno" + IDS_2118 "Controlador interno" IDS_2119 "Sair" IDS_2120 "Nenhum ROM encontrada" IDS_2121 "Você deseja salvar as configurações?" From be76456921299d414f3bb1776b18c09b74e9ead6 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Mon, 10 Jan 2022 21:05:09 -0300 Subject: [PATCH 41/62] Update pt-BR.rc --- src/win/languages/pt-BR.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 645587d99..2e64edef4 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -368,7 +368,7 @@ END #define STR_SIZE_MB "Tamanho (MB):" #define STR_TYPE "Tipo:" #define STR_IMG_FORMAT "Formato:" -#define STR_BLOCK_SIZE "Tamanho do bloco:" +#define STR_BLOCK_SIZE "Bloco:" #define STR_FLOPPY_DRIVES "Unidades de disquete:" #define STR_TURBO "Turbo" From 3be3acf78fd4c4513f6296b78fd83406ece91610 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Tue, 11 Jan 2022 08:04:56 +0200 Subject: [PATCH 42/62] Fix opengl core renderer message pump --- src/win/win_opengl.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index 4f328c097..228cbb56f 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -200,8 +200,9 @@ static void set_parent_binding(int enable) * @param wParam * @param lParam * @param fullscreen + * @return Was message handled */ -static void handle_window_messages(UINT message, WPARAM wParam, LPARAM lParam, int fullscreen) +static int handle_window_messages(UINT message, WPARAM wParam, LPARAM lParam, int fullscreen) { switch (message) { @@ -219,7 +220,7 @@ static void handle_window_messages(UINT message, WPARAM wParam, LPARAM lParam, i /* Mouse events that enter and exit capture. */ PostMessage(parent, message, wParam, lParam); } - break; + return 1; case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: @@ -228,7 +229,7 @@ static void handle_window_messages(UINT message, WPARAM wParam, LPARAM lParam, i { PostMessage(parent, message, wParam, lParam); } - break; + return 1; case WM_INPUT: if (fullscreen) { @@ -256,8 +257,10 @@ static void handle_window_messages(UINT message, WPARAM wParam, LPARAM lParam, i } free(raw); } - break; + return 1; } + + return 0; } /** @@ -638,12 +641,13 @@ static void opengl_main(void* param) /* Handle window messages */ MSG msg; - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.hwnd == window_hwnd) - handle_window_messages(msg.message, msg.wParam, msg.lParam, fullscreen); - TranslateMessage(&msg); - DispatchMessage(&msg); + if (msg.hwnd != window_hwnd || !handle_window_messages(msg.message, msg.wParam, msg.lParam, fullscreen)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } } /* Wait for synchronized events for 1ms before going back to window events */ From b13c14b039aff89ef503dbab30a8148256b6c04f Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Wed, 12 Jan 2022 19:39:17 +0200 Subject: [PATCH 43/62] Exit full screen mode if changing window with alt-tab etc. unintended way. --- src/win/win_opengl.c | 14 ++++++++++++++ src/win/win_ui.c | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index 228cbb56f..99843cd9f 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -258,6 +258,13 @@ static int handle_window_messages(UINT message, WPARAM wParam, LPARAM lParam, in free(raw); } return 1; + case WM_MOUSELEAVE: + if (fullscreen) + { + /* Leave fullscreen if mouse leaves the renderer window. */ + PostMessage(GetAncestor(parent, GA_ROOT), WM_LEAVEFULLSCREEN, 0, 0); + } + return 0; } return 0; @@ -726,7 +733,14 @@ static void opengl_main(void* param) { SetForegroundWindow(window_hwnd); SetFocus(window_hwnd); + + /* Clip cursor to prevent it moving to another monitor. */ + RECT rect; + GetWindowRect(window_hwnd, &rect); + ClipCursor(&rect); } + else + ClipCursor(NULL); } if (fullscreen) diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 97084858c..c2740f0c7 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -961,6 +961,9 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_WINDOWPOSCHANGED: + if (video_fullscreen & 1) + PostMessage(hwndMain, WM_LEAVEFULLSCREEN, 0, 0); + pos = (WINDOWPOS*)lParam; GetClientRect(hwndMain, &rect); @@ -1160,6 +1163,13 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } break; + case WM_ACTIVATEAPP: + /* Leave full screen on switching application except + for OpenGL Core and VNC renderers. */ + if (video_fullscreen & 1 && wParam == FALSE && vid_api < 3) + PostMessage(hwndMain, WM_LEAVEFULLSCREEN, 0, 0); + break; + case WM_ENTERSIZEMOVE: user_resize = 1; break; From cd616b407ccecc92685df8cb2941ebfbdc9dc31b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Wed, 12 Jan 2022 22:01:41 +0100 Subject: [PATCH 44/62] Add tooltips to the toolbar buttons --- src/win/win_toolbar.c | 52 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index 7a4d75011..d5d2c87cb 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -14,6 +14,7 @@ HWND hwndRebar; static HWND hwndToolbar; static HIMAGELIST hImageList; static wchar_t wTitle[512]; +static WNDPROC pOriginalProcedure; static TBBUTTON buttons[] = { { 0, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Pause @@ -26,6 +27,52 @@ static TBBUTTON buttons[] = { { 0, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } // Settings }; + +int +ToolBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) { + case WM_NOTIFY: + switch (((LPNMHDR) lParam)->code) { + case TTN_GETDISPINFO: { + LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)lParam; + + // Set the instance of the module that contains the resource. + lpttt->hinst = hinstance; + + uintptr_t idButton = lpttt->hdr.idFrom; + + switch (idButton) { + case IDM_ACTION_PAUSE: + lpttt->lpszText = L"Pause execution"; + break; + + case IDM_ACTION_RESET_CAD: + lpttt->lpszText = L"Press Ctrl+Alt+Delete"; + break; + + case IDM_ACTION_CTRL_ALT_ESC: + lpttt->lpszText = L"Press Ctrl+Alt+Esc"; + break; + + case IDM_ACTION_HRESET: + lpttt->lpszText = L"Hard reset"; + break; + + case IDM_CONFIG: + lpttt->lpszText = L"Settings"; + break; + } + + return TRUE; + } + } + } + + return(CallWindowProc(pOriginalProcedure, hwnd, message, wParam, lParam)); +} + + void ToolBarCreate(HWND hwndParent, HINSTANCE hInst) { @@ -59,6 +106,10 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst) // Autosize the toolbar and determine its size. btnSize = LOWORD(SendMessage(hwndToolbar, TB_GETBUTTONSIZE, 0,0)); + // Replace the original procedure with ours. + pOriginalProcedure = (WNDPROC) GetWindowLongPtr(hwndToolbar, GWLP_WNDPROC); + SetWindowLongPtr(hwndToolbar, GWL_WNDPROC, (LONG_PTR)&ToolBarProcedure); + // Create the containing Rebar. hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | @@ -92,6 +143,7 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst) return; } + wchar_t * ui_window_title(wchar_t *s) { From 8d0c1dec81d5242033564dd0e3468e867ee22d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Wed, 12 Jan 2022 23:15:33 +0100 Subject: [PATCH 45/62] Add taskbar tooltips to the resources for localization --- src/include/86box/language.h | 7 +++++++ src/win/languages/cs-CZ.rc | 7 +++++++ src/win/languages/de-DE.rc | 7 +++++++ src/win/languages/en-GB.rc | 7 +++++++ src/win/languages/en-US.rc | 7 +++++++ src/win/languages/es-ES.rc | 7 +++++++ src/win/languages/fi-FI.rc | 7 +++++++ src/win/languages/fr-FR.rc | 7 +++++++ src/win/languages/hr-HR.rc | 7 +++++++ src/win/languages/hu-HU.rc | 7 +++++++ src/win/languages/it-IT.rc | 7 +++++++ src/win/languages/ja-JP.rc | 7 +++++++ src/win/languages/ko-KR.rc | 7 +++++++ src/win/languages/pt-BR.rc | 7 +++++++ src/win/languages/pt-PT.rc | 7 +++++++ src/win/languages/ru-RU.rc | 7 +++++++ src/win/languages/sl-SI.rc | 7 +++++++ src/win/languages/tr-TR.rc | 7 +++++++ src/win/languages/zh-CN.rc | 7 +++++++ src/win/win_toolbar.c | 10 +++++----- 20 files changed, 138 insertions(+), 5 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 467a5704c..f9da499be 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -127,6 +127,13 @@ #define IDS_2151 2151 // "Cartridge images (*.JRC)\0*.JRC\0..." #define IDS_2152 2152 // "Error initializing renderer" #define IDS_2153 2153 // "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." +#define IDS_2154 2154 // "Resume execution" +#define IDS_2155 2155 // "Pause execution" +#define IDS_2156 2156 // "Press Ctrl+Alt+Del" +#define IDS_2157 2157 // "Press Ctrl+Alt+Esc" +#define IDS_2158 2158 // "Hard reset" +#define IDS_2159 2159 // "ACPI shutdown" +#define IDS_2160 2160 // "Settings" #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index d9f392cc9..6ad1d8788 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Obrazy cartridge (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Všechny soubory (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Obnovit" + IDS_2155 "Pozastavit" + IDS_2156 "Stisknout Ctrl+Alt+Delete" + IDS_2157 "Stisknout Ctrl+Alt+Esc" + IDS_2158 "Resetovat" + IDS_2159 "Vypnout skrze rozhraní ACPI" + IDS_2159 "Nastavení" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 38a562cd5..9a89beb24 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Cartridgeimages (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Alle Dateien (*.*)\0*.*\0" IDS_2152 "Fehler bei der Rendererinitialisierung" IDS_2153 "Der OpenGL (3.0-Kern)-Renderer konnte nicht initialisiert werden. Bitte benutzen Sie einen anderen Renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index 939d96f5c..936a05e17 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index c010e9a90..0266397a4 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 44fadfc6e..52cb60c6b 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Imágenes de Cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index bedc9d3f7..5513977af 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "ROM-moduulikuvat (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Kaikki tiedostot (*.*)\0*.*\0" IDS_2152 "Virhe renderöijän alustuksessa" IDS_2153 "OpenGL (3.0 Core) renderöijän alustus epäonnistui. Käytä toista renderöijää." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index a59c78dab..460283b0d 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Images cartouche (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tous les fichiers (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index ba384f5a6..575d0ba1d 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Slike kasete (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Sve datoteke (*.*)\0*.*\0" IDS_2152 "Nije moguće inicijalizirati renderer" IDS_2153 "Nije moguće inicijalizirati OpenGL (3.0 jezgra) renderer. Molimte koristite drugi renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 1b7dfbe43..ae7e51924 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -535,6 +535,13 @@ BEGIN IDS_2151 "ROM-kazetta képek (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Minden fájl (*.*)\0*.*\0" IDS_2152 "Hiba történt a renderelő inicializálásakor" IDS_2153 "Az OpenGL (3.0 Core) megjelenítő-motort nem sikerült inicializálni. Kérem használjon másik renderelőt." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 2656a2d5d..2ee1cb0a8 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Immagini cartuccia (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tutti i file (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index c74b99d81..47d7184f2 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "カートリッジイメージ (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0すべてのファイル (*.*)\0*.*\0" IDS_2152 "レンダラーの初期化エラー" IDS_2153 "OpenGL(3.0コア)レンダラーが初期化できませんでした。別のレンダラーを使用してください。" + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index 510bc8c60..b2e86d0ac 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "카트리지 이미지 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0모든 파일 (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index e2a9a856e..5732494e6 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -536,6 +536,13 @@ BEGIN IDS_2151 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os arquivos (*.*)\0*.*\0" IDS_2152 "Erro ao inicializar o renderizador" IDS_2153 "O renderizador OpenGL (Núcleo 3.0) não pôde ser inicializado. Use outro renderizador." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index c30f6d50d..cc50665b1 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os ficheiros (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 72b4e7e66..6bb1f222a 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Образы картриджей (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Все файлы (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 815c08603..cdc00fc4a 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Slike spominskega vložka (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Vse datoteke (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 91ee1480e..eca2767dc 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "Kartuş imajları (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tüm dosyalar (*.*)\0*.*\0" IDS_2152 "Error initializing renderer" IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 628ce1210..00ec3bc29 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -533,6 +533,13 @@ BEGIN IDS_2151 "卡带镜像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有文件 (*.*)\0*.*\0" IDS_2152 "初始化渲染器时出错" IDS_2153 "无法初始化 OpenGL (3.0 核心) 渲染器。请使用其他渲染器。" + IDS_2154 "Resume execution" + IDS_2155 "Pause execution" + IDS_2156 "Press Ctrl+Alt+Del" + IDS_2157 "Press Ctrl+Alt+Esc" + IDS_2158 "Hard reset" + IDS_2159 "ACPI shutdown" + IDS_2160 "Settings" END STRINGTABLE DISCARDABLE diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index d5d2c87cb..c6f22644c 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -44,23 +44,23 @@ ToolBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch (idButton) { case IDM_ACTION_PAUSE: - lpttt->lpszText = L"Pause execution"; + lpttt->lpszText = MAKEINTRESOURCE(IDS_2155); break; case IDM_ACTION_RESET_CAD: - lpttt->lpszText = L"Press Ctrl+Alt+Delete"; + lpttt->lpszText = MAKEINTRESOURCE(IDS_2156); break; case IDM_ACTION_CTRL_ALT_ESC: - lpttt->lpszText = L"Press Ctrl+Alt+Esc"; + lpttt->lpszText = MAKEINTRESOURCE(IDS_2157); break; case IDM_ACTION_HRESET: - lpttt->lpszText = L"Hard reset"; + lpttt->lpszText = MAKEINTRESOURCE(IDS_2158); break; case IDM_CONFIG: - lpttt->lpszText = L"Settings"; + lpttt->lpszText = MAKEINTRESOURCE(IDS_2160); break; } From e5bf6ea015676621f5c14245c1e7e1ffbfb56446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Wed, 12 Jan 2022 23:40:40 +0100 Subject: [PATCH 46/62] Add support for icon set switching to the toolbar --- src/include/86box/win.h | 1 + src/win/win_icon.c | 8 ++++-- src/win/win_toolbar.c | 54 +++++++++++++++++++++++++++-------------- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 6c061ef4a..0bbc99642 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -216,6 +216,7 @@ extern int MediaMenuHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara /* Functions in win_toolbar.c */ extern HWND hwndRebar; extern void ToolBarCreate(HWND hwndParent, HINSTANCE hInst); +extern void ToolBarLoadIcons(); /* Functions in win_dialog.c: */ diff --git a/src/win/win_icon.c b/src/win/win_icon.c index 9b0d5ef23..8d3ec9590 100644 --- a/src/win/win_icon.c +++ b/src/win/win_icon.c @@ -120,9 +120,11 @@ void win_load_icon_set() win_clear_icon_set(); win_system_icon_set(); - if (strlen(icon_set) == 0) + if (strlen(icon_set) == 0) { + ToolBarLoadIcons(); return; - + } + char path_root[2048] = {0}, temp[2048] = {0}; wchar_t wtemp[2048] = {0}; @@ -150,4 +152,6 @@ void win_load_icon_set() uint32_t curr_lang = lang_id; lang_id = 0; set_language(curr_lang); + + ToolBarLoadIcons(); } \ No newline at end of file diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index c6f22644c..aa1d60cd6 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -10,21 +10,21 @@ #include <86box/ui.h> #include <86box/win.h> -HWND hwndRebar; -static HWND hwndToolbar; -static HIMAGELIST hImageList; -static wchar_t wTitle[512]; -static WNDPROC pOriginalProcedure; +HWND hwndRebar = NULL; +static HWND hwndToolbar = NULL; +static HIMAGELIST hImageList = NULL; +static wchar_t wTitle[512] = { 0 }; +static WNDPROC pOriginalProcedure = NULL; static TBBUTTON buttons[] = { { 0, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Pause { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, - { 0, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Del - { 0, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Esc - { 0, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Hard reset - { 0, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, // ACPI shutdown + { 1, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Del + { 2, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Esc + { 3, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Hard reset + { 4, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, // ACPI shutdown { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, - { 0, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } // Settings + { 5, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } // Settings }; @@ -73,6 +73,31 @@ ToolBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } +void +ToolBarLoadIcons() +{ + if (!hwndToolbar) + return; + + if (hImageList) + ImageList_Destroy(hImageList); + + hImageList = ImageList_Create(win_get_system_metrics(SM_CXSMICON, dpi), + win_get_system_metrics(SM_CYSMICON, dpi), + ILC_MASK | ILC_COLOR32, 1, 1); + + ImageList_AddIcon(hImageList, hIcon[16]); // Run + ImageList_AddIcon(hImageList, hIcon[24]); // Pause + ImageList_AddIcon(hImageList, hIcon[32]); // Ctrl+Alt+Delete + ImageList_AddIcon(hImageList, hIcon[40]); // Ctrl+Alt+Esc + ImageList_AddIcon(hImageList, hIcon[48]); // Hard reset + ImageList_AddIcon(hImageList, hIcon[56]); // ACPI shutdown + ImageList_AddIcon(hImageList, hIcon[64]); // Settings + + SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList); +} + + void ToolBarCreate(HWND hwndParent, HINSTANCE hInst) { @@ -90,14 +115,7 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst) 0, 0, 0, 0, hwndParent, NULL, hInst, NULL); - // Create the image list. - hImageList = ImageList_Create(win_get_system_metrics(SM_CXSMICON, dpi), - win_get_system_metrics(SM_CYSMICON, dpi), - ILC_MASK | ILC_COLOR32, 1, 1); - - ImageList_AddIcon(hImageList, hIcon[241]); - - SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList); + ToolBarLoadIcons(); // Add buttons. SendMessage(hwndToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); From 88037d9bdaf1335b218c6eb07c1b0ae6bc135bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 13 Jan 2022 00:08:06 +0100 Subject: [PATCH 47/62] Change the Pause icon if paused --- src/include/86box/win.h | 1 + src/win/win_toolbar.c | 25 +++++++++++++++++++------ src/win/win_ui.c | 3 +++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 0bbc99642..4fb6a7d00 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -217,6 +217,7 @@ extern int MediaMenuHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara extern HWND hwndRebar; extern void ToolBarCreate(HWND hwndParent, HINSTANCE hInst); extern void ToolBarLoadIcons(); +extern void ToolBarUpdatePause(int paused); /* Functions in win_dialog.c: */ diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index aa1d60cd6..b4ebab0c6 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -17,14 +17,14 @@ static wchar_t wTitle[512] = { 0 }; static WNDPROC pOriginalProcedure = NULL; static TBBUTTON buttons[] = { - { 0, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Pause + { 1, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Pause { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, - { 1, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Del - { 2, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Esc - { 3, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Hard reset - { 4, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, // ACPI shutdown + { 2, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Del + { 3, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Esc + { 4, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Hard reset + { 5, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, // ACPI shutdown { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, - { 5, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } // Settings + { 6, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } // Settings }; @@ -98,6 +98,19 @@ ToolBarLoadIcons() } +void +ToolBarUpdatePause(int pause) +{ + TBBUTTONINFO tbbi; + + tbbi.cbSize = sizeof(tbbi); + tbbi.dwMask = TBIF_IMAGE; + tbbi.iImage = pause ? 0 : 1; + + SendMessage(hwndToolbar, TB_SETBUTTONINFO, IDM_ACTION_PAUSE, (LPARAM) &tbbi); +} + + void ToolBarCreate(HWND hwndParent, HINSTANCE hInst) { diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 0c1fbc930..099540ccb 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -1630,6 +1630,9 @@ plat_pause(int p) if (enable_discord) discord_update_activity(dopause); + /* Update the toolbar */ + ToolBarUpdatePause(p); + /* Send the WM to a manager if needed. */ if (source_hwnd) PostMessage((HWND) (uintptr_t) source_hwnd, WM_SENDSTATUS, (WPARAM) !!dopause, (LPARAM) hwndMain); From b6d033481f62626cf7bb8861b4657f1cd8d3539e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 13 Jan 2022 00:09:45 +0100 Subject: [PATCH 48/62] Change tooltip for Pause button if paused --- src/win/win_toolbar.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index b4ebab0c6..03b796059 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -43,8 +43,11 @@ ToolBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) uintptr_t idButton = lpttt->hdr.idFrom; switch (idButton) { - case IDM_ACTION_PAUSE: - lpttt->lpszText = MAKEINTRESOURCE(IDS_2155); + case IDM_ACTION_PAUSE: + if (dopause) + lpttt->lpszText = MAKEINTRESOURCE(IDS_2154); + else + lpttt->lpszText = MAKEINTRESOURCE(IDS_2155); break; case IDM_ACTION_RESET_CAD: From 6a98625e28d675f4f056bfc30febd31382db3a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 13 Jan 2022 00:14:01 +0100 Subject: [PATCH 49/62] Fix 64-bit build due to no `GWL_WNDPROC` constant --- src/win/win_stbar.c | 6 +----- src/win/win_toolbar.c | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index afc906215..29985aaf3 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -54,10 +54,6 @@ #include <86box/ui.h> #include <86box/win.h> -#ifndef GWL_WNDPROC -#define GWL_WNDPROC GWLP_WNDPROC -#endif - HWND hwndSBAR; int update_icons = 1, reset_occurred = 1; @@ -992,7 +988,7 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) /* Replace the original procedure with ours. */ OriginalProcedure = GetWindowLongPtr(hwndSBAR, GWLP_WNDPROC); - SetWindowLongPtr(hwndSBAR, GWL_WNDPROC, (LONG_PTR)&StatusBarProcedure); + SetWindowLongPtr(hwndSBAR, GWLP_WNDPROC, (LONG_PTR)&StatusBarProcedure); SendMessage(hwndSBAR, SB_SETMINHEIGHT, (WPARAM)17, (LPARAM)0); diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index 03b796059..15bc6ceea 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -142,7 +142,7 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst) // Replace the original procedure with ours. pOriginalProcedure = (WNDPROC) GetWindowLongPtr(hwndToolbar, GWLP_WNDPROC); - SetWindowLongPtr(hwndToolbar, GWL_WNDPROC, (LONG_PTR)&ToolBarProcedure); + SetWindowLongPtr(hwndToolbar, GWLP_WNDPROC, (LONG_PTR)&ToolBarProcedure); // Create the containing Rebar. hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL, From dc8c94814ec0560f69d0753090e84aed0d320373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 13 Jan 2022 00:43:01 +0100 Subject: [PATCH 50/62] Initialize the Pause button to the correct state on start --- src/win/win_toolbar.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index 15bc6ceea..dd484658f 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -144,6 +144,9 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst) pOriginalProcedure = (WNDPROC) GetWindowLongPtr(hwndToolbar, GWLP_WNDPROC); SetWindowLongPtr(hwndToolbar, GWLP_WNDPROC, (LONG_PTR)&ToolBarProcedure); + // Make sure the Pause button is in the correct state. + ToolBarUpdatePause(dopause); + // Create the containing Rebar. hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | From 318875bf09fa4f54fcf140a0503c125485db4052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 13 Jan 2022 00:47:14 +0100 Subject: [PATCH 51/62] Add proper icons --- src/win/86Box.rc | 7 +++++++ src/win/icons/acpi_shutdown.ico | Bin 0 -> 9622 bytes src/win/icons/hard_reset.ico | Bin 0 -> 9622 bytes src/win/icons/pause.ico | Bin 0 -> 9622 bytes src/win/icons/run.ico | Bin 0 -> 9622 bytes src/win/icons/send_cad.ico | Bin 0 -> 9622 bytes src/win/icons/send_cae.ico | Bin 0 -> 9622 bytes src/win/icons/settings.ico | Bin 0 -> 9622 bytes src/win/win_icon.c | 7 +++++++ src/win/win_toolbar.c | 14 +++++++------- 10 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 src/win/icons/acpi_shutdown.ico create mode 100644 src/win/icons/hard_reset.ico create mode 100644 src/win/icons/pause.ico create mode 100644 src/win/icons/run.ico create mode 100644 src/win/icons/send_cad.ico create mode 100644 src/win/icons/send_cae.ico create mode 100644 src/win/icons/settings.ico diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 1b48edb03..8b34c5c09 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -139,6 +139,13 @@ END 185 ICON DISCARDABLE ICON_PATH "icons/mo_empty_active.ico" 192 ICON DISCARDABLE ICON_PATH "icons/cassette_empty.ico" 193 ICON DISCARDABLE ICON_PATH "icons/cassette_empty_active.ico" +200 ICON DISCARDABLE ICON_PATH "icons/run.ico" +201 ICON DISCARDABLE ICON_PATH "icons/pause.ico" +202 ICON DISCARDABLE ICON_PATH "icons/send_cad.ico" +203 ICON DISCARDABLE ICON_PATH "icons/send_cae.ico" +204 ICON DISCARDABLE ICON_PATH "icons/hard_reset.ico" +205 ICON DISCARDABLE ICON_PATH "icons/acpi_shutdown.ico" +206 ICON DISCARDABLE ICON_PATH "icons/settings.ico" 232 ICON DISCARDABLE ICON_PATH "icons/cartridge_empty.ico" 240 ICON DISCARDABLE ICON_PATH "icons/machine.ico" 241 ICON DISCARDABLE ICON_PATH "icons/display.ico" diff --git a/src/win/icons/acpi_shutdown.ico b/src/win/icons/acpi_shutdown.ico new file mode 100644 index 0000000000000000000000000000000000000000..a2493b8031b6a7b5de4dff93d43e32c184d5336c GIT binary patch literal 9622 zcmeHNJ#HR15Tzi)Lg2zKT)30Ul)iyo%&-nYXiV zXNDZ^&!@z85d!q=k~8nU8FINRS*2W*C*{S9BKD@dds50zrIeR1_5QD?rTi&luU_f> zZ$Fgs%d=8$ZuI^SiThi8f0P)x6a*a?Q{GD4&Q`@Q>s#S-%tx_VUoaCK?_VW8>-3p$ z9LC4`{(b9DUs^wpF^}Qn)xS2)@&S&I_pz80;nHUO#p)R1sDl_jp0VDK{_WgWJm!5r z8n6DQ`)kCrZkijo(PAE~2lK}^h&5#GHJb6 z-+PmQ`5#>`_+;Jc;A66DzwZ9J_kFmo^>kJ1-DRz}7us!)`kZYZzKB6A&KWswrt=2p z725A|MjdR+b0Ts6`XCHrea`-x^P8}<2FAuZSbaFZhD#q<;`lLt-Of+Ajo5atmU{oG zrd{`o$87P&Sj{>t`0JP+Pj%Uzr4CxH8MGTFYC(-XR`ex~w^oZDv&S1pX1rQU)u?6{wKp! z>^e8Y03X-6)kaLkv-br3GkrS8cY)?Z9B;wZ;_CA?$4t5mNBuoQejRZcPpf%PdFJ86 zQS!HT7*M|8eIxIuQ~6Nu%A2X*mg|aM%JZ~yp8kjh2C(qnl27RJS~}lbKg+lDnN9fH zdQbOf!cAcgv#k^F1LpxQ#?x{SwwCj-d-G|Z7hrlEf9?79aJ1Np#pkfK#!H?xjuzXV z#}>D}SDrPFZS1+etaD2-*Kow)@uP0T^>ttB5O^$)Wq#gMIlk2w{?tZGKGT!qkFjyi z^tkPqYGool$M=HIdeAbDe@lN>XK;K^_|Ow|+8W1kxanL!u6siB(hZugG4_P*hYZKY zqOZpWgU9c4P(6mV&Ph%FJZ@Nq^+2T>Uf3 zIr_GBC$6^{#|WReuzRq{qa4V^@|o64aA@Pt=<_%Mc39}qPM+3se%8JNbL3)NM=|TK zwSJcGtq1wex|i>)Q@N6FuS@yvx>&lfy1Ll4_dyI|fdMRF0vq39H`3oq=XcmGesTHu zmTD4Mjz6BEMgIYWoXi9GFo=6$b?7?X|z8v3(< z9I&G`h(2C3bnMlTb9+vncdhk4s`IFZo?9{P3~xC{_lP^DVeCKR*cv~kq2<>#%Q)t> z_9DDg=Y|EM5_c=ri z&+l_*4pD!M&G_1}Eq>#P*n8qyuF?G#7Hi=1--0L-tYbXjvD&+O2CtP=r>oNul*c9 z`w;kmMZI-Bpd)J0IpyWL7^nKu=Ky8uN}Q;Ln!GhVi1{y?X^C7MKgL<_pHF{)@THUw wpG$f3P|Eea{KwC!l&iZ^F41r0R|xE7qtOrcZjL_*7BGPg4scC>6d~OI0KJFdkpKVy literal 0 HcmV?d00001 diff --git a/src/win/icons/hard_reset.ico b/src/win/icons/hard_reset.ico new file mode 100644 index 0000000000000000000000000000000000000000..d0494f40bb8220eaf8babada5cc3db648f6a67cd GIT binary patch literal 9622 zcmc(lF>V}35Jj7yV8U=91qzgrp+nz5ihK@7hHoJ{bLe9@a%^Qh3gH6?bYuc1cU-?` z-t6Dn?wQ%81vgNv?y6t^*L2Se2b4;=D6h(!HzoW{`RP?D-tWQDL;Nw%FWHV{w?Z02lm^jiD@v5@o?os)NLF?;99m;UTbb|%g{38JmPWur%z=V zhGPRW@yr~G3$HqA!MX>dm~(i&FylHX(*Wo7#H34HWfTAGp#l$0`h&L!BONsGwZMKT4xi>>bxw>>a0E=Ie2VKyze#=IrGmoAhfR#JtA&JkGVs8|L7;#m(?q@E&tMIFj3|;vQ2SXXyT1zTTO(&T~tD^eil+)jxaaIci%m=OWMbkLwXZj=knSBrcCOUX_Yt zuEjo37d3Tg&E7>|eugz~4aHT%Ib}YPIwx4e@l4HHOI*&!H8@_pZsgcg^(&4%r~yY^ z_T<55p1cM}UH0U2-P)SE?3e0x`h63>pYF@Y;jX-|c3Z9oSt+lZMjpIs#UU>J-ilA? z@?99ew|Wb}$Zoeg&{@-1<8Hm1h_z}J^Yd83i0Aq5&)^SyPh$&zIKr`_o^4&i4mrQfr?7S>;~h*ZnPHh!gWzZ{NhNQG1!r zPV)#=gNrqs^2CJkGuPZW0yYlC=mTErSO@ZeS8*_S#U|Xuym!i>0p2}2EneZ4xKUZt za6O-I;m#VmmZj?^Tm9kk<>R22pv&u*D;zV-8otl1 zdFtnw>9k1IbsfL=TXV-+FQ=&n+IdG!bOL-0oe5t#0&>Rb69 zFPuCOJzP&8UDaX4avv>j#U^}hp@s4L$MCgIYgxvC^Bxq_J(;oSxAKlwJyh~ahOv}T~9<(&Tv~uE9DNk%BkL;P(>_-}?<+mD{E~J{zqJSAkS6BqmZoBk&3n$;cqBWIR?muI z^lkOCUXaweW6{gr>St{x%IRLpHF=Fr_8FJgOWLRQkh#~^TeQDa52tA79=4oE@7h%> z3r^X|gY$)FOD~S4{$$})0FS)$x8{ybH2=xc`CIc-MTUph@v^)acBOoLD&_rSDc2A2 n4?p*%T-}v&DZ7n7Az)=?fRn$Q>hFU~oZ^;-wCaC~21jLZBci;e=fOs=gZqGMs zd%E2<4-i7MCF^y&-}h?9(?9MpyJKf|er~QidwFK|%*-w>%KqnjW}kfQ^0Mr|ePH(D zq1kR%_CGlH!@ZB4@l8)C<1TjP+@K{t)_3gvc;0W@t1rpwUb2d(9?#qLF;aZ|-M5tN zqxar3I=1nLIo{^)-#>ryZ#eyq^)<3T|7VX?=YMnkm22p5ZY&+Uev{I#^n9Q3+s$;p z$@i<=-updj(766acD-tinWkCC~F zc(%ObXXYt$a*B8RJ^qXHdHAg9&X=Lr&zG6|E(xs;yw^8R)9>v0x#de}d*Yqv)^lG= z4;s&(UI)l@sQ0tqa`WFkd&e!xx$p3-npHR>Z5 zjdD>RxoDJ&`p8A2T+~M{8s(xsa?vOk^^uE4xu}m^G|EMNLVA8a#0_-Xq1ck z$VH=E)JHBF<)S`v(I^-7k&8yTy^poh^ei5|t9JRToaY~{v+~$lTj9Q@yXjB%ybjxW zzw*vH>~;R*a@<%$E$NuPJ-Wm*e(S8amgcO?cV=Tv&2g?-%jNalDQh}DotmR^)J4@C zm7^}I=BONXQ8h>9sEevODo0&Z%~3h(qH2!HQ5RKnRF1l+nxk^mMb#XYqb{oEs2p`s zHAm&Bi>f&)M_p9SQ90_OYL3cL7gcjqj=HFtqjJ=INRdZC1x~Q6?a@0lD9F?Oks^+L1bx}2E&(;44uI?VC< Xv;Q?P&i7kW{7YK#-yhxF|C{|MaKmbx literal 0 HcmV?d00001 diff --git a/src/win/icons/run.ico b/src/win/icons/run.ico new file mode 100644 index 0000000000000000000000000000000000000000..90a7f28866ea609d94cf0c3c6d62b174f2d7ee21 GIT binary patch literal 9622 zcmc&)F>>255Il`M(PUD{g$s95nKD0+tGpvsCcltUC1rl#HdX4R(@Y+aC+G)xLYQ5F zXC6U71VB)NW(OpQ+ub|T04-Z&A$M|rFX*@O=}zRmh&(*F^PjIoeqikJ(Vc&NE%Nb= z$ad?_za#E1=DtM?4#D8Y(a96yBCWwVQPvKKB^*aS4`cZ$<m?`N-6_4_E|-*e8|U=9I*i5lpN%d~k7DswQ|E?yKip8>|8yn-dyqufcV*FEi)rZeti`VC` z&Fk|skCOT-PpqGb_jEd)f5#uZcdgoYtMhx;4)0oPU z8khQ7`c^kq>yVEc`l+?9t#5MEqhC{3y`<>Rp_{5tZF-zqXVvrj zSpGI=Kc?onuWxnd%Gvr?{cG#02i0ePjeJ#C`y1*0X`1FYa3prX2Eca;NBob%5r6wR m$_7{iOF)P{umM)UvIUPh#%qn6%NWLjgIwe!H#HikN$vj&jY=>8 literal 0 HcmV?d00001 diff --git a/src/win/icons/send_cad.ico b/src/win/icons/send_cad.ico new file mode 100644 index 0000000000000000000000000000000000000000..e3e64a74349af9f14f900b0cf1d5dcd7b37e024f GIT binary patch literal 9622 zcmeI1J#HLF5QUqdV8U=f1qzsvp+nz5ihK@5hHs$}U>FX43`dToj7K4S0D+E7z$C}@ zy64+{)7w3}!zJy+4b)cuRK555XL^UrlupvC^!jxQf0cfGmD2Yqr8jR%`_oq`{T_W6 z7p48n*D3w*O-ff+rTtsveTmp_BPXhXQ2N8AcaismGDeQup%6J|7}DrwSX~^C|NJ?P zZj4PhO$^11<2ElEn<6ZY_wrl0@B`Ar7=|HZJ2$y_VH}$8e8=R&>3FR*kpAoI>&+bM zJld^XHp17SwGQf&RqIb1pTxmlkRwmO^9if)4&>){>EGr|x=GDmc`BNBnR~(L_0N){ z(TnT#xAMhHQ9WX^{#JjTueP|{i19wv>32V#kK_I6INqHUyN&I+af|-ju%99(MXcM; zm*c2=Ca#-&-{`(l`8DpSCzj3rMZVY9!cA*9-+MbdVDH5xM_$jMpGE4#Oq#oxic`+^ zS#IkiM)6CSj;EZ`<|J)BaZ7l__}wIgiGSlkCBBErICCXV-c9%_#1mI9BIB(+s5#c) zv2L!ZUjH?C=vR&kx`ioQJKq`)O!TU)0uS-^`l(F}8t?^S`>B5LRS%=s?_q9Zra8z_>x)uDbR&w2g3l{o%criX{F1Y05HSSo4;w|z0 z8+iVGBP}ZG(|oj!OXIaZ=DfSV!)9$-W9n;RjUUJHF?|^C)7$YbU1qzDFQb-ed3b_)q0@I^d~dyvcj+Tb@Z`O({gJQ*lk-)3<6O&=b%Mt|T6@OV@Q@=9 zUhG1gs9j^6oQY>~E{YWvxvG<2dymuDKKvfGo`+Vc2m4$q~31|AKMQNHF}+jHRySA4ax&d2I!j+#5AH9z*i z$H-k;A7UIE4A!i)O9W#+uNq%%;^d>5lksY(A1lav_m*dFbKkJ`!j(A}n0Ut7cVeSI zv<_4L5EyRd+@Q0X^NyYtHu%y}H0!iw?zsi(iA^U&sCUy>}b&qhI*@;?Rv(ek;ed zf`3RHxbDTVWW+ATXpA`bnz^APP5&mlX(9+iFdEmG>r{mDdLNrg+Jf1 z;r(TP54#G&cVWDT4f^5oWlCtsXRP)w!&Xo?T-)U{Rpa5n3$K1}B={<_RE9K-Uu&%<68w&tH)#4$|9{25%>9rR)-lYZ z_W*GIlkv16iuW_QX8!)(SZi=x)n#zX)Atna$j?Q4Ft^<^?)Y%Zdp~v42nBwoJvw{s zI2X$r;HrI(Tk{j&e4h2ZOUyQ|XyB~ZT(lXNpXL;9Uc}3J>1l|JtPihv%?EQHuQNW) zeNH^J;1{OOTg%Yp{2uQ-URQjR)HT)SS)MYqnicx&U0 zs#yh3bM6(5DJ}rAXRQv2Z<1Q4aF@8@Pz?NQ;*F|Xm4-tMfJ0&xL;R8-^$#Ha`J;dO u+{6zO*YN{`erO1LjGqtg1E6CX!%idiEPi7+kMPT|w_$nBdVaV#8UF#0;gaA0 literal 0 HcmV?d00001 diff --git a/src/win/icons/send_cae.ico b/src/win/icons/send_cae.ico new file mode 100644 index 0000000000000000000000000000000000000000..757f38d351d3992669ae6dbdf051571b4731c873 GIT binary patch literal 9622 zcmeHNF>WL`5adD!3&t7H1qWDxfmP_xKae87Ly_TM+$cFa^fMeecDN7lBlH48p@W6! zswRumLy?@>yA@yq*FdXDc6U{?$(dd0E`(ip6W+ZGus7l7HzE8OLU{i^&Hwx=gg>x$ zeVyjNejUP3Z$r4bN%P;4_cvm{M-GNSNb4}+4tXa^%<;5d*I}k91}gJ3mQ7fF48&0a zHIK_YujP8$7%t!PGB3vz;dU?zXQ^K-4)=u*F_YtIa-5paT8XLNbG%$rWoA8p*{9-_ zt9j!Ln147N%KjG^oIpnWEP@zy9Vv4@ON4PxUgkY|A8Yo?49=Yx7jkGdhP#aGb(d;G z`YGHuRT#bX*T^TY#QLA>Z>`t-oU>N1it%e4Yu(%DUt&C7#Q4t+io<=nkMWU;x%3JC zkKf|_u9o_7A0yv0c-`3hhVLuNZ+J(YLE3j>JMc1}`}gYa*&3$L(-;SacC9`SFQAc6 zDY<#9HCd}Q)!00@j9Z>n;wd)|7jxrN?Tx+X`;qQ{RiokNT+dN3J9x@dPBXsZa{FGi z&gyfq1(S7oeizfjBCy93maNN5cLol(wx~;!8c$fVmd{#=C9P{0Sgz0B1&qmi5|*rR z%6x!FXx1ogVG@VZJf~EfdR<$4FQ@GJCppA}^u;}99bBXJn&ZknWWJPf=1&&GS?Hs% zXI_=F=AV($Xf1xt|9`~upEo*1yMy_hM*e!goU=zQRcy=0HTk`bPpBw-h|kbt*yFS6 zDn3!aq3$uhh0@Y@8y^sdvYYzwkUqEY6*~L?)#uhdzDu83(tS;Lzqzjy_=KgD@>~S= zEcNZvIFvtQBs{iUI{U=G%_5Joz#&#%E56h5tw!ckh({5wpO^KSqweKmFZm7@{1%px z6H~%`O2Nr>EY|7gdgp9~Z|`O0!%ALYWyfND1z#NO zlaw_{JeJmIx!$Q=`{~*8{h`J-JkMSAh4rylv@Okjw7Pt)RN6zxYq-m;Ynf;rmrcx|{HK1L_0j7f||k z_ov2z8Dx3ABd7#8n|z}~0+vzBv9Yk!Fk zm(bqXvgfTK@oH}~_JW(wL8)Pm`Me%@&KjS-ye4khvz!6&3!aVA{`?yGHLq<|!|C_I z@z>Z}=cNYrs`1Vo9!}=p%GHar8sIFo3`rNyu;mb!((85d_WimeYy4C05v`OtBX0Vo z!#FrCZg2*ZxEPahdzeiujh_!Iek{od52`tGJ04C^y$*uu?wKz?zPvli9U>x1IGe=E1{A!}&q8n^M}9aYuwm8hrJoX%Ljnd=h{^)D%)34=xi?gw-Au*(%+`BLp$2E+b!dMEN z-5TVRRlMO6yVi`wc<4~XPfXsomNJG4AhV36v|_pDyMGFGw$@6`A&{NoOs+Rszt z$L#-|^XJ{`iS9J^QttoO_$~V%VW}p@i2s!MHGcYerdw24TVffb_>sl`O!yGv<83_R yj|Tilo=4~*yoK(d;Tg$C)9+wScbH#hy@2JM_7bsI({D};Nvm@My-haRRmG+>60{*K!t3zRq3&Po{TekG0wLuQ!bjAdX)*6-^ga*MburLcr?FzfYGYs@ zEztA0pXXfGQ^#=iR+o7>rU|!+p?cPNt;!RlTuVxNy;Y8h`VMP!o!9DzJc)CdGgj8o zw%cuA&-nm@*vfJ2&gJW^F5?X_IDr{Pqu%rj*I}f})HB1-9*FSVgLN!my(JN4dFL*3-D(yK=VJ z`1Aa8jE7~6PYXCM_vtal9ej&?L&z5ud~BaU9PaR`ofX>rIQ- zlg57FQ2h}j z;j!iNdjer|_*W4GqMl=~*j$kIi+% zz+N2n=$wz&bc28zVv|Go#FTk1uJ@idv^Z+`;t)oa14+-xJ;rf7-{cv%pWJlv$VyC~ zH$BDY1M6w(J)>dzeR)rbZFrvB*Fb#@dkSA#8Hvq$yKBZY?t8)k*J)mR6+dl0-YM#O z>;d9%(!wt|Oe6P7$0^uJQqpgSXq3i5cRDFc&dsxRGF2B6- z{!0JytchXpoCtVLn(>S>kgo=ftge zl{)}_k7uKFKA$7M=4C82u!rZF<1evKo%b5pt8-rung3L-);`mK#a_!fT{uAld1;e( z!SxsPpovY)?6Vrq;h({*o&_~64b)$)8Qw+zJ~trNi+imjkm)(ojOa5 za$Y@4rLNFAdJl?|QQs59Uvidnr=jm#_1um39XV;@RTRI+D!DZ`4ZyL;B+S=Y{sMk! zNQgts5l6u}TBp8>hOTjb_CfrnKkxJBDmmunhI63?!+wE=7B}B|-9!(_%XK+6Gc~wh zKexqVoi(lA6PKpfosV1_)Xi`kPu@dJ-qjR0_s~42AGi2fGkP6(tzJXrzUO)_4I}Y?`=Q(P^-|u(`0yIAUohPUWXA?v>Ycnx;mdTMAh7bn*Nlh3CmH8CcQtMS3A>D1zedC_1{?hM<{=&)*Z2`(9e40;cne>^1Ln!QyKo41 zVIS@mNZnwGzJznWgx_?xVHIv)t;5~&0aM%uJ^g<17vcf)C;Zm&^a}rHT0X>Q{NLz5 DqNwaW literal 0 HcmV?d00001 diff --git a/src/win/win_icon.c b/src/win/win_icon.c index 8d3ec9590..33a5932ef 100644 --- a/src/win/win_icon.c +++ b/src/win/win_icon.c @@ -87,6 +87,13 @@ const _ICON_DATA icon_files[] = {185, "mo_empty_active.ico"}, {192, "cassette_empty.ico"}, {193, "cassette_empty_active.ico"}, + {200, "run.ico"}, + {201, "pause.ico"}, + {202, "send_cad.ico"}, + {203, "send_cae.ico"}, + {204, "hard_reset.ico"}, + {205, "acpi_shutdown.ico"}, + {206, "settings.ico"}, {232, "cartridge_empty.ico"}, {240, "machine.ico"}, {241, "display.ico"}, diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index dd484658f..cf461e4c1 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -89,13 +89,13 @@ ToolBarLoadIcons() win_get_system_metrics(SM_CYSMICON, dpi), ILC_MASK | ILC_COLOR32, 1, 1); - ImageList_AddIcon(hImageList, hIcon[16]); // Run - ImageList_AddIcon(hImageList, hIcon[24]); // Pause - ImageList_AddIcon(hImageList, hIcon[32]); // Ctrl+Alt+Delete - ImageList_AddIcon(hImageList, hIcon[40]); // Ctrl+Alt+Esc - ImageList_AddIcon(hImageList, hIcon[48]); // Hard reset - ImageList_AddIcon(hImageList, hIcon[56]); // ACPI shutdown - ImageList_AddIcon(hImageList, hIcon[64]); // Settings + ImageList_AddIcon(hImageList, hIcon[200]); // Run + ImageList_AddIcon(hImageList, hIcon[201]); // Pause + ImageList_AddIcon(hImageList, hIcon[202]); // Ctrl+Alt+Delete + ImageList_AddIcon(hImageList, hIcon[203]); // Ctrl+Alt+Esc + ImageList_AddIcon(hImageList, hIcon[204]); // Hard reset + ImageList_AddIcon(hImageList, hIcon[205]); // ACPI shutdown + ImageList_AddIcon(hImageList, hIcon[206]); // Settings SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList); } From 6746bbce7deb6e15a35ea0659701150191c9168b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 13 Jan 2022 00:52:48 +0100 Subject: [PATCH 52/62] Fix duplicate string ID --- src/win/languages/cs-CZ.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 6ad1d8788..f9b128819 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -539,7 +539,7 @@ BEGIN IDS_2157 "Stisknout Ctrl+Alt+Esc" IDS_2158 "Resetovat" IDS_2159 "Vypnout skrze rozhraní ACPI" - IDS_2159 "Nastavení" + IDS_2160 "Nastavení" END STRINGTABLE DISCARDABLE From 5e51e28f6e89cef9c062ea79923c906255cb069e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 13 Jan 2022 01:14:58 +0100 Subject: [PATCH 53/62] Reorder the toolbar buttons --- src/win/win_toolbar.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index cf461e4c1..8ba1e4911 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -16,15 +16,27 @@ static HIMAGELIST hImageList = NULL; static wchar_t wTitle[512] = { 0 }; static WNDPROC pOriginalProcedure = NULL; +// Used for image list indices +// Don't shuffle the values up without updating `ToolBarLoadIcons` to follow suit! +enum image_index { + RUN, + PAUSE, + CTRL_ALT_DEL, + CTRL_ALT_ESC, + HARD_RESET, + ACPI_SHUTDOWN, + SETTINGS +}; + static TBBUTTON buttons[] = { - { 1, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Pause - { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, - { 2, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Del - { 3, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Ctrl+Alt+Esc - { 4, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, // Hard reset - { 5, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, // ACPI shutdown - { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, - { 6, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } // Settings + { PAUSE, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, + { HARD_RESET, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, + { ACPI_SHUTDOWN, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, + { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, + { CTRL_ALT_DEL, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, + { CTRL_ALT_ESC, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, + { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, + { SETTINGS, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } }; @@ -89,6 +101,9 @@ ToolBarLoadIcons() win_get_system_metrics(SM_CYSMICON, dpi), ILC_MASK | ILC_COLOR32, 1, 1); + // The icons must be loaded in the same order as the `image_index` + // enumeration on top of the source file. + ImageList_AddIcon(hImageList, hIcon[200]); // Run ImageList_AddIcon(hImageList, hIcon[201]); // Pause ImageList_AddIcon(hImageList, hIcon[202]); // Ctrl+Alt+Delete @@ -108,7 +123,7 @@ ToolBarUpdatePause(int pause) tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_IMAGE; - tbbi.iImage = pause ? 0 : 1; + tbbi.iImage = pause ? RUN : PAUSE; SendMessage(hwndToolbar, TB_SETBUTTONINFO, IDM_ACTION_PAUSE, (LPARAM) &tbbi); } From 691aa95cd111260b65ce044304ee672e01107acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 13 Jan 2022 01:17:27 +0100 Subject: [PATCH 54/62] Slight function reordering --- src/win/win_toolbar.c | 80 +++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index 8ba1e4911..71e9a02c3 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -16,8 +16,7 @@ static HIMAGELIST hImageList = NULL; static wchar_t wTitle[512] = { 0 }; static WNDPROC pOriginalProcedure = NULL; -// Used for image list indices -// Don't shuffle the values up without updating `ToolBarLoadIcons` to follow suit! + enum image_index { RUN, PAUSE, @@ -28,16 +27,33 @@ enum image_index { SETTINGS }; -static TBBUTTON buttons[] = { - { PAUSE, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, - { HARD_RESET, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, - { ACPI_SHUTDOWN, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, - { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, - { CTRL_ALT_DEL, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, - { CTRL_ALT_ESC, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, - { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, - { SETTINGS, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } -}; + +void +ToolBarLoadIcons() +{ + if (!hwndToolbar) + return; + + if (hImageList) + ImageList_Destroy(hImageList); + + hImageList = ImageList_Create(win_get_system_metrics(SM_CXSMICON, dpi), + win_get_system_metrics(SM_CYSMICON, dpi), + ILC_MASK | ILC_COLOR32, 1, 1); + + // The icons must be loaded in the same order as the `image_index` + // enumeration above. + + ImageList_AddIcon(hImageList, hIcon[200]); // Run + ImageList_AddIcon(hImageList, hIcon[201]); // Pause + ImageList_AddIcon(hImageList, hIcon[202]); // Ctrl+Alt+Delete + ImageList_AddIcon(hImageList, hIcon[203]); // Ctrl+Alt+Esc + ImageList_AddIcon(hImageList, hIcon[204]); // Hard reset + ImageList_AddIcon(hImageList, hIcon[205]); // ACPI shutdown + ImageList_AddIcon(hImageList, hIcon[206]); // Settings + + SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList); +} int @@ -88,34 +104,6 @@ ToolBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } -void -ToolBarLoadIcons() -{ - if (!hwndToolbar) - return; - - if (hImageList) - ImageList_Destroy(hImageList); - - hImageList = ImageList_Create(win_get_system_metrics(SM_CXSMICON, dpi), - win_get_system_metrics(SM_CYSMICON, dpi), - ILC_MASK | ILC_COLOR32, 1, 1); - - // The icons must be loaded in the same order as the `image_index` - // enumeration on top of the source file. - - ImageList_AddIcon(hImageList, hIcon[200]); // Run - ImageList_AddIcon(hImageList, hIcon[201]); // Pause - ImageList_AddIcon(hImageList, hIcon[202]); // Ctrl+Alt+Delete - ImageList_AddIcon(hImageList, hIcon[203]); // Ctrl+Alt+Esc - ImageList_AddIcon(hImageList, hIcon[204]); // Hard reset - ImageList_AddIcon(hImageList, hIcon[205]); // ACPI shutdown - ImageList_AddIcon(hImageList, hIcon[206]); // Settings - - SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList); -} - - void ToolBarUpdatePause(int pause) { @@ -129,6 +117,18 @@ ToolBarUpdatePause(int pause) } +static TBBUTTON buttons[] = { + { PAUSE, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, + { HARD_RESET, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, + { ACPI_SHUTDOWN, 0, TBSTATE_INDETERMINATE, BTNS_BUTTON, { 0 }, 0, 0 }, + { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, + { CTRL_ALT_DEL, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, + { CTRL_ALT_ESC, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, + { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, + { SETTINGS, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } +}; + + void ToolBarCreate(HWND hwndParent, HINSTANCE hInst) { From 73c0175bc92a963df7f31890b0cbeb0ec3e9bcea Mon Sep 17 00:00:00 2001 From: EmpyreusX <36258024+EmpyreusX@users.noreply.github.com> Date: Thu, 13 Jan 2022 20:43:21 +0800 Subject: [PATCH 55/62] Updated Simp. Chinese translation --- src/win/languages/zh-CN.rc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 00ec3bc29..52d8de944 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -32,7 +32,7 @@ BEGIN POPUP "查看(&V)" BEGIN MENUITEM "隐藏状态栏(&H)", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "隐藏工具栏(&T)", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "窗口大小可调(&R)", IDM_VID_RESIZE MENUITEM "记住窗口大小和位置(&E)", IDM_VID_REMEMBER @@ -533,13 +533,13 @@ BEGIN IDS_2151 "卡带镜像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有文件 (*.*)\0*.*\0" IDS_2152 "初始化渲染器时出错" IDS_2153 "无法初始化 OpenGL (3.0 核心) 渲染器。请使用其他渲染器。" - IDS_2154 "Resume execution" - IDS_2155 "Pause execution" - IDS_2156 "Press Ctrl+Alt+Del" - IDS_2157 "Press Ctrl+Alt+Esc" - IDS_2158 "Hard reset" - IDS_2159 "ACPI shutdown" - IDS_2160 "Settings" + IDS_2154 "恢复执行" + IDS_2155 "暂停执行" + IDS_2156 "按 Ctrl+Alt+Del" + IDS_2157 "按 Ctrl+Alt+Esc" + IDS_2158 "硬重置" + IDS_2159 "ACPI 关机" + IDS_2160 "设置" END STRINGTABLE DISCARDABLE From d90ad0f6f54c58760b668d84f12cc48a4c7fa9a7 Mon Sep 17 00:00:00 2001 From: EmpyreusX <36258024+EmpyreusX@users.noreply.github.com> Date: Thu, 13 Jan 2022 22:48:44 +0800 Subject: [PATCH 56/62] Updated Japanese translation. --- src/win/languages/ja-JP.rc | 234 ++++++++++++++++++------------------- 1 file changed, 117 insertions(+), 117 deletions(-) diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index 47d7184f2..006fdc29b 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -20,7 +20,7 @@ BEGIN MENUITEM "キーボードはキャプチャが必要(&K)", IDM_ACTION_KBD_REQ_CAPTURE MENUITEM "右CTRLを左ALTへ(&R)", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR - MENUITEM "再起動(&H)...", IDM_ACTION_HRESET + MENUITEM "ハードリセット(&H)...", IDM_ACTION_HRESET MENUITEM "Ctrl+Alt+Del(&C)\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC @@ -32,10 +32,10 @@ BEGIN POPUP "表示(&V)" BEGIN MENUITEM "ステータスバーを隠す(&H)", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "ツールバーを隠す(&T)", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR - MENUITEM "ウィンドウのサイズを変更可能にする(&R)", IDM_VID_RESIZE - MENUITEM "ウィンドウのサイズと位置を記憶する(&E)", IDM_VID_REMEMBER + MENUITEM "ウィンドウのサイズをリサイズ可能(&R)", IDM_VID_RESIZE + MENUITEM "ウィンドウのサイズと位置を記憶(&E)", IDM_VID_REMEMBER MENUITEM SEPARATOR POPUP "レンダラー(&N)" BEGIN @@ -48,9 +48,9 @@ BEGIN #endif END MENUITEM SEPARATOR - MENUITEM "ウィンドウのサイズを指定する...", IDM_VID_SPECIFY_DIM - MENUITEM "画面比率を4:3に合わせる(&O)", IDM_VID_FORCE43 - POPUP "ウィンドウの倍率(&W)" + MENUITEM "ウィンドウのサイズを指定...", IDM_VID_SPECIFY_DIM + MENUITEM "4:3アスペクト比を固定(&O)", IDM_VID_FORCE43 + POPUP "ウィンドウの表示倍率(&W)" BEGIN MENUITEM "0.5x(&0)", IDM_VID_SCALE_1X MENUITEM "1x(&1)", IDM_VID_SCALE_2X @@ -59,53 +59,53 @@ BEGIN END POPUP "フィルター方式" BEGIN - MENUITEM "ニアレストネイバー(&N)", IDM_VID_FILTER_NEAREST - MENUITEM "リニア補間(&L)", IDM_VID_FILTER_LINEAR + MENUITEM "最近傍補間(&N)", IDM_VID_FILTER_NEAREST + MENUITEM "線形補間(&L)", IDM_VID_FILTER_LINEAR END - MENUITEM "高DPIスケール(&D)", IDM_VID_HIDPI + MENUITEM "HiDPIスケーリング(&D)", IDM_VID_HIDPI MENUITEM SEPARATOR MENUITEM "フルスクリーン(&F)\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN - POPUP "フルスクリーンの比率(&S)" + POPUP "フルスクリーンのスケール(&S)" BEGIN MENUITEM "フルスクリーンに拡大(&F)", IDM_VID_FS_FULL MENUITEM "4:3(&4)", IDM_VID_FS_43 - MENUITEM "正方形のピクセル(維持率)(&S)", IDM_VID_FS_KEEPRATIO - MENUITEM "定数倍(&I)", IDM_VID_FS_INT + MENUITEM "正方形ピクセル(アスペクト比を維持)(&S)", IDM_VID_FS_KEEPRATIO + MENUITEM "整数倍(&I)", IDM_VID_FS_INT END POPUP "E&GA/(S)VGAの設定" BEGIN - MENUITEM "色反転VGAモニター(&I)", IDM_VID_INVERT - POPUP "VGA画面タイプ(&T)" + MENUITEM "色を反転(&I)", IDM_VID_INVERT + POPUP "画面タイプ(&T)" BEGIN - MENUITEM "RGBカラー(&C)", IDM_VID_GRAY_RGB - MENUITEM "RGBグレースケール(&R)", IDM_VID_GRAY_MONO - MENUITEM "橙色モニター(&A)", IDM_VID_GRAY_AMBER - MENUITEM "緑色モニター(&G)", IDM_VID_GRAY_GREEN - MENUITEM "白色モニター(&W)", IDM_VID_GRAY_WHITE + MENUITEM "RGB(カラー)(&C)", IDM_VID_GRAY_RGB + MENUITEM "RGB(グレースケール)(&R)", IDM_VID_GRAY_MONO + MENUITEM "モニター(琥珀色)(&A)", IDM_VID_GRAY_AMBER + MENUITEM "モニター(緑色)(&G)", IDM_VID_GRAY_GREEN + MENUITEM "モニター(白色)(&W)", IDM_VID_GRAY_WHITE END - POPUP "グレースケール表示方式(&C)" + POPUP "グレースケール変換タイプ(&C)" BEGIN MENUITEM "BT601 (NTSC/PAL)(&6)", IDM_VID_GRAYCT_601 MENUITEM "BT709 (HDTV)(&7)", IDM_VID_GRAYCT_709 - MENUITEM "平均値(&A)", IDM_VID_GRAYCT_AVE + MENUITEM "平均(&A)", IDM_VID_GRAYCT_AVE END END MENUITEM SEPARATOR MENUITEM "CGA/PCjr/Tandy/EGA/(S)VGAオーバースキャン(&G)", IDM_VID_OVERSCAN - MENUITEM "単色モニター用対比転換(&M)", IDM_VID_CGACON + MENUITEM "単色モニター用コントラストを変更(&M)", IDM_VID_CGACON END MENUITEM "メディア(&M)", IDM_MEDIA POPUP "ツール(&T)" BEGIN MENUITEM "設定(&S)...", IDM_CONFIG - MENUITEM "ステータスバーのアイコンを更新する(&U)", IDM_UPDATE_ICONS + MENUITEM "ステータスバーのアイコンを更新(&U)", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "スクリーンショットを撮る(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "環境設定(&P)...", IDM_PREFERENCES - MENUITEM "Discordとの連携を可能にする(&D)", IDM_DISCORD + MENUITEM "Discordとの連携機能(&D)", IDM_DISCORD MENUITEM SEPARATOR - MENUITEM "音量ゲイン(&G)...", IDM_SND_GAIN + MENUITEM "音量を調節(&G)...", IDM_SND_GAIN #ifdef MTR_ENABLED MENUITEM SEPARATOR MENUITEM "トレース開始\tCtrl+T", IDM_ACTION_BEGIN_TRACE @@ -116,35 +116,35 @@ BEGIN POPUP "ログ(&L)" BEGIN # ifdef ENABLE_BUSLOGIC_LOG - MENUITEM "BusLogicのログを有効にする\tCtrl+F4", IDM_LOG_BUSLOGIC + MENUITEM "BusLogicのログを有効\tCtrl+F4", IDM_LOG_BUSLOGIC # endif # ifdef ENABLE_CDROM_LOG - MENUITEM "CD-ROMのログを有効にする\tCtrl+F5", IDM_LOG_CDROM + MENUITEM "CD-ROMのログを有効\tCtrl+F5", IDM_LOG_CDROM # endif # ifdef ENABLE_D86F_LOG - MENUITEM "フロッピー(86F)のログを有効にする\tCtrl+F6", IDM_LOG_D86F + MENUITEM "フロッピー(86F)のログを有効\tCtrl+F6", IDM_LOG_D86F # endif # ifdef ENABLE_FDC_LOG - MENUITEM "フロッピーコントローラーのログを有効にする\tCtrl+F7", IDM_LOG_FDC + MENUITEM "フロッピーコントローラーのログを有効\tCtrl+F7", IDM_LOG_FDC # endif # ifdef ENABLE_IDE_LOG - MENUITEM "IDEのログを有効にする\tCtrl+F8", IDM_LOG_IDE + MENUITEM "IDEのログを有効\tCtrl+F8", IDM_LOG_IDE # endif # ifdef ENABLE_SERIAL_LOG - MENUITEM "シリアルポートのログを有効にする\tCtrl+F3", IDM_LOG_SERIAL + MENUITEM "シリアルポートのログを有効\tCtrl+F3", IDM_LOG_SERIAL # endif # ifdef ENABLE_NIC_LOG - MENUITEM "ネットワークのログを有効にする\tCtrl+F9", IDM_LOG_NIC + MENUITEM "ネットワークのログを有効\tCtrl+F9", IDM_LOG_NIC # endif # ifdef ENABLE_LOG_COMMANDS # ifdef ENABLE_LOG_TOGGLES MENUITEM SEPARATOR # endif # ifdef ENABLE_LOG_BREAKPOINT - MENUITEM "ブレークポイントのログを有効にする(&L)\tCtrl+F10", IDM_LOG_BREAKPOINT + MENUITEM "ブレークポイントのログを有効(&L)\tCtrl+F10", IDM_LOG_BREAKPOINT # endif # ifdef ENABLE_VRAM_DUMP - MENUITEM "ビデオRAMのダンプを有効にする(&V)\tCtrl+F1", IDM_DUMP_VRAM + MENUITEM "ビデオRAMのダンプを有効(&V)\tCtrl+F1", IDM_DUMP_VRAM # endif # endif END @@ -152,7 +152,7 @@ BEGIN POPUP "ヘルプ(&H)" BEGIN MENUITEM "ドキュメント(&D)...", IDM_DOCS - MENUITEM "86Boxについて(&A)...", IDM_ABOUT + MENUITEM "86Boxのバージョン情報(&A)...", IDM_ABOUT END END @@ -165,15 +165,15 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新規のイメージ(&N)...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "新規イメージ(&N)...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "既存のイメージ(&E)...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "既存のイメージ(ライトプロテクト付き) (&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "既存のイメージを開く(&E)...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "録音する(&R)", IDM_CASSETTE_RECORD - MENUITEM "再生する(&P)", IDM_CASSETTE_PLAY + MENUITEM "録音(&R)", IDM_CASSETTE_RECORD + MENUITEM "再生(&P)", IDM_CASSETTE_PLAY MENUITEM "冒頭に巻き戻す(&R)", IDM_CASSETTE_REWIND - MENUITEM "最後まで早送りする(&F)", IDM_CASSETTE_FAST_FORWARD + MENUITEM "最後まで早送り(&F)", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR MENUITEM "取り出す(&J)", IDM_CASSETTE_EJECT END @@ -193,12 +193,12 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新規のイメージ(&N)...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "新規イメージ(&N)...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "既存のイメージ(&E)...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "既存のイメージ(ライトプロテクト付き) (&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "既存のイメージを開く(&E)...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "86Fへのエクスポート(&X)...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "86Fイメージにエクスポート(&X)...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR MENUITEM "取り出す(&J)", IDM_FLOPPY_EJECT END @@ -211,7 +211,7 @@ BEGIN MENUITEM "ミュート(&M)", IDM_CDROM_MUTE MENUITEM SEPARATOR MENUITEM "空(&M)", IDM_CDROM_EMPTY - MENUITEM "前のイメージを再読み込み (&R)", IDM_CDROM_RELOAD + MENUITEM "前のイメージを再読み込み(&R)", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "イメージ(&I)", IDM_CDROM_IMAGE END @@ -221,13 +221,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新規のイメージ(&N)...", IDM_ZIP_IMAGE_NEW + MENUITEM "新規イメージ(&N)...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "既存のイメージ(&E)...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "既存のイメージ(ライトプロテクト付き) (&W)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "既存のイメージを開く(&E)...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR MENUITEM "取り出す(&J)", IDM_ZIP_EJECT - MENUITEM "前のイメージを再読み込み (&R)", IDM_ZIP_RELOAD + MENUITEM "前のイメージを再読み込み(&R)", IDM_ZIP_RELOAD END END @@ -235,13 +235,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新規のイメージ(&N)...", IDM_MO_IMAGE_NEW + MENUITEM "新規イメージ(&N)...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "既存のイメージ(&E)...", IDM_MO_IMAGE_EXISTING - MENUITEM "既存のイメージ(ライトプロテクト付き) (&W)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "既存のイメージを開く(&E)...", IDM_MO_IMAGE_EXISTING + MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR MENUITEM "取り出す(&J)", IDM_MO_EJECT - MENUITEM "前のイメージを再読み込み (&R)", IDM_MO_RELOAD + MENUITEM "前のイメージを再読み込み(&R)", IDM_MO_RELOAD END END @@ -249,16 +249,16 @@ VidGLSubMenu MENU DISCARDABLE BEGIN POPUP "目標フレームレート(&F)" BEGIN - MENUITEM "ビデオとの同期(&S)", IDM_VID_GL_FPS_BLITTER + MENUITEM "ビデオと同期(&S)", IDM_VID_GL_FPS_BLITTER MENUITEM "25 fps(&2)", IDM_VID_GL_FPS_25 MENUITEM "30 fps(&3)", IDM_VID_GL_FPS_30 MENUITEM "50 fps(&5)", IDM_VID_GL_FPS_50 MENUITEM "60 fps(&6)", IDM_VID_GL_FPS_60 MENUITEM "75 fps(&7)", IDM_VID_GL_FPS_75 END - MENUITEM "VSync(&V)", IDM_VID_GL_VSYNC - MENUITEM "シェーダの選択(&S)...", IDM_VID_GL_SHADER - MENUITEM "シェーダの削除(&R)", IDM_VID_GL_NOSHADER + MENUITEM "垂直同期(VSync)(&V)", IDM_VID_GL_VSYNC + MENUITEM "シェーダーを選択(&S)...", IDM_VID_GL_SHADER + MENUITEM "シェーダーを削除(&R)", IDM_VID_GL_NOSHADER END @@ -283,9 +283,9 @@ END #define STR_GAIN "ゲイン値" #define STR_FILE_NAME "ファイル名:" -#define STR_DISK_SIZE "ディスクの容量:" -#define STR_RPM_MODE "RPMモード:" -#define STR_PROGRESS "進行:" +#define STR_DISK_SIZE "ディスクサイズ:" +#define STR_RPM_MODE "回転数モード:" +#define STR_PROGRESS "進行状況:" #define STR_WIDTH "幅:" #define STR_HEIGHT "高さ:" @@ -300,11 +300,11 @@ END #define STR_WAIT_STATES "待機状態:" #define STR_MB "MB" #define STR_MEMORY "メモリ:" -#define STR_TIME_SYNC "時刻同期化" -#define STR_DISABLED "使用しない" -#define STR_ENABLED_LOCAL "使用する (現地時間)" -#define STR_ENABLED_UTC "使用する (UTC)" -#define STR_DYNAREC "動的再コンパイル" +#define STR_TIME_SYNC "時刻同期機能" +#define STR_DISABLED "無効にする" +#define STR_ENABLED_LOCAL "有効にする (現地時間)" +#define STR_ENABLED_UTC "有効にする (UTC)" +#define STR_DYNAREC "動的リコンパイラ" #define STR_VIDEO "ビデオカード:" #define STR_VOODOO "Voodooグラフィック" @@ -319,15 +319,15 @@ END #define STR_SOUND "サウンドカード:" #define STR_MIDI "MIDI出力デバイス:" #define STR_MIDI_IN "MIDI入力デバイス:" -#define STR_MPU401 "MPU-401を単独使用" +#define STR_MPU401 "独立型MPU-401" #define STR_SSI "Innovation SSI-2001" #define STR_CMS "CMS / Game Blaster" #define STR_GUS "Gravis Ultrasound" -#define STR_FLOAT "FLOAT32サウンドを使用" +#define STR_FLOAT "FLOAT32サウンドを使用する" #define STR_NET_TYPE "ネットワークタイプ:" #define STR_PCAP "PCapデバイス:" -#define STR_NET "ネットワークカード:" +#define STR_NET "ネットワークアダプター:" #define STR_LPT1 "LPT1デバイス:" #define STR_LPT2 "LPT2デバイス:" @@ -363,8 +363,8 @@ END #define STR_SECTORS "セクター:" #define STR_HEADS "ヘッド:" #define STR_CYLS "シリンダー:" -#define STR_SIZE_MB "容量(MB):" -#define STR_TYPE "形式:" +#define STR_SIZE_MB "サイズ(MB):" +#define STR_TYPE "タイプ:" #define STR_IMG_FORMAT "イメージ形式:" #define STR_BLOCK_SIZE "ブロックサイズ:" @@ -406,19 +406,19 @@ BEGIN IDS_2053 "速度" IDS_2054 "ZIP %03i %i (%s): %ls" IDS_2055 "ZIPイメージ (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Boxで使用可能なROMイメージが見つかりませんでした。\n\nROMセットをダウンロードして、《roms》ディレクトリに解凍してください。" + IDS_2056 "86Boxで使用可能なROMイメージが見つかりませんでした。\n\nROMセットをダウンロードして、「roms」ディレクトリに解凍してください。" IDS_2057 "(空)" IDS_2058 "ZIPイメージ (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0すべてのファイル (*.*)\0*.*\0" IDS_2059 "高速" IDS_2060 "オン" IDS_2061 "オフ" IDS_2062 "すべてのイメージ (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本的なセクターイメージ (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面イメージ (*.86F)\0*.86F\0" - IDS_2063 "roms/machinesディレクトリにROMがないため、マシン《%hs》は使用できません。使用可能なマシンに切り替えます。" + IDS_2063 "roms/machinesディレクトリにROMがないため、マシン「%hs」は使用できません。使用可能なマシンに切り替えます。" END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "roms/videoディレクトリにROMがないため、ビデオカード《%hs》は使用できません。使用可能なビデオカードに切り替えます。" + IDS_2064 "roms/videoディレクトリにROMがないため、ビデオカード「%hs」は使用できません。使用可能なビデオカードに切り替えます。" IDS_2065 "マシン" IDS_2066 "画面表示" IDS_2067 "入力デバイス" @@ -429,11 +429,11 @@ BEGIN IDS_2072 "ハードディスク" IDS_2073 "フロッピー/CD-ROMドライブ" IDS_2074 "その他のリムーバブルデバイス" - IDS_2075 "その他の周辺機器" + IDS_2075 "その他の周辺装置" IDS_2076 "表面イメージ (*.86F)\0*.86F\0" - IDS_2077 "クリックするとマウスを直接入力します" - IDS_2078 "F12+F8キーでマウスの直接入力を解除します" - IDS_2079 "F12+F8キーまたは中クリックでマウスの直接入力を解除します" + IDS_2077 "クリックするとマウスをキャプチャします" + IDS_2078 "F8+F12キーでマウスを解放します" + IDS_2079 "F8+F12キーまたは中ボタンでマウスを解放します" END STRINGTABLE DISCARDABLE @@ -450,42 +450,42 @@ BEGIN IDS_2089 "ビデオレンダラーが初期化できません。" IDS_2090 "既定値" IDS_2091 "%iつの待機状態" - IDS_2092 "形式" + IDS_2092 "タイプ" IDS_2093 "PCapのセットアップに失敗しました" IDS_2094 "PCapデバイスがありません" IDS_2095 "不正なPCapデバイスです" - IDS_2096 "標準2ボタンジョイスティック" - IDS_2097 "標準4ボタンジョイスティック" - IDS_2098 "標準6ボタンジョイスティック" - IDS_2099 "標準8ボタンジョイスティック" + IDS_2096 "標準ジョイスティック(2ボタン)" + IDS_2097 "標準ジョイスティック(4ボタン)" + IDS_2098 "標準ジョイスティック(6ボタン)" + IDS_2099 "標準ジョイスティック(8ボタン)" IDS_2100 "CH Flightstick Pro" IDS_2101 "Microsoft SideWinder Pad" IDS_2102 "Thrustmaster Flight Control System" IDS_2103 "なし" - IDS_2104 "キーボードアクセラレーターを読み込めません。" - IDS_2105 "Raw入力が登録できません。" + IDS_2104 "キーボードアクセラレータを読み込めません。" + IDS_2105 "生の入力が登録できません。" IDS_2106 "%u" IDS_2107 "%u MB (CHS: %i, %i, %i)" IDS_2108 "フロッピー %i (%s): %ls" IDS_2109 "すべてのイメージ (*.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\0アドバンスドセクターイメージ (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本セクターイメージ (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0フラックスイメージ (*.FDI)\0*.FDI\0表面イメージ (*.86F;*.MFM)\0*.86F;*.MFM\0すべてのファイル (*.*)\0*.*\0" IDS_2110 "FreeTypeが初期化できません" IDS_2111 "SDLが初期化できません。SDL2.dllが必要です" - IDS_2112 "起動中のマシンを再起動しますか?" + IDS_2112 "使用中のマシンをハードリセットしますか?" IDS_2113 "86Boxを終了しますか?" IDS_2114 "Ghostscriptが初期化できません" IDS_2115 "光磁気 %i (%ls): %ls" IDS_2116 "光磁気イメージ (*.IM?;*.MDI)\0*.IM?;*.MDI\0すべてのファイル (*.*)\0*.*\0" - IDS_2117 "86Boxへようこそ!" - IDS_2118 "内部のコントローラー" + IDS_2117 "86Boxへようこそ!" + IDS_2118 "内蔵コントローラー" IDS_2119 "終了" IDS_2120 "ROMが見つかりません" IDS_2121 "設定を保存しますか?" - IDS_2122 "保存すると使用中のマシンが再起動されます。" + IDS_2122 "保存すると使用中のマシンがハードリセットされます。" IDS_2123 "保存" - IDS_2124 "86Boxについて" + IDS_2124 "86Boxのバージョン情報" IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "古いコンピュータのエミュレータ\n\n著者: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nGNU General Public License version 2以降でリリースされています。詳しくは LICENSE をご覧ください。" + IDS_2126 "古いパソコンのエミュレーター\n\n著者: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nGNU General Public License version 2以降でリリースされています。詳しくは LICENSE をご覧ください。" IDS_2127 "OK" IDS_2128 "ハードウェアが利用できません" #ifdef _WIN32 @@ -506,15 +506,15 @@ BEGIN #else #define LIB_NAME_GS "libgs" #endif - IDS_2132 LIB_NAME_GS "はPostScriptファイルをPDFに自動変換させる為に必要です。\n\n汎用PostScriptプリンターに送った任意のドキュメントはPostScript(.ps)ファイルとして保存されます。" + IDS_2132 "PostScriptファイルをPDFに自動変換するには" LIB_NAME_GS "が必要です。\n\n汎用PostScriptプリンターに送信されたドキュメントは、PostScript(.ps)ファイルとして保存されます。" #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif IDS_2133 "FluidSynthのMIDI出力には" LIB_NAME_FLUIDSYNTH "が必要です。" - IDS_2134 "フルスクリーンモードに転換します" - IDS_2135 "今後このメッセージを表示しない" + IDS_2134 "フルスクリーンに切り替えています" + IDS_2135 "今後、このメッセージを表示しない" IDS_2136 "終了しない" IDS_2137 "リセット" IDS_2138 "リセットしない" @@ -523,23 +523,23 @@ BEGIN IDS_2141 "%hs デバイスの設定" IDS_2142 "モニターのスリープモード" IDS_2143 "OpenGLシェーダー (*.GLSL)\0*.GLSL\0すべてのファイル (*.*)\0*.*\0" - IDS_2144 "OpenGLの設定" + IDS_2144 "OpenGL設定" IDS_2145 "サポートされていない設定を読み込んでいます" IDS_2146 "選択したマシンに基づくCPUタイプのフィルタリングは、このエミュレートされたマシンでは無効になっています。\n\nこれにより、選択したマシンと互換性のないCPUが選択できます。ただし、マシンのBIOSまたは他のソフトウェアとの互換性が失われる可能性があります。\n\nこの設定の有効化は公式サポートができません。また、バグレポートが無効として閉じられる場合があります。" - IDS_2147 "つづく" + IDS_2147 "続行" IDS_2148 "カセット: %s" IDS_2149 "カセットイメージ (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0すべてのファイル (*.*)\0*.*\0" IDS_2150 "カートリッジ %i: %ls" IDS_2151 "カートリッジイメージ (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0すべてのファイル (*.*)\0*.*\0" IDS_2152 "レンダラーの初期化エラー" - IDS_2153 "OpenGL(3.0コア)レンダラーが初期化できませんでした。別のレンダラーを使用してください。" - IDS_2154 "Resume execution" - IDS_2155 "Pause execution" - IDS_2156 "Press Ctrl+Alt+Del" - IDS_2157 "Press Ctrl+Alt+Esc" - IDS_2158 "Hard reset" - IDS_2159 "ACPI shutdown" - IDS_2160 "Settings" + IDS_2153 "OpenGL (3.0コア) レンダラーが初期化できませんでした。別のレンダラーを使用してください。" + IDS_2154 "実行を再開" + IDS_2155 "実行を一時停止" + IDS_2156 "Ctrl+Alt+DELを押します" + IDS_2157 "Ctrl+Alt+Escを押します" + IDS_2158 "ハードリセット" + IDS_2159 "ACPIシャットダウン" + IDS_2160 "設定" END STRINGTABLE DISCARDABLE @@ -549,33 +549,33 @@ BEGIN IDS_4098 "%01i" IDS_4099 "MFM/RLLまたはESDIのCD-ROMドライブが存在しません" IDS_4100 "カスタム..." - IDS_4101 "カスタム(大)..." + IDS_4101 "カスタム (大型)..." IDS_4102 "新規のディスクを追加" IDS_4103 "既定のディスクを追加" - IDS_4104 "HDIのディスクイメージは4GB以上にはできません。" - IDS_4105 "ディスクイメージは127GB以上にはできません。" + IDS_4104 "HDIディスクイメージは4GBを超えることはできません。" + IDS_4105 "ディスクイメージは127GBを超えることはできません。" IDS_4106 "ハードディスクイメージ (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0すべてのファイル (*.*)\0*.*\0" IDS_4107 "ファイルの読み込みができません" IDS_4108 "ファイルの書き込みができません" - IDS_4109 "512バイト以外のセクターサイズを持ったHDIまたはHDX形式のイメージはサポートしません。" - IDS_4110 "USBはまだサポートしません" + IDS_4109 "512以外のセクタサイズを持つHDIまたはHDXイメージはサポートされていません。" + IDS_4110 "USBはまだサポートされていません" IDS_4111 "ディスクイメージファイルが既に存在します" IDS_4112 "有効なファイル名を指定してください。" IDS_4113 "ディスクイメージが作成されました" - IDS_4114 "ファイルが存在し、読み取り可能であることを確認します。" + IDS_4114 "ファイルが存在し、読み取り可能であることを確認してください。" IDS_4115 "ファイルが書き込み可能なディレクトリに保存されていることを確認してください。" - IDS_4116 "ディスクイメージが大きすぎます" - IDS_4117 "新規ディスクのパーティション設定とフォーマットを必ずしといてください。" - IDS_4118 "選択したファイルは上書きされます。使っていいですか?" + IDS_4116 "ディスクイメージのサイズが大きすぎます" + IDS_4117 "新規ドライブをパーティション分割し、フォーマットを必ずしといてください。" + IDS_4118 "選択したファイルが上書きされます。使っていいですか?" IDS_4119 "サポートされていないディスクイメージ" IDS_4120 "上書き" IDS_4121 "上書きしない" IDS_4122 "Rawイメージ (.img)" IDS_4123 "HDIイメージ (.hdi)" IDS_4124 "HDXイメージ (.hdx)" - IDS_4125 "固定サイズのVHD (.vhd)" - IDS_4126 "ダイナミックサイズのVHD (.vhd)" - IDS_4127 "ディファレンシングVHD (.vhd)" + IDS_4125 "VHD(容量固定)(.vhd)" + IDS_4126 "VHD(容量可変)(.vhd)" + IDS_4127 "VHD(差分)(.vhd)" IDS_4128 "大型ブロック (2 MB)" IDS_4129 "小型ブロック (512 KB)" IDS_4130 "VHDファイル (*.VHD)\0*.VHD\0すべてのファイル (*.*)\0*.*\0" From 6ce316694ad29aacf8a66920de2219ae9febd680 Mon Sep 17 00:00:00 2001 From: EmpyreusX <36258024+EmpyreusX@users.noreply.github.com> Date: Thu, 13 Jan 2022 23:02:47 +0800 Subject: [PATCH 57/62] Small fix to Japanese translation --- src/win/languages/ja-JP.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index 006fdc29b..56abc7600 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -535,8 +535,8 @@ BEGIN IDS_2153 "OpenGL (3.0コア) レンダラーが初期化できませんでした。別のレンダラーを使用してください。" IDS_2154 "実行を再開" IDS_2155 "実行を一時停止" - IDS_2156 "Ctrl+Alt+DELを押します" - IDS_2157 "Ctrl+Alt+Escを押します" + IDS_2156 "Ctrl+Alt+DELを押し" + IDS_2157 "Ctrl+Alt+Escを押し" IDS_2158 "ハードリセット" IDS_2159 "ACPIシャットダウン" IDS_2160 "設定" From 20eed92b9d01b54211687ae7cc8ac7991a463325 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Thu, 13 Jan 2022 18:18:01 -0300 Subject: [PATCH 58/62] Update pt-BR.rc --- src/win/languages/pt-BR.rc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 5732494e6..68761adfa 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -35,7 +35,7 @@ BEGIN POPUP "&Exibir" BEGIN MENUITEM "&Ocultar barra de status", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "Ocultar &barra de ferramenta", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Janela redimensionável", IDM_VID_RESIZE MENUITEM "&Lembrar tamanho e posição", IDM_VID_REMEMBER @@ -536,13 +536,13 @@ BEGIN IDS_2151 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os arquivos (*.*)\0*.*\0" IDS_2152 "Erro ao inicializar o renderizador" IDS_2153 "O renderizador OpenGL (Núcleo 3.0) não pôde ser inicializado. Use outro renderizador." - IDS_2154 "Resume execution" - IDS_2155 "Pause execution" - IDS_2156 "Press Ctrl+Alt+Del" - IDS_2157 "Press Ctrl+Alt+Esc" - IDS_2158 "Hard reset" - IDS_2159 "ACPI shutdown" - IDS_2160 "Settings" + IDS_2154 "Continuar a execução" + IDS_2155 "Pausar a execução" + IDS_2156 "Pressionar Ctrl+Alt+Del" + IDS_2157 "Pressionar Ctrl+Alt+Esc" + IDS_2158 "Reinicialização completa" + IDS_2159 "Desligamento por ACPI" + IDS_2160 "Configurações" END STRINGTABLE DISCARDABLE From 69f572395b1be3ae26cb3c6b2fc62e95689a55ce Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 18 Jan 2022 01:55:05 +0100 Subject: [PATCH 59/62] Improved the performance of sdl_blit_ex(), closes #1995. --- src/win/win_sdl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index 4fc735a1c..cf5afb809 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -274,6 +274,7 @@ sdl_blit_ex(int x, int y, int w, int h) SDL_Rect r_src; void *pixeldata; int pitch, ret; + int row; if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) { video_blit_complete(); @@ -284,7 +285,8 @@ sdl_blit_ex(int x, int y, int w, int h) SDL_LockTexture(sdl_tex, 0, &pixeldata, &pitch); - video_copy(pixeldata, &(buffer32->line[y][x]), h * 2048 * sizeof(uint32_t)); + for (row = 0; row < h; ++row) + video_copy(&(((uint8_t *) pixeldata)[row * 2048 * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t)); if (screenshots) video_screenshot((uint32_t *) pixeldata, 0, 0, 2048); From f87010c484da15e2e48b82f018a7501b3956c32f Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 18 Jan 2022 13:13:22 +0100 Subject: [PATCH 60/62] Applied the fix to the OpenGL Core renderer as well. --- src/win/win_opengl.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index 99843cd9f..9bb13561d 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -872,6 +872,8 @@ static void opengl_main(void* param) static void opengl_blit(int x, int y, int w, int h) { + int row; + if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (thread == NULL) || atomic_flag_test_and_set(&blit_info[write_pos].in_use)) { @@ -879,7 +881,8 @@ static void opengl_blit(int x, int y, int w, int h) return; } - video_copy(blit_info[write_pos].buffer, &(buffer32->line[y][x]), h * ROW_LENGTH * sizeof(uint32_t)); + for (row = 0; row < h; ++row) + video_copy(&(((uint8_t *) blit_info[write_pos].buffer)[row * ROW_LENGTH * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t)); if (screenshots) video_screenshot(blit_info[write_pos].buffer, 0, 0, ROW_LENGTH); From cbdc3d9688bf000083ab29912b11e9c785cfa7ec Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 19 Jan 2022 12:43:29 +0100 Subject: [PATCH 61/62] Implemented ES1371 MIDI input. --- src/sound/snd_audiopci.c | 192 +++++++++++++++++++++++++++++++++------ 1 file changed, 163 insertions(+), 29 deletions(-) diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index 7f10701f5..444108a25 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -70,6 +70,10 @@ typedef struct { uint8_t uart_ctrl, uart_status, uart_res; uint32_t uart_fifo; + + uint8_t midi_queue[64], midi_data; + int midi_r, midi_w; + int uart_in, sysex, valid; ac97_codec_t * codec; uint32_t codec_ctrl; @@ -174,7 +178,6 @@ typedef struct { static void es1371_fetch(es1371_t *dev, int dac_nr); static void update_legacy(es1371_t *dev, uint32_t old_legacy_ctrl); - #ifdef ENABLE_AUDIOPCI_LOG int audiopci_do_log = ENABLE_AUDIOPCI_LOG; @@ -201,14 +204,19 @@ es1371_update_irqs(es1371_t *dev) int irq = 0; if ((dev->int_status & INT_STATUS_DAC1) && (dev->si_cr & SI_P1_INTR_EN)) - irq = 1; + irq = 1; if ((dev->int_status & INT_STATUS_DAC2) && (dev->si_cr & SI_P2_INTR_EN)) - irq = 1; + irq = 1; - /* MIDI input is unsupported for now */ - if ((dev->int_status & INT_STATUS_UART) && (dev->uart_status & UART_STATUS_TXINT) && - ((dev->uart_ctrl & UART_CTRL_TXINTEN) != 0x20)) - irq = 1; + if (dev->int_status & INT_STATUS_UART) { + if (((dev->uart_ctrl & UART_CTRL_TXINTEN) != 0x20) && (dev->uart_status & UART_STATUS_TXINT) && !dev->uart_in) { + audiopci_log("TXINT\n"); + irq = 1; + } else if ((dev->uart_ctrl & UART_CTRL_RXINTEN) && (dev->uart_status & UART_STATUS_RXINT) && (dev->uart_in)) { + audiopci_log("RXINT\n"); + irq = 1; + } + } if (irq) dev->int_status |= INT_STATUS_INTR; @@ -230,6 +238,11 @@ es1371_reset(void *p) { es1371_t *dev = (es1371_t *) p; + dev->uart_in = 0; + dev->midi_r = 0; + dev->midi_w = 0; + dev->valid = 0; + nmi = 0; /* Interrupt/Chip Select Control Register, Address 00H @@ -344,7 +357,10 @@ es1371_read_frame_reg(es1371_t *dev, int frame, int page) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - ret = dev->uart_fifo; + ret = dev->midi_data; + if (dev->valid) { + ret |= 0x100; + } break; } break; @@ -363,7 +379,10 @@ es1371_read_frame_reg(es1371_t *dev, int frame, int page) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - ret = dev->uart_fifo; + ret = dev->midi_data; + if (dev->valid) { + ret |= 0x100; + } break; } break; @@ -377,7 +396,10 @@ es1371_read_frame_reg(es1371_t *dev, int frame, int page) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - ret = dev->uart_fifo; + ret = dev->midi_data; + if (dev->valid) { + ret |= 0x100; + } break; } break; @@ -391,12 +413,19 @@ es1371_read_frame_reg(es1371_t *dev, int frame, int page) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - ret = dev->uart_fifo; + ret = dev->midi_data; + if (dev->valid) { + ret |= 0x100; + } break; } break; } + if (page == 0x0e || page == 0x0f) { + audiopci_log("Read frame = %02x, page = %02x, uart fifo valid = %02x, temp = %03x\n", frame, page, dev->valid, ret); + } + return ret; } @@ -419,7 +448,8 @@ es1371_write_frame_reg(es1371_t *dev, int frame, int page, uint32_t val) break; /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ - case 0xe: case 0xf: + case 0xe: + case 0xf: dev->uart_fifo = (dev->uart_fifo & 0xfffffe00) | (val & 0x000001ff); break; } @@ -440,7 +470,8 @@ es1371_write_frame_reg(es1371_t *dev, int frame, int page, uint32_t val) break; /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ - case 0xe: case 0xf: + case 0xe: + case 0xf: dev->uart_fifo = (dev->uart_fifo & 0xfffffe00) | (val & 0x000001ff); break; } @@ -454,7 +485,8 @@ es1371_write_frame_reg(es1371_t *dev, int frame, int page, uint32_t val) break; /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ - case 0xe: case 0xf: + case 0xe: + case 0xf: dev->uart_fifo = (dev->uart_fifo & 0xfffffe00) | (val & 0x000001ff); break; } @@ -469,12 +501,18 @@ es1371_write_frame_reg(es1371_t *dev, int frame, int page, uint32_t val) break; /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ - case 0xe: case 0xf: + case 0xe: + case 0xf: dev->uart_fifo = (dev->uart_fifo & 0xfffffe00) | (val & 0x000001ff); break; } break; } + + if (page == 0x0e || page == 0x0f) { + audiopci_log("Write frame = %02x, page = %02x, uart fifo = %08x, val = %02x\n", frame, page, dev->uart_fifo, val); + dev->valid = 0; + } } @@ -520,6 +558,19 @@ es1371_inb(uint16_t port, void *p) Addressable as byte only */ case 0x08: ret = 0x00; + if (dev->uart_in) { + ret = dev->midi_queue[dev->midi_r]; + if (dev->midi_r != dev->midi_w) { + dev->midi_r++; + dev->midi_r &= 0x3f; + } + dev->midi_data = ret; + audiopci_log("MIDI input ret = %02x, pos = %i, valid = %i\n", ret, dev->midi_r, dev->valid); + if (!dev->valid) + dev->int_status &= ~INT_STATUS_UART; + dev->uart_status &= ~(UART_STATUS_RXINT | UART_STATUS_RXRDY); + es1371_update_irqs(dev); + } break; /* UART Status Register, Address 09H @@ -661,6 +712,8 @@ es1371_inw(uint16_t port, void *p) break; } + audiopci_log("es1371_inw: port=%04x ret=%04x\n", port, ret); + return ret; } @@ -783,6 +836,7 @@ es1371_outb(uint16_t port, uint8_t val, void *p) /* UART Data Register, Address 08H Addressable as byte only */ case 0x08: + audiopci_log("MIDI data = %02x\n", dev->midi_data); midi_raw_out_byte(val); break; @@ -790,10 +844,22 @@ es1371_outb(uint16_t port, uint8_t val, void *p) Addressable as byte only */ case 0x09: dev->uart_ctrl = val & 0xe3; - if ((dev->uart_ctrl & UART_CTRL_TXINTEN) != 0x20) + + if ((val & 0x03) == 0x03) { /*Software reset*/ + dev->uart_in = 0; + dev->uart_status = 0x00; + dev->midi_r = 0; + dev->midi_w = 0; + dev->valid = 0; + } else if (dev->uart_ctrl & UART_CTRL_RXINTEN) { + dev->uart_in = 1; + audiopci_log("ES1371 UART RX Cntrl = %02x\n", dev->uart_ctrl); + } else if ((dev->uart_ctrl & UART_CTRL_TXINTEN) != 0x20) { dev->int_status &= ~INT_STATUS_UART; + dev->uart_in = 0; + } + es1371_update_irqs(dev); - audiopci_log("ES1371 UART Cntrl = %02x\n", dev->uart_ctrl); break; /* UART Reserved Register, Address 0AH @@ -1708,19 +1774,32 @@ es1371_poll(void *p) if (dev->int_ctrl & INT_UART_EN) { //audiopci_log("UART INT Enabled\n"); - if (dev->uart_ctrl & UART_CTRL_RXINTEN) { - /* We currently don't implement MIDI Input. - But if anything sets MIDI Input and Output together we'd have to take account - of the MIDI Output case, and disable IRQ's and RX bits when MIDI Input is - enabled as well but not in the MIDI Output portion */ - dev->int_status &= ~INT_STATUS_UART; - dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); - } else if (!(dev->uart_ctrl & UART_CTRL_RXINTEN) && ((dev->uart_ctrl & UART_CTRL_TXINTEN))) { - /* Or enable the UART IRQ and the respective TX bits only when the MIDI Output is - enabled */ + if (((dev->uart_ctrl & (UART_CTRL_RXINTEN | UART_CTRL_TXINTEN)) == UART_CTRL_RXINTEN) && dev->uart_in) { + audiopci_log("RX irq\n"); dev->int_status |= INT_STATUS_UART; + } else if (((dev->uart_ctrl & (UART_CTRL_RXINTEN | UART_CTRL_TXINTEN)) == UART_CTRL_TXINTEN) && !dev->uart_in) { + audiopci_log("TX irq\n"); + dev->int_status |= INT_STATUS_UART; + } else if ((dev->uart_ctrl & (UART_CTRL_RXINTEN | UART_CTRL_TXINTEN)) == (UART_CTRL_RXINTEN | UART_CTRL_TXINTEN)) { + dev->int_status &= ~INT_STATUS_UART; + if (dev->uart_in) { + audiopci_log("No Status UART RX\n"); + dev->uart_status |= (UART_STATUS_RXINT | UART_STATUS_RXRDY); + dev->uart_status &= ~(UART_STATUS_TXINT | UART_STATUS_TXRDY); + } else { + audiopci_log("No Status UART TX\n"); + dev->uart_status &= ~(UART_STATUS_RXINT | UART_STATUS_RXRDY); + dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); + } } else { - dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); + audiopci_log("STAT UART IN = %i\n", dev->uart_in); + if (dev->uart_in) { + dev->uart_status |= (UART_STATUS_RXINT | UART_STATUS_RXRDY); + dev->uart_status &= ~(UART_STATUS_TXINT | UART_STATUS_TXRDY); + } else { + dev->uart_status &= ~(UART_STATUS_RXINT | UART_STATUS_RXRDY); + dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); + } } //audiopci_log("UART control = %02x\n", dev->uart_ctrl & (UART_CTRL_RXINTEN | UART_CTRL_TXINTEN)); @@ -1846,12 +1925,63 @@ generate_es1371_filter(void) } +static void +es1371_input_msg(void *p, uint8_t *msg, uint32_t len) +{ + es1371_t *dev = (es1371_t *)p; + uint8_t i; + + audiopci_log("SYSEX on MSG = %i, len = %i, midiw = %i\n", dev->sysex, len, dev->midi_w); + + if (dev->sysex) + return; + + if (dev->uart_in) { + audiopci_log("RX midi data\n"); + dev->uart_status |= (UART_STATUS_RXINT | UART_STATUS_RXRDY); + dev->valid = 1; + + for (i=0; i < len; i++) { + dev->midi_queue[dev->midi_w++] = msg[i]; + dev->midi_w &= 0x3f; + } + + es1371_update_irqs(dev); + } +} + +static int +es1371_input_sysex(void *p, uint8_t *buffer, uint32_t len, int abort) +{ + es1371_t *dev = (es1371_t *)p; + uint32_t i; + + audiopci_log("SYSEX = %i, Abort = %i\n", dev->sysex, abort); + + if (abort) { + dev->sysex = 0; + return 0; + } + dev->sysex = 1; + for (i=0;imidi_r == dev->midi_w) + return (len-i); + dev->midi_queue[dev->midi_w++] = buffer[i]; + dev->midi_w &= 0x3f; + } + dev->sysex = 0; + return 0; +} + static void * es1371_init(const device_t *info) { es1371_t *dev = malloc(sizeof(es1371_t)); memset(dev, 0x00, sizeof(es1371_t)); + if (device_get_config_int("receive_input")) + midi_in_handler(1, es1371_input_msg, es1371_input_sysex, dev); + sound_add_handler(es1371_get_buffer, dev); sound_set_cd_audio_filter(es1371_filter_cd_audio, dev); @@ -1920,7 +2050,11 @@ static const device_config_t es1371_config[] = } }, .default_int = AC97_CODEC_CS4297A - }, { + }, + { + "receive_input", "Receive input (MIDI)", CONFIG_BINARY, "", 1 + }, + { "", "", -1 } }; From fe90200eee01a63fc864c7cd8ab7726b142659ae Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 19 Jan 2022 13:38:07 +0100 Subject: [PATCH 62/62] Added MIDI In/Out to the AdLib Gold as well as a fix to wave out. --- src/sound/snd_adlibgold.c | 114 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 6 deletions(-) diff --git a/src/sound/snd_adlibgold.c b/src/sound/snd_adlibgold.c index 845ee2bfc..5fe65445a 100644 --- a/src/sound/snd_adlibgold.c +++ b/src/sound/snd_adlibgold.c @@ -12,6 +12,7 @@ #include <86box/nvr.h> #include <86box/sound.h> #include <86box/filters.h> +#include <86box/midi.h> #include <86box/snd_opl.h> #include <86box/snd_ym7128.h> @@ -38,6 +39,10 @@ typedef struct adgold_t int adgold_mma_intpos[2]; pc_timer_t adgold_mma_timer_count; + + uint8_t adgold_midi_ctrl, midi_queue[16]; + int midi_r, midi_w; + int uart_in, uart_out, sysex; struct { @@ -134,12 +139,15 @@ void adgold_update_irq_status(adgold_t *adgold) uint8_t temp = 0xf; if (!(adgold->adgold_mma_regs[0][8] & 0x10) && (adgold->adgold_mma_status & 0x10)) /*Timer 0*/ - temp &= ~2; + temp &= ~2; if (!(adgold->adgold_mma_regs[0][8] & 0x20) && (adgold->adgold_mma_status & 0x20)) /*Timer 1*/ - temp &= ~2; + temp &= ~2; if (!(adgold->adgold_mma_regs[0][8] & 0x40) && (adgold->adgold_mma_status & 0x40)) /*Timer 2*/ - temp &= ~2; - + temp &= ~2; + if (!(adgold->adgold_mma_regs[0][0xd] & 0x01) && (adgold->adgold_mma_status & 0x04)) + temp &= ~2; + if (!(adgold->adgold_mma_regs[0][0xd] & 0x04) && (adgold->adgold_mma_status & 0x08)) + temp &= ~2; if ((adgold->adgold_mma_status & 0x01) && !(adgold->adgold_mma_regs[0][0xc] & 2)) temp &= ~2; if ((adgold->adgold_mma_status & 0x02) && !(adgold->adgold_mma_regs[1][0xc] & 2)) @@ -253,7 +261,7 @@ void adgold_write(uint16_t addr, uint8_t val, void *p) case 0x18: /*Surround*/ adgold->adgold_38x_regs[0x18] = val; ym7128_write(&adgold->ym7128, val); - break; + break; default: adgold->adgold_38x_regs[adgold->adgold_38x_addr] = val; @@ -380,6 +388,26 @@ void adgold_write(uint16_t addr, uint8_t val, void *p) case 0xc: adgold->adgold_mma_intpos[0] = (7 - ((val >> 2) & 7)) * 8; break; + + case 0xd: + adgold->adgold_midi_ctrl = val & 0x3f; + + if ((val & 0x0f) == 0x0f) { + adgold->uart_in = 0; + adgold->midi_w = 0; + adgold->midi_r = 0; + adgold->adgold_mma_status &= ~0x0c; + } else if (adgold->adgold_midi_ctrl & 0x05) { + adgold->uart_in = 1; + } else + adgold->uart_in = 0; + + adgold_update_irq_status(adgold); + break; + + case 0xe: + midi_raw_out_byte(val); + break; } adgold->adgold_mma_regs[0][adgold->adgold_mma_addr] = val; break; @@ -482,7 +510,7 @@ uint8_t adgold_read(uint16_t addr, void *p) case 4: case 6: temp = adgold->adgold_mma_status; - adgold->adgold_mma_status = 0; /*JUKEGOLD expects timer status flags to auto-clear*/ + adgold->adgold_mma_status &= ~0xf3; /*JUKEGOLD expects timer status flags to auto-clear*/ adgold_update_irq_status(adgold); break; case 5: @@ -491,12 +519,26 @@ uint8_t adgold_read(uint16_t addr, void *p) { case 6: /*Timer 2 low*/ adgold->adgold_mma.timer2_read = adgold->adgold_mma.timer2_count; + adgold->adgold_mma_status |= 0x40; temp = adgold->adgold_mma.timer2_read & 0xff; break; case 7: /*Timer 2 high*/ temp = adgold->adgold_mma.timer2_read >> 8; break; + case 0xe: + temp = 0; + if (adgold->uart_in) { + temp = adgold->midi_queue[adgold->midi_r]; + if (adgold->midi_r != adgold->midi_w) { + adgold->midi_r++; + adgold->midi_r &= 0x0f; + } + adgold->adgold_mma_status &= ~0x04; + adgold_update_irq_status(adgold); + } + break; + default: temp = adgold->adgold_mma_regs[0][adgold->adgold_mma_addr]; break; @@ -579,6 +621,19 @@ void adgold_timer_poll(void *p) adgold_t *adgold = (adgold_t *)p; timer_advance_u64(&adgold->adgold_mma_timer_count, (uint64_t)((double)TIMER_USEC * 1.88964)); + + if (adgold->adgold_midi_ctrl & 0x0f) { + if ((adgold->adgold_midi_ctrl & 0x0f) == 0x05) { + adgold->adgold_mma_status |= 0x08; + } else { + if ((adgold->adgold_midi_ctrl & 0x0f) == 0x02) + adgold->adgold_mma_status &= ~0x04; + else if ((adgold->adgold_midi_ctrl & 0x0f) == 0x08) + adgold->adgold_mma_status &= ~0x08; + } + adgold_update_irq_status(adgold); + } + if (adgold->adgold_mma_regs[0][8] & 0x01) /*Timer 0*/ { adgold->adgold_mma.timer0_count--; @@ -753,6 +808,47 @@ static void adgold_get_buffer(int32_t *buffer, int len, void *p) } +static void adgold_input_msg(void *p, uint8_t *msg, uint32_t len) +{ + adgold_t *adgold = (adgold_t *)p; + uint8_t i; + + if (adgold->sysex) + return; + + if (adgold->uart_in) { + adgold->adgold_mma_status |= 0x04; + + for (i=0; i < len; i++) { + adgold->midi_queue[adgold->midi_w++] = msg[i]; + adgold->midi_w &= 0x0f; + } + + adgold_update_irq_status(adgold); + } +} + +static int adgold_input_sysex(void *p, uint8_t *buffer, uint32_t len, int abort) +{ + adgold_t *adgold = (adgold_t *)p; + uint32_t i; + + if (abort) { + adgold->sysex = 0; + return 0; + } + adgold->sysex = 1; + for (i=0;imidi_r == adgold->midi_w) + return (len-i); + adgold->midi_queue[adgold->midi_w++] = buffer[i]; + adgold->midi_w &= 0x0f; + } + adgold->sysex = 0; + return 0; +} + + void *adgold_init(const device_t *info) { FILE *f; @@ -809,6 +905,9 @@ void *adgold_init(const device_t *info) sound_add_handler(adgold_get_buffer, adgold); + if (device_get_config_int("receive_input")) + midi_in_handler(1, adgold_input_msg, adgold_input_sysex, adgold); + return adgold; } @@ -832,6 +931,9 @@ static const device_config_t adgold_config[] = { "surround", "Surround module", CONFIG_BINARY, "", 1 }, + { + "receive_input", "Receive input (MIDI)", CONFIG_BINARY, "", 1 + }, { "", "", -1 }