From 9063bbe68bc910f269cd2cfd799496d8a40893c1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 23 Jul 2025 15:53:34 +0200 Subject: [PATCH] Second and last part of the icon indicator work. --- src/config.c | 251 +++++++++++----------------- src/device/cassette.c | 16 +- src/disk/mo.c | 13 +- src/disk/zip.c | 13 +- src/floppy/fdd.c | 12 +- src/include/86box/cassette.h | 2 +- src/qt/icons/browse.ico | Bin 0 -> 9622 bytes src/qt/icons/cartridge_image.ico | Bin 0 -> 9622 bytes src/qt/icons/cassette_image.ico | Bin 0 -> 9622 bytes src/qt/icons/cdrom_nomedia.ico | Bin 0 -> 9622 bytes src/qt/icons/eject.ico | Bin 0 -> 9622 bytes src/qt/icons/export.ico | Bin 0 -> 9622 bytes src/qt/icons/fast_forward.ico | Bin 0 -> 9622 bytes src/qt/icons/floppy_35_image.ico | Bin 0 -> 9622 bytes src/qt/icons/floppy_525_image.ico | Bin 0 -> 9622 bytes src/qt/icons/mo_image.ico | Bin 0 -> 9622 bytes src/qt/icons/new.ico | Bin 0 -> 9622 bytes src/qt/icons/record.ico | Bin 0 -> 9622 bytes src/qt/icons/rewind.ico | Bin 0 -> 9622 bytes src/qt/icons/superdisk.ico | Bin 0 -> 9622 bytes src/qt/icons/superdisk_disabled.ico | Bin 0 -> 9622 bytes src/qt/icons/superdisk_image.ico | Bin 0 -> 9622 bytes src/qt/icons/write_active.ico | Bin 9622 -> 6950 bytes src/qt/icons/write_protected.ico | Bin 9622 -> 9622 bytes src/qt/icons/zip_image.ico | Bin 0 -> 9622 bytes src/qt/qt_iconindicators.cpp | 18 +- src/qt/qt_iconindicators.hpp | 5 + src/qt/qt_machinestatus.cpp | 28 +++- src/qt/qt_mediahistorymanager.cpp | 46 +++-- src/qt/qt_mediamenu.cpp | 164 +++++++++++++----- src/qt_resources.qrc | 16 ++ 31 files changed, 362 insertions(+), 222 deletions(-) create mode 100644 src/qt/icons/browse.ico create mode 100644 src/qt/icons/cartridge_image.ico create mode 100644 src/qt/icons/cassette_image.ico create mode 100644 src/qt/icons/cdrom_nomedia.ico create mode 100644 src/qt/icons/eject.ico create mode 100644 src/qt/icons/export.ico create mode 100644 src/qt/icons/fast_forward.ico create mode 100644 src/qt/icons/floppy_35_image.ico create mode 100644 src/qt/icons/floppy_525_image.ico create mode 100644 src/qt/icons/mo_image.ico create mode 100644 src/qt/icons/new.ico create mode 100644 src/qt/icons/record.ico create mode 100644 src/qt/icons/rewind.ico create mode 100644 src/qt/icons/superdisk.ico create mode 100644 src/qt/icons/superdisk_disabled.ico create mode 100644 src/qt/icons/superdisk_image.ico create mode 100644 src/qt/icons/zip_image.ico diff --git a/src/config.c b/src/config.c index 95362bc06..9aa4a15e5 100644 --- a/src/config.c +++ b/src/config.c @@ -795,6 +795,33 @@ load_ports(void) #endif } +static int +load_image_file(char *dest, char *p, uint8_t *ui_wp) +{ + char *prefix = ""; + int ret = 0; + + if (strstr(p, "wp://") == p) { + p += 5; + prefix = "wp://"; + if (ui_wp != NULL) + *ui_wp = 1; + } else if ((ui_wp != NULL) && *ui_wp) + prefix = "wp://"; + + if (path_abs(p)) { + if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) + ret = 1; + else + snprintf(dest, MAX_IMAGE_PATH_LEN, "%s%s", prefix, p); + } else + snprintf(dest, MAX_IMAGE_PATH_LEN, "%s%s%s%s", prefix, usr_path, path_get_slash(usr_path), p); + + path_normalize(dest); + + return ret; +} + /* Load "Storage Controllers" section. */ static void load_storage_controllers(void) @@ -888,20 +915,17 @@ load_storage_controllers(void) else cassette_enable = 0; + cassette_ui_writeprot = !!ini_section_get_int(cat, "cassette_writeprot", 0); + ini_section_delete_var(cat, "cassette_writeprot"); + p = ini_section_get_string(cat, "cassette_file", ""); if (!strcmp(p, usr_path)) p[0] = 0x00; if (p[0] != 0x00) { - if (path_abs(p)) { - if (strlen(p) > 511) - fatal("Configuration: Length of cassette_file is more than 511\n"); - else - strncpy(cassette_fname, p, 511); - } else - path_append_filename(cassette_fname, usr_path, p); - path_normalize(cassette_fname); + if (load_image_file(cassette_fname, p, (uint8_t *) &cassette_ui_writeprot)) + fatal("Configuration: Length of cassette_file is more than 511\n"); } p = ini_section_get_string(cat, "cassette_mode", "load"); @@ -915,16 +939,9 @@ load_storage_controllers(void) sprintf(temp, "cassette_image_history_%02i", i + 1); p = ini_section_get_string(cat, temp, NULL); if (p) { - if (path_abs(p)) { - if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) - fatal("Configuration: Length of cassette_image_history_%02i is more " - "than %i\n", i + 1, MAX_IMAGE_PATH_LEN - 1); - else - snprintf(cassette_image_history[i], MAX_IMAGE_PATH_LEN, "%s", p); - } else - snprintf(cassette_image_history[i], MAX_IMAGE_PATH_LEN, "%s%s%s", usr_path, - path_get_slash(usr_path), p); - path_normalize(cassette_image_history[i]); + if (load_image_file(cassette_image_history[i], p, NULL)) + fatal("Configuration: Length of cassette_image_history_%02i is more " + "than %i\n", i + 1, MAX_IMAGE_PATH_LEN - 1); } } cassette_pos = ini_section_get_int(cat, "cassette_position", 0); @@ -939,9 +956,6 @@ load_storage_controllers(void) cassette_pcm = ini_section_get_int(cat, "cassette_pcm", 0); if (!cassette_pcm) ini_section_delete_var(cat, "cassette_pcm"); - cassette_ui_writeprot = !!ini_section_get_int(cat, "cassette_writeprot", 0); - if (!cassette_ui_writeprot) - ini_section_delete_var(cat, "cassette_writeprot"); if (!cassette_enable) { ini_section_delete_var(cat, "cassette_file"); @@ -1227,6 +1241,11 @@ load_floppy_and_cdrom_drives(void) if (fdd_get_type(c) > 13) fdd_set_type(c, 13); + sprintf(temp, "fdd_%02i_writeprot", c + 1); + ui_writeprot[c] = !!ini_section_get_int(cat, temp, 0); + if (ui_writeprot[c] == 0) + ini_section_delete_var(cat, temp); + sprintf(temp, "fdd_%02i_fn", c + 1); p = ini_section_get_string(cat, temp, ""); @@ -1234,22 +1253,14 @@ load_floppy_and_cdrom_drives(void) p[0] = 0x00; if (p[0] != 0x00) { - if (path_abs(p)) { - if (strlen(p) > 511) - fatal("Configuration: Length of fdd_%02i_fn is more than 511\n", c + 1); - else - strncpy(floppyfns[c], p, 511); - } else - path_append_filename(floppyfns[c], usr_path, p); - path_normalize(floppyfns[c]); + if (load_image_file(floppyfns[c], p, (uint8_t *) &(ui_writeprot[c]))) + fatal("Configuration: Length of fdd_%02i_fn is more than 511\n", c + 1); } #if defined(ENABLE_CONFIG_LOG) && (ENABLE_CONFIG_LOG == 2) if (*p != '\0') config_log("Floppy%d: %ls\n", c, floppyfns[c]); #endif - sprintf(temp, "fdd_%02i_writeprot", c + 1); - ui_writeprot[c] = !!ini_section_get_int(cat, temp, 0); sprintf(temp, "fdd_%02i_turbo", c + 1); fdd_set_turbo(c, !!ini_section_get_int(cat, temp, 0)); sprintf(temp, "fdd_%02i_check_bpb", c + 1); @@ -1265,10 +1276,6 @@ load_floppy_and_cdrom_drives(void) sprintf(temp, "fdd_%02i_fn", c + 1); ini_section_delete_var(cat, temp); } - if (ui_writeprot[c] == 0) { - sprintf(temp, "fdd_%02i_writeprot", c + 1); - ini_section_delete_var(cat, temp); - } if (fdd_get_turbo(c) == 0) { sprintf(temp, "fdd_%02i_turbo", c + 1); ini_section_delete_var(cat, temp); @@ -1282,16 +1289,9 @@ load_floppy_and_cdrom_drives(void) sprintf(temp, "fdd_%02i_image_history_%02i", c + 1, i + 1); p = ini_section_get_string(cat, temp, NULL); if (p) { - if (path_abs(p)) { - if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) - fatal("Configuration: Length of fdd_%02i_image_history_%02i is more " - "than %i\n", c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1); - else - snprintf(fdd_image_history[c][i], MAX_IMAGE_PATH_LEN, "%s", p); - } else - snprintf(fdd_image_history[c][i], MAX_IMAGE_PATH_LEN, "%s%s%s", usr_path, - path_get_slash(usr_path), p); - path_normalize(fdd_image_history[c][i]); + if (load_image_file(fdd_image_history[c][i], p, NULL)) + fatal("Configuration: Length of fdd_%02i_image_history_%02i is more " + "than %i\n", c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1); } } } @@ -1520,19 +1520,14 @@ load_other_removable_devices(void) sprintf(temp, "zip_%02i_writeprot", c + 1); zip_drives[c].read_only = ini_section_get_int(cat, temp, 0); + ini_section_delete_var(cat, temp); if (!strcmp(p, usr_path)) p[0] = 0x00; if (p[0] != 0x00) { - if (path_abs(p)) { - if (strlen(p) > 511) - fatal("Configuration: Length of zip_%02i_image_path is more than 511\n", c + 1); - else - strncpy(zip_drives[c].image_path, p, 511); - } else - path_append_filename(zip_drives[c].image_path, usr_path, p); - path_normalize(zip_drives[c].image_path); + if (load_image_file(zip_drives[c].image_path, p, &(zip_drives[c].read_only))) + fatal("Configuration: Length of zip_%02i_image_path is more than 511\n", c + 1); } for (int i = 0; i < MAX_PREV_IMAGES; i++) { @@ -1540,16 +1535,9 @@ load_other_removable_devices(void) sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1); p = ini_section_get_string(cat, temp, NULL); if (p) { - if (path_abs(p)) { - if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) - fatal("Configuration: Length of zip_%02i_image_history_%02i is more than %i\n", - c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1); - else - snprintf(zip_drives[c].image_history[i], MAX_IMAGE_PATH_LEN, "%s", p); - } else - snprintf(zip_drives[c].image_history[i], MAX_IMAGE_PATH_LEN, "%s%s%s", usr_path, - path_get_slash(usr_path), p); - path_normalize(zip_drives[c].image_history[i]); + if (load_image_file(zip_drives[c].image_history[i], p, NULL)) + fatal("Configuration: Length of zip_%02i_image_history_%02i is more than %i\n", + c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1); } } @@ -1635,19 +1623,14 @@ load_other_removable_devices(void) sprintf(temp, "mo_%02i_writeprot", c + 1); mo_drives[c].read_only = ini_section_get_int(cat, temp, 0); + ini_section_delete_var(cat, temp); if (!strcmp(p, usr_path)) p[0] = 0x00; if (p[0] != 0x00) { - if (path_abs(p)) { - if (strlen(p) > 511) - fatal("Configuration: Length of mo_%02i_image_path is more than 511\n", c + 1); - else - strncpy(mo_drives[c].image_path, p, 511); - } else - path_append_filename(mo_drives[c].image_path, usr_path, p); - path_normalize(mo_drives[c].image_path); + if (load_image_file(mo_drives[c].image_path, p, &(mo_drives[c].read_only))) + fatal("Configuration: Length of mo_%02i_image_path is more than 511\n", c + 1); } for (int i = 0; i < MAX_PREV_IMAGES; i++) { @@ -1655,16 +1638,9 @@ load_other_removable_devices(void) sprintf(temp, "mo_%02i_image_history_%02i", c + 1, i + 1); p = ini_section_get_string(cat, temp, NULL); if (p) { - if (path_abs(p)) { - if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) - fatal("Configuration: Length of mo_%02i_image_history_%02i is more than %i\n", - c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1); - else - snprintf(mo_drives[c].image_history[i], MAX_IMAGE_PATH_LEN, "%s", p); - } else - snprintf(mo_drives[c].image_history[i], MAX_IMAGE_PATH_LEN, "%s%s%s", usr_path, - path_get_slash(usr_path), p); - path_normalize(mo_drives[c].image_history[i]); + if (load_image_file(mo_drives[c].image_history[i], p, NULL)) + fatal("Configuration: Length of mo_%02i_image_history_%02i is more than %i\n", + c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1); } } @@ -2579,6 +2555,27 @@ save_keybinds(void) ini_delete_section_if_empty(config, cat); } +static void +save_image_file(char *cat, char *var, char *src) +{ + char temp[2048] = { 0 }; + char *prefix = ""; + + path_normalize(src); + + if (strstr(src, "wp://") == src) { + src += 5; + prefix = "wp://"; + } + + if (!strnicmp(src, usr_path, strlen(usr_path))) + sprintf(temp, "%s%s", prefix, &src[strlen(usr_path)]); + else + sprintf(temp, "%s%s", prefix, src); + + ini_section_set_string(cat, var, temp); +} + /* Save "Storage Controllers" section. */ static void save_storage_controllers(void) @@ -2640,13 +2637,8 @@ save_storage_controllers(void) if (strlen(cassette_fname) == 0) ini_section_delete_var(cat, "cassette_file"); - else { - path_normalize(cassette_fname); - if (!strnicmp(cassette_fname, usr_path, strlen(usr_path))) - ini_section_set_string(cat, "cassette_file", &cassette_fname[strlen(usr_path)]); - else - ini_section_set_string(cat, "cassette_file", cassette_fname); - } + else + save_image_file(cat, "cassette_file", cassette_fname); if (!strcmp(cassette_mode, "load")) ini_section_delete_var(cat, "cassette_mode"); @@ -2657,13 +2649,8 @@ save_storage_controllers(void) sprintf(temp, "cassette_image_history_%02i", i + 1); if ((cassette_image_history[i] == 0) || strlen(cassette_image_history[i]) == 0) ini_section_delete_var(cat, temp); - else { - path_normalize(cassette_image_history[i]); - if (!strnicmp(cassette_image_history[i], usr_path, strlen(usr_path))) - ini_section_set_string(cat, temp, &cassette_image_history[i][strlen(usr_path)]); - else - ini_section_set_string(cat, temp, cassette_image_history[i]); - } + else + save_image_file(cat, temp, cassette_image_history[i]); } if (cassette_pos == 0) @@ -2686,10 +2673,7 @@ save_storage_controllers(void) else ini_section_set_int(cat, "cassette_pcm", cassette_pcm); - if (cassette_ui_writeprot == 0) - ini_section_delete_var(cat, "cassette_writeprot"); - else - ini_section_set_int(cat, "cassette_writeprot", cassette_ui_writeprot); + ini_section_delete_var(cat, "cassette_writeprot"); for (c = 0; c < 2; c++) { sprintf(temp, "cartridge_%02i_fn", c + 1); @@ -2944,19 +2928,11 @@ save_floppy_and_cdrom_drives(void) sprintf(temp, "fdd_%02i_writeprot", c + 1); ini_section_delete_var(cat, temp); - } else { - path_normalize(floppyfns[c]); - if (!strnicmp(floppyfns[c], usr_path, strlen(usr_path))) - ini_section_set_string(cat, temp, &floppyfns[c][strlen(usr_path)]); - else - ini_section_set_string(cat, temp, floppyfns[c]); - } + } else + save_image_file(cat, temp, floppyfns[c]); sprintf(temp, "fdd_%02i_writeprot", c + 1); - if (ui_writeprot[c] == 0) - ini_section_delete_var(cat, temp); - else - ini_section_set_int(cat, temp, ui_writeprot[c]); + ini_section_delete_var(cat, temp); sprintf(temp, "fdd_%02i_turbo", c + 1); if (fdd_get_turbo(c) == 0) @@ -2974,13 +2950,8 @@ save_floppy_and_cdrom_drives(void) sprintf(temp, "fdd_%02i_image_history_%02i", c + 1, i + 1); if ((fdd_image_history[c][i] == 0) || strlen(fdd_image_history[c][i]) == 0) ini_section_delete_var(cat, temp); - else { - path_normalize(fdd_image_history[c][i]); - if (!strnicmp(fdd_image_history[c][i], usr_path, strlen(usr_path))) - ini_section_set_string(cat, temp, &fdd_image_history[c][i][strlen(usr_path)]); - else - ini_section_set_string(cat, temp, fdd_image_history[c][i]); - } + else + save_image_file(cat, temp, fdd_image_history[c][i]); } } @@ -3097,10 +3068,7 @@ save_other_removable_devices(void) ini_section_delete_var(cat, temp); sprintf(temp, "zip_%02i_writeprot", c + 1); - if (zip_drives[c].read_only) - ini_section_set_int(cat, temp, zip_drives[c].read_only); - else - ini_section_delete_var(cat, temp); + ini_section_delete_var(cat, temp); sprintf(temp, "zip_%02i_scsi_location", c + 1); if (zip_drives[c].bus_type != ZIP_BUS_SCSI) @@ -3114,25 +3082,15 @@ save_other_removable_devices(void) sprintf(temp, "zip_%02i_image_path", c + 1); if ((zip_drives[c].bus_type == 0) || (strlen(zip_drives[c].image_path) == 0)) ini_section_delete_var(cat, temp); - else { - path_normalize(zip_drives[c].image_path); - if (!strnicmp(zip_drives[c].image_path, usr_path, strlen(usr_path))) - ini_section_set_string(cat, temp, &zip_drives[c].image_path[strlen(usr_path)]); - else - ini_section_set_string(cat, temp, zip_drives[c].image_path); - } + else + save_image_file(cat, temp, zip_drives[c].image_path); for (int i = 0; i < MAX_PREV_IMAGES; i++) { sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1); if ((zip_drives[c].image_history[i] == 0) || strlen(zip_drives[c].image_history[i]) == 0) ini_section_delete_var(cat, temp); - else { - path_normalize(zip_drives[c].image_history[i]); - if (!strnicmp(zip_drives[c].image_history[i], usr_path, strlen(usr_path))) - ini_section_set_string(cat, temp, &zip_drives[c].image_history[i][strlen(usr_path)]); - else - ini_section_set_string(cat, temp, zip_drives[c].image_history[i]); - } + else + save_image_file(cat, temp, zip_drives[c].image_history[i]); } } @@ -3159,10 +3117,7 @@ save_other_removable_devices(void) ini_section_delete_var(cat, temp); sprintf(temp, "mo_%02i_writeprot", c + 1); - if (mo_drives[c].read_only) - ini_section_set_int(cat, temp, mo_drives[c].read_only); - else - ini_section_delete_var(cat, temp); + ini_section_delete_var(cat, temp); sprintf(temp, "mo_%02i_scsi_location", c + 1); if (mo_drives[c].bus_type != MO_BUS_SCSI) @@ -3176,25 +3131,15 @@ save_other_removable_devices(void) sprintf(temp, "mo_%02i_image_path", c + 1); if ((mo_drives[c].bus_type == 0) || (strlen(mo_drives[c].image_path) == 0)) ini_section_delete_var(cat, temp); - else { - path_normalize(mo_drives[c].image_path); - if (!strnicmp(mo_drives[c].image_path, usr_path, strlen(usr_path))) - ini_section_set_string(cat, temp, &mo_drives[c].image_path[strlen(usr_path)]); - else - ini_section_set_string(cat, temp, mo_drives[c].image_path); - } + else + save_image_file(cat, temp, mo_drives[c].image_path); for (int i = 0; i < MAX_PREV_IMAGES; i++) { sprintf(temp, "mo_%02i_image_history_%02i", c + 1, i + 1); if ((mo_drives[c].image_history[i] == 0) || strlen(mo_drives[c].image_history[i]) == 0) ini_section_delete_var(cat, temp); - else { - path_normalize(mo_drives[c].image_history[i]); - if (!strnicmp(mo_drives[c].image_history[i], usr_path, strlen(usr_path))) - ini_section_set_string(cat, temp, &mo_drives[c].image_history[i][strlen(usr_path)]); - else - ini_section_set_string(cat, temp, mo_drives[c].image_history[i]); - } + else + save_image_file(cat, temp, mo_drives[c].image_history[i]); } } diff --git a/src/device/cassette.c b/src/device/cassette.c index 5cde2fbd0..0577ae06f 100644 --- a/src/device/cassette.c +++ b/src/device/cassette.c @@ -152,10 +152,11 @@ pc_cas_del(pc_cassette_t *cas) } int -pc_cas_set_fname(pc_cassette_t *cas, const char *fname) +pc_cas_set_fname(pc_cassette_t *cas, char *fname) { unsigned n; const char *ext; + int offs = 0; if (cas->close) fclose(cas->fp); @@ -176,6 +177,13 @@ pc_cas_set_fname(pc_cassette_t *cas, const char *fname) return 0; } + if (strstr(fname, "wp://") == fname) { + offs = 5; + cassette_ui_writeprot = 1; + } + + fname += offs; + cas->fp = plat_fopen(fname, "r+b"); if (cas->fp == NULL) @@ -197,10 +205,10 @@ pc_cas_set_fname(pc_cassette_t *cas, const char *fname) n = strlen(fname); - cas->fname = malloc((n + 1) * sizeof(char)); + cas->fname = malloc((n + offs + 1) * sizeof(char)); if (cas->fname != NULL) - memcpy(cas->fname, fname, (n + 1) * sizeof(char)); + memcpy(cas->fname, fname - offs, (n + offs + 1) * sizeof(char)); if (n > 4) { ext = fname + (n - 4); @@ -216,6 +224,8 @@ pc_cas_set_fname(pc_cassette_t *cas, const char *fname) pc_cas_set_pcm(cas, 0); } + ui_sb_update_icon_wp(SB_CASSETTE, cassette_ui_writeprot); + return 0; } diff --git a/src/disk/mo.c b/src/disk/mo.c index 1a2db0443..c1f95c073 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -152,6 +152,14 @@ mo_load(const mo_t *dev, const char *fn, const int skip_insert) { const int was_empty = mo_is_empty(dev->id); int ret = 0; + int offs = 0; + + if (strstr(fn, "wp://") == fn) { + offs = 5; + dev->drv->read_only = 1; + } + + fn += offs; if (dev->drv == NULL) mo_eject(dev->id); @@ -202,7 +210,7 @@ mo_load(const mo_t *dev, const char *fn, const int skip_insert) log_fatal(dev->log, "mo_load(): Error seeking to the beginning of " "the file\n"); - strncpy(dev->drv->image_path, fn, sizeof(dev->drv->image_path) - 1); + strncpy(dev->drv->image_path, fn - offs, sizeof(dev->drv->image_path) - 1); ret = 1; } else @@ -218,6 +226,9 @@ mo_load(const mo_t *dev, const char *fn, const int skip_insert) if (was_empty) mo_insert((mo_t *) dev); } + + if (ret) + ui_sb_update_icon_wp(SB_MO | dev->id, dev->drv->read_only); } void diff --git a/src/disk/zip.c b/src/disk/zip.c index 55cf901a4..7602f8096 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -194,6 +194,14 @@ zip_load(const zip_t *dev, const char *fn, const int skip_insert) { const int was_empty = zip_is_empty(dev->id); int ret = 0; + int offs = 0; + + if (strstr(fn, "wp://") == fn) { + offs = 5; + dev->drv->read_only = 1; + } + + fn += offs; if (dev->drv == NULL) zip_eject(dev->id); @@ -247,7 +255,7 @@ zip_load(const zip_t *dev, const char *fn, const int skip_insert) log_fatal(dev->log, "zip_load(): Error seeking to the beginning of " "the file\n"); - strncpy(dev->drv->image_path, fn, sizeof(dev->drv->image_path) - 1); + strncpy(dev->drv->image_path, fn - offs, sizeof(dev->drv->image_path) - 1); /* After using strncpy, dev->drv->image_path needs to be explicitly null terminated to make gcc happy. @@ -270,6 +278,9 @@ zip_load(const zip_t *dev, const char *fn, const int skip_insert) if (was_empty) zip_insert((zip_t *) dev); } + + if (ret) + ui_sb_update_icon_wp(SB_ZIP | dev->id, dev->drv->read_only); } void diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index b5eb8c8fc..dd87c19c0 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -459,11 +459,17 @@ fdd_load(int drive, char *fn) int size; const char *p; FILE *fp; + int offs = 0; fdd_log("FDD: loading drive %d with '%s'\n", drive, fn); if (!fn) return; + if (strstr(fn, "wp://") == fn) { + offs = 5; + ui_writeprot[drive] = 1; + } + fn += offs; p = path_get_extension(fn); if (!p) return; @@ -476,10 +482,10 @@ fdd_load(int drive, char *fn) while (loaders[c].ext) { if (!strcasecmp(p, (char *) loaders[c].ext) && (size == loaders[c].size || loaders[c].size == -1)) { driveloaders[drive] = c; - if (floppyfns[drive] != fn) - strcpy(floppyfns[drive], fn); + if (floppyfns[drive] != (fn - offs)) + strcpy(floppyfns[drive], fn - offs); d86f_setup(drive); - loaders[c].load(drive, floppyfns[drive]); + loaders[c].load(drive, floppyfns[drive] + offs); drive_empty[drive] = 0; fdd_forced_seek(drive, 0); fdd_changed[drive] = 1; diff --git a/src/include/86box/cassette.h b/src/include/86box/cassette.h index 168d82099..dc85bfc26 100644 --- a/src/include/86box/cassette.h +++ b/src/include/86box/cassette.h @@ -75,7 +75,7 @@ void pc_cas_del(pc_cassette_t *cas); * @short Set the cassette file * @return True on error, false otherwise *****************************************************************************/ -int pc_cas_set_fname(pc_cassette_t *cas, const char *fname); +int pc_cas_set_fname(pc_cassette_t *cas, char *fname); /*!*************************************************************************** * @short Get the cassette mode diff --git a/src/qt/icons/browse.ico b/src/qt/icons/browse.ico new file mode 100644 index 0000000000000000000000000000000000000000..8a947ae9d375eb745363f03477518083ffe9a9a2 GIT binary patch literal 9622 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 literal 0 HcmV?d00001 diff --git a/src/qt/icons/cdrom_nomedia.ico b/src/qt/icons/cdrom_nomedia.ico new file mode 100644 index 0000000000000000000000000000000000000000..ca3c58920b6ee508bf766e1c514d928a0d7c3a5e GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkD)psGra@GBAMM4AKv> z8)gQG4`Rdgg5*FL5-zA_fYgHIKo)}B3F1T4!NUXO4lss@W7Q9KBghAR3!~kZVA4ptyqS2YChTUJwIj1}?ow`a$jhV~`#s3^E31_=EI= zFvty1H-pu~^h4|g#Xm?DVGK0~9TQDIq}09uWB-*?hw0LenrT|A1(a zu^^Km_&>Nj0_788@&rULh=i1l5Eh6HG7ZTr)ck_oolt**%s{vc#6vX?BnQWk{D)~C z)GV+%BtL^pgXKN2A7So7rm>j`G7qE%iH4g6QIA=kg4BaBL>|?RAag(%B#%s^s)d*d zk_Ta!T2wU;dIh zG;={_!!XE5h}j?#QE!6E9)k5SC^SJ~0x|@P9Z+Fd=?E!eazDsCn7d&# zvKYur7>3E?^#jO!kh`(j0g^+)FmpjP+-#6uNL+wI0u_Vwg5;5CxLZMD5PgU=3UUJ| zZb5p`F+?q<`5<#ZYLRIW8=HEN7)TDJ9vy?^P)&#Q|3KOo>KH6VS+7$k?w zd}MVXHpmQY>Oo>4IglE343Z%)q7|BnFZLnT<|^nu5q6am8 zv6+ofi*5rr4nXFDFx+ftZUVPaKzd;ql(?W6EC;g-;tou+K_VDw4%$utL2_6|34W2|9`+x|Nj7kJs3AI$o~gn1_u8B3?I-i13y>}Bo9*$(hD-?Wki~;Q9>I?j)h?huedVLBMX18zBBi>uZ4AN~s%g*bS>c@!Act zAB4$u1JrJa9iT8q#UODIM)y0+Z74LUZUEU0Z8w0-f!Kp;Ke9MH&O!dgg-LM($bOJH z_}l2g+v<3=#ujkREIpq8?icM->B^0m2|NkZ5=u zfW)wy1s=x)#S2c1T_2|XXm*3m1KA70_|3rY2K;&BF+*xC=uW8n5R zG5!aI6Da)9Y5aO|hCkSDka-{sG84Nw;IId!QxFEb6{a3WW7h|<7nuav0Wt*CZv@pP zApI~5k^^CgS&+O3VuQr6; zsR44D$a!F!29>z`*|h00Z;?1_nkrX0T!S&rpYkZ5ZJ4AhjSpAiW?nKxTo= J{NMQhKLGF2PQw5I literal 0 HcmV?d00001 diff --git a/src/qt/icons/eject.ico b/src/qt/icons/eject.ico new file mode 100644 index 0000000000000000000000000000000000000000..1bfead4d6068671503da761fe5f717d590379a49 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkjXV|$D6GP0yP>xjq zWCl9Mst~6jy4yi~oQhE-8XEpHV8f)iAEY1Teo#1o*re!%IR>N;WCl5UkI7#Jq7;j|c(FL7aUi}WHVvxQF=54Mnhmwhd=|UOsW6>A4G#N1C)L6|NsAw|NsC0op4o!q5@QJ zNiZ-l7$CKe6F6}O0jRttgmG%dD*-Aak;`9PY)Z;LkR60DUPlhNB%!be$&=?uLg50F zr!@RQ=@(nvg3PDHY?!Y>=AhdF5~GIM*zBOT+30pq)7>z$VKl_;Fy1IV8UmvsFd71* zA%G)7O}<9kxW9j2aI@eeW&l;~Bn!XW!VZh&EW+6}TFgh6hAVGw^5 zkA}c#2#kinXb6mkz-S1JhQKfhfd=OP{}~t&7{mt+H-KoEIEa0K{r~?5{Qv)dkpKVx OhyDNmf9gT1D8~Tn>eayj literal 0 HcmV?d00001 diff --git a/src/qt/icons/export.ico b/src/qt/icons/export.ico new file mode 100644 index 0000000000000000000000000000000000000000..5076182dc97a958cbc9686f4d9a4b26fa487ed15 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pkh6V8up|4$fz${7&`NO{8uE^QbXCa_WHC`|33{EsP0o(SpX2Y!1X z=0Wl$CGG_2g_s2@V?dZ(GeP=b7-SAICb#^7nFrDjGY`ZDiQ^9+{IVeZAag(%#Ky0h zuq?<7YMBMI4P+*aJxY&;z-S22Jp}&$`~Uy{pZfp*|JeWk|3Uu${|EdK8pH>QgX9TU zS8x@edP{TRD<+^^usW^`5V+T_E#7=7KPYja?P_q98MAWj4%JAUj~}QF=54MnhmU1V%sz{QrOd|NsB} z|NsAQ|Ns9F^Z)-p82|tO!2qE_e2_R;9;6Q5yds(bYKMWwC>@a6VGW>xOZtZ`s4YT& zTOl?=+EWh3hYnFBHp9piEXNF7KIvKf@JLFS=jkUi*b z0EvOrQEDGC`a$-9?1Q-h#0H5Gqn8?LKz4!b1lbRwL40bMORO0n`#|=BFo;d8K5D50 z**Q>l!~6hp1B^XNkA}c#2#kinXb6mkz-S1JhQJ^Qf&c&i*Z=?j&;I}afAatT|KtDv m{~!DR{|A`=|8HRY|G$9&LWB4qaj-l{ojpV!(Zdlq6#@Xlvd6># literal 0 HcmV?d00001 diff --git a/src/qt/icons/fast_forward.ico b/src/qt/icons/fast_forward.ico new file mode 100644 index 0000000000000000000000000000000000000000..6bc5eeaff16e0dca78ae41611c4f367135b3fcf0 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkB=`USe+CeZO$|t#82Oz$v6}(YPmDY^HOTsjkw;g9uAdlrWHs3I6C)1`GhF)d z$;0G8X#kskeDcV0*!1I*N0&p_k53+(9I}2w@*sbL)T3jNI4->)wIF#A2C=bWkQ@kO zlLLw2lOsaDzW)Dzd;9mkX=jZ?bpPl{xe`e{nU1a-UY?yhZsKcig**sFz;Zlok9x3Xusl{d`*YCvfQpLxWnLso;&JYv+LtHEU+G3v0X!Db#Y>Tsz+H;))~_|zbqN31$f z{DJi0!XSA=l}ngKmPwe|Kb1t*$@8z z&wSwjf5rp#{}~S0|7UQJ|Ifg{55XYz0ei3A_|`IqGrg!DT)<>app;XFfUV(e)5ApB(kbdWbQf z9QCj~MXdRxsE4Tq%ag1 zZ~yuKfBBF9|MP$N|DXLs{eR{U_Wv0_$p2^f!2h42fc-y%0rP(b0Y*^W55XWdNDL(R zfgh|Eqz9xIWCqAAkeMK}LG3Wm7^MSJJFEdTa0zlNDh8R2Dnc5MGX0QnCf^Kd=%>UC zkX{fbwq1uFwjjNTbWeIXP)k2@-H7f+e0-Sw)X-0k8OZiiLqDlzpxaLk{iK+I&3EeL6{u9AU%}mrGozY|Mmav|J(nU|1bZa|3CkK_W$hv zng28YXZ+9jp8*8x8R{AA8SEM48RQxG8Tc948Q2+^8JHOu85lvJ0|0Xxw#oni literal 0 HcmV?d00001 diff --git a/src/qt/icons/floppy_35_image.ico b/src/qt/icons/floppy_35_image.ico new file mode 100644 index 0000000000000000000000000000000000000000..d27b4be0242e3e78c84ab1b35e4a4505f807716a GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk{`*Bzg_7lwhos|s#cT_O^udA;IV~{==CRYFdM;rd{hlUl52AM&O{vDN& zI6_xTwEhZ)|NkFt{J(GCekk7ef8V}+|FP+Z`WZQ_7(n)e^#4DSiQ)uo`a$sqQUsEN zMLb;p(X9Xfk7WJ-52BA|VYMHmA6YNR3>5v3HiG>Eat}xyHVo2(jA8mgafro#5c7^^ z{RgRo$|Gxs`+s`{!~cfH#{YG7b^q(@8^AP3J;*H}KjG33(g#ull5c8i0*CGYW7%N; z6QdvG7?9gR>9Db>=|9Mf#>S@q^$iXGL41%L$ZQY>sYS6FuHl5bPP(n$a+EMBJ=UFv6%-7 zPmnkaQ)(Wy-3Kxc<~9&LBHVW@8y=0s_!kt1XqW+%_TcFSWF8a~V;(4+K@I?^g=Jg} z^PqJBNDW9WJ`6Gsqz+~lh(_g6Kyys%s^?BSPXRsN#^6rAINebHw=LJc*7JFKFDsw$3}NQD80cj$Q)c4pP9&V z*vyCJE07#E46+m1418>me&p~6xgBIaNDP-gYM2iyJ3w}0!_+c=)cyZa`j(&!42$2v z82+Gm2c z*e)m=W)8C1AT~%G&1_IP1~L|oG29QTtI;sX9FTeF7$gqDpfCZM1ES#uLm41(Q279I zFPIH=GgK|eJ>b43y4fH;%xsums2-@v5DIK2$h}DI8jyOBUScpvEeM0mp~QTUUXVE; z46+x@hq?WZb~O{GWj+%>JK& zfgcZ+|KGr14<0`NjZr!vwZj@f1D9|YP{aVIZ%~+0fXQ|MDEvYBpIi)eGe!1;@-aCW zr%*RH< z)Pc+cvC-|uW6)c*gVZ~$PFM&g#CoP50(do6*derpBNflKiFU*i2pwrnDOBT1_ovZ;xIb{0|P$; Y1A{yR1A{#S14BJ1jBsPd|DZ7s03Zj^a{vGU literal 0 HcmV?d00001 diff --git a/src/qt/icons/floppy_525_image.ico b/src/qt/icons/floppy_525_image.ico new file mode 100644 index 0000000000000000000000000000000000000000..ae3a4d8a4c8bc219dce35b829bc3178adf8ed852 GIT binary patch literal 9622 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 literal 0 HcmV?d00001 diff --git a/src/qt/icons/new.ico b/src/qt/icons/new.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3e0c16b068904a9a57b964d2a48efd413541c7d GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk!=&gNRXZ92 zI6~n6FSe*+Q*@j>FC#7+Q%${7&`NO{8uE^QbXCa~eKjC5gGS%XZIZVE&P zqU?d?ArMV$83Hi_LW1;x^6*YbnFKBmU~G^asb+%oAejdWa=4iwISR}JnFYgOGbuC= zWCqAQ5DmsuFb`}FCE*8(6_7hXVTg`F;vji)Fi0;tCdZsnJ)0gyd(G#}({bPVJ?;B5quJV-6I-2gIkpzOzDH^{#@{ZH*MK(Zg% zPF!q|+ejYg#+O<~?FXei@H_@MY(eo0ozsBD0kSxl4GJ@A<^hm-AXh-`2H63#8$^Tn za12sQO}jy917zkv+K=o8G?I&BS63LcNE_ z|Nq!9!c4F^NM`*1zi}gWJ-E$5HiHuVr0IpZ2jUly8%Fh$5_g#42TBH{g&`vBL3%-$ zQvC=s@c9KK2g1<21=56uA$b6#1{;RB8>9wJ8wMAo1{=mu$nZn{|NjT<|NkFg{{O#$ z5rPr+pqc@b2dM?=0qF&mGa?L-@`e#y+AuIoV8gVBfC#kQ0Obc1Oh6lkG}IhacO(1* zHycAEngEJ9ur!BG6K5{ME$I4j@zKmhcN$4$9n21hnPC4TnMYc>hnWSVG0mi=d6b!j z>Bdp>U|~WEjfi7vhaV^zQf4N?Z6LEinA+x%ZziVOKxTn3#Eqcxo!EE)sRdzT>kVAy zg3JJ6h}%Hr639LHFh~u;y&%2Fn0Ry0?SPnz&=2FIt3&YrvH$=7gYp0W2MqQ94=~t+ zaRY<=e-LJ1;Qx;egXBOMrXHjhWCqAAP`xF=z`$UD)ILt&MA%0n3tC@*%U5JJiN>HP zM=}Q%KIk-xeJGmob5PB}m0nQe2W%I9W5KeJ^n%MwT;dSB2-!iN*)Tit+d-Mx`0b#M z*|_Z(%H~to?U-RSYCbGXkZD9-80z5zDs-sp2SnI_%m(41Za($=fEhL*vtgLBaKdjk zWp)r}HmV)4whnT>L1x3`K{W2R8O%&{8c_#>^kc&iH^bDS>nDW|GXtF_Y{vh_|Ns9m z*#G~*ApidZ1ONXA4DA08FfjjbU|@t}sNa#=E8uz@E)P-*(gV^9G6Q55$V`ygpmrE& zjM4$A9o7IExFqZ}LMkxagXT^``pJ<;vJ*Y5(fN=tg1U(uyO8xj?M2vuoKCT^(b5)F zKeCa;vWd47n>#>a2)BU4gjkC~K}XhD2*^%s7~&3M-9TAchs}PF7;$c(jol#oK^VUq zXlpmfeh|j(hJm!7K6Zor55kyXFp}-3uiru855kBz7_}eNMgfHhJ@IJxgX&jMoix(Z zAE;SC-!MR=J&@fXJksr_Ul?G9J;-hlrcWH;wx9NHz;8Fmeh{WjI1pzy$bJx}t{X_R z8)QESL)<_~-2~DL!k`WX$VAdHsEkIq17sGVIufJ?h9Uk2nL)bEs5(GqKrqZ~Tr|Q? zka|>8sKW!9iw~1#%l{Aj;Kd357#QmRFfiEvU|^8{z`(%&fPsPi00RRv2sbb=Fv2h) d(_!jBG)ON9gUkY%2{IdG2gok)qKFUt{{g^9e-r=! literal 0 HcmV?d00001 diff --git a/src/qt/icons/rewind.ico b/src/qt/icons/rewind.ico new file mode 100644 index 0000000000000000000000000000000000000000..b18c1a66d39454710006ed5a4bc6aa6666085b29 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk)PnSY^n%J65e7(k!w4>I7#Jq7VYiM5QS|(VOA9gTKx#l3ml-f|kQxw%@v+g6 zJcKVkAi9WA2T?;PenEDD)POLE4KW{`gqQ`&x0I_xn1$awV$`9k!EGKf>M+${H;))~ z*wtW~M~ph$YEaE1P8}%zKxG0*FE$L42c-iLO^iBFO2MZVBnL8&6m|I2BAZ8wI$Ube z%_Bt}HnrHyBSjs$T3qIlq7GRtKJ!RXhpZMBzaTMe7-T0XEfG=&(hE{cO?3z}K`i_j zQ~~XO|Np=J`Tzgy`~Uy3=l}o1j{pA$8~**g84x|R8 z7NiHH7i7l&{qO&S>MaQd1_lG9_HhCyerFINOQ;?}H-Z%PAhjTjZU!zsNG%BCl1CPY zlu^XQFGLq9>LF^0O+O$vfYgF8hz+q17YQ*NR9;eFJ;H3_%qK-Xs#?P4lcF9|Eq?P! zQIB0MZu3b|k6SHv^GQ*UUoEEjq^KvX7S(*x)PvGBsEh`gfe(Y!f$|H8CPh6cXAz?Z zqy}U@IqHeggKR!I>IvyVH=i8!`1D{ipB(kL^x!g|9QD}r;4_~b_2_yCnNN;-WIe=~ zPmX$IJ+Sl-62pfErf8hTQ{)Yb__!<5`;A8lIfQR9K0|$7l4AkBLvq54YIglEVT96))UXU4Jvp{CP z{|9b|fyO8uklJAlpn*%`Tu7`ckh_Rgi%lIR`aya@7@N7oh=KHiFfnS;)j;YRQqmQw z36$uE=p{8>BkZR{KSVF6z9i3nO7tW2l4n09`cd_gZa*dZG4+yWKPCFH>m}ZPO7!E_ zOPu|b=*O>@u>F+iC#)C0{gmh@PA_izDbY{7UhMW$qMtOqnD$empLD&b_EV-GRE~q% zR3I}+!61F0`VT}?q90T*kz)o(56FIM=qJYvWc#V1pHwr@?Wcx*Qp~_+KQ;6dYX&a+ zsiB`3Gw|6@4gG}7AY?x^^y4#w82hQAAD0=#+D{Gr*vufsero7PH-l9Bsi7a)407zJ zhJIu-VC6qZj1&xVJE+bgS3k%ukQoE1AK?ZNi#!Y(hxqsZ-~T`V|NQ^)|HuCi|3CbH z@c+U81OE^FZ}{KvpW#2lKZbt{e;EES{9yRO@PXk2!vlr~32H63!3uNcN|Nj6_;mb7u literal 0 HcmV?d00001 diff --git a/src/qt/icons/superdisk.ico b/src/qt/icons/superdisk.ico new file mode 100644 index 0000000000000000000000000000000000000000..ac5cc5fb0cc368975b78f36f399ac34bb9d9acdc GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkN|Nm$BzjG%9 zgZLo!e>4CQgQx+qLF$n8gZMBE(t6{@jsM6PBnGkvrUpbK>j$wx7$go+i;YBt5l9_E zJ;Gfuw}EuS><6(yc7x<#m>B&KeJ~Q!4qWzw>;RdMj6q_^7$k>JKeAeEY+CCFg%>hL zcLP5AVR8)(4F6#mWEQd+Ff||=Sq{W+XlVEk!l3Yh=?Bs1>Ok@!^)PV|8>A10Ve&8< zB#*2XCXOry(+i_PYCvod4RSxST96nhH-pRtVURjp7^D`Y1{s6&HZcDG&%i()2I&Qr zGa?L-@`e#y+AuIoU;~+q6O&WUAnSn}jO-V3*`RO%83@vk9JZjaCIutw1(^vm4@AQ- zEGOfmL3V=7g6RR#$mW6AAPf?RnFA|l&}o=F$UKl95C-Xk(I9bq8d@ zsR6kighBdnVURwM8W4t=3DOHHPeB;OhGAT0po_!Q!)TB>Abfzq{(l35{C@@pehRVt z{{{y8|DbwHf`Ng-0I7YPzzMPmCq}M=sKJI?1oJC3X;9pNEC88_95k;v$Av-ai7_9SenR3S#e7iuz=iRJ5i#KdQUj?E zA^kv5d?E8e_TsVwq!*+fL}OD25=S-*R*!-7Ad6$u3$hcWAEXvUV^aeXM>dC==HoIO zWCzGisPI6&HYAhTf@qz}Xf(J-~h zX5b1RkXn!&41>(The77U)PiVaJ3wZE>UR(ZvC%O;bCKoH^}+Zcb3yn31M~j|21aVM zchJmW{NKR93~q;k#wZ<-+F=c#flH9(*fE+ph%q@(c+mjET>%RldeTt;fX7+U;~$hJ zsEv{B0GSQ)E65EX8YBmzK^P_nqN#;J=7Y=vnGeD+HnRO7HVDJyKs2>5%zlvhAPh1W zsR!9bs{J56Aosz{gSGug zp<#Nl*$p!vm;Yh%2s0>QVQ))<{5O>BCok+l;YObSsS^j-?S`3+FZ^L@Kt3QJQ_p_# z!k>EflNSb**-u#<;I;I zwjedcVq|@|*dTj}jen3@NS^`G-vsFeVPtU_8{|%0_QJ$LW`gvCXng8H@-TBDG-|&E zWClbW;x-r?pP3*xfXoHy1=0A_g5+UlLTLKgPsnaie+T3Th`Uhz4-zBfFOXi49k|qi zFbpyWWEVCJG6N!y8vZc7*N FGXR3f>^J}b literal 0 HcmV?d00001 diff --git a/src/qt/icons/superdisk_disabled.ico b/src/qt/icons/superdisk_disabled.ico new file mode 100644 index 0000000000000000000000000000000000000000..e4fa80370055288dad5c35cd132ef343b4dd97b9 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkE%p)&YrkQ_1wYiVd`0EsaWp#L*4{71qJ zAU*$KdJY^o0OG^V`2QcI7Ni42gUkof|Nq0(fn*pMz-BPO)WXby@o(I?0XCC?0iquw z{vT>5$UFup8|)3RT68lYdLa72s=#)F^nx&|{V=z|%z)XCY6eIj2!qT-*bmbSqak`g zz67a-(I7n#46_5|CYV~7UKkBi1EXQ$Fd7toxa44JaM3V*`0U4}7bcF+ewd$NG)xbS z#%DiFZpnfL;5dcRFugDuoBc4oFdC*8M#J>Nb8loo)}An{fI|A&VD|Gx?sz54%uP&p&Q z04Z-6!KDoY!vr>v$v81MPSE{@gAY=Rj^PFq>rbdUq_PK;r(hV8hoNd1U~z+=2IWDB zewaE)ygaUU!!&}nqLh;bjRtOeN%@&}9$GaKDZkUE&T=yEW^ zsAV0fyaQoKod&W1W;QIIh^1j=KFEAf+`=%355WjKKyswmg={v&EKnH>saGIof&2i% zh;kd^S43S3^9Mvd$P}=8Xr2X`2jVw?q@ndbNDSmkuo9>k#19}vAQ_mMurPy(qt-JZ zl_0Yq=7V?;b=dd__ruJF(GWf8?uPLZ=A){E*Z~m(v9Y_KkR7Pu-vIAZApD zVRoXM4da8fR~CJv*~^&_dra6e2ArWeMC(J*lsjVm5NZh`56*$?Bx^uqWs8l(s0 zei#i?hi(UwdXn7_GaE+3%!0WQMuX&W$-&gXi9t0y1cTgx5f-3ugN_$qwiyVy1>|p# zjS%x;enmA0ArH47Eb1`XDyOF~IY!8b05VJt$faTz60cICE4N;G2 zC#pCuJK^@g!xf?rE)EWJh!|>EfdU35j^0j2=cD@{CJ)gMw+rkBG%=k1howP?dUE{_ z(}!>a#5_2kDE~wBz|6v=(fyBIJ;Y9k9E6Rp9zpj%EKG6H#Jd4uHz0Htwc3=#)nkQi$IM^E=KK6bk>;{c)#;syvCWDhC^iGwgGtYCg4#s9d% z9#tIVH-tMt_Q5d7UJ!=)4PX4j)PVFNyOCHv$R13Lh+|^>PpKPV`f<_3_#dVh=3ZiH zm_A%I%pByf#if>3;-vVW+HM$X{wFrw!_*N9FH-yuQw!^JfZ`35ZeTP_97YrC29SQ3 z*|^*blZTlN86da7Gq z!T9KA!qmfPkQpF1qpO4QVdkLINcwU5AEpLo7L1Qh!{pIvLU90cJIpLx?t_^LQ-@B2 z%)sY=TyB7w1JX-K4Iwwc z-TyE-m|hqk7Y(x$CJ*Do^rM>(69=h->4Ayi;={y=rD5j5XmmHg%mMiy#-=w7vioXi zi1?~i3z$Pg9T-=wYG4Qrb#z>{s$oHBC`-VqRZR+^p{xR{Ry8$1#Tg*#7BGc|hKR0O OwQ5ypXlN(}^lAW!4M<)9 literal 0 HcmV?d00001 diff --git a/src/qt/icons/superdisk_image.ico b/src/qt/icons/superdisk_image.ico new file mode 100644 index 0000000000000000000000000000000000000000..b8c854fd2346860c41e95d4d51b864ce76a4e774 GIT binary patch literal 9622 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 diff --git a/src/qt/icons/write_protected.ico b/src/qt/icons/write_protected.ico index f867ab37362e7f17805498b644bff51767006325..f4ba2aa7a69c3e46ea7fb754e945223cb56ebc89 100644 GIT binary patch delta 131 zcmbQ{JsACTNyVNI50^b|NsAg^Z)<<8KD@&2I1qACyJ;~UdLiQxl%x6@>yAn z&2u>_nKnOQDPW%L#H})UiipnSG;ZU~l>(wHn$ScA|O37lh?`$ bY(6XN$-Y@Zw1H!Cl&Z~SWmWUZ4J^C>LG3yy delta 116 zcmbQ{Jj>UL$1A77UAF X9H{ETc7Xl={|4sC3aV0*%~WLo^_eDa diff --git a/src/qt/icons/zip_image.ico b/src/qt/icons/zip_image.ico new file mode 100644 index 0000000000000000000000000000000000000000..82fd868fdf5026584ecdf6a601ad377ddefa294a GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk`=RE?^57LhhtFD6i8(BL8ihfY|W5XbG3F!yv1BK(24={V+G}sOt`azC?$-`)L zKf}a9YSHl@#{d73@dL*H{|_+!|KGs)|33o^Gynh3!2bU~13xNmkpKT5RL+PnK*}3N zaB0K9Fo6x-7QB48Ke41QTyi)K1o<75PKd=&JMo%_oCfi+L3YyFy#FBo;&T(S93J<9 z!x@xLC^Zjc1|0WYp~!t;bD(+RKPV4f`9K}>KxTpR+yDP$n+JCrl3AeeB{%%g%>$VQ ziaTnV2Qmv}Cbi51nFTVF81tZc0-VO6Y>aXfWF80;V;)Ey%x+l5MF~GxoT#oMDtrrrU|?V{Kx!W+a3b4C5*r-G&~PA@O|%7| zFaxDgVlmVmB$*G&PsCu58wQd2;IIaT4>4{BsUgz+U~^$bn^6}TS*au3zbhnfxZFD2$R9SNI^?0Wt?<4?0E`2dM|~p>}}H z1`+to2k8Ns3DO6m(J@RMqz=SJH=7vqVS3Tc2Jt~=!sMZ5gTe`9EF5FFACw1>>PwJ3 z$Q+P)=olmp!XUFj>OeHyU?>A54zH_0W@Eu1GtkWj@j>DsGr{EuG3^GJ+0b$UY%jFU z4l)ZH2Ad7iN38jvumP#>y8;SJycldhR4phRKz@M+3!DOpqpO3t37dOiVj#27^?}6T z1|u<0>_Boq%q(m)$Sf@8BbkcI1ls{J8wq1G7g-Eh52|Sh-v0*X|H$|s1M~kM49x!@ zFfji=0L2Xq%>O}{fr0ry0<-^TVBp7zL2b4J4EEsh1JD?y15!Jz0W@%lZ~`SPyy*iJ z#zbJU?FWT5DF2g-p>Ctdeo#Ip2ZP)^YCm}Vdo=vX3;|I3CnxQJ^pKhUQ1UyS?1$Tl zT%Lm1w6-5)2MUJObx@j?_Ji#O)$>rhV09)kO)L9}u^Z$LTG)@*Zcun2VQSlt*KTOP z1C(!Im~Qri+8oe%Cz#zJnlAPu*$pcOf|I*ywf>vLB=mWCx6fu|Z~m*n}`h9Y`;T#%4D$_Jj0;?19lBHpn~>O$dY3fiNz+ ziM1bQH;e|ENyu)HJV+fryGgMhW;ciinM*7N*?|vZO@E-e2bBLw!5}@z7)QSo-7Prn zM>dNb_E5JUslEgER|)aa!-x|9gW?^@JZKumR))gGz-~m+1BzFuKJ+L@;e*s+(+g^6 zz%Ze-4zdTE86a^K%W!Zo+<@kP3hc*WBc?Fe4Iq25U_$nT%#c)*1l z7?}SsFfjjMU|{~hz`*=~fr0q|0|Rpd5@ujvU}j)oU}s=p;Adc9kY`|EuxDUksE39> OJdGgp8yFbD;~W6?^wHS> literal 0 HcmV?d00001 diff --git a/src/qt/qt_iconindicators.cpp b/src/qt/qt_iconindicators.cpp index 8440af7dc..169910b21 100644 --- a/src/qt/qt_iconindicators.cpp +++ b/src/qt/qt_iconindicators.cpp @@ -14,6 +14,14 @@ getIndicatorIcon(IconIndicator indicator) return QIcon(":/settings/qt/icons/disabled.ico"); case WriteProtected: return QIcon(":/settings/qt/icons/write_protected.ico"); + case New: + return QIcon(":/settings/qt/icons/new.ico"); + case Browse: + return QIcon(":/settings/qt/icons/browse.ico"); + case Eject: + return QIcon(":/settings/qt/icons/eject.ico"); + case Export: + return QIcon(":/settings/qt/icons/eject.ico"); default: return QIcon(); } @@ -30,12 +38,18 @@ getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode, auto painter = QPainter(&iconPixmap); auto indicatorPixmap = getIndicatorIcon((indicator == ReadWriteActive || indicator == WriteProtectedActive) ? Active : indicator).pixmap(size); + if (indicator == WriteProtectedBrowse) + indicatorPixmap = getIndicatorIcon(WriteProtected).pixmap(size); + painter.drawPixmap(0, 0, indicatorPixmap); - if (indicator == ReadWriteActive || indicator == WriteProtectedActive) { + if ((indicator == ReadWriteActive) || (indicator == WriteProtectedActive)) { auto writeIndicatorPixmap = getIndicatorIcon(indicator == WriteProtectedActive ? WriteProtected : WriteActive).pixmap(size); painter.drawPixmap(0, 0, writeIndicatorPixmap); + } else if (indicator == WriteProtectedBrowse) { + auto browseIndicatorPixmap = getIndicatorIcon(Browse).pixmap(size); + painter.drawPixmap(0, 0, browseIndicatorPixmap); } painter.end(); return iconPixmap; -} \ No newline at end of file +} diff --git a/src/qt/qt_iconindicators.hpp b/src/qt/qt_iconindicators.hpp index d2232fc77..c3c8946ad 100644 --- a/src/qt/qt_iconindicators.hpp +++ b/src/qt/qt_iconindicators.hpp @@ -12,6 +12,11 @@ enum IconIndicator { Disabled, WriteProtected, WriteProtectedActive, + New, + Browse, + WriteProtectedBrowse, + Export, + Eject }; QPixmap getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode, IconIndicator indicator); diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index 5a731c188..131b6ad6c 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -617,7 +617,12 @@ MachineStatus::refresh(QStatusBar *sbar) if (cassette_enable) { d->cassette.label = std::make_unique(); d->cassette.setEmpty(QString(cassette_fname).isEmpty()); - d->cassette.setWriteProtected(cassette_ui_writeprot); + if (QString(cassette_fname).isEmpty()) + d->cassette.setWriteProtected(false); + else if (QString(cassette_fname).left(5) == "wp://") + d->cassette.setWriteProtected(true); + else + d->cassette.setWriteProtected(cassette_ui_writeprot); d->cassette.refresh(); connect((ClickableLabel *) d->cassette.label.get(), &ClickableLabel::clicked, [](QPoint pos) { MediaMenu::ptr->cassetteMenu->popup(pos - QPoint(0, MediaMenu::ptr->cassetteMenu->sizeHint().height())); @@ -658,7 +663,12 @@ MachineStatus::refresh(QStatusBar *sbar) } d->fdd[i].label = std::make_unique(); d->fdd[i].setEmpty(QString(floppyfns[i]).isEmpty()); - d->fdd[i].setWriteProtected(ui_writeprot[i]); + if (QString(floppyfns[i]).isEmpty()) + d->fdd[i].setWriteProtected(false); + else if (QString(floppyfns[i]).left(5) == "wp://") + d->fdd[i].setWriteProtected(true); + else + d->fdd[i].setWriteProtected(ui_writeprot[i]); d->fdd[i].setActive(false); d->fdd[i].setWriteActive(false); d->fdd[i].refresh(); @@ -693,7 +703,12 @@ MachineStatus::refresh(QStatusBar *sbar) iterateZIP([this, sbar](int i) { d->zip[i].label = std::make_unique(); d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty()); - d->zip[i].setWriteProtected(zip_drives[i].read_only); + if (QString(zip_drives[i].image_path).isEmpty()) + d->zip[i].setWriteProtected(false); + else if (QString(zip_drives[i].image_path).left(5) == "wp://") + d->zip[i].setWriteProtected(true); + else + d->zip[i].setWriteProtected(zip_drives[i].read_only); d->zip[i].setActive(false); d->zip[i].setWriteActive(false); d->zip[i].refresh(); @@ -711,7 +726,12 @@ MachineStatus::refresh(QStatusBar *sbar) iterateMO([this, sbar](int i) { d->mo[i].label = std::make_unique(); d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty()); - d->mo[i].setWriteProtected(mo_drives[i].read_only); + if (QString(zip_drives[i].image_path).isEmpty()) + d->mo[i].setWriteProtected(false); + else if (QString(zip_drives[i].image_path).left(5) == "wp://") + d->mo[i].setWriteProtected(true); + else + d->mo[i].setWriteProtected(zip_drives[i].read_only); d->mo[i].setActive(false); d->mo[i].setWriteActive(false); d->mo[i].refresh(); diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index 5892c55cd..74d596866 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -21,6 +21,9 @@ #include #include #include "qt_mediahistorymanager.hpp" +#ifdef Q_OS_WINDOWS +#include +#endif extern "C" { #include <86box/timer.h> @@ -205,6 +208,8 @@ MediaHistoryManager::initialDeduplication() break; } deduplicateList(device_history, QVector(1, current_image)); + device_history = removeMissingImages(device_history); + device_history = pathAdjustFull(device_history); // Fill in missing, if any int missing = MAX_PREV_IMAGES - device_history.size(); if (missing) { @@ -213,6 +218,7 @@ MediaHistoryManager::initialDeduplication() } } setHistoryListForDeviceIndex(device_index, device_type, device_history); + serializeImageHistoryType(device_type); } } } @@ -343,24 +349,42 @@ MediaHistoryManager::removeMissingImages(device_index_list_t &device_history) char temp[MAX_IMAGE_PATH_LEN * 2] = { 0 }; - if (path_abs(checked_path.toUtf8().data())) { - if (checked_path.length() > (MAX_IMAGE_PATH_LEN - 1)) - fatal("removeMissingImages(): checked_path.length() > %i\n", MAX_IMAGE_PATH_LEN - 1); - else - snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s", checked_path.toUtf8().constData()); + if (checked_path.left(8) == "ioctl://") { + strncpy(temp, checked_path.toUtf8().data(), sizeof(temp)); + temp[sizeof(temp) - 1] = '\0'; } else { - if ((strlen(usr_path) + strlen(path_get_slash(usr_path)) + checked_path.length()) > (MAX_IMAGE_PATH_LEN - 1)) - fatal("removeMissingImages(): Combined absolute path length > %i\n", MAX_IMAGE_PATH_LEN - 1); + QString path_only; + if (checked_path.left(5) == "wp://") + path_only = checked_path.right(checked_path.length() - 5); else - snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path, - path_get_slash(usr_path), checked_path.toUtf8().constData()); + path_only = checked_path; + + if (path_abs(path_only.toUtf8().data())) { + if (path_only.length() > (MAX_IMAGE_PATH_LEN - 1)) + fatal("removeMissingImages(): path_only.length() > %i\n", MAX_IMAGE_PATH_LEN - 1); + else + snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s", path_only.toUtf8().constData()); + } else { + if ((strlen(usr_path) + strlen(path_get_slash(usr_path)) + path_only.length()) > (MAX_IMAGE_PATH_LEN - 1)) + fatal("removeMissingImages(): Combined absolute path length > %i\n", MAX_IMAGE_PATH_LEN - 1); + else + snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path, + path_get_slash(usr_path), path_only.toUtf8().constData()); + } + path_normalize(temp); } - path_normalize(temp); QString qstr = QString::fromUtf8(temp); QFileInfo new_fi(qstr); - if ((new_fi.filePath().left(8) != "ioctl://") && !new_fi.exists()) { + bool file_exists = new_fi.exists(); + +#ifdef Q_OS_WINDOWS + if (new_fi.filePath().left(8) == "ioctl://") + file_exists = (GetDriveType(new_fi.filePath().right(2).toUtf8().data()) == DRIVE_CDROM); +#endif + + if (!file_exists) { qWarning("Image file %s does not exist - removing from history", qPrintable(new_fi.filePath())); checked_path = ""; } diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index c9d658fb2..cf14d7826 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -69,9 +69,12 @@ extern "C" { #include "qt_deviceconfig.hpp" #include "qt_mediahistorymanager.hpp" #include "qt_mediamenu.hpp" +#include "qt_iconindicators.hpp" std::shared_ptr MediaMenu::ptr; +static QSize pixmap_size(16, 16); + MediaMenu::MediaMenu(QWidget *parent) : QObject(parent) { @@ -86,27 +89,28 @@ MediaMenu::refresh(QMenu *parentMenu) if (MachineStatus::hasCassette()) { cassetteMenu = parentMenu->addMenu(""); - cassetteMenu->addAction(tr("&New image..."), [this]() { cassetteNewImage(); }); + QIcon img_icon = QIcon(":/settings/qt/icons/cassette_image.ico"); + cassetteMenu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, New), tr("&New image..."), [this]() { cassetteNewImage(); }); cassetteMenu->addSeparator(); - cassetteMenu->addAction(tr("&Existing image..."), [this]() { cassetteSelectImage(false); }); - cassetteMenu->addAction(tr("Existing image (&Write-protected)..."), [this]() { cassetteSelectImage(true); }); + cassetteMenu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Existing image..."), [this]() { cassetteSelectImage(false); }); + cassetteMenu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, WriteProtectedBrowse), tr("Existing image (&Write-protected)..."), [this]() { cassetteSelectImage(true); }); cassetteMenu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { cassetteImageHistoryPos[slot] = cassetteMenu->children().count(); - cassetteMenu->addAction(tr("Image %1").arg(slot), [this, slot]() { cassetteMenuSelect(slot); })->setCheckable(false); + cassetteMenu->addAction(img_icon, tr("Image %1").arg(slot), [this, slot]() { cassetteMenuSelect(slot); })->setCheckable(false); } cassetteMenu->addSeparator(); cassetteRecordPos = cassetteMenu->children().count(); - cassetteMenu->addAction(tr("&Record"), [this] { pc_cas_set_mode(cassette, 1); cassetteUpdateMenu(); })->setCheckable(true); + cassetteMenu->addAction(QIcon(":/settings/qt/icons/record.ico"), tr("&Record"), [this] { pc_cas_set_mode(cassette, 1); cassetteUpdateMenu(); })->setCheckable(true); cassettePlayPos = cassetteMenu->children().count(); - cassetteMenu->addAction(tr("&Play"), [this] { pc_cas_set_mode(cassette, 0); cassetteUpdateMenu(); })->setCheckable(true); + cassetteMenu->addAction(QIcon(":/menuicons/qt/icons/run.ico"), tr("&Play"), [this] { pc_cas_set_mode(cassette, 0); cassetteUpdateMenu(); })->setCheckable(true); cassetteRewindPos = cassetteMenu->children().count(); - cassetteMenu->addAction(tr("&Rewind to the beginning"), [] { pc_cas_rewind(cassette); }); + cassetteMenu->addAction(QIcon(":/settings/qt/icons/rewind.ico"), tr("&Rewind to the beginning"), [] { pc_cas_rewind(cassette); }); cassetteFastFwdPos = cassetteMenu->children().count(); - cassetteMenu->addAction(tr("&Fast forward to the end"), [] { pc_cas_append(cassette); }); + cassetteMenu->addAction(QIcon(":/settings/qt/icons/fast_forward.ico"), tr("&Fast forward to the end"), [] { pc_cas_append(cassette); }); cassetteMenu->addSeparator(); cassetteEjectPos = cassetteMenu->children().count(); - cassetteMenu->addAction(tr("E&ject"), [this]() { cassetteEject(); }); + cassetteMenu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this]() { cassetteEject(); }); cassetteUpdateMenu(); } @@ -114,15 +118,16 @@ MediaMenu::refresh(QMenu *parentMenu) if (machine_has_cartridge(machine)) { for (int i = 0; i < 2; i++) { auto *menu = parentMenu->addMenu(""); - menu->addAction(tr("&Image..."), [this, i]() { cartridgeSelectImage(i); }); + QIcon img_icon = QIcon(":/settings/qt/icons/cartridge_image.ico"); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Image..."), [this, i]() { cartridgeSelectImage(i); }); menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { cartridgeImageHistoryPos[slot] = menu->children().count(); - menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { cartridgeMenuSelect(i, slot); })->setCheckable(false); + menu->addAction(img_icon, tr("Image %1").arg(slot), [this, i, slot]() { cartridgeMenuSelect(i, slot); })->setCheckable(false); } menu->addSeparator(); cartridgeEjectPos = menu->children().count(); - menu->addAction(tr("E&ject"), [this, i]() { cartridgeEject(i); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this, i]() { cartridgeEject(i); }); cartridgeMenus[i] = menu; cartridgeUpdateMenu(i); } @@ -131,21 +136,23 @@ MediaMenu::refresh(QMenu *parentMenu) floppyMenus.clear(); MachineStatus::iterateFDD([this, parentMenu](int i) { auto *menu = parentMenu->addMenu(""); - menu->addAction(tr("&New image..."), [this, i]() { floppyNewImage(i); }); + QIcon img_icon = fdd_is_525(i) ? QIcon(":/settings/qt/icons/floppy_525_image.ico") : + QIcon(":/settings/qt/icons/floppy_35_image.ico"); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, New), tr("&New image..."), [this, i]() { floppyNewImage(i); }); menu->addSeparator(); - menu->addAction(tr("&Existing image..."), [this, i]() { floppySelectImage(i, false); }); - menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { floppySelectImage(i, true); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Existing image..."), [this, i]() { floppySelectImage(i, false); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, WriteProtectedBrowse), tr("Existing image (&Write-protected)..."), [this, i]() { floppySelectImage(i, true); }); menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { floppyImageHistoryPos[slot] = menu->children().count(); - menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { floppyMenuSelect(i, slot); })->setCheckable(false); + menu->addAction(img_icon, tr("Image %1").arg(slot), [this, i, slot]() { floppyMenuSelect(i, slot); })->setCheckable(false); } menu->addSeparator(); floppyExportPos = menu->children().count(); - menu->addAction(tr("E&xport to 86F..."), [this, i]() { floppyExportTo86f(i); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Export), tr("E&xport to 86F..."), [this, i]() { floppyExportTo86f(i); }); menu->addSeparator(); floppyEjectPos = menu->children().count(); - menu->addAction(tr("E&ject"), [this, i]() { floppyEject(i); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this, i]() { floppyEject(i); }); floppyMenus[i] = menu; floppyUpdateMenu(i); }); @@ -156,8 +163,8 @@ MediaMenu::refresh(QMenu *parentMenu) cdromMutePos = menu->children().count(); menu->addAction(QIcon(":/settings/qt/icons/cdrom_mute.ico"), tr("&Mute"), [this, i]() { cdromMute(i); })->setCheckable(true); menu->addSeparator(); - menu->addAction(QIcon(":/settings/qt/icons/cdrom_image.ico"), tr("&Image..."), [this, i]() { cdromMount(i, 0, nullptr); })->setCheckable(false); - menu->addAction(QIcon(":/settings/qt/icons/cdrom_folder.ico"), tr("&Folder..."), [this, i]() { cdromMount(i, 1, nullptr); })->setCheckable(false); + menu->addAction(getIconWithIndicator(QIcon(":/settings/qt/icons/cdrom_image.ico"), pixmap_size, QIcon::Normal, Browse), tr("&Image..."), [this, i]() { cdromMount(i, 0, nullptr); })->setCheckable(false); + menu->addAction(getIconWithIndicator(QIcon(":/settings/qt/icons/cdrom_folder.ico"), pixmap_size, QIcon::Normal, Browse), tr("&Folder..."), [this, i]() { cdromMount(i, 1, nullptr); })->setCheckable(false); menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { cdromImageHistoryPos[slot] = menu->children().count(); @@ -183,18 +190,19 @@ MediaMenu::refresh(QMenu *parentMenu) zipMenus.clear(); MachineStatus::iterateZIP([this, parentMenu](int i) { auto *menu = parentMenu->addMenu(""); - menu->addAction(tr("&New image..."), [this, i]() { zipNewImage(i); }); + QIcon img_icon = QIcon(":/settings/qt/icons/zip_image.ico"); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, New), tr("&New image..."), [this, i]() { zipNewImage(i); }); menu->addSeparator(); - menu->addAction(tr("&Existing image..."), [this, i]() { zipSelectImage(i, false); }); - menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { zipSelectImage(i, true); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Existing image..."), [this, i]() { zipSelectImage(i, false); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, WriteProtectedBrowse), tr("Existing image (&Write-protected)..."), [this, i]() { zipSelectImage(i, true); }); menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { zipImageHistoryPos[slot] = menu->children().count(); - menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false); + menu->addAction(img_icon, tr("Image %1").arg(slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false); } menu->addSeparator(); zipEjectPos = menu->children().count(); - menu->addAction(tr("E&ject"), [this, i]() { zipEject(i); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this, i]() { zipEject(i); }); zipMenus[i] = menu; zipUpdateMenu(i); }); @@ -202,18 +210,19 @@ MediaMenu::refresh(QMenu *parentMenu) moMenus.clear(); MachineStatus::iterateMO([this, parentMenu](int i) { auto *menu = parentMenu->addMenu(""); - menu->addAction(tr("&New image..."), [this, i]() { moNewImage(i); }); + QIcon img_icon = QIcon(":/settings/qt/icons/mo_image.ico"); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, New), tr("&New image..."), [this, i]() { moNewImage(i); }); menu->addSeparator(); - menu->addAction(tr("&Existing image..."), [this, i]() { moSelectImage(i, false); }); - menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { moSelectImage(i, true); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Existing image..."), [this, i]() { moSelectImage(i, false); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, WriteProtectedBrowse), tr("Existing image (&Write-protected)..."), [this, i]() { moSelectImage(i, true); }); menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { moImageHistoryPos[slot] = menu->children().count(); - menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { moReload(i, slot); })->setCheckable(false); + menu->addAction(img_icon, tr("Image %1").arg(slot), [this, i, slot]() { moReload(i, slot); })->setCheckable(false); } menu->addSeparator(); moEjectPos = menu->children().count(); - menu->addAction(tr("E&ject"), [this, i]() { moEject(i); }); + menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this, i]() { moEject(i); }); moMenus[i] = menu; moUpdateMenu(i); }); @@ -277,6 +286,12 @@ MediaMenu::cassetteMount(const QString &filename, bool wp) if (!filename.isEmpty()) { QByteArray filenameBytes = filename.toUtf8(); + + if (filename.left(5) == "wp://") + cassette_ui_writeprot = 1; + else if (cassette_ui_writeprot) + filenameBytes = QString::asprintf(R"(wp://%s)", filename.toUtf8().data()).toUtf8(); + strncpy(cassette_fname, filenameBytes.data(), sizeof(cassette_fname) - 1); pc_cas_set_fname(cassette, cassette_fname); } @@ -444,11 +459,18 @@ MediaMenu::floppyMount(int i, const QString &filename, bool wp) ui_writeprot[i] = wp ? 1 : 0; if (!filename.isEmpty()) { QByteArray filenameBytes = filename.toUtf8(); + + if (filename.left(5) == "wp://") + ui_writeprot[i] = 1; + else if (ui_writeprot[i]) + filenameBytes = QString::asprintf(R"(wp://%s)", filename.toUtf8().data()).toUtf8(); + fdd_load(i, filenameBytes.data()); - } + mhm.addImageToHistory(i, ui::MediaType::Floppy, previous_image.filePath(), QString(filenameBytes)); + } else + mhm.addImageToHistory(i, ui::MediaType::Floppy, previous_image.filePath(), filename); ui_sb_update_icon_state(SB_FLOPPY | i, filename.isEmpty() ? 1 : 0); ui_sb_update_icon_wp(SB_FLOPPY | i, ui_writeprot[i]); - mhm.addImageToHistory(i, ui::MediaType::Floppy, previous_image.filePath(), filename); floppyUpdateMenu(i); ui_sb_update_tip(SB_FLOPPY | i); config_save(); @@ -569,7 +591,7 @@ MediaMenu::cdromMount(int i, int dir, const QString &arg) QFileInfo fi(cdrom[i].image_path); if (dir > 1) - filename = QString::asprintf(R"(ioctl://%s)", arg.toStdString().c_str()); + filename = QString::asprintf(R"(ioctl://%s)", arg.toUtf8().data()); else if (dir == 1) filename = QFileDialog::getExistingDirectory(parentWidget); else { @@ -641,8 +663,18 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) menu = cassetteMenu; children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[cassetteImageHistoryPos[slot]]); - fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; + menu_icon = QIcon(":/settings/qt/icons/cassette_image.ico"); + if (fn.left(5) == "wp://") + fi.setFile(fn.right(fn.length() - 5)); + else + fi.setFile(fn); + if (!fi.fileName().isEmpty() && (fn.left(5) == "wp://")) { + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn.right(fn.length() - 5); + imageHistoryUpdatePos->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, WriteProtected)); + } else { + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; + imageHistoryUpdatePos->setIcon(menu_icon); + } break; case ui::MediaType::Cartridge: if (!machine_has_cartridge(machine)) @@ -659,8 +691,19 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) menu = floppyMenus[index]; children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[floppyImageHistoryPos[slot]]); - fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; + menu_icon = fdd_is_525(index) ? QIcon(":/settings/qt/icons/floppy_525_image.ico") : + QIcon(":/settings/qt/icons/floppy_35_image.ico"); + if (fn.left(5) == "wp://") + fi.setFile(fn.right(fn.length() - 5)); + else + fi.setFile(fn); + if (!fi.fileName().isEmpty() && (fn.left(5) == "wp://")) { + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn.right(fn.length() - 5); + imageHistoryUpdatePos->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, WriteProtected)); + } else { + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; + imageHistoryUpdatePos->setIcon(menu_icon); + } break; case ui::MediaType::Optical: if (!cdromMenus.contains(index)) @@ -688,8 +731,18 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) menu = zipMenus[index]; children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[zipImageHistoryPos[slot]]); - fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; + menu_icon = QIcon(":/settings/qt/icons/mo_image.ico"); + if (fn.left(5) == "wp://") + fi.setFile(fn.right(fn.length() - 5)); + else + fi.setFile(fn); + if (!fi.fileName().isEmpty() && (fn.left(5) == "wp://")) { + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn.right(fn.length() - 5); + imageHistoryUpdatePos->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, WriteProtected)); + } else { + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; + imageHistoryUpdatePos->setIcon(menu_icon); + } break; case ui::MediaType::Mo: if (!moMenus.contains(index)) @@ -697,8 +750,18 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) menu = moMenus[index]; children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[moImageHistoryPos[slot]]); - fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; + menu_icon = QIcon(":/settings/qt/icons/mo_image.ico"); + if (fn.left(5) == "wp://") + fi.setFile(fn.right(fn.length() - 5)); + else + fi.setFile(fn); + if (!fi.fileName().isEmpty() && (fn.left(5) == "wp://")) { + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn.right(fn.length() - 5); + imageHistoryUpdatePos->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, WriteProtected)); + } else { + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; + imageHistoryUpdatePos->setIcon(menu_icon); + } break; } @@ -749,9 +812,12 @@ MediaMenu::cdromUpdateMenu(int i) menu_item_name = name.isEmpty() ? QString() : fi.fileName(); name2 = name; - menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico"); + if (name.isEmpty()) + menu_icon = QIcon(":/settings/qt/icons/cdrom.ico"); + else + menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico"); } - ejectMenu->setIcon(menu_icon); + ejectMenu->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, Eject)); ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(menu_item_name)); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) @@ -812,6 +878,12 @@ MediaMenu::zipMount(int i, const QString &filename, bool wp) zip_drives[i].read_only = wp; if (!filename.isEmpty()) { QByteArray filenameBytes = filename.toUtf8(); + + if (filename.left(5) == "wp://") + zip_drives[i].read_only = 1; + else if (zip_drives[i].read_only) + filenameBytes = QString::asprintf(R"(wp://%s)", filename.toUtf8().data()).toUtf8(); + zip_load(dev, filenameBytes.data(), 1); /* Signal media change to the emulated machine. */ @@ -951,6 +1023,12 @@ MediaMenu::moMount(int i, const QString &filename, bool wp) mo_drives[i].read_only = wp; if (!filename.isEmpty()) { QByteArray filenameBytes = filename.toUtf8(); + + if (filename.left(5) == "wp://") + mo_drives[i].read_only = 1; + else if (mo_drives[i].read_only) + filenameBytes = QString::asprintf(R"(wp://%s)", filename.toUtf8().data()).toUtf8(); + mo_load(dev, filenameBytes.data(), 1); /* Signal media change to the emulated machine. */ diff --git a/src/qt_resources.qrc b/src/qt_resources.qrc index 9291892b5..f0ea8d945 100644 --- a/src/qt_resources.qrc +++ b/src/qt_resources.qrc @@ -1,6 +1,9 @@ + qt/icons/browse.ico qt/icons/cartridge.ico + qt/icons/cartridge_image.ico + qt/icons/cassette_image.ico qt/icons/cassette.ico qt/icons/cdrom.ico qt/icons/cdrom_disabled.ico @@ -10,22 +13,35 @@ qt/icons/cdrom_folder.ico qt/icons/cdrom_host.ico qt/icons/display.ico + qt/icons/eject.ico + qt/icons/export.ico + qt/icons/fast_forward.ico qt/icons/floppy_35.ico + qt/icons/floppy_35_image.ico qt/icons/floppy_525.ico + qt/icons/floppy_525_image.ico qt/icons/floppy_and_cdrom_drives.ico qt/icons/floppy_disabled.ico qt/icons/hard_disk.ico qt/icons/input_devices.ico qt/icons/machine.ico qt/icons/mo.ico + qt/icons/mo_image.ico qt/icons/mo_disabled.ico qt/icons/network.ico + qt/icons/new.ico qt/icons/other_peripherals.ico qt/icons/other_removable_devices.ico qt/icons/ports.ico + qt/icons/record.ico + qt/icons/rewind.ico qt/icons/sound.ico qt/icons/storage_controllers.ico + qt/icons/superdisk.ico + qt/icons/superdisk_image.ico + qt/icons/superdisk_disabled.ico qt/icons/zip.ico + qt/icons/zip_image.ico qt/icons/zip_disabled.ico qt/icons/active.ico qt/icons/write_protected.ico