Merge branch '86Box:master' into dell-p60-fix

This commit is contained in:
win2kgamer
2025-08-28 16:03:46 -05:00
committed by GitHub
76 changed files with 740 additions and 266 deletions

View File

@@ -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];

View File

@@ -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)

View File

@@ -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;

View File

@@ -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

View File

@@ -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,

View File

@@ -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,

View File

@@ -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);

View File

@@ -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;

View File

@@ -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

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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,

View File

@@ -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)

View File

@@ -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,

View File

@@ -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.

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -2972,3 +2972,15 @@ msgstr ""
msgid "OpenGL input stretch mode"
msgstr ""
msgid "Color scheme"
msgstr ""
msgid "System"
msgstr ""
msgid "Light"
msgstr ""
msgid "Dark"
msgstr ""

View File

@@ -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á"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 "暗闇"

View File

@@ -2972,3 +2972,12 @@ msgstr "OpenGL 입력 스케일"
msgid "OpenGL input stretch mode"
msgstr "OpenGL 입력 스트레치 모드"
msgid "Color scheme"
msgstr "색상 구성"
msgid "Light"
msgstr "빛"
msgid "Dark"
msgstr "어둠"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -2972,3 +2972,12 @@ msgstr "Масштаб ввода OpenGL"
msgid "OpenGL input stretch mode"
msgstr "Режим растяжения ввода OpenGL"
msgid "Color scheme"
msgstr "Цветовая схема"
msgid "Light"
msgstr "Светлая"
msgid "Dark"
msgstr "Тёмная"

View File

@@ -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á"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -2972,3 +2972,12 @@ msgstr "Шкала введення OpenGL"
msgid "OpenGL input stretch mode"
msgstr "Режим розтягування вхідних даних OpenGL"
msgid "Color scheme"
msgstr "Колірна гамма"
msgid "Light"
msgstr "Світло"
msgid "Dark"
msgstr "Темний"

View File

@@ -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"

View File

@@ -2972,3 +2972,12 @@ msgstr "OpenGL的输入比例"
msgid "OpenGL input stretch mode"
msgstr "OpenGL的输入拉伸模式"
msgid "Color scheme"
msgstr "配色方案"
msgid "Light"
msgstr "光"
msgid "Dark"
msgstr "黑暗"

View File

@@ -2972,3 +2972,12 @@ msgstr "OpenGL 的輸入比例"
msgid "OpenGL input stretch mode"
msgstr "OpenGL 的輸入拉伸模式"
msgid "Color scheme"
msgstr "配色方案"
msgid "Light"
msgstr "光"
msgid "Dark"
msgstr "黑暗"

View File

@@ -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. */

View File

@@ -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

View File

@@ -68,6 +68,7 @@ signals:
void vmmRunningStateChanged(VMManagerProtocol::RunningState state);
void vmmConfigurationChanged();
void vmmGlobalConfigurationChanged();
public slots:
void showSettings();
void hardReset();

View File

@@ -942,7 +942,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Square pixels (keep ratio)</string>
<string>&amp;Square pixels (Keep ratio)</string>
</property>
</action>
<action name="action_Integer_scale_gl">

View File

