diff --git a/src/86box.c b/src/86box.c index 87dbfc0b1..0b5a26131 100644 --- a/src/86box.c +++ b/src/86box.c @@ -236,6 +236,7 @@ char monitor_edid_path[1024] = { 0 }; /* (C) Path to double video_gl_input_scale = 1.0; /* (C) OpenGL 3.x input scale */ int video_gl_input_scale_mode = FULLSCR_SCALE_FULL; /* (C) OpenGL 3.x input stretch mode */ +int color_scheme = 0; /* (C) Color scheme of UI (Windows-only) */ // Accelerator key array struct accelKey acc_keys[NUM_ACCELS]; diff --git a/src/cdrom/CMakeLists.txt b/src/cdrom/CMakeLists.txt index 4d5f947ca..6208111de 100644 --- a/src/cdrom/CMakeLists.txt +++ b/src/cdrom/CMakeLists.txt @@ -28,6 +28,9 @@ add_library(cdrom OBJECT if(NOT WIN32) target_include_directories(86Box PRIVATE PkgConfig::SNDFILE) endif() +if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + target_include_directories(cdrom PRIVATE /usr/local/include) +endif() target_link_libraries(86Box PkgConfig::SNDFILE) if(CDROM_MITSUMI) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 1eee1ac94..98f408d64 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -344,7 +344,7 @@ cdrom_is_sector_good(cdrom_t *dev, const uint8_t *b, const uint8_t mode2, const { int ret = 1; - if (!mode2 || (form == 1)) { + if ((dev->cd_status != CD_STATUS_DVD) && (!mode2 || (form == 1))) { if (mode2 && (form == 1)) { const uint32_t crc = cdrom_crc32(0xffffffff, &(b[16]), 2056) ^ 0xffffffff; @@ -2976,9 +2976,12 @@ cdrom_update_status(cdrom_t *dev) dev->seek_pos = 0; dev->cd_buflen = 0; - if (dev->ops->is_dvd(dev->local)) - dev->cd_status = CD_STATUS_DVD; - else + if (dev->ops->is_dvd(dev->local)) { + if (cdrom_is_dvd(dev->type)) + dev->cd_status = CD_STATUS_DVD; + else + dev->cd_status = CD_STATUS_DVD_REJECTED; + } else dev->cd_status = dev->ops->has_audio(dev->local) ? CD_STATUS_STOPPED : CD_STATUS_DATA_ONLY; diff --git a/src/config.c b/src/config.c index a3c2dc0ec..737e7313b 100644 --- a/src/config.c +++ b/src/config.c @@ -128,6 +128,7 @@ load_global(void) confirm_reset = ini_section_get_int(cat, "confirm_reset", 1); confirm_exit = ini_section_get_int(cat, "confirm_exit", 1); confirm_save = ini_section_get_int(cat, "confirm_save", 1); + color_scheme = ini_section_get_int(cat, "color_scheme", 0); inhibit_multimedia_keys = ini_section_get_int(cat, "inhibit_multimedia_keys", 0); @@ -2222,6 +2223,11 @@ save_global(void) ini_section_set_string(cat, "language", buffer); } + if (color_scheme) + ini_section_set_int(cat, "color_scheme", color_scheme); + else + ini_section_delete_var(cat, "color_scheme"); + if (open_dir_usr_path) ini_section_set_int(cat, "open_dir_usr_path", open_dir_usr_path); else diff --git a/src/device/hasp.c b/src/device/hasp.c index 12dc6f2d1..07e9ac636 100644 --- a/src/device/hasp.c +++ b/src/device/hasp.c @@ -341,7 +341,6 @@ const lpt_device_t lpt_hasp_savquest_device = { .close = hasp_close, .write_data = hasp_write_data, .write_ctrl = NULL, - .autofeed = NULL, .strobe = NULL, .read_status = hasp_read_status, .read_ctrl = NULL, diff --git a/src/device/isamem.c b/src/device/isamem.c index 1e2e92470..f89512779 100644 --- a/src/device/isamem.c +++ b/src/device/isamem.c @@ -2100,7 +2100,7 @@ static const device_config_t mplus2_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 64, diff --git a/src/device/lpt.c b/src/device/lpt.c index 1466ea021..29689d2de 100644 --- a/src/device/lpt.c +++ b/src/device/lpt.c @@ -222,15 +222,6 @@ lpt_ecp_update_irq(lpt_t *dev) picintclevel(1 << dev->irq, &dev->irq_state); } -static void -lpt_autofeed(lpt_t *dev, const uint8_t val) -{ - if (dev->dt && dev->dt->autofeed && dev->dt->priv) - dev->dt->autofeed(val, dev->dt->priv); - - dev->autofeed = val; -} - static void lpt_strobe(lpt_t *dev, const uint8_t val) { @@ -258,8 +249,6 @@ lpt_fifo_out_callback(void *priv) else ret = dma_channel_read(dev->dma); - lpt_log("DMA %02X: %08X\n", dev->dma, ret); - if (ret != DMA_NODATA) { fifo_write_evt_tagged(0x01, (uint8_t) (ret & 0xff), dev->fifo); @@ -299,7 +288,6 @@ lpt_fifo_out_callback(void *priv) dev->dma_stat = 0x04; dev->state = LPT_STATE_IDLE; lpt_ecp_update_irq(dev); - lpt_autofeed(dev, 0); } else { dev->state = LPT_STATE_READ_DMA; @@ -312,8 +300,6 @@ lpt_fifo_out_callback(void *priv) } else if (!fifo_get_empty(dev->fifo)) timer_advance_u64(&dev->fifo_out_timer, (uint64_t) ((1000000.0 / 2500000.0) * (double) TIMER_USEC)); - else - lpt_autofeed(dev, 0); break; } } @@ -354,13 +340,11 @@ lpt_write(const uint16_t port, const uint8_t val, void *priv) break; case 0x0002: - if (dev->dt && dev->dt->write_ctrl && dev->dt->priv) { - if (dev->ecp && ((dev->ecr & 0xe0) >= 0x20)) - dev->dt->write_ctrl((val & 0xfc) | dev->autofeed | dev->strobe, dev->dt->priv); - else - dev->dt->write_ctrl(val, dev->dt->priv); - } + if (dev->dt && dev->dt->write_ctrl && dev->dt->priv) + dev->dt->write_ctrl(val, dev->dt->priv); dev->ctrl = val; + dev->strobe = val & 0x01; + dev->autofeed = val & 0x02; dev->enable_irq = val & 0x10; if (!(val & 0x10) && (dev->irq != 0xff)) picintc(1 << dev->irq); @@ -430,11 +414,6 @@ lpt_write(const uint16_t port, const uint8_t val, void *priv) break; case 0x0402: case 0x0406: - if (!(val & 0x0c)) - lpt_autofeed(dev, 0x00); - else - lpt_autofeed(dev, 0x02); - if ((dev->ecr & 0x04) && !(val & 0x04)) { dev->dma_stat = 0x00; fifo_reset(dev->fifo); diff --git a/src/disk/hdc_ide_rz1000.c b/src/disk/hdc_ide_rz1000.c index 8e664dd92..6b7aa68e8 100644 --- a/src/disk/hdc_ide_rz1000.c +++ b/src/disk/hdc_ide_rz1000.c @@ -208,6 +208,15 @@ rz1000_reset(void *priv) dev->regs[0x0a] = 0x01; /* IDE controller */ dev->regs[0x0b] = 0x01; /* Mass storage controller */ + dev->regs[0x10] = 0xf1; + dev->regs[0x11] = 0x01; + dev->regs[0x14] = 0xf5; + dev->regs[0x15] = 0x03; + dev->regs[0x18] = 0x71; + dev->regs[0x19] = 0x01; + dev->regs[0x1c] = 0x75; + dev->regs[0x1d] = 0x03; + dev->irq_mode[0] = dev->irq_mode[1] = 0; dev->irq_pin = PCI_INTA; dev->irq_line = 14; diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 08def802b..ce39652bc 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -206,6 +206,8 @@ extern int portable_mode; /* we are running in portable mode extern int monitor_edid; /* (C) Which EDID to use. 0=default, 1=custom. */ extern char monitor_edid_path[1024]; /* (C) Path to custom EDID */ +extern int color_scheme; /* (C) Color scheme of UI (Windows-only) */ + #ifndef USE_NEW_DYNAREC extern FILE *stdlog; /* file to log output to */ #endif diff --git a/src/include/86box/lpt.h b/src/include/86box/lpt.h index 037c31a44..61c95094f 100644 --- a/src/include/86box/lpt.h +++ b/src/include/86box/lpt.h @@ -25,7 +25,6 @@ typedef struct lpt_device_s { void (*close)(void *priv); void (*write_data)(uint8_t val, void *priv); void (*write_ctrl)(uint8_t val, void *priv); - void (*autofeed)(uint8_t val,void *priv); void (*strobe)(uint8_t old, uint8_t val,void *priv); uint8_t (*read_status)(void *priv); uint8_t (*read_ctrl)(void *priv); diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 1c7061d8a..899e819f7 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -149,11 +149,11 @@ static const scancode scancode_tandy[512] = { { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */ { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */ { .mk = { 0x56, 0 }, .brk = { 0xd6, 0 } }, /* 053 */ - { .mk = { 0 }, .brk = { 0 } }, /* 054 */ + { .mk = { 0x54, 0 }, .brk = { 0xd4, 0 } }, /* 054 */ { .mk = { 0 }, .brk = { 0 } }, /* 055 */ { .mk = { 0 }, .brk = { 0 } }, /* 056 */ - { .mk = { 0 }, .brk = { 0 } }, /* 057 */ - { .mk = { 0 }, .brk = { 0 } }, /* 058 */ + { .mk = { 0x59, 0 }, .brk = { 0xd9, 0 } }, /* 057 */ + { .mk = { 0x5a, 0 }, .brk = { 0xda, 0 } }, /* 058 */ { .mk = { 0 }, .brk = { 0 } }, /* 059 */ { .mk = { 0 }, .brk = { 0 } }, /* 05a */ { .mk = { 0 }, .brk = { 0 } }, /* 05b */ @@ -392,7 +392,7 @@ static const scancode scancode_tandy[512] = { { .mk = { 0 }, .brk = { 0 } }, /* 144 */ { .mk = { 0 }, .brk = { 0 } }, /* 145 */ { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 146 */ - { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 147 */ + { .mk = { 0x58, 0 }, .brk = { 0xd8, 0 } }, /* 147 */ { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 148 */ { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 149 */ { .mk = { 0 }, .brk = { 0 } }, /* 14a */ @@ -403,7 +403,7 @@ static const scancode scancode_tandy[512] = { { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 14f */ { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 150 */ { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 151 */ - { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 152 */ + { .mk = { 0x55, 0 }, .brk = { 0xd5, 0 } }, /* 152 */ { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 153 */ { .mk = { 0 }, .brk = { 0 } }, /* 154 */ { .mk = { 0 }, .brk = { 0 } }, /* 155 */ diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index aacc69d59..6fc09e548 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -11390,7 +11390,7 @@ const machine_t machines[] = { .default_jumpered_ecp_dma = 3, .kbc_device = &kbc_at_device, .kbc_params = KBC_VEN_PHOENIX | 0x00012900, - .kbc_p1 = 0x00000cf0, + .kbc_p1 = 0x00001010, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, .device = &batman_device, @@ -11976,7 +11976,7 @@ const machine_t machines[] = { .default_jumpered_ecp_dma = 3, .kbc_device = &kbc_at_device, .kbc_params = KBC_VEN_PHOENIX | 0x00012900, - .kbc_p1 = 0x00000cf0, + .kbc_p1 = 0x00001010, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, .device = &plato_device, diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index 82d332e20..3f7ba427c 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -71,6 +71,9 @@ if(NETSWITCH) endif() if (UNIX) + if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + set_source_files_properties(net_slirp.c PROPERTIES COMPILE_FLAGS "-I/usr/local/include") + endif() find_path(HAS_VDE "libvdeplug.h" PATHS ${VDE_INCLUDE_DIR} "/usr/include /usr/local/include" "/opt/homebrew/include" ) if(HAS_VDE) find_library(VDE_LIB vdeplug) diff --git a/src/network/net_plip.c b/src/network/net_plip.c index c45ad5527..5eacc5536 100644 --- a/src/network/net_plip.c +++ b/src/network/net_plip.c @@ -494,7 +494,6 @@ const lpt_device_t lpt_plip_device = { .close = plip_close, .write_data = plip_write_data, .write_ctrl = plip_write_ctrl, - .autofeed = NULL, .strobe = NULL, .read_status = plip_read_status, .read_ctrl = NULL, diff --git a/src/printer/CMakeLists.txt b/src/printer/CMakeLists.txt index 071bf7113..0efb2aec2 100644 --- a/src/printer/CMakeLists.txt +++ b/src/printer/CMakeLists.txt @@ -37,6 +37,10 @@ endif() find_package(PkgConfig REQUIRED) pkg_check_modules(FREETYPE REQUIRED IMPORTED_TARGET freetype2) target_link_libraries(86Box PkgConfig::FREETYPE) +if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + target_include_directories(print PRIVATE /usr/local/include) + target_include_directories(print PRIVATE /usr/local/include/freetype2) +endif() if(STATIC_BUILD) # if(QT) # Qt provides its own version of harfbuzz which leads to duplicated symbols. diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index 0806b0dad..6af374fba 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -520,7 +520,7 @@ update_font(escp_t *dev) } else switch (dev->lq_typeface) { case TYPEFACE_ROMAN: - fn = FONT_FILE_ROMAN; + fn = (dev->font_style & STYLE_PROP) ? FONT_FILE_ROMAN : FONT_FILE_COURIER; break; case TYPEFACE_SANSSERIF: fn = FONT_FILE_SANSSERIF; @@ -890,7 +890,7 @@ process_char(escp_t *dev, uint8_t ch) break; case 0x21: /* master select (ESC !) */ - dev->cpi = dev->esc_parms[0] & 0x01 ? 12.0 : 10.0; + dev->cpi = (dev->esc_parms[0]) & 0x01 ? 12.0 : 10.0; /* Reset first seven bits. */ dev->font_style &= 0xFF80; @@ -1045,7 +1045,7 @@ process_char(escp_t *dev, uint8_t ch) update_font(dev); break; - case 0x47: /* select dobule-strike printing (ESC G) */ + case 0x47: /* select double-strike printing (ESC G) */ dev->font_style |= STYLE_DOUBLESTRIKE; break; @@ -1098,7 +1098,7 @@ process_char(escp_t *dev, uint8_t ch) break; case 0x52: /* select an intl character set (ESC R) */ - if (dev->esc_parms[0] <= 13 || dev->esc_parms[0] == 64) { + if ((dev->esc_parms[0] <= 13) || (dev->esc_parms[0] == 64)) { if (dev->esc_parms[0] == 64) dev->esc_parms[0] = 14; @@ -1118,9 +1118,9 @@ process_char(escp_t *dev, uint8_t ch) break; case 0x53: /* select superscript/subscript printing (ESC S) */ - if (dev->esc_parms[0] == 0 || dev->esc_parms[0] == '0') + if ((dev->esc_parms[0] == 0) || (dev->esc_parms[0] == '0')) dev->font_style |= STYLE_SUBSCRIPT; - if (dev->esc_parms[0] == 1 || dev->esc_parms[1] == '1') + if ((dev->esc_parms[0] == 1) || (dev->esc_parms[1] == '1')) dev->font_style |= STYLE_SUPERSCRIPT; update_font(dev); break; @@ -1137,9 +1137,9 @@ process_char(escp_t *dev, uint8_t ch) case 0x57: /* turn double-width printing on/off (ESC W) */ if (!dev->multipoint_mode) { dev->hmi = -1; - if (dev->esc_parms[0] == 0 || dev->esc_parms[0] == '0') + if ((dev->esc_parms[0] == 0) || (dev->esc_parms[0] == '0')) dev->font_style &= ~STYLE_DOUBLEWIDTH; - if (dev->esc_parms[0] == 1 || dev->esc_parms[0] == '1') + if ((dev->esc_parms[0] == 1) || (dev->esc_parms[0] == '1')) dev->font_style |= STYLE_DOUBLEWIDTH; update_font(dev); } @@ -1216,9 +1216,9 @@ process_char(escp_t *dev, uint8_t ch) break; case 0x6b: /* select typeface (ESC k) */ - if (dev->esc_parms[0] <= 11 || dev->esc_parms[0] == 30 || dev->esc_parms[0] == 31) { + if ((dev->esc_parms[0] <= 11) || (dev->esc_parms[0] == 30) || + (dev->esc_parms[0] == 31)) dev->lq_typeface = dev->esc_parms[0]; - } update_font(dev); break; @@ -1229,9 +1229,9 @@ process_char(escp_t *dev, uint8_t ch) break; case 0x70: /* Turn proportional mode on/off (ESC p) */ - if (dev->esc_parms[0] == 0 || dev->esc_parms[0] == '0') + if ((dev->esc_parms[0] == 0) || (dev->esc_parms[0] == '0')) dev->font_style &= ~STYLE_PROP; - if (dev->esc_parms[0] == 1 || dev->esc_parms[0] == '1') { + if ((dev->esc_parms[0] == 1) || (dev->esc_parms[0] == '1')) { dev->font_style |= STYLE_PROP; dev->print_quality = QUALITY_LQ; } @@ -1264,20 +1264,20 @@ process_char(escp_t *dev, uint8_t ch) case 0x77: /* turn double-height printing on/off (ESC w) */ if (!dev->multipoint_mode) { - if (dev->esc_parms[0] == 0 || dev->esc_parms[0] == '0') + if ((dev->esc_parms[0] == 0) || (dev->esc_parms[0] == '0')) dev->font_style &= ~STYLE_DOUBLEHEIGHT; - if (dev->esc_parms[0] == 1 || dev->esc_parms[0] == '1') + if ((dev->esc_parms[0] == 1) || (dev->esc_parms[0] == '1')) dev->font_style |= STYLE_DOUBLEHEIGHT; update_font(dev); } break; case 0x78: /* select LQ or draft (ESC x) */ - if (dev->esc_parms[0] == 0 || dev->esc_parms[0] == '0') { + if ((dev->esc_parms[0] == 0) || (dev->esc_parms[0] == '0')) { dev->print_quality = QUALITY_DRAFT; dev->font_style |= STYLE_CONDENSED; } - if (dev->esc_parms[0] == 1 || dev->esc_parms[0] == '1') { + if ((dev->esc_parms[0] == 1) || (dev->esc_parms[0] == '1')) { dev->print_quality = QUALITY_LQ; dev->font_style &= ~STYLE_CONDENSED; } @@ -1884,17 +1884,6 @@ write_data(uint8_t val, void *priv) dev->data = val; } -static void -autofeed(uint8_t val, void *priv) -{ - escp_t *dev = (escp_t *) priv; - - if (dev == NULL) - return; - - dev->autofeed = ((val & 0x02) > 0); -} - static void strobe(uint8_t old, uint8_t val, void *priv) { @@ -2147,7 +2136,6 @@ const lpt_device_t lpt_prt_escp_device = { .close = escp_close, .write_data = write_data, .write_ctrl = write_ctrl, - .autofeed = autofeed, .strobe = strobe, .read_status = read_status, .read_ctrl = read_ctrl, diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c index c7183ec3f..c07ad475a 100644 --- a/src/printer/prt_ps.c +++ b/src/printer/prt_ps.c @@ -322,17 +322,6 @@ process_data(ps_t *dev) dev->buffer[dev->buffer_pos] = 0; } -static void -ps_autofeed(uint8_t val, void *priv) -{ - ps_t *dev = (ps_t *) priv; - - if (dev == NULL) - return; - - dev->autofeed = val & 0x02 ? true : false; -} - static void ps_strobe(uint8_t old, uint8_t val, void *priv) { @@ -533,7 +522,6 @@ const lpt_device_t lpt_prt_ps_device = { .close = ps_close, .write_data = ps_write_data, .write_ctrl = ps_write_ctrl, - .autofeed = ps_autofeed, .strobe = ps_strobe, .read_status = ps_read_status, .read_ctrl = NULL, @@ -551,7 +539,6 @@ const lpt_device_t lpt_prt_pcl_device = { .close = ps_close, .write_data = ps_write_data, .write_ctrl = ps_write_ctrl, - .autofeed = ps_autofeed, .strobe = ps_strobe, .read_status = ps_read_status, .read_ctrl = NULL, diff --git a/src/printer/prt_text.c b/src/printer/prt_text.c index a9808845f..eb951de08 100644 --- a/src/printer/prt_text.c +++ b/src/printer/prt_text.c @@ -369,18 +369,6 @@ write_data(uint8_t val, void *priv) dev->data = val; } -static void -autofeed(uint8_t val, void *priv) -{ - prnt_t *dev = (prnt_t *) priv; - - if (dev == NULL) - return; - - /* set autofeed value */ - dev->autofeed = val & 0x02 ? 1 : 0; -} - static void strobe(uint8_t old, uint8_t val, void *priv) { @@ -418,7 +406,7 @@ write_ctrl(uint8_t val, void *priv) return; /* set autofeed value */ - dev->autofeed = val & 0x02 ? 1 : 0; + dev->autofeed = (val & 0x02) ? 1 : 0; if (val & 0x08) { /* SELECT */ /* select printer */ @@ -562,7 +550,6 @@ const lpt_device_t lpt_prt_text_device = { .close = prnt_close, .write_data = write_data, .write_ctrl = write_ctrl, - .autofeed = autofeed, .strobe = strobe, .read_status = read_status, .read_ctrl = NULL, diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 4fc54d4a7..a65578eae 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2972,3 +2972,15 @@ msgstr "" msgid "OpenGL input stretch mode" msgstr "" + +msgid "Color scheme" +msgstr "" + +msgid "System" +msgstr "" + +msgid "Light" +msgstr "" + +msgid "Dark" +msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 21f55dfd6..ae265593c 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2972,3 +2972,12 @@ msgstr "Vstupní měřítko OpenGL" msgid "OpenGL input stretch mode" msgstr "režim roztažení vstupu OpenGL" + +msgid "Color scheme" +msgstr "Barevné schéma" + +msgid "Light" +msgstr "Světlo" + +msgid "Dark" +msgstr "Tmavá" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index c2e47f777..4385811c0 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -2972,3 +2972,12 @@ msgstr "Eingabeskala von OpenGL" msgid "OpenGL input stretch mode" msgstr "Eingabestreckungsmodus von OpenGL" + +msgid "Color scheme" +msgstr "Farbschema" + +msgid "Light" +msgstr "Licht" + +msgid "Dark" +msgstr "Dunkel" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index d15f98e76..b3d8835cf 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2972,3 +2972,12 @@ msgstr "Escala de entrada de OpenGL" msgid "OpenGL input stretch mode" msgstr "Modo de estiramiento de entrada de OpenGL" + +msgid "Color scheme" +msgstr "Esquema de colores" + +msgid "Light" +msgstr "Luz" + +msgid "Dark" +msgstr "Oscuro" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index ef9f90f48..475d94b7b 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL:n syöttöasteikko" msgid "OpenGL input stretch mode" msgstr "OpenGL:n syötteen venytystila" + +msgid "Color scheme" +msgstr "Värimaailma" + +msgid "Light" +msgstr "Valo" + +msgid "Dark" +msgstr "Tumma" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 983994783..3f28b4af8 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -2972,3 +2972,12 @@ msgstr "Échelle d'entrée d'OpenGL" msgid "OpenGL input stretch mode" msgstr "Mode d'étirement des données d'entrée d'OpenGL" + +msgid "Color scheme" +msgstr "Palette de couleurs" + +msgid "Light" +msgstr "Lumière" + +msgid "Dark" +msgstr "Sombre" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 9b901c03e..4996db404 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2972,3 +2972,12 @@ msgstr "Ulazna skala OpenGL-a" msgid "OpenGL input stretch mode" msgstr "Način rastezanja ulaza u OpenGL-u" + +msgid "Color scheme" +msgstr "Shema boja" + +msgid "Light" +msgstr "Svjetlo" + +msgid "Dark" +msgstr "Tamno" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 5fad20cb9..9ad2559ee 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -2972,3 +2972,12 @@ msgstr "Scala di input di OpenGL" msgid "OpenGL input stretch mode" msgstr "Modalità di allungamento dell'input di OpenGL" + +msgid "Color scheme" +msgstr "Combinazione di colori" + +msgid "Light" +msgstr "Luce" + +msgid "Dark" +msgstr "Scuro" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 49f1d7cf2..be01430f9 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2593,7 +2593,7 @@ msgid "Generic Text Printer" msgstr "汎用テキスト・プリンタ" msgid "Generic ESC/P 2 Dot-Matrix Printer" -msgstr "汎用ESC/Pドットマトリクスプリンタ" +msgstr "汎用ESC/P 2ドットマトリクスプリンタ" msgid "Generic PostScript Printer" msgstr "汎用ポストスクリプトプリンタ" @@ -2695,7 +2695,7 @@ msgid "Unable to find Dot-Matrix fonts" msgstr "ドットマトリクスフォントが見つかりません" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P 2 Dot-Matrix Printer." -msgstr "汎用ESC/Pドットマトリクスプリンタのエミュレーションには、roms/printer/fontsディレクトリ内のTrueTypeフォントが必要です。" +msgstr "汎用ESC/P 2ドットマトリクスプリンタのエミュレーションには、roms/printer/fontsディレクトリ内のTrueTypeフォントが必要です。" msgid "Inhibit multimedia keys" msgstr "マルチメディアキーを無効にする" @@ -2972,3 +2972,12 @@ msgstr "OpenGLの入力スケール" msgid "OpenGL input stretch mode" msgstr "OpenGLの入力ストレッチモード" + +msgid "Color scheme" +msgstr "配色" + +msgid "Light" +msgstr "光" + +msgid "Dark" +msgstr "暗闇" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 63c9d8a94..14da0ec8b 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL 입력 스케일" msgid "OpenGL input stretch mode" msgstr "OpenGL 입력 스트레치 모드" + +msgid "Color scheme" +msgstr "색상 구성" + +msgid "Light" +msgstr "빛" + +msgid "Dark" +msgstr "어둠" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index 0568aa565..8d9f97521 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -2972,3 +2972,12 @@ msgstr "Inngangsskala for OpenGL" msgid "OpenGL input stretch mode" msgstr "Inngangsstrekkmodus for OpenGL" + +msgid "Color scheme" +msgstr "Fargevalg" + +msgid "Light" +msgstr "Lys" + +msgid "Dark" +msgstr "Mørk" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 9183ece94..d28a72651 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -2972,3 +2972,12 @@ msgstr "Invoerschaal van OpenGL" msgid "OpenGL input stretch mode" msgstr "Input stretch-modus van OpenGL" + +msgid "Color scheme" +msgstr "Kleurenschema" + +msgid "Light" +msgstr "Licht" + +msgid "Dark" +msgstr "Donker" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 2baa525e4..2a0cde697 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2972,3 +2972,12 @@ msgstr "Skala wejściowa OpenGL" msgid "OpenGL input stretch mode" msgstr "Tryb rozciągania wejściowego OpenGL" + +msgid "Color scheme" +msgstr "Schemat kolorów" + +msgid "Light" +msgstr "Światło" + +msgid "Dark" +msgstr "Ciemny" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 6cee38ff5..63a17871b 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2972,3 +2972,12 @@ msgstr "Escala de entrada do OpenGL" msgid "OpenGL input stretch mode" msgstr "Modo de expansão de entrada do OpenGL" + +msgid "Color scheme" +msgstr "Esquema de cores" + +msgid "Light" +msgstr "Claro" + +msgid "Dark" +msgstr "Escuro" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 3e16ac722..4c7866f41 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -2972,3 +2972,12 @@ msgstr "Escala de entrada do OpenGL" msgid "OpenGL input stretch mode" msgstr "Modo de expansão de entrada do OpenGL" + +msgid "Color scheme" +msgstr "Esquema de cores" + +msgid "Light" +msgstr "Claro" + +msgid "Dark" +msgstr "Escuro" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index f26353b6a..904757d74 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2972,3 +2972,12 @@ msgstr "Масштаб ввода OpenGL" msgid "OpenGL input stretch mode" msgstr "Режим растяжения ввода OpenGL" + +msgid "Color scheme" +msgstr "Цветовая схема" + +msgid "Light" +msgstr "Светлая" + +msgid "Dark" +msgstr "Тёмная" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 5f079509f..3a5e3b863 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -2972,3 +2972,12 @@ msgstr "Vstupná stupnica OpenGL" msgid "OpenGL input stretch mode" msgstr "Režim rozťahovania vstupu OpenGL" + +msgid "Color scheme" +msgstr "Farebná schéma" + +msgid "Light" +msgstr "Svetlo" + +msgid "Dark" +msgstr "Tmavá" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 18437c5b2..c23024a33 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -2972,3 +2972,12 @@ msgstr "Vhodna lestvica OpenGL" msgid "OpenGL input stretch mode" msgstr "Način raztezanja vhoda OpenGL" + +msgid "Color scheme" +msgstr "Barvna shema" + +msgid "Light" +msgstr "Svetloba" + +msgid "Dark" +msgstr "Temno" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 180eecf64..58ead9405 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -2972,3 +2972,12 @@ msgstr "Inmatningsskala för OpenGL" msgid "OpenGL input stretch mode" msgstr "Inmatningssträckningsläge för OpenGL" + +msgid "Color scheme" +msgstr "Färgschema" + +msgid "Light" +msgstr "Ljus" + +msgid "Dark" +msgstr "Mörk" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 53b15d1c7..538cc7af6 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL'nin giriş ölçeği" msgid "OpenGL input stretch mode" msgstr "OpenGL'nin giriş germe modu" + +msgid "Color scheme" +msgstr "Renk şeması" + +msgid "Light" +msgstr "Işık" + +msgid "Dark" +msgstr "Karanlık" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 093f507b2..c079fc141 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -2972,3 +2972,12 @@ msgstr "Шкала введення OpenGL" msgid "OpenGL input stretch mode" msgstr "Режим розтягування вхідних даних OpenGL" + +msgid "Color scheme" +msgstr "Колірна гамма" + +msgid "Light" +msgstr "Світло" + +msgid "Dark" +msgstr "Темний" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 9d967145e..0190aee4c 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -2972,3 +2972,12 @@ msgstr "Độ phân giải đầu vào của OpenGL" msgid "OpenGL input stretch mode" msgstr "Chế độ kéo giãn đầu vào của OpenGL" + +msgid "Color scheme" +msgstr "Bảng màu" + +msgid "Light" +msgstr "Ánh sáng" + +msgid "Dark" +msgstr "Tối" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 4cfee3fff..a265bfdc1 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL的输入比例" msgid "OpenGL input stretch mode" msgstr "OpenGL的输入拉伸模式" + +msgid "Color scheme" +msgstr "配色方案" + +msgid "Light" +msgstr "光" + +msgid "Dark" +msgstr "黑暗" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 39bbe7f5b..21a984ebd 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL 的輸入比例" msgid "OpenGL input stretch mode" msgstr "OpenGL 的輸入拉伸模式" + +msgid "Color scheme" +msgstr "配色方案" + +msgid "Light" +msgstr "光" + +msgid "Dark" +msgstr "黑暗" diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 6a2ba1a3a..664b495bd 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -515,10 +515,15 @@ main_thread_fn() static std::thread *main_thread; +#ifdef Q_OS_WINDOWS +WindowsDarkModeFilter* vmm_dark_mode_filter = nullptr; +#endif + int main(int argc, char *argv[]) { #ifdef Q_OS_WINDOWS + bool wasDarkTheme = false; /* Check if Windows supports UTF-8 */ if (GetACP() == CP_UTF8) acp_utf8 = 1; @@ -554,6 +559,7 @@ main(int argc, char *argv[]) f.open(QFile::ReadOnly | QFile::Text); QTextStream ts(&f); qApp->setStyleSheet(ts.readAll()); + wasDarkTheme = true; } QPalette palette(qApp->palette()); palette.setColor(QPalette::Link, Qt::white); @@ -585,6 +591,16 @@ main(int argc, char *argv[]) return 0; } +#ifdef Q_OS_WINDOWS + if (util::isWindowsLightTheme() && wasDarkTheme) { + qApp->setStyleSheet(""); + QPalette palette(qApp->palette()); + palette.setColor(QPalette::Link, Qt::blue); + palette.setColor(QPalette::LinkVisited, Qt::magenta); + qApp->setPalette(palette); + } +#endif + if (!start_vmm) #ifdef Q_OS_MACOS qt_set_sequence_auto_mnemonic(false); @@ -645,6 +661,8 @@ main(int argc, char *argv[]) const auto vmm_main_window = new VMManagerMainWindow(); #ifdef Q_OS_WINDOWS darkModeFilter.get()->setWindow(vmm_main_window); + // HACK + vmm_dark_mode_filter = darkModeFilter.get(); #endif vmm_main_window->show(); }); @@ -831,6 +849,7 @@ main(int argc, char *argv[]) }); QObject::connect(main_window, &MainWindow::vmmRunningStateChanged, &manager_socket, &VMManagerClientSocket::clientRunningStateChanged); QObject::connect(main_window, &MainWindow::vmmConfigurationChanged, &manager_socket, &VMManagerClientSocket::configurationChanged); + QObject::connect(main_window, &MainWindow::vmmGlobalConfigurationChanged, &manager_socket, &VMManagerClientSocket::globalConfigurationChanged); main_window->installEventFilter(&manager_socket); manager_socket.sendWinIdMessage(main_window->winId()); @@ -864,6 +883,10 @@ main(int argc, char *argv[]) /* Initialize the rendering window, or fullscreen. */ QTimer::singleShot(0, &app, [] { +#ifdef Q_OS_WINDOWS + extern bool NewDarkMode; + NewDarkMode = util::isWindowsLightTheme(); +#endif pc_reset_hard_init(); /* Set the PAUSE mode depending on the renderer. */ diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 789ce0894..9ae180d1f 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -2140,6 +2140,9 @@ MainWindow::on_actionHiDPI_scaling_triggered() void MainWindow::on_actionHide_status_bar_triggered() { + auto w = ui->stackedWidget->width() * (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.); + auto h = ui->stackedWidget->height() * (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.); + hide_status_bar ^= 1; ui->actionHide_status_bar->setChecked(hide_status_bar); statusBar()->setVisible(!hide_status_bar); @@ -2151,7 +2154,7 @@ MainWindow::on_actionHide_status_bar_triggered() } else { int vid_resize_orig = vid_resize; vid_resize = 0; - emit resizeContents(monitors[0].mon_scrnsz_x, monitors[0].mon_scrnsz_y); + emit resizeContents(vid_resize_orig ? w : monitors[0].mon_scrnsz_x, vid_resize_orig ? h : monitors[0].mon_scrnsz_y); vid_resize = vid_resize_orig; if (vid_resize == 1) setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); @@ -2161,6 +2164,9 @@ MainWindow::on_actionHide_status_bar_triggered() void MainWindow::on_actionHide_tool_bar_triggered() { + auto w = ui->stackedWidget->width() * (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.); + auto h = ui->stackedWidget->height() * (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.); + hide_tool_bar ^= 1; ui->actionHide_tool_bar->setChecked(hide_tool_bar); ui->toolBar->setVisible(!hide_tool_bar); @@ -2169,7 +2175,7 @@ MainWindow::on_actionHide_tool_bar_triggered() } else { int vid_resize_orig = vid_resize; vid_resize = 0; - emit resizeContents(monitors[0].mon_scrnsz_x, monitors[0].mon_scrnsz_y); + emit resizeContents(vid_resize_orig ? w : monitors[0].mon_scrnsz_x, vid_resize_orig ? h : monitors[0].mon_scrnsz_y); vid_resize = vid_resize_orig; if (vid_resize == 1) setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); @@ -2244,7 +2250,9 @@ void MainWindow::on_actionPreferences_triggered() { ProgSettings progsettings(this); - progsettings.exec(); + if (progsettings.exec() == QDialog::Accepted) { + emit vmmGlobalConfigurationChanged(); + } } void diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 22dec71f8..6a255ac85 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -68,6 +68,7 @@ signals: void vmmRunningStateChanged(VMManagerProtocol::RunningState state); void vmmConfigurationChanged(); + void vmmGlobalConfigurationChanged(); public slots: void showSettings(); void hardReset(); diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index 9c719cba6..78cb2df98 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -942,7 +942,7 @@ true - &Square pixels (keep ratio) + &Square pixels (Keep ratio) diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index c2fa75dff..7efeba377 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -96,8 +96,13 @@ ProgSettings::ProgSettings(QWidget *parent) ui->checkBoxConfirmSave->setChecked(confirm_save); ui->checkBoxConfirmHardReset->setChecked(confirm_reset); + ui->radioButtonSystem->setChecked(color_scheme == 0); + ui->radioButtonLight->setChecked(color_scheme == 1); + ui->radioButtonDark->setChecked(color_scheme == 2); + #ifndef Q_OS_WINDOWS ui->checkBoxMultimediaKeys->setHidden(true); + ui->groupBox->setHidden(true); #endif } @@ -111,6 +116,13 @@ ProgSettings::accept() confirm_reset = ui->checkBoxConfirmHardReset->isChecked() ? 1 : 0; inhibit_multimedia_keys = ui->checkBoxMultimediaKeys->isChecked() ? 1 : 0; + color_scheme = (ui->radioButtonSystem->isChecked()) ? 0 : (ui->radioButtonLight->isChecked() ? 1 : 2); + +#ifdef Q_OS_WINDOWS + extern void selectDarkMode(); + selectDarkMode(); +#endif + loadTranslators(QCoreApplication::instance()); reloadStrings(); update_mouse_msg(); @@ -126,6 +138,7 @@ ProgSettings::accept() connect(main_window, &MainWindow::updateStatusBarTip, main_window->status.get(), &MachineStatus::updateTip); connect(main_window, &MainWindow::statusBarMessage, main_window->status.get(), &MachineStatus::message, Qt::QueuedConnection); mouse_sensitivity = mouseSensitivity; + config_save_global(); QDialog::accept(); } diff --git a/src/qt/qt_progsettings.ui b/src/qt/qt_progsettings.ui index abaee5019..ca33726b1 100644 --- a/src/qt/qt_progsettings.ui +++ b/src/qt/qt_progsettings.ui @@ -7,7 +7,7 @@ 0 0 458 - 391 + 508 @@ -27,7 +27,7 @@ - QLayout::SetFixedSize + QLayout::SizeConstraint::SetFixedSize @@ -36,6 +36,40 @@ + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + Inhibit multimedia keys + + + + + + + Mouse sensitivity: + + + + + + + Default + + + @@ -48,30 +82,10 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - + + - Default - - - - - - - Mouse sensitivity: + Ask for confirmation before saving settings @@ -93,27 +107,7 @@ 100 - Qt::Horizontal - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Default + Qt::Orientation::Horizontal @@ -127,19 +121,25 @@ - - + + - Inhibit multimedia keys + Default - - - - Ask for confirmation before saving settings + + + + Qt::Orientation::Horizontal - + + + 40 + 20 + + + @@ -148,6 +148,16 @@ + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + @@ -155,14 +165,34 @@ - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + Color scheme + + + + + System + + + + + + + Light + + + + + + + Dark + + + + diff --git a/src/qt/qt_specifydimensions.cpp b/src/qt/qt_specifydimensions.cpp index 4999c6a83..0b88e9b57 100644 --- a/src/qt/qt_specifydimensions.cpp +++ b/src/qt/qt_specifydimensions.cpp @@ -118,5 +118,7 @@ SpecifyDimensions::on_SpecifyDimensions_accepted() + main_window->menuBar()->height() + (main_window->statusBar()->height() * !hide_status_bar) + (main_window->ui->toolBar->height() * !hide_tool_bar)); + window_w = ui->spinBoxWidth->value(); + window_h = ui->spinBoxHeight->value(); } } diff --git a/src/qt/qt_util.cpp b/src/qt/qt_util.cpp index 201b61b3f..a95226247 100644 --- a/src/qt/qt_util.cpp +++ b/src/qt/qt_util.cpp @@ -66,6 +66,10 @@ screenOfWidget(QWidget *widget) bool isWindowsLightTheme(void) { + if (color_scheme != 0) { + return (color_scheme == 1); + } + // based on https://stackoverflow.com/questions/51334674/how-to-detect-windows-10-light-dark-mode-in-win32-application // The value is expected to be a REG_DWORD, which is a signed 32-bit little-endian diff --git a/src/qt/qt_vmmanager_clientsocket.cpp b/src/qt/qt_vmmanager_clientsocket.cpp index ffe4fb5f7..7f1587cb4 100644 --- a/src/qt/qt_vmmanager_clientsocket.cpp +++ b/src/qt/qt_vmmanager_clientsocket.cpp @@ -23,6 +23,7 @@ extern "C" { #include "86box/plat.h" +#include "86box/config.h" } VMManagerClientSocket::VMManagerClientSocket(QObject* obj) : server_connected(false) @@ -183,6 +184,15 @@ VMManagerClientSocket::jsonReceived(const QJsonObject &json) case VMManagerProtocol::ManagerMessage::RequestStatus: qDebug("Status request command received from manager"); break; + case VMManagerProtocol::ManagerMessage::GlobalConfigurationChanged: + { + config_load_global(); +#ifdef Q_OS_WINDOWS + void selectDarkMode(); + selectDarkMode(); +#endif + break; + } default: qDebug("Unknown client message type received:"); qDebug() << json; @@ -248,6 +258,12 @@ VMManagerClientSocket::clientRunningStateChanged(VMManagerProtocol::RunningState sendMessageWithObject(VMManagerProtocol::ClientMessage::RunningStateChanged, extra_object); } +void +VMManagerClientSocket::globalConfigurationChanged() const +{ + sendMessage(VMManagerProtocol::ClientMessage::GlobalConfigurationChanged); +} + void VMManagerClientSocket::configurationChanged() const { diff --git a/src/qt/qt_vmmanager_clientsocket.hpp b/src/qt/qt_vmmanager_clientsocket.hpp index 50657a27b..1848749a3 100644 --- a/src/qt/qt_vmmanager_clientsocket.hpp +++ b/src/qt/qt_vmmanager_clientsocket.hpp @@ -45,6 +45,7 @@ signals: public slots: void clientRunningStateChanged(VMManagerProtocol::RunningState state) const; void configurationChanged() const; + void globalConfigurationChanged() const; private: QString server_name; diff --git a/src/qt/qt_vmmanager_details.cpp b/src/qt/qt_vmmanager_details.cpp index 65608cf0a..873da9083 100644 --- a/src/qt/qt_vmmanager_details.cpp +++ b/src/qt/qt_vmmanager_details.cpp @@ -248,52 +248,52 @@ VMManagerDetails::updateConfig(VMManagerSystem *passed_sysconfig) { // System systemSection->clear(); - systemSection->addSection("Machine", passed_sysconfig->getDisplayValue(Display::Name::Machine)); - systemSection->addSection("CPU", passed_sysconfig->getDisplayValue(Display::Name::CPU)); - systemSection->addSection("Memory", passed_sysconfig->getDisplayValue(Display::Name::Memory)); + systemSection->addSection("Machine", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Machine)); + systemSection->addSection("CPU", passed_sysconfig->getDisplayValue(VMManager::Display::Name::CPU)); + systemSection->addSection("Memory", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Memory)); // Video videoSection->clear(); - videoSection->addSection("Video", passed_sysconfig->getDisplayValue(Display::Name::Video)); - if(!passed_sysconfig->getDisplayValue(Display::Name::Voodoo).isEmpty()) { - videoSection->addSection("Voodoo", passed_sysconfig->getDisplayValue(Display::Name::Voodoo)); + videoSection->addSection("Video", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Video)); + if(!passed_sysconfig->getDisplayValue(VMManager::Display::Name::Voodoo).isEmpty()) { + videoSection->addSection("Voodoo", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Voodoo)); } // Disks storageSection->clear(); - storageSection->addSection("Disks", passed_sysconfig->getDisplayValue(Display::Name::Disks)); - storageSection->addSection("Floppy", passed_sysconfig->getDisplayValue(Display::Name::Floppy)); - storageSection->addSection("CD-ROM", passed_sysconfig->getDisplayValue(Display::Name::CD)); - storageSection->addSection("Removable disks", passed_sysconfig->getDisplayValue(Display::Name::RDisk)); - storageSection->addSection("MO", passed_sysconfig->getDisplayValue(Display::Name::MO)); - storageSection->addSection("SCSI", passed_sysconfig->getDisplayValue(Display::Name::SCSIController)); - storageSection->addSection("Controllers", passed_sysconfig->getDisplayValue(Display::Name::StorageController)); + storageSection->addSection("Disks", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Disks)); + storageSection->addSection("Floppy", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Floppy)); + storageSection->addSection("CD-ROM", passed_sysconfig->getDisplayValue(VMManager::Display::Name::CD)); + storageSection->addSection("Removable disks", passed_sysconfig->getDisplayValue(VMManager::Display::Name::RDisk)); + storageSection->addSection("MO", passed_sysconfig->getDisplayValue(VMManager::Display::Name::MO)); + storageSection->addSection("SCSI", passed_sysconfig->getDisplayValue(VMManager::Display::Name::SCSIController)); + storageSection->addSection("Controllers", passed_sysconfig->getDisplayValue(VMManager::Display::Name::StorageController)); // Audio audioSection->clear(); - audioSection->addSection("Audio", passed_sysconfig->getDisplayValue(Display::Name::Audio)); - audioSection->addSection("MIDI Out", passed_sysconfig->getDisplayValue(Display::Name::MidiOut)); + audioSection->addSection("Audio", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Audio)); + audioSection->addSection("MIDI Out", passed_sysconfig->getDisplayValue(VMManager::Display::Name::MidiOut)); // Network networkSection->clear(); - networkSection->addSection("NIC", passed_sysconfig->getDisplayValue(Display::Name::NIC)); + networkSection->addSection("NIC", passed_sysconfig->getDisplayValue(VMManager::Display::Name::NIC)); // Input inputSection->clear(); - inputSection->addSection("Keyboard", passed_sysconfig->getDisplayValue(Display::Name::Keyboard)); - inputSection->addSection("Mouse", passed_sysconfig->getDisplayValue(Display::Name::Mouse)); - inputSection->addSection("Joystick", passed_sysconfig->getDisplayValue(Display::Name::Joystick)); + inputSection->addSection("Keyboard", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Keyboard)); + inputSection->addSection("Mouse", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Mouse)); + inputSection->addSection("Joystick", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Joystick)); // Ports portsSection->clear(); - portsSection->addSection("Serial ports", passed_sysconfig->getDisplayValue(Display::Name::Serial)); - portsSection->addSection("Parallel ports", passed_sysconfig->getDisplayValue(Display::Name::Parallel)); + portsSection->addSection("Serial ports", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Serial)); + portsSection->addSection("Parallel ports", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Parallel)); // Other devices otherSection->clear(); - otherSection->addSection("ISA RTC", passed_sysconfig->getDisplayValue(Display::Name::IsaRtc)); - otherSection->addSection("ISA RAM", passed_sysconfig->getDisplayValue(Display::Name::IsaMem)); - otherSection->addSection("ISA ROM", passed_sysconfig->getDisplayValue(Display::Name::IsaRom)); + otherSection->addSection("ISA RTC", passed_sysconfig->getDisplayValue(VMManager::Display::Name::IsaRtc)); + otherSection->addSection("ISA RAM", passed_sysconfig->getDisplayValue(VMManager::Display::Name::IsaMem)); + otherSection->addSection("ISA ROM", passed_sysconfig->getDisplayValue(VMManager::Display::Name::IsaRom)); systemSection->setSections(); videoSection->setSections(); diff --git a/src/qt/qt_vmmanager_detailsection.cpp b/src/qt/qt_vmmanager_detailsection.cpp index ab9a4b5ff..afb71a5f0 100644 --- a/src/qt/qt_vmmanager_detailsection.cpp +++ b/src/qt/qt_vmmanager_detailsection.cpp @@ -145,7 +145,7 @@ VMManagerDetailSection::setSectionName(const QString &name) } void -VMManagerDetailSection::addSection(const QString &name, const QString &value, Display::Name displayField) +VMManagerDetailSection::addSection(const QString &name, const QString &value, VMManager::Display::Name displayField) { const auto new_section = DetailSection { name, value}; sections.push_back(new_section); diff --git a/src/qt/qt_vmmanager_main.cpp b/src/qt/qt_vmmanager_main.cpp index cfded658e..e53e2e407 100644 --- a/src/qt/qt_vmmanager_main.cpp +++ b/src/qt/qt_vmmanager_main.cpp @@ -31,10 +31,13 @@ #include #include "qt_vmmanager_main.hpp" +#include "qt_vmmanager_mainwindow.hpp" #include "ui_qt_vmmanager_main.h" #include "qt_vmmanager_model.hpp" #include "qt_vmmanager_addmachine.hpp" +extern VMManagerMainWindow* vmm_main_window; + // https://stackoverflow.com/a/36460740 bool copyPath(QString sourceDir, QString destinationDir, bool overWriteDirectory) { @@ -348,6 +351,10 @@ illegal_chars: } }); + connect(vm_model, &VMManagerModel::globalConfigurationChanged, this, [this] () { + vmm_main_window->updateSettings(); + }); + // Initial default details view vm_details = new VMManagerDetails(ui->detailsArea); ui->detailsArea->layout()->addWidget(vm_details); @@ -400,6 +407,12 @@ VMManagerMain::~VMManagerMain() { delete vm_model; } +void +VMManagerMain::updateGlobalSettings() +{ + vmm_main_window->updateSettings(); +} + void VMManagerMain::currentSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous) @@ -768,6 +781,10 @@ VMManagerMain::onPreferencesUpdated() if (oldRegexSearch != regexSearch) { ui->searchBar->clear(); } + + if (vm_model) { + vm_model->sendGlobalConfigurationChanged(); + } } void diff --git a/src/qt/qt_vmmanager_main.hpp b/src/qt/qt_vmmanager_main.hpp index be43da705..070f30398 100644 --- a/src/qt/qt_vmmanager_main.hpp +++ b/src/qt/qt_vmmanager_main.hpp @@ -70,6 +70,7 @@ public slots: void shutdownForceButtonPressed() const; void searchSystems(const QString &text) const; void newMachineWizard(); + void updateGlobalSettings(); void deleteSystem(VMManagerSystem *sysconfig); void addNewSystem(const QString &name, const QString &dir, const QString &displayName = QString(), const QString &configFile = {}); #if __GNUC__ >= 11 diff --git a/src/qt/qt_vmmanager_mainwindow.cpp b/src/qt/qt_vmmanager_mainwindow.cpp index 6ee8979cd..55e980ec9 100644 --- a/src/qt/qt_vmmanager_mainwindow.cpp +++ b/src/qt/qt_vmmanager_mainwindow.cpp @@ -18,6 +18,7 @@ #include "qt_vmmanager_mainwindow.hpp" #include "qt_vmmanager_main.hpp" #include "qt_vmmanager_preferences.hpp" +#include "qt_vmmanager_windarkmodefilter.hpp" #include "ui_qt_vmmanager_mainwindow.h" #if EMU_BUILD_NUM != 0 # include "qt_updatecheckdialog.hpp" @@ -30,7 +31,16 @@ #include #include #include -#include +#include + +extern "C" +{ +extern void config_load_global(); +extern void config_save_global(); +} + +VMManagerMainWindow* vmm_main_window = nullptr; +extern WindowsDarkModeFilter* vmm_dark_mode_filter; VMManagerMainWindow:: VMManagerMainWindow(QWidget *parent) @@ -41,6 +51,8 @@ VMManagerMainWindow(QWidget *parent) { ui->setupUi(this); + vmm_main_window = this; + // Connect signals from the VMManagerMain widget connect(vmm, &VMManagerMain::selectionChanged, this, &VMManagerMainWindow::vmmSelectionChanged); @@ -118,6 +130,7 @@ VMManagerMainWindow(QWidget *parent) connect(this, &VMManagerMainWindow::languageUpdated, vmm, &VMManagerMain::onLanguageUpdated); #ifdef Q_OS_WINDOWS connect(this, &VMManagerMainWindow::darkModeUpdated, vmm, &VMManagerMain::onDarkModeUpdated); + connect(this, &VMManagerMainWindow::preferencesUpdated, [this] () { vmm_dark_mode_filter->reselectDarkMode(); }); #endif { @@ -187,6 +200,14 @@ VMManagerMainWindow::preferencesTriggered() } } +void +VMManagerMainWindow::updateSettings() +{ + config_load_global(); + emit preferencesUpdated(); + updateLanguage(); +} + void VMManagerMainWindow::saveSettings() const { diff --git a/src/qt/qt_vmmanager_mainwindow.hpp b/src/qt/qt_vmmanager_mainwindow.hpp index bde74765c..be02c3095 100644 --- a/src/qt/qt_vmmanager_mainwindow.hpp +++ b/src/qt/qt_vmmanager_mainwindow.hpp @@ -34,6 +34,7 @@ class VMManagerMainWindow final : public QMainWindow public: explicit VMManagerMainWindow(QWidget *parent = nullptr); ~VMManagerMainWindow() override; + void updateSettings(); signals: void preferencesUpdated(); void languageUpdated(); diff --git a/src/qt/qt_vmmanager_model.cpp b/src/qt/qt_vmmanager_model.cpp index 40baac90a..6e74da82c 100644 --- a/src/qt/qt_vmmanager_model.cpp +++ b/src/qt/qt_vmmanager_model.cpp @@ -23,6 +23,7 @@ VMManagerModel::VMManagerModel() { for ( const auto& each_config : machines_vec) { machines.append(each_config); connect(each_config, &VMManagerSystem::itemDataChanged, this, &VMManagerModel::modelDataChanged); + connect(each_config, &VMManagerSystem::globalConfigurationChanged, this, &VMManagerModel::globalConfigurationChanged); } } @@ -138,6 +139,7 @@ VMManagerModel::addConfigToModel(VMManagerSystem *system_config) beginInsertRows(QModelIndex(), this->rowCount(QModelIndex()), this->rowCount(QModelIndex())); machines.append(system_config); connect(system_config, &VMManagerSystem::itemDataChanged, this, &VMManagerModel::modelDataChanged); + connect(system_config, &VMManagerSystem::globalConfigurationChanged, this, &VMManagerModel::globalConfigurationChanged); endInsertRows(); } @@ -177,6 +179,16 @@ VMManagerModel::getProcessStats() return stats; } +void +VMManagerModel::sendGlobalConfigurationChanged() +{ + for (auto& system: machines) { + if (system->getProcessStatus() != VMManagerSystem::ProcessStatus::Stopped) { + system->sendGlobalConfigurationChanged(); + } + } +} + int VMManagerModel::getActiveMachineCount() { diff --git a/src/qt/qt_vmmanager_model.hpp b/src/qt/qt_vmmanager_model.hpp index 159dad9f2..af72f3bc9 100644 --- a/src/qt/qt_vmmanager_model.hpp +++ b/src/qt/qt_vmmanager_model.hpp @@ -60,8 +60,10 @@ public: QMap getProcessStats(); int getActiveMachineCount(); void refreshConfigs(); + void sendGlobalConfigurationChanged(); signals: void systemDataChanged(); + void globalConfigurationChanged(); private: QVector machines; diff --git a/src/qt/qt_vmmanager_preferences.cpp b/src/qt/qt_vmmanager_preferences.cpp index 49b7b4a1f..b709b0b13 100644 --- a/src/qt/qt_vmmanager_preferences.cpp +++ b/src/qt/qt_vmmanager_preferences.cpp @@ -24,6 +24,11 @@ #include "qt_vmmanager_config.hpp" #include "ui_qt_vmmanager_preferences.h" +#ifdef Q_OS_WINDOWS +#include "qt_vmmanager_windarkmodefilter.hpp" +extern WindowsDarkModeFilter* vmm_dark_mode_filter; +#endif + extern "C" { #include <86box/86box.h> #include <86box/config.h> @@ -66,7 +71,13 @@ VMManagerPreferences(QWidget *parent) : ui(new Ui::VMManagerPreferences) const auto useRegexSearch = config->getStringValue("regex_search").toInt(); ui->regexSearchCheckBox->setChecked(useRegexSearch); + ui->radioButtonSystem->setChecked(color_scheme == 0); + ui->radioButtonLight->setChecked(color_scheme == 1); + ui->radioButtonDark->setChecked(color_scheme == 2); +#ifndef Q_OS_WINDOWS + ui->groupBoxColorScheme->setHidden(true); +#endif } VMManagerPreferences::~ @@ -95,6 +106,7 @@ VMManagerPreferences::accept() strncpy(vmm_path_cfg, QDir::cleanPath(ui->systemDirectory->text()).toUtf8().constData(), sizeof(vmm_path_cfg) - 1); lang_id = ui->comboBoxLanguage->currentData().toInt(); + color_scheme = (ui->radioButtonSystem->isChecked()) ? 0 : (ui->radioButtonLight->isChecked() ? 1 : 2); config_save_global(); #if EMU_BUILD_NUM != 0 diff --git a/src/qt/qt_vmmanager_preferences.ui b/src/qt/qt_vmmanager_preferences.ui index 37caaae56..ab96109e6 100644 --- a/src/qt/qt_vmmanager_preferences.ui +++ b/src/qt/qt_vmmanager_preferences.ui @@ -7,13 +7,16 @@ 0 0 400 - 300 + 475 Preferences + + QLayout::SizeConstraint::SetFixedSize + @@ -103,10 +106,40 @@ + + + + Color scheme + + + + + + System + + + + + + + Light + + + + + + + Dark + + + + + + - Qt::Vertical + Qt::Orientation::Vertical @@ -119,10 +152,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok diff --git a/src/qt/qt_vmmanager_protocol.cpp b/src/qt/qt_vmmanager_protocol.cpp index bc1805411..d113ba203 100644 --- a/src/qt/qt_vmmanager_protocol.cpp +++ b/src/qt/qt_vmmanager_protocol.cpp @@ -95,6 +95,8 @@ VMManagerProtocol::getClientMessageType(const QJsonObject &json_document) return VMManagerProtocol::ClientMessage::ConfigurationChanged; } else if (message_type == "WinIdMessage") { return VMManagerProtocol::ClientMessage::WinIdMessage; + } else if (message_type == "GlobalConfigurationChanged") { + return VMManagerProtocol::ClientMessage::GlobalConfigurationChanged; } return VMManagerProtocol::ClientMessage::UnknownMessage; } @@ -119,6 +121,8 @@ VMManagerProtocol::getManagerMessageType(const QJsonObject &json_document) return VMManagerProtocol::ManagerMessage::RequestShutdown; } if (message_type == "ForceShutdown") { return VMManagerProtocol::ManagerMessage::ForceShutdown; + } if (message_type == "GlobalConfigurationChanged") { + return VMManagerProtocol::ManagerMessage::GlobalConfigurationChanged; } return VMManagerProtocol::ManagerMessage::UnknownMessage; } diff --git a/src/qt/qt_vmmanager_protocol.hpp b/src/qt/qt_vmmanager_protocol.hpp index 90f7e4eeb..99c88d808 100644 --- a/src/qt/qt_vmmanager_protocol.hpp +++ b/src/qt/qt_vmmanager_protocol.hpp @@ -43,6 +43,7 @@ public: ResetVM, RequestShutdown, ForceShutdown, + GlobalConfigurationChanged, UnknownMessage, }; @@ -56,6 +57,7 @@ public: RunningStateChanged, ConfigurationChanged, WinIdMessage, + GlobalConfigurationChanged, UnknownMessage, }; Q_ENUM(ClientMessage); diff --git a/src/qt/qt_vmmanager_serversocket.cpp b/src/qt/qt_vmmanager_serversocket.cpp index 1364ff794..edd1e6c02 100644 --- a/src/qt/qt_vmmanager_serversocket.cpp +++ b/src/qt/qt_vmmanager_serversocket.cpp @@ -189,6 +189,10 @@ VMManagerServerSocket::jsonReceived(const QJsonObject &json) qDebug("Configuration change received from client"); emit configurationChanged(); break; + case VMManagerProtocol::ClientMessage::GlobalConfigurationChanged: + qDebug("Global configuration change received from client"); + emit globalConfigurationChanged(); + break; default: qDebug("Unknown client message type received:"); qDebug() << json; diff --git a/src/qt/qt_vmmanager_serversocket.hpp b/src/qt/qt_vmmanager_serversocket.hpp index 30ad02b2c..ff1950771 100644 --- a/src/qt/qt_vmmanager_serversocket.hpp +++ b/src/qt/qt_vmmanager_serversocket.hpp @@ -76,6 +76,7 @@ signals: void windowStatusChanged(int status); void runningStatusChanged(VMManagerProtocol::RunningState state); void configurationChanged(); + void globalConfigurationChanged(); void winIdReceived(WId id); diff --git a/src/qt/qt_vmmanager_system.cpp b/src/qt/qt_vmmanager_system.cpp index 00b699163..8079f1ba0 100644 --- a/src/qt/qt_vmmanager_system.cpp +++ b/src/qt/qt_vmmanager_system.cpp @@ -557,7 +557,7 @@ VMManagerSystem::setupVars() { } } } - display_table[Display::Name::Machine] = machine_name; + display_table[VMManager::Display::Name::Machine] = machine_name; // CPU: Combine name with speed and FPU QString cpu_name = "Unknown"; @@ -592,34 +592,34 @@ VMManagerSystem::setupVars() { // int speed_display = machine_config["cpu_speed"].toInt() / 1000000; // cpu_name.append(QString::number(speed_display).prepend(" / ")); // cpu_name.append(QCoreApplication::translate("", "MHz").prepend(' ')); - display_table[Display::Name::CPU] = cpu_name; + display_table[VMManager::Display::Name::CPU] = cpu_name; // Memory int divisor = (ram_granularity < 1024) ? 1 : 1024; QString display_unit = (divisor == 1) ? "KB" : "MB"; auto mem_display = QString::number(machine_config["mem_size"].toInt() / divisor); mem_display.append(QCoreApplication::translate("", display_unit.toUtf8().constData()).prepend(' ')); - display_table[Display::Name::Memory] = mem_display; + display_table[VMManager::Display::Name::Memory] = mem_display; // Video card int video_int = video_get_video_from_internal_name(video_config["gfxcard"].toUtf8().data()); const device_t* video_dev = video_card_getdevice(video_int); - display_table[Display::Name::Video] = DeviceConfig::DeviceName(video_dev, video_get_internal_name(video_int), 1); + display_table[VMManager::Display::Name::Video] = DeviceConfig::DeviceName(video_dev, video_get_internal_name(video_int), 1); // Secondary video if (video_config.contains("gfxcard_2")) { int video2_int = video_get_video_from_internal_name(video_config["gfxcard_2"].toUtf8().data()); const device_t* video2_dev = video_card_getdevice(video2_int); - display_table[Display::Name::Video].append(DeviceConfig::DeviceName(video2_dev, video_get_internal_name(video2_int), 1).prepend(VMManagerDetailSection::sectionSeparator)); + display_table[VMManager::Display::Name::Video].append(DeviceConfig::DeviceName(video2_dev, video_get_internal_name(video2_int), 1).prepend(VMManagerDetailSection::sectionSeparator)); } // Add-on video that's not Voodoo if (video_config.contains("8514a") && (video_config["8514a"].toInt() != 0)) - display_table[Display::Name::Video].append(tr("IBM 8514/A Graphics").prepend(VMManagerDetailSection::sectionSeparator)); + display_table[VMManager::Display::Name::Video].append(tr("IBM 8514/A Graphics").prepend(VMManagerDetailSection::sectionSeparator)); if (video_config.contains("xga") && (video_config["xga"].toInt() != 0)) - display_table[Display::Name::Video].append(tr("XGA Graphics").prepend(VMManagerDetailSection::sectionSeparator)); + display_table[VMManager::Display::Name::Video].append(tr("XGA Graphics").prepend(VMManagerDetailSection::sectionSeparator)); if (video_config.contains("da2") && (video_config["da2"].toInt() != 0)) - display_table[Display::Name::Video].append(tr("IBM PS/55 Display Adapter Graphics").prepend(VMManagerDetailSection::sectionSeparator)); + display_table[VMManager::Display::Name::Video].append(tr("IBM PS/55 Display Adapter Graphics").prepend(VMManagerDetailSection::sectionSeparator)); // Voodoo QString voodoo_name = ""; @@ -641,7 +641,7 @@ VMManagerSystem::setupVars() { break; } } - display_table[Display::Name::Voodoo] = voodoo_name; + display_table[VMManager::Display::Name::Voodoo] = voodoo_name; // Drives // First the number of disks @@ -666,7 +666,7 @@ VMManagerSystem::setupVars() { if (disks.count()) { disks_display.append(" / ").append(bus_types.keys().join(", ").toUpper()); } -// display_table[Display::Name::Disks] = disks_display; +// display_table[VMManager::Display::Name::Disks] = disks_display; // Drives QString new_disk_display; @@ -699,7 +699,7 @@ VMManagerSystem::setupVars() { if(new_disk_display.isEmpty()) { new_disk_display = tr("No disks"); } - display_table[Display::Name::Disks] = new_disk_display; + display_table[VMManager::Display::Name::Disks] = new_disk_display; // Floppy & CD-ROM QStringList floppyDevices; @@ -748,8 +748,8 @@ VMManagerSystem::setupVars() { } } - display_table[Display::Name::Floppy] = floppyDevices.join(VMManagerDetailSection::sectionSeparator); - display_table[Display::Name::CD] = cdromDevices.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::Floppy] = floppyDevices.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::CD] = cdromDevices.join(VMManagerDetailSection::sectionSeparator); // Removable disks & MO QStringList rdiskDevices; @@ -786,8 +786,8 @@ VMManagerSystem::setupVars() { } } - display_table[Display::Name::RDisk] = rdiskDevices.join(VMManagerDetailSection::sectionSeparator); - display_table[Display::Name::MO] = moDevices.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::RDisk] = rdiskDevices.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::MO] = moDevices.join(VMManagerDetailSection::sectionSeparator); // SCSI controllers @@ -805,7 +805,7 @@ VMManagerSystem::setupVars() { } } } - display_table[Display::Name::SCSIController] = scsiControllers.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::SCSIController] = scsiControllers.join(VMManagerDetailSection::sectionSeparator); // Hard and floppy disk controllers QStringList storageControllers; @@ -864,7 +864,7 @@ VMManagerSystem::setupVars() { if (storage_config.contains(ide_qua_internal_name) && (storage_config[ide_qua_internal_name].toInt() != 0)) storageControllers.append(DeviceConfig::DeviceName(hdc_get_device(hdc_get_from_internal_name(ide_qua_internal_name.toUtf8().data())), ide_qua_internal_name.toUtf8().constData(), 1)); - display_table[Display::Name::StorageController] = storageControllers.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::StorageController] = storageControllers.join(VMManagerDetailSection::sectionSeparator); // Audio QStringList sndCards; @@ -889,7 +889,7 @@ VMManagerSystem::setupVars() { if(sndCards.isEmpty()) { sndCards.append(tr("None")); } - display_table[Display::Name::Audio] = sndCards.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::Audio] = sndCards.join(VMManagerDetailSection::sectionSeparator); // MIDI QString midiOutDev; @@ -901,7 +901,7 @@ VMManagerSystem::setupVars() { midiOutDev = midiDevName; } } - display_table[Display::Name::MidiOut] = midiOutDev; + display_table[VMManager::Display::Name::MidiOut] = midiOutDev; // midi_device = mt32 (output) // mpu401_standalone = 1 @@ -940,21 +940,21 @@ VMManagerSystem::setupVars() { if(nicList.isEmpty()) { nicList.append(tr("None")); } - display_table[Display::Name::NIC] = nicList.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::NIC] = nicList.join(VMManagerDetailSection::sectionSeparator); // Input (Keyboard) if (input_config.contains("keyboard_type")) { auto keyboard_internal_name = input_config["keyboard_type"]; auto keyboard_dev = keyboard_get_from_internal_name(keyboard_internal_name.toUtf8().data()); auto keyboard_dev_name = DeviceConfig::DeviceName(keyboard_get_device(keyboard_dev), keyboard_get_internal_name(keyboard_dev), 0); - display_table[Display::Name::Keyboard] = keyboard_dev_name; + display_table[VMManager::Display::Name::Keyboard] = keyboard_dev_name; } // Input (Mouse) auto mouse_internal_name = input_config["mouse_type"]; auto mouse_dev = mouse_get_from_internal_name(mouse_internal_name.toUtf8().data()); auto mouse_dev_name = DeviceConfig::DeviceName(mouse_get_device(mouse_dev), mouse_get_internal_name(mouse_dev), 0); - display_table[Display::Name::Mouse] = mouse_dev_name; + display_table[VMManager::Display::Name::Mouse] = mouse_dev_name; // Input (joystick) QString joystickDevice; @@ -965,7 +965,7 @@ VMManagerSystem::setupVars() { joystickDevice = joystickName; } } - display_table[Display::Name::Joystick] = joystickDevice; + display_table[VMManager::Display::Name::Joystick] = joystickDevice; // # Ports // Serial @@ -1026,8 +1026,8 @@ VMManagerSystem::setupVars() { if (portIndex == PARALLEL_MAX) break; } - display_table[Display::Name::Serial] = (serialFinal.empty() ? tr("None") : serialFinal.join(", ")); - display_table[Display::Name::Parallel] = (lptFinal.empty() ? tr("None") : lptFinal.join((hasLptDevices ? VMManagerDetailSection::sectionSeparator : ", "))); + display_table[VMManager::Display::Name::Serial] = (serialFinal.empty() ? tr("None") : serialFinal.join(", ")); + display_table[VMManager::Display::Name::Parallel] = (lptFinal.empty() ? tr("None") : lptFinal.join((hasLptDevices ? VMManagerDetailSection::sectionSeparator : ", "))); // ISA RTC QString isartc_dev_name = ""; @@ -1036,7 +1036,7 @@ VMManagerSystem::setupVars() { auto isartc_dev = isartc_get_from_internal_name(isartc_internal_name.toUtf8().data()); isartc_dev_name = DeviceConfig::DeviceName(isartc_get_device(isartc_dev), isartc_get_internal_name(isartc_dev), 0); } - display_table[Display::Name::IsaRtc] = isartc_dev_name; + display_table[VMManager::Display::Name::IsaRtc] = isartc_dev_name; // ISA RAM QStringList IsaMemCards; @@ -1053,7 +1053,7 @@ VMManagerSystem::setupVars() { } } } - display_table[Display::Name::IsaMem] = IsaMemCards.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::IsaMem] = IsaMemCards.join(VMManagerDetailSection::sectionSeparator); // ISA ROM QStringList IsaRomCards; @@ -1070,7 +1070,7 @@ VMManagerSystem::setupVars() { } } } - display_table[Display::Name::IsaRom] = IsaRomCards.join(VMManagerDetailSection::sectionSeparator); + display_table[VMManager::Display::Name::IsaRom] = IsaRomCards.join(VMManagerDetailSection::sectionSeparator); } bool @@ -1081,6 +1081,7 @@ VMManagerSystem::startServer() { connect(socket_server, &VMManagerServerSocket::windowStatusChanged, this, &VMManagerSystem::windowStatusChangeReceived); connect(socket_server, &VMManagerServerSocket::runningStatusChanged, this, &VMManagerSystem::runningStatusChangeReceived); connect(socket_server, &VMManagerServerSocket::configurationChanged, this, &VMManagerSystem::configurationChangeReceived); + connect(socket_server, &VMManagerServerSocket::globalConfigurationChanged, this, &VMManagerSystem::globalConfigurationChanged); connect(socket_server, &VMManagerServerSocket::winIdReceived, this, [this] (WId id) { this->id = id; }); return true; } else { @@ -1119,11 +1120,17 @@ VMManagerSystem::windowStatusChangeReceived(int status) processStatusChanged(); } QString -VMManagerSystem::getDisplayValue(Display::Name key) +VMManagerSystem::getDisplayValue(VMManager::Display::Name key) { return (display_table.contains(key)) ? display_table[key] : ""; } +void +VMManagerSystem::sendGlobalConfigurationChanged() +{ + socket_server->serverSendMessage(VMManagerProtocol::ManagerMessage::GlobalConfigurationChanged); +} + void VMManagerSystem::shutdownRequestButtonPressed() { diff --git a/src/qt/qt_vmmanager_system.hpp b/src/qt/qt_vmmanager_system.hpp index 5914e46cb..e40e2d4e1 100644 --- a/src/qt/qt_vmmanager_system.hpp +++ b/src/qt/qt_vmmanager_system.hpp @@ -129,6 +129,7 @@ public slots: void shutdownForceButtonPressed(); void cadButtonPressed(); void reloadConfig(); + void sendGlobalConfigurationChanged(); public: QDateTime timestamp(); void setIcon(const QString &newIcon); @@ -157,6 +158,7 @@ signals: void itemDataChanged(); void clientProcessStatusChanged(); void configurationChanged(const QString &uuid); + void globalConfigurationChanged(); private: void loadSettings(); diff --git a/src/qt/qt_vmmanager_windarkmodefilter.cpp b/src/qt/qt_vmmanager_windarkmodefilter.cpp index 195419ad9..c95bc0c0f 100644 --- a/src/qt/qt_vmmanager_windarkmodefilter.cpp +++ b/src/qt/qt_vmmanager_windarkmodefilter.cpp @@ -38,6 +38,48 @@ static bool NewDarkMode = FALSE; +void +WindowsDarkModeFilter::reselectDarkMode() +{ + bool OldDarkMode = NewDarkMode; + + if (!util::isWindowsLightTheme()) { + QFile f(":qdarkstyle/dark/darkstyle.qss"); + + if (!f.exists()) + printf("Unable to set stylesheet, file not found\n"); + else { + f.open(QFile::ReadOnly | QFile::Text); + QTextStream ts(&f); + qApp->setStyleSheet(ts.readAll()); + } + QPalette palette(qApp->palette()); + palette.setColor(QPalette::Link, Qt::white); + palette.setColor(QPalette::LinkVisited, Qt::lightGray); + qApp->setPalette(palette); + window->resize(window->size()); + + NewDarkMode = TRUE; + } else { + qApp->setStyleSheet(""); + QPalette palette(qApp->palette()); + palette.setColor(QPalette::Link, Qt::blue); + palette.setColor(QPalette::LinkVisited, Qt::magenta); + qApp->setPalette(palette); + window->resize(window->size()); + NewDarkMode = FALSE; + } + window->updateDarkMode(); + + if (NewDarkMode != OldDarkMode) QTimer::singleShot(1000, [this] () { + BOOL DarkMode = NewDarkMode; + DwmSetWindowAttribute((HWND) window->winId(), + DWMWA_USE_IMMERSIVE_DARK_MODE, + (LPCVOID) &DarkMode, + sizeof(DarkMode)); + }); +} + void WindowsDarkModeFilter::setWindow(VMManagerMainWindow *window) { @@ -52,45 +94,9 @@ WindowsDarkModeFilter::nativeEventFilter(const QByteArray &eventType, void *mess if ((msg != nullptr) && (msg->message == WM_SETTINGCHANGE)) { if ((((void *) msg->lParam) != nullptr) && - (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0)) { - - bool OldDarkMode = NewDarkMode; - - if (!util::isWindowsLightTheme()) { - QFile f(":qdarkstyle/dark/darkstyle.qss"); - - if (!f.exists()) - printf("Unable to set stylesheet, file not found\n"); - else { - f.open(QFile::ReadOnly | QFile::Text); - QTextStream ts(&f); - qApp->setStyleSheet(ts.readAll()); - } - QPalette palette(qApp->palette()); - palette.setColor(QPalette::Link, Qt::white); - palette.setColor(QPalette::LinkVisited, Qt::lightGray); - qApp->setPalette(palette); - window->resize(window->size()); - - NewDarkMode = TRUE; - } else { - qApp->setStyleSheet(""); - QPalette palette(qApp->palette()); - palette.setColor(QPalette::Link, Qt::blue); - palette.setColor(QPalette::LinkVisited, Qt::magenta); - qApp->setPalette(palette); - window->resize(window->size()); - NewDarkMode = FALSE; - } - window->updateDarkMode(); - - if (NewDarkMode != OldDarkMode) QTimer::singleShot(1000, [this] () { - BOOL DarkMode = NewDarkMode; - DwmSetWindowAttribute((HWND) window->winId(), - DWMWA_USE_IMMERSIVE_DARK_MODE, - (LPCVOID) &DarkMode, - sizeof(DarkMode)); - }); + (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0) && + color_scheme == 0) { + reselectDarkMode(); } } } diff --git a/src/qt/qt_vmmanager_windarkmodefilter.hpp b/src/qt/qt_vmmanager_windarkmodefilter.hpp index 4f6b28a6e..e89b22acd 100644 --- a/src/qt/qt_vmmanager_windarkmodefilter.hpp +++ b/src/qt/qt_vmmanager_windarkmodefilter.hpp @@ -39,6 +39,7 @@ public: WindowsDarkModeFilter() = default; void setWindow(VMManagerMainWindow *window); bool nativeEventFilter(const QByteArray &eventType, void *message, result_t *result) override; + void reselectDarkMode(); private: VMManagerMainWindow *window; diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 9b7adce1d..9029f4fcd 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -74,7 +74,9 @@ extern void win_keyboard_handle(uint32_t scancode, int up, int e0, int e1); #include "qt_util.hpp" #include "ui_qt_mainwindow.h" -static bool NewDarkMode = FALSE; +bool NewDarkMode = FALSE; + +extern MainWindow* main_window; struct { @@ -307,6 +309,56 @@ device_change(WPARAM wParam, LPARAM lParam) } } +void +selectDarkMode() +{ + bool OldDarkMode = NewDarkMode; + + if (!util::isWindowsLightTheme()) { + QFile f(":qdarkstyle/dark/darkstyle.qss"); + + if (!f.exists()) + printf("Unable to set stylesheet, file not found\n"); + else { + f.open(QFile::ReadOnly | QFile::Text); + QTextStream ts(&f); + qApp->setStyleSheet(ts.readAll()); + } + QPalette palette(qApp->palette()); + palette.setColor(QPalette::Link, Qt::white); + palette.setColor(QPalette::LinkVisited, Qt::lightGray); + qApp->setPalette(palette); + NewDarkMode = TRUE; + } else { + qApp->setStyleSheet(""); + QPalette palette(qApp->palette()); + palette.setColor(QPalette::Link, Qt::blue); + palette.setColor(QPalette::LinkVisited, Qt::magenta); + qApp->setPalette(palette); + NewDarkMode = FALSE; + } + + if (NewDarkMode != OldDarkMode) + QTimer::singleShot(1000, []() { + BOOL DarkMode = NewDarkMode; + DwmSetWindowAttribute((HWND) main_window->winId(), + DWMWA_USE_IMMERSIVE_DARK_MODE, + (LPCVOID) &DarkMode, + sizeof(DarkMode)); + + main_window->resizeContents(monitors[0].mon_scrnsz_x, + monitors[0].mon_scrnsz_y); + + for (int i = 1; i < MONITORS_NUM; i++) { + auto mon = &(monitors[i]); + + if ((main_window->renderers[i] != nullptr) && !main_window->renderers[i]->isHidden()) + main_window->resizeContentsMonitor(mon->mon_scrnsz_x, + mon->mon_scrnsz_y, i); + } + }); +} + bool WindowsRawInputFilter::nativeEventFilter(const QByteArray &eventType, void *message, result_t *result) { @@ -328,7 +380,8 @@ WindowsRawInputFilter::nativeEventFilter(const QByteArray &eventType, void *mess return true; case WM_SETTINGCHANGE: if ((((void *) msg->lParam) != nullptr) && - (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0)) { + (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0) && + color_scheme == 0) { bool OldDarkMode = NewDarkMode; #if 0 diff --git a/src/sio/sio_um8669f.c b/src/sio/sio_um8669f.c index f0460ada9..96c37573d 100644 --- a/src/sio/sio_um8669f.c +++ b/src/sio/sio_um8669f.c @@ -209,6 +209,9 @@ um8669f_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *pri if (config->activate && (config->io[0].base != ISAPNP_IO_DISABLED)) { um8669f_log("UM8669F: LPT enabled at port %04X IRQ %d\n", config->io[0].base, config->irq[0].irq); lpt_port_setup(dev->lpt, config->io[0].base); + + lpt_port_irq(dev->lpt, config->irq[0].irq); + lpt_port_dma(dev->lpt, (config->dma[0].dma == ISAPNP_DMA_DISABLED) ? -1 : config->dma[0].dma); } else { um8669f_log("UM8669F: LPT disabled\n"); } diff --git a/src/sound/snd_lpt_dac.c b/src/sound/snd_lpt_dac.c index 99cf66916..33b197230 100644 --- a/src/sound/snd_lpt_dac.c +++ b/src/sound/snd_lpt_dac.c @@ -124,7 +124,6 @@ const lpt_device_t lpt_dac_device = { .close = dac_close, .write_data = dac_write_data, .write_ctrl = dac_write_ctrl, - .autofeed = NULL, .strobe = dac_strobe, .read_status = dac_read_status, .read_ctrl = NULL, @@ -141,7 +140,6 @@ const lpt_device_t lpt_dac_stereo_device = { .close = dac_close, .write_data = dac_write_data, .write_ctrl = dac_write_ctrl, - .autofeed = NULL, .strobe = dac_strobe, .read_status = dac_read_status, .read_ctrl = NULL, diff --git a/src/sound/snd_lpt_dss.c b/src/sound/snd_lpt_dss.c index 206f44ec8..5ea0048f4 100644 --- a/src/sound/snd_lpt_dss.c +++ b/src/sound/snd_lpt_dss.c @@ -139,7 +139,6 @@ const lpt_device_t dss_device = { .init = dss_init, .close = dss_close, .write_data = dss_write_data, - .autofeed = NULL, .strobe = NULL, .write_ctrl = dss_write_ctrl, .read_status = dss_read_status, diff --git a/src/unix/unix_serial_passthrough.c b/src/unix/unix_serial_passthrough.c index 873c706b9..f6f953eee 100644 --- a/src/unix/unix_serial_passthrough.c +++ b/src/unix/unix_serial_passthrough.c @@ -57,8 +57,13 @@ plat_serpt_read(void *priv, uint8_t *data) fd_set rdfds; switch (dev->mode) { + case SERPT_MODE_HOSTSER: { + if (read(dev->master_fd, data, 1) > 0) { + return 1; + } + return 0; + } case SERPT_MODE_VCON: - case SERPT_MODE_HOSTSER: FD_ZERO(&rdfds); FD_SET(dev->master_fd, &rdfds); tv.tv_sec = 0; diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index f34455136..6301956c5 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -143,6 +143,10 @@ add_library(vid OBJECT ) +if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + target_include_directories(vid PRIVATE /usr/local/include) +endif() + if(G100) target_compile_definitions(vid PRIVATE USE_G100) endif()