mirror of
https://github.com/86Box/86Box.git
synced 2026-02-24 10:28:19 -07:00
Merge remote-tracking branch 'origin/master' into feature/recompiler_improvements
This commit is contained in:
@@ -2965,7 +2965,7 @@ image_close(void *local)
|
||||
free(img);
|
||||
|
||||
if (temp_file[0] != 0x00) {
|
||||
remove(temp_file);
|
||||
remove(nvr_path(temp_file));
|
||||
temp_file[0] = 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,9 +220,10 @@ memmap_state_default(headland_t *dev, uint8_t ht_romcs)
|
||||
mem_mapping_disable(&dev->mid_mapping);
|
||||
|
||||
if (ht_romcs)
|
||||
mem_set_mem_state(0x0e0000, 0x20000, MEM_READ_ROMCS | MEM_WRITE_ROMCS);
|
||||
mem_set_mem_state(0x0e0000, 0x10000, MEM_READ_ROMCS | MEM_WRITE_ROMCS);
|
||||
else
|
||||
mem_set_mem_state(0x0e0000, 0x20000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
||||
mem_set_mem_state(0x0e0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
||||
mem_set_mem_state(0x0f0000, 0x10000, MEM_READ_ROMCS | MEM_WRITE_ROMCS);
|
||||
mem_set_mem_state(0xfe0000, 0x20000, MEM_READ_ROMCS | MEM_WRITE_ROMCS);
|
||||
|
||||
mem_mapping_disable(&dev->shadow_mapping[0]);
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <86box/device.h>
|
||||
#include <86box/mem.h>
|
||||
#include <86box/port_92.h>
|
||||
#include <86box/plat_fallthrough.h>
|
||||
#include <86box/plat_unused.h>
|
||||
#include <86box/chipset.h>
|
||||
|
||||
@@ -176,6 +177,9 @@ opti499_write(uint16_t addr, uint8_t val, void *priv)
|
||||
break;
|
||||
|
||||
case 0x22:
|
||||
mem_a20_chipset = (val & 0x02);
|
||||
mem_a20_recalc();
|
||||
fallthrough;
|
||||
case 0x23:
|
||||
case 0x26:
|
||||
case 0x2d:
|
||||
|
||||
36
src/config.c
36
src/config.c
@@ -27,6 +27,11 @@
|
||||
* -DANSI_CFG for use on these systems.
|
||||
*/
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <ws2tcpip.h>
|
||||
#else
|
||||
# include <arpa/inet.h>
|
||||
#endif
|
||||
#include <inttypes.h>
|
||||
#ifdef ENABLE_CONFIG_LOG
|
||||
#include <stdarg.h>
|
||||
@@ -886,6 +891,25 @@ load_network(void)
|
||||
} else
|
||||
strcpy(nc->host_dev_name, "none");
|
||||
|
||||
if (nc->net_type == NET_TYPE_SLIRP) {
|
||||
sprintf(temp, "net_%02i_addr", c + 1);
|
||||
p = ini_section_get_string(cat, temp, "");
|
||||
if (p && *p) {
|
||||
struct in_addr addr;
|
||||
if (inet_pton(AF_INET, p, &addr)) {
|
||||
uint8_t *bytes = (uint8_t *)&addr.s_addr;
|
||||
bytes[3] = 0;
|
||||
sprintf(nc->slirp_net, "%d.%d.%d.0", bytes[0], bytes[1], bytes[2]);
|
||||
} else {
|
||||
nc->slirp_net[0] = '\0';
|
||||
}
|
||||
} else {
|
||||
nc->slirp_net[0] = '\0';
|
||||
}
|
||||
} else {
|
||||
nc->slirp_net[0] = '\0';
|
||||
}
|
||||
|
||||
sprintf(temp, "net_%02i_switch_group", c + 1);
|
||||
nc->switch_group = ini_section_get_int(cat, temp, NET_SWITCH_GRP_MIN);
|
||||
if (nc->switch_group < NET_SWITCH_GRP_MIN)
|
||||
@@ -1458,7 +1482,7 @@ load_floppy_and_cdrom_drives(void)
|
||||
int c;
|
||||
int d;
|
||||
int count = cdrom_get_type_count();
|
||||
|
||||
|
||||
#ifndef DISABLE_FDD_AUDIO
|
||||
fdd_audio_load_profiles();
|
||||
#endif
|
||||
@@ -1532,7 +1556,7 @@ load_floppy_and_cdrom_drives(void)
|
||||
fdd_set_audio_profile(c, d);
|
||||
#else
|
||||
fdd_set_audio_profile(c, 0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||
fdd_image_history[c][i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
|
||||
@@ -2987,6 +3011,14 @@ save_network(void)
|
||||
else
|
||||
ini_section_set_int(cat, temp, nc->link_state);
|
||||
|
||||
if (nc->net_type == NET_TYPE_SLIRP && nc->slirp_net[0] != '\0') {
|
||||
sprintf(temp, "net_%02i_addr", c + 1);
|
||||
ini_section_set_string(cat, temp, nc->slirp_net);
|
||||
} else {
|
||||
sprintf(temp, "net_%02i_addr", c + 1);
|
||||
ini_section_delete_var(cat, temp);
|
||||
}
|
||||
|
||||
sprintf(temp, "net_%02i_switch_group", c + 1);
|
||||
if (nc->switch_group == NET_SWITCH_GRP_MIN)
|
||||
ini_section_delete_var(cat, temp);
|
||||
|
||||
@@ -2610,8 +2610,8 @@ ide_callback(void *priv)
|
||||
err = ABRT_ERR;
|
||||
else {
|
||||
/* Only accept after RESET or DIAG. */
|
||||
if (ide->params_specified) {
|
||||
ide->cfg_spt = ide->tf->secount;
|
||||
if (!ide->params_specified) {
|
||||
ide->cfg_spt = (ide->tf->secount == 0) ? 256 : ide->tf->secount;
|
||||
ide->cfg_hpc = ide->tf->head + 1;
|
||||
|
||||
ide->params_specified = 1;
|
||||
|
||||
@@ -749,6 +749,9 @@ extern int machine_at_4gpv5_init(const machine_t *);
|
||||
/* Contaq 82C597 */
|
||||
extern int machine_at_greenb_init(const machine_t *);
|
||||
|
||||
/* OPTi 499 */
|
||||
extern int machine_at_xenon_init(const machine_t *);
|
||||
|
||||
/* OPTi 895 */
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t j403tg_device;
|
||||
|
||||
@@ -313,6 +313,7 @@ extern int read_type;
|
||||
|
||||
extern int mem_a20_state;
|
||||
extern int mem_a20_alt;
|
||||
extern int mem_a20_chipset;
|
||||
extern int mem_a20_key;
|
||||
|
||||
extern uint8_t read_mem_b(uint32_t addr);
|
||||
|
||||
@@ -99,6 +99,7 @@ typedef struct netcard_conf_t {
|
||||
uint32_t link_state;
|
||||
uint8_t switch_group;
|
||||
uint8_t promisc_mode;
|
||||
char slirp_net[16];
|
||||
char nrs_hostname[128];
|
||||
} netcard_conf_t;
|
||||
|
||||
|
||||
@@ -28,27 +28,27 @@
|
||||
#define LEDGER_PAGE_HEIGHT 17.0
|
||||
|
||||
/* Standard A0 */
|
||||
#define A0_PAGE_WIDTH 33.125
|
||||
#define A0_PAGE_HEIGHT 46.75
|
||||
#define A0_PAGE_WIDTH 33.110236
|
||||
#define A0_PAGE_HEIGHT 46.811023
|
||||
|
||||
/* Standard A1 */
|
||||
#define A1_PAGE_WIDTH 23.375
|
||||
#define A1_PAGE_HEIGHT 33.125
|
||||
#define A1_PAGE_WIDTH 23.385826
|
||||
#define A1_PAGE_HEIGHT 33.110236
|
||||
|
||||
/* Standard A2 */
|
||||
#define A2_PAGE_WIDTH 16.5
|
||||
#define A2_PAGE_HEIGHT 23.375
|
||||
#define A2_PAGE_WIDTH 16.535433
|
||||
#define A2_PAGE_HEIGHT 23.385826
|
||||
|
||||
/* Standard A3 */
|
||||
#define A3_PAGE_WIDTH 11.75
|
||||
#define A3_PAGE_HEIGHT 16.5
|
||||
#define A3_PAGE_WIDTH 11.692913
|
||||
#define A3_PAGE_HEIGHT 16.535433
|
||||
|
||||
/* Standard A4 */
|
||||
#define A4_PAGE_WIDTH 8.25
|
||||
#define A4_PAGE_HEIGHT 11.75
|
||||
#define A4_PAGE_WIDTH 8.267716
|
||||
#define A4_PAGE_HEIGHT 11.692913
|
||||
|
||||
/* Standard B4 */
|
||||
#define B4_PAGE_WIDTH 9.875
|
||||
#define B4_PAGE_HEIGHT 13.875
|
||||
#define B4_PAGE_WIDTH 9.8425197
|
||||
#define B4_PAGE_HEIGHT 13.897637
|
||||
|
||||
#endif /*EMU_PLAT_FALLTHROUGH_H*/
|
||||
|
||||
@@ -396,6 +396,8 @@ machine_at_tuliptc38_init(const machine_t *model)
|
||||
device_add(&ide_isa_device);
|
||||
device_add_params(&fdc37c6xx_device, (void *) (FDC37C651 | FDC37C6XX_IDE_PRI));
|
||||
|
||||
video_reset(gfxcard[0]);
|
||||
|
||||
if (gfxcard[0] == VID_INTERNAL) {
|
||||
bios_load_aux_linear("roms/machines/tuliptc38/VBIOS.BIN",
|
||||
0x000c0000, 32768, 0);
|
||||
|
||||
@@ -311,6 +311,8 @@ machine_at_dell466np_init(const machine_t *model)
|
||||
machine_at_common_init(model);
|
||||
device_add(&sis_85c461_device);
|
||||
|
||||
video_reset(gfxcard[0]);
|
||||
|
||||
if (gfxcard[0] == VID_INTERNAL)
|
||||
device_add(machine_get_vid_device(machine));
|
||||
else {
|
||||
@@ -354,6 +356,8 @@ machine_at_valuepoint433_init(const machine_t *model) // hangs without the PS/2
|
||||
if (fdc_current[0] == FDC_INTERNAL)
|
||||
device_add(&fdc_at_device);
|
||||
|
||||
video_reset(gfxcard[0]);
|
||||
|
||||
if (gfxcard[0] != VID_INTERNAL) {
|
||||
for (uint16_t i = 0; i < 32768; i++)
|
||||
rom[i] = mem_readb_phys(0x000c0000 + i);
|
||||
|
||||
@@ -166,6 +166,29 @@ machine_at_greenb_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* OPTi 499 */
|
||||
int
|
||||
machine_at_xenon_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bios_load_linear("roms/machines/xenon/addx-bios-7-71-i28f001.bin",
|
||||
0x000e0000, 131072, 0);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
|
||||
machine_at_common_init(model);
|
||||
|
||||
device_add(&opti499_device);
|
||||
device_add(&ide_vlb_device);
|
||||
device_add_params(&fdc37c6xx_device, (void *) (FDC37C661 | FDC37C6XX_IDE_PRI));
|
||||
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
|
||||
device_add(&intel_flash_bxt_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* OPTi 895 */
|
||||
static const device_config_t j403tg_config[] = {
|
||||
// clang-format off
|
||||
@@ -467,6 +490,8 @@ machine_at_tg486g_init(const machine_t *model)
|
||||
|
||||
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
|
||||
|
||||
video_reset(gfxcard[0]);
|
||||
|
||||
if (gfxcard[0] != VID_INTERNAL) {
|
||||
for (uint16_t i = 0; i < 32768; i++)
|
||||
rom[i] = mem_readb_phys(0x000c0000 + i);
|
||||
|
||||
@@ -8761,6 +8761,50 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has AMIKey F KBC firmware. */
|
||||
{
|
||||
.name = "[OPTi 499] ADD-X Normerel Xenon",
|
||||
.internal_name = "xenon",
|
||||
.type = MACHINE_TYPE_486_S3,
|
||||
.chipset = MACHINE_CHIPSET_OPTI_499,
|
||||
.init = machine_at_xenon_init,
|
||||
.p1_handler = machine_generic_p1_handler,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET3,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_VLB,
|
||||
.flags = MACHINE_IDE | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 1024,
|
||||
.max = 65536,
|
||||
.step = 1024
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.jumpered_ecp_dma = 0,
|
||||
.default_jumpered_ecp_dma = -1,
|
||||
.kbc_device = &kbc_at_device,
|
||||
.kbc_params = KBC_VEN_AMI | 0x00004600,
|
||||
.kbc_p1 = 0x00000cf0,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.kbd_device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Version 1.0 has an AMIKEY-2, version 2.0 has a VIA VT82C42N KBC. */
|
||||
{
|
||||
.name = "[OPTi 895] Jetway J-403TG",
|
||||
@@ -18511,11 +18555,10 @@ const machine_t machines[] = {
|
||||
.block = CPU_BLOCK(CPU_CYRIX3S),
|
||||
.min_bus = 66666667,
|
||||
.max_bus = 83333333,
|
||||
/* TODO: to find the actual voltage and multiplier bus speeds. */
|
||||
.min_voltage = 1800,
|
||||
.max_voltage = 3500,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 8.0
|
||||
.min_voltage = 2050,
|
||||
.max_voltage = 3100,
|
||||
.min_multi = 3.5,
|
||||
.max_multi = 5.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI | MACHINE_USB,
|
||||
|
||||
@@ -106,9 +106,10 @@ int cachesize = 256;
|
||||
uint32_t get_phys_virt;
|
||||
uint32_t get_phys_phys;
|
||||
|
||||
int mem_a20_key = 0;
|
||||
int mem_a20_alt = 0;
|
||||
int mem_a20_state = 0;
|
||||
int mem_a20_key = 0;
|
||||
int mem_a20_alt = 0;
|
||||
int mem_a20_chipset = 0;
|
||||
int mem_a20_state = 0;
|
||||
|
||||
int mmuflush = 0;
|
||||
|
||||
@@ -3109,12 +3110,12 @@ mem_a20_recalc(void)
|
||||
if (!is286) {
|
||||
rammask = 0xfffff;
|
||||
flushmmucache();
|
||||
mem_a20_key = mem_a20_alt = mem_a20_state = 0;
|
||||
mem_a20_key = mem_a20_alt = mem_a20_state = mem_a20_chipset = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
state = mem_a20_key | mem_a20_alt;
|
||||
state = mem_a20_key | mem_a20_alt | mem_a20_chipset;
|
||||
if (state && !mem_a20_state) {
|
||||
rammask = cpu_16bitbus ? 0xffffff : 0xffffffff;
|
||||
if (is6117)
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#ifdef _WIN32
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
# include <ws2tcpip.h>
|
||||
#else
|
||||
# include <poll.h>
|
||||
#endif
|
||||
@@ -493,13 +494,30 @@ net_slirp_init(const netcard_t *card, const uint8_t *mac_addr, UNUSED(void *priv
|
||||
slirp->pfd = calloc(1, slirp->pfd_size);
|
||||
#endif
|
||||
|
||||
/* Set the IP addresses to use. */
|
||||
struct in_addr net = { .s_addr = htonl(0x0a000000 | (slirp_card_num << 8)) }; /* 10.0.x.0 */
|
||||
struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
|
||||
struct in_addr host = { .s_addr = htonl(0x0a000002 | (slirp_card_num << 8)) }; /* 10.0.x.2 */
|
||||
struct in_addr dhcp = { .s_addr = htonl(0x0a00000f | (slirp_card_num << 8)) }; /* 10.0.x.15 */
|
||||
struct in_addr dns = { .s_addr = htonl(0x0a000003 | (slirp_card_num << 8)) }; /* 10.0.x.3 */
|
||||
struct in_addr bind = { .s_addr = htonl(0x00000000) }; /* 0.0.0.0 */
|
||||
struct in_addr net;
|
||||
struct in_addr host;
|
||||
struct in_addr dhcp;
|
||||
struct in_addr dns;
|
||||
|
||||
/* Set the IP addresses to use.
|
||||
Use a configured address if set, otherwise 10.0.x.0 */
|
||||
const char *slirp_net = net_cards_conf[card->card_num].slirp_net;
|
||||
if (slirp_net[0] != '\0') {
|
||||
struct in_addr addr;
|
||||
inet_pton(AF_INET, slirp_net, &addr);
|
||||
net.s_addr = htonl(ntohl(addr.s_addr) & 0xffffff00);
|
||||
host.s_addr = htonl(ntohl(addr.s_addr) + 2);
|
||||
dhcp.s_addr = htonl(ntohl(addr.s_addr) + 15);
|
||||
dns.s_addr = htonl(ntohl(addr.s_addr) + 3);
|
||||
} else {
|
||||
net.s_addr = htonl(0x0a000000 | (slirp_card_num << 8)); /* 10.0.x.0 */
|
||||
host.s_addr = htonl(0x0a000002 | (slirp_card_num << 8)); /* 10.0.x.2 */
|
||||
dhcp.s_addr = htonl(0x0a00000f | (slirp_card_num << 8)); /* 10.0.x.15 */
|
||||
dns.s_addr = htonl(0x0a000003 | (slirp_card_num << 8)); /* 10.0.x.3 */
|
||||
}
|
||||
|
||||
struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
|
||||
struct in_addr bind = { .s_addr = htonl(0x00000000) }; /* 0.0.0.0 */
|
||||
|
||||
const SlirpConfig slirp_config = {
|
||||
#if SLIRP_CHECK_VERSION(4, 9, 0)
|
||||
|
||||
@@ -265,6 +265,8 @@ typedef struct escp_t {
|
||||
uint8_t ctrl;
|
||||
|
||||
PALETTE palcol;
|
||||
|
||||
uint8_t auto_lf;
|
||||
} escp_t;
|
||||
|
||||
/* Codepage table, needed for ESC t ( */
|
||||
@@ -540,7 +542,7 @@ init_codepage(escp_t *dev, uint16_t num)
|
||||
static void
|
||||
reset_printer(escp_t *dev)
|
||||
{
|
||||
dev->top_margin = dev->left_margin = 0.0;
|
||||
dev->top_margin = dev->left_margin = 1.0 / 36.0;
|
||||
dev->right_margin = dev->page_width;
|
||||
switch (dev->paper_size) {
|
||||
case PAPER_A4:
|
||||
@@ -556,7 +558,7 @@ reset_printer(escp_t *dev)
|
||||
default:
|
||||
dev->page_height = LETTER_PAGE_HEIGHT;
|
||||
}
|
||||
dev->bottom_margin = dev->page_height;
|
||||
dev->bottom_margin = dev->page_height - 1.0 / 36.0;
|
||||
/* TODO: these should be configurable. */
|
||||
dev->color = COLOR_BLACK;
|
||||
dev->curr_x = dev->curr_y = 0.0;
|
||||
@@ -1749,7 +1751,7 @@ process_char(escp_t *dev, uint8_t ch)
|
||||
|
||||
case 0x0d: /* Carriage Return (CR) */
|
||||
dev->curr_x = dev->left_margin;
|
||||
if (!dev->autofeed)
|
||||
if (!dev->autofeed && !dev->auto_lf)
|
||||
return 1;
|
||||
fallthrough;
|
||||
|
||||
@@ -2214,7 +2216,9 @@ escp_init(const device_t *info)
|
||||
dev->page_height = LETTER_PAGE_HEIGHT;
|
||||
}
|
||||
|
||||
dev->dpi = dev->lang >= LANG_ESCP ? 360 : 240;
|
||||
dev->auto_lf = device_get_config_int("auto_lf");
|
||||
|
||||
dev->dpi = dev->lang >= LANG_ESCP ? 360 : 240;
|
||||
|
||||
/* Create 8-bit grayscale buffer for the page. */
|
||||
dev->page = (psurface_t *) malloc(sizeof(psurface_t));
|
||||
@@ -2328,6 +2332,17 @@ static const device_config_t lpt_prt_escp_config[] = {
|
||||
},
|
||||
.bios = { { 0 } }
|
||||
},
|
||||
{
|
||||
.name = "auto_lf",
|
||||
.description = "Auto LF",
|
||||
.type = CONFIG_BINARY,
|
||||
.default_string = NULL,
|
||||
.default_int = 0,
|
||||
.file_filter = NULL,
|
||||
.spinner = { 0 },
|
||||
.selection = { { 0 } },
|
||||
.bios = { { 0 } }
|
||||
},
|
||||
{ .name = "", .description = "", .type = CONFIG_END }
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2026-01-26 17:57+0000\n"
|
||||
"PO-Revision-Date: 2026-02-04 18:32+0000\n"
|
||||
"Last-Translator: DimMan88 <dimman88@hotmail.com>\n"
|
||||
"Language-Team: Greek <https://weblate.86box.net/projects/86box/86box/el/>\n"
|
||||
"Language: el-GR\n"
|
||||
@@ -61,7 +61,7 @@ msgid "Remember size && position"
|
||||
msgstr "Απομνήμευση μεγέθους && θέσης"
|
||||
|
||||
msgid "Re&nderer"
|
||||
msgstr "Re&nderer"
|
||||
msgstr "&Απεικονιστής"
|
||||
|
||||
msgid "&Qt (Software)"
|
||||
msgstr "&Qt (Software)"
|
||||
@@ -397,7 +397,7 @@ msgid "Enabled (UTC)"
|
||||
msgstr "Ενεργό (UTC)"
|
||||
|
||||
msgid "Dynamic Recompiler"
|
||||
msgstr "Dynamic Recompiler"
|
||||
msgstr "Δυναμικός Αναμεταγλωττιστής"
|
||||
|
||||
msgid "CPU frame size"
|
||||
msgstr "Μέγεθος πλαισίου CPU"
|
||||
@@ -619,7 +619,7 @@ msgid "Image Format:"
|
||||
msgstr "Τύπος Εικόνας:"
|
||||
|
||||
msgid "Block Size:"
|
||||
msgstr "Block Size:"
|
||||
msgstr "Μέγεθος Block:"
|
||||
|
||||
msgid "Floppy drives:"
|
||||
msgstr "Οδηγοί δισκέτας:"
|
||||
@@ -721,10 +721,10 @@ msgid "Turbo"
|
||||
msgstr "Turbo"
|
||||
|
||||
msgid "On"
|
||||
msgstr "On"
|
||||
msgstr "Ενεργό"
|
||||
|
||||
msgid "Off"
|
||||
msgstr "Off"
|
||||
msgstr "Ανενεργό"
|
||||
|
||||
msgid "All images"
|
||||
msgstr "Όλες οι εικόνες"
|
||||
@@ -1080,7 +1080,7 @@ msgid "Cartridge %1: %2"
|
||||
msgstr "Κασέτα δεδομένων %1: %2"
|
||||
|
||||
msgid "Car&tridge %1: %2"
|
||||
msgstr "Car&tridge %1: %2"
|
||||
msgstr "&Κασέτα δεδομένων %1: %2"
|
||||
|
||||
msgid "Cartridge images"
|
||||
msgstr "Εικόνες κασέτας δεδομένων"
|
||||
@@ -1460,13 +1460,13 @@ msgid "HDX image"
|
||||
msgstr "Εικόνα HDX"
|
||||
|
||||
msgid "Fixed-size VHD"
|
||||
msgstr "Fixed-size VHD"
|
||||
msgstr "Σταθερό-μέγεθος VHD"
|
||||
|
||||
msgid "Dynamic-size VHD"
|
||||
msgstr "Dynamic-size VHD"
|
||||
msgstr "Δυναμικό-μέγεθος VHD"
|
||||
|
||||
msgid "Differencing VHD"
|
||||
msgstr "Differencing VHD"
|
||||
msgstr "Διαφοροποίηση VHD"
|
||||
|
||||
msgid "(N/A)"
|
||||
msgstr "(Μ/Δ)"
|
||||
@@ -1481,19 +1481,19 @@ msgid "HDX image (.hdx)"
|
||||
msgstr "Εικόνα HDX (.hdx)"
|
||||
|
||||
msgid "Fixed-size VHD (.vhd)"
|
||||
msgstr "Fixed-size VHD (.vhd)"
|
||||
msgstr "Σταθερό-μέγεθος VHD (.vhd)"
|
||||
|
||||
msgid "Dynamic-size VHD (.vhd)"
|
||||
msgstr "Dynamic-size VHD (.vhd)"
|
||||
msgstr "Δυναμικό-μέγεθος VHD (.vhd)"
|
||||
|
||||
msgid "Differencing VHD (.vhd)"
|
||||
msgstr "Differencing VHD (.vhd)"
|
||||
msgstr "Διαφοροποίηση VHD (.vhd)"
|
||||
|
||||
msgid "Large blocks (2 MB)"
|
||||
msgstr "Large blocks (2 MB)"
|
||||
msgstr "Μεγάλα blocks (2 MB)"
|
||||
|
||||
msgid "Small blocks (512 KB)"
|
||||
msgstr "Small blocks (512 KB)"
|
||||
msgstr "Μικρά blocks (512 KB)"
|
||||
|
||||
msgid "VHD files"
|
||||
msgstr "Αρχεία VHD"
|
||||
@@ -2964,7 +2964,7 @@ msgid "version"
|
||||
msgstr "έκδοση"
|
||||
|
||||
msgid "build"
|
||||
msgstr "build"
|
||||
msgstr "δομή"
|
||||
|
||||
msgid "You are currently running version <b>%1</b>."
|
||||
msgstr "Τρέχετε την έκδοση <b>%1</b>."
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2025-11-29 00:34+0000\n"
|
||||
"Last-Translator: OBattler <oubattler@gmail.com>\n"
|
||||
"PO-Revision-Date: 2026-02-06 05:57+0000\n"
|
||||
"Last-Translator: Jeffrey Hope <strangercoug@hotmail.com>\n"
|
||||
"Language-Team: Spanish <https://weblate.86box.net/projects/86box/86box/es/>\n"
|
||||
"Language: es-ES\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -1108,7 +1108,7 @@ msgid "Not running"
|
||||
msgstr "No en ejecución"
|
||||
|
||||
msgid "Running"
|
||||
msgstr "En ejeución"
|
||||
msgstr "En ejecución"
|
||||
|
||||
msgid "Paused"
|
||||
msgstr "En pausa"
|
||||
|
||||
@@ -622,7 +622,7 @@ main(int argc, char *argv[])
|
||||
fprintf(stderr, "Qt: version %s, platform \"%s\"\n", qVersion(), QApplication::platformName().toUtf8().data());
|
||||
ProgSettings::loadTranslators(&app);
|
||||
#ifdef Q_OS_WINDOWS
|
||||
QApplication::setFont(QFont(ProgSettings::getFontName(lang_id), 9));
|
||||
QApplication::setFont(ProgSettings::getUIFont());
|
||||
SetCurrentProcessExplicitAppUserModelID(L"86Box.86Box");
|
||||
#endif
|
||||
|
||||
|
||||
@@ -2431,7 +2431,7 @@ MainWindow::changeEvent(QEvent *event)
|
||||
#ifdef Q_OS_WINDOWS
|
||||
if (event->type() == QEvent::LanguageChange) {
|
||||
auto size = this->centralWidget()->size();
|
||||
QApplication::setFont(QFont(ProgSettings::getFontName(lang_id), 9));
|
||||
QApplication::setFont(ProgSettings::getUIFont());
|
||||
QApplication::processEvents();
|
||||
main_window->centralWidget()->setFixedSize(size);
|
||||
QApplication::processEvents();
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#ifdef Q_OS_WINDOWS
|
||||
# include <QSysInfo>
|
||||
# include <QVersionNumber>
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
@@ -157,27 +159,67 @@ ProgSettings::~ProgSettings()
|
||||
delete ui;
|
||||
}
|
||||
|
||||
static QString sys_lang;
|
||||
|
||||
#ifdef Q_OS_WINDOWS
|
||||
/* Return the standard font name on Windows, which is overridden per-language
|
||||
to prevent CJK fonts with embedded bitmaps being chosen as a fallback. */
|
||||
QString
|
||||
ProgSettings::getFontName(int langId)
|
||||
/* Returns the standard UI font for Windows, which by default varies for different
|
||||
languages. It can also be changed via external tools, if the user wants that.
|
||||
|
||||
We use the message font here since that is what most Windows components and
|
||||
other third-party programs use. */
|
||||
QFont
|
||||
ProgSettings::getUIFont()
|
||||
{
|
||||
QString langCode = languageIdToCode(lang_id);
|
||||
if (langCode == "ja-JP") {
|
||||
/* Check for Windows 10 or later to choose the appropriate system font */
|
||||
if (QVersionNumber::fromString(QSysInfo::kernelVersion()).majorVersion() >= 10)
|
||||
return "Yu Gothic UI";
|
||||
else
|
||||
return "Meiryo UI";
|
||||
} else if (langCode == "ko-KR")
|
||||
return "Malgun Gothic";
|
||||
else if (langCode == "zh-CN")
|
||||
return "Microsoft YaHei";
|
||||
else if (langCode == "zh-TW")
|
||||
return "Microsoft JhengHei";
|
||||
else
|
||||
return "Segoe UI";
|
||||
|
||||
if ((langCode != sys_lang) && ((langCode == "ja-JP") || (langCode == "ko-KR") ||
|
||||
(langCode == "zh-CN") || (langCode == "zh-TW"))) {
|
||||
/*
|
||||
Work around Windows' inappropriate, ugly default fonts when using an East Asian
|
||||
language when it is not also the system language.
|
||||
*/
|
||||
if (langCode == "ja-JP") {
|
||||
/* Check for Windows 10 or later to choose the appropriate system font */
|
||||
if (QVersionNumber::fromString(QSysInfo::kernelVersion()).majorVersion() >= 10)
|
||||
return QFont("Yu Gothic UI", 9);
|
||||
else
|
||||
return QFont("Meiryo UI", 9);
|
||||
} else if (langCode == "ko-KR")
|
||||
return QFont("Malgun Gothic", 9);
|
||||
else if (langCode == "zh-CN")
|
||||
return QFont("Microsoft YaHei", 9);
|
||||
else if (langCode == "zh-TW")
|
||||
return QFont("Microsoft JhengHei", 9);
|
||||
}
|
||||
|
||||
// Get the system (primary monitor) DPI. The font returned by
|
||||
// SystemParametersInfo is scaled according to this and we need
|
||||
// to get the font size in points to pass into QFont's constructor.
|
||||
HDC hdc = GetDC(NULL);
|
||||
int systemDpi = GetDeviceCaps(hdc, LOGPIXELSY);
|
||||
ReleaseDC(NULL, hdc);
|
||||
|
||||
// Get the font metrics.
|
||||
NONCLIENTMETRICSW ncm = {};
|
||||
ncm.cbSize = sizeof(ncm);
|
||||
// This should never happen, but just to be safe, return Segoe UI if
|
||||
// SPI fails.
|
||||
if (!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0))
|
||||
{
|
||||
return QFont("Segoe UI", 9);
|
||||
}
|
||||
|
||||
QString fontName = QString::fromWCharArray(ncm.lfMessageFont.lfFaceName);
|
||||
// Windows' conversion from points to pixels goes as follows:
|
||||
//
|
||||
// -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72)
|
||||
//
|
||||
// (source: https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createfontw)
|
||||
//
|
||||
// Let's reverse that calculation to get the point size from the message font.
|
||||
int fontSize = -MulDiv(ncm.lfMessageFont.lfHeight, 72, systemDpi);
|
||||
|
||||
return QFont(fontName, fontSize);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -201,9 +243,42 @@ ProgSettings::languageIdToCode(int id)
|
||||
return languages[id].first;
|
||||
}
|
||||
|
||||
void
|
||||
ProgSettings::getSysLang(QObject *parent)
|
||||
{
|
||||
if (qtTranslator) {
|
||||
QApplication::removeTranslator(qtTranslator);
|
||||
qtTranslator = nullptr;
|
||||
}
|
||||
if (translator) {
|
||||
QApplication::removeTranslator(translator);
|
||||
translator = nullptr;
|
||||
}
|
||||
qtTranslator = new QTranslator(parent);
|
||||
translator = new CustomTranslator(parent);
|
||||
QString localetofilename = "";
|
||||
for (int i = 0; i < QLocale::system().uiLanguages().size(); i++) {
|
||||
localetofilename = QLocale::system().uiLanguages()[i];
|
||||
if (translator->load(QLatin1String("86box_") + localetofilename, QLatin1String(":/"))) {
|
||||
qDebug() << "Translations loaded.";
|
||||
QCoreApplication::installTranslator(translator);
|
||||
/* First try qtbase */
|
||||
if (!loadQtTranslations(QLatin1String("qtbase_") + localetofilename.replace('-', '_')))
|
||||
/* If that fails, try legacy qt_* translations */
|
||||
if (!loadQtTranslations(QLatin1String("qt_") + localetofilename.replace('-', '_')))
|
||||
qDebug() << "Failed to find Qt translations!";
|
||||
if (QCoreApplication::installTranslator(qtTranslator))
|
||||
qDebug() << "Qt translations loaded.";
|
||||
sys_lang = localetofilename;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ProgSettings::loadTranslators(QObject *parent)
|
||||
{
|
||||
getSysLang(parent);
|
||||
if (qtTranslator) {
|
||||
QApplication::removeTranslator(qtTranslator);
|
||||
qtTranslator = nullptr;
|
||||
|
||||
@@ -15,10 +15,11 @@ public:
|
||||
explicit ProgSettings(QWidget *parent = nullptr);
|
||||
~ProgSettings();
|
||||
#ifdef Q_OS_WINDOWS
|
||||
static QString getFontName(int langId);
|
||||
static QFont getUIFont();
|
||||
#endif
|
||||
static int languageCodeToId(QString langCode);
|
||||
static QString languageIdToCode(int id);
|
||||
static void getSysLang(QObject *parent = nullptr);
|
||||
static void loadTranslators(QObject *parent = nullptr);
|
||||
static void reloadStrings();
|
||||
class CustomTranslator : public QTranslator {
|
||||
|
||||
@@ -165,7 +165,7 @@ VMManagerDetails::VMManagerDetails(QWidget *parent)
|
||||
connect(this, &VMManagerDetails::styleUpdated, portsSection, &VMManagerDetailSection::updateStyle);
|
||||
connect(this, &VMManagerDetails::styleUpdated, otherSection, &VMManagerDetailSection::updateStyle);
|
||||
|
||||
QApplication::setFont(QFont(ProgSettings::getFontName(lang_id), 9));
|
||||
QApplication::setFont(ProgSettings::getUIFont());
|
||||
#endif
|
||||
|
||||
sysconfig = new VMManagerSystem();
|
||||
|
||||
@@ -269,7 +269,7 @@ VMManagerMainWindow::changeEvent(QEvent *event)
|
||||
{
|
||||
#ifdef Q_OS_WINDOWS
|
||||
if (event->type() == QEvent::LanguageChange) {
|
||||
QApplication::setFont(QFont(ProgSettings::getFontName(lang_id), 9));
|
||||
QApplication::setFont(QFont(ProgSettings::getUIFont()));
|
||||
}
|
||||
#endif
|
||||
QWidget::changeEvent(event);
|
||||
|
||||
Reference in New Issue
Block a user