@@ -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();
}

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>458</width>
<height>391</height>
<height>508</height>
</rect>
</property>
<property name="minimumSize">
@@ -27,7 +27,7 @@
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
<enum>QLayout::SizeConstraint::SetFixedSize</enum>
</property>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_2">
@@ -36,6 +36,40 @@
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="checkBoxMultimediaKeys">
<property name="text">
<string>Inhibit multimedia keys</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Mouse sensitivity:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QComboBox" name="comboBoxLanguage">
<property name="maxVisibleItems">
@@ -48,30 +82,10 @@
</item>
</widget>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="pushButtonLanguage">
<item row="8" column="0">
<widget class="QCheckBox" name="checkBoxConfirmSave">
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Mouse sensitivity:</string>
<string>Ask for confirmation before saving settings</string>
</property>
</widget>
</item>
@@ -93,27 +107,7 @@
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="5" column="0">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Default</string>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@@ -127,19 +121,25 @@
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="checkBoxMultimediaKeys">
<item row="2" column="1">
<widget class="QPushButton" name="pushButtonLanguage">
<property name="text">
<string>Inhibit multimedia keys</string>
<string>Default</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QCheckBox" name="checkBoxConfirmSave">
<property name="text">
<string>Ask for confirmation before saving settings</string>
<item row="5" column="0">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="9" column="0">
<widget class="QCheckBox" name="checkBoxConfirmExit">
@@ -148,6 +148,16 @@
</property>
</widget>
</item>
<item row="14" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="checkBoxConfirmHardReset">
<property name="text">
@@ -155,14 +165,34 @@
</property>
</widget>
</item>
<item row="13" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<item row="13" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Color scheme</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QRadioButton" name="radioButtonSystem">
<property name="text">
<string>System</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonLight">
<property name="text">
<string>Light</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonDark">
<property name="text">
<string>Dark</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>

View File

@@ -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();
}
}

View File

@@ -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

View File

@@ -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
{

View File

@@ -45,6 +45,7 @@ signals:
public slots:
void clientRunningStateChanged(VMManagerProtocol::RunningState state) const;
void configurationChanged() const;
void globalConfigurationChanged() const;
private:
QString server_name;

View File

@@ -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();

View File

@@ -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);

View File

@@ -31,10 +31,13 @@
#include <atomic>
#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 &current,
const QModelIndex &previous)
@@ -768,6 +781,10 @@ VMManagerMain::onPreferencesUpdated()
if (oldRegexSearch != regexSearch) {
ui->searchBar->clear();
}
if (vm_model) {
vm_model->sendGlobalConfigurationChanged();
}
}
void

View File

@@ -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

View File

@@ -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 <QStringListModel>
#include <QCompleter>
#include <QCloseEvent>
#include <QDesktopServices>
#include <QDesktopServices>
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
{

View File

@@ -34,6 +34,7 @@ class VMManagerMainWindow final : public QMainWindow
public:
explicit VMManagerMainWindow(QWidget *parent = nullptr);
~VMManagerMainWindow() override;
void updateSettings();
signals:
void preferencesUpdated();
void languageUpdated();

View File

@@ -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()
{

View File

@@ -60,8 +60,10 @@ public:
QMap<VMManagerSystem::ProcessStatus, int> getProcessStats();
int getActiveMachineCount();
void refreshConfigs();
void sendGlobalConfigurationChanged();
signals:
void systemDataChanged();
void globalConfigurationChanged();
private:
QVector<VMManagerSystem *> machines;

View File

@@ -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

View File

@@ -7,13 +7,16 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<height>475</height>
</rect>
</property>
<property name="windowTitle">
<string>Preferences</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetFixedSize</enum>
</property>
<item>
<widget class="QLabel" name="label">
<property name="text">
@@ -103,10 +106,40 @@
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBoxColorScheme">
<property name="title">
<string>Color scheme</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QRadioButton" name="radioButtonSystem">
<property name="text">
<string>System</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonLight">
<property name="text">
<string>Light</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonDark">
<property name="text">
<string>Dark</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -119,10 +152,10 @@
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
</item>

View File

@@ -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;
}

View File

@@ -43,6 +43,7 @@ public:
ResetVM,
RequestShutdown,
ForceShutdown,
GlobalConfigurationChanged,
UnknownMessage,
};
@@ -56,6 +57,7 @@ public:
RunningStateChanged,
ConfigurationChanged,
WinIdMessage,
GlobalConfigurationChanged,
UnknownMessage,
};
Q_ENUM(ClientMessage);

View File

@@ -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;

View File

@@ -76,6 +76,7 @@ signals:
void windowStatusChanged(int status);
void runningStatusChanged(VMManagerProtocol::RunningState state);
void configurationChanged();
void globalConfigurationChanged();
void winIdReceived(WId id);

View File

@@ -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()
{

View File

@@ -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();

View File

@@ -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();
}
}
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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");
}

View File

@@ -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,

View File

@@ -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,

View File

@@ -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;

View File

@@ -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()