Merge branch '86Box:master' into NL_translation_update
This commit is contained in:
63
src/86box.c
63
src/86box.c
@@ -161,7 +161,7 @@ int window_remember;
|
||||
int vid_resize; /* (C) allow resizing */
|
||||
int invert_display = 0; /* (C) invert the display */
|
||||
int suppress_overscan = 0; /* (C) suppress overscans */
|
||||
int lang_id = 0; /* (C) language id */
|
||||
int lang_id = 0; /* (G) language id */
|
||||
int scale = 0; /* (C) screen scale factor */
|
||||
int dpi_scale = 0; /* (C) DPI scaling of the emulated
|
||||
screen */
|
||||
@@ -199,13 +199,13 @@ int cpu = 0; /* (C) cpu typ
|
||||
int fpu_type = 0; /* (C) fpu type */
|
||||
int fpu_softfloat = 0; /* (C) fpu uses softfloat */
|
||||
int time_sync = 0; /* (C) enable time sync */
|
||||
int confirm_reset = 1; /* (C) enable reset confirmation */
|
||||
int confirm_exit = 1; /* (C) enable exit confirmation */
|
||||
int confirm_save = 1; /* (C) enable save confirmation */
|
||||
int confirm_reset = 1; /* (G) enable reset confirmation */
|
||||
int confirm_exit = 1; /* (G) enable exit confirmation */
|
||||
int confirm_save = 1; /* (G) enable save confirmation */
|
||||
int enable_discord = 0; /* (C) enable Discord integration */
|
||||
int pit_mode = -1; /* (C) force setting PIT mode */
|
||||
int fm_driver = 0; /* (C) select FM sound driver */
|
||||
int open_dir_usr_path = 0; /* (C) default file open dialog directory
|
||||
int open_dir_usr_path = 0; /* (G) default file open dialog directory
|
||||
of usr_path */
|
||||
int video_fullscreen_scale_maximized = 0; /* (C) Whether fullscreen scaling settings
|
||||
also apply when maximized. */
|
||||
@@ -215,7 +215,7 @@ int hook_enabled = 1; /* (C) Keyboar
|
||||
int test_mode = 0; /* (C) Test mode */
|
||||
char uuid[MAX_UUID_LEN] = { '\0' }; /* (C) UUID or machine identifier */
|
||||
int sound_muted = 0; /* (C) Is sound muted? */
|
||||
int inhibit_multimedia_keys; /* (C) Inhibit multimedia keys on Windows. */
|
||||
int inhibit_multimedia_keys; /* (G) Inhibit multimedia keys on Windows. */
|
||||
int force_10ms; /* (C) Force 10ms CPU frame intervals. */
|
||||
|
||||
int other_ide_present = 0; /* IDE controllers from non-IDE cards are
|
||||
@@ -232,27 +232,27 @@ struct accelKey acc_keys[NUM_ACCELS];
|
||||
struct accelKey def_acc_keys[NUM_ACCELS] = {
|
||||
{ .name="send_ctrl_alt_del", .desc="Send Control+Alt+Del",
|
||||
.seq="Ctrl+F12" },
|
||||
|
||||
{ .name="send_ctrl_alt_esc", .desc="Send Control+Alt+Escape",
|
||||
|
||||
{ .name="send_ctrl_alt_esc", .desc="Send Control+Alt+Escape",
|
||||
.seq="Ctrl+F10" },
|
||||
|
||||
{ .name="fullscreen", .desc="Toggle fullscreen",
|
||||
|
||||
{ .name="fullscreen", .desc="Toggle fullscreen",
|
||||
.seq="Ctrl+Alt+PgUp" },
|
||||
|
||||
{ .name="screenshot", .desc="Screenshot",
|
||||
|
||||
{ .name="screenshot", .desc="Screenshot",
|
||||
.seq="Ctrl+F11" },
|
||||
|
||||
{ .name="release_mouse", .desc="Release mouse pointer",
|
||||
|
||||
{ .name="release_mouse", .desc="Release mouse pointer",
|
||||
.seq="Ctrl+End" },
|
||||
|
||||
{ .name="hard_reset", .desc="Hard reset",
|
||||
|
||||
{ .name="hard_reset", .desc="Hard reset",
|
||||
.seq="Ctrl+Alt+F12" },
|
||||
|
||||
{ .name="pause", .desc="Toggle pause",
|
||||
|
||||
{ .name="pause", .desc="Toggle pause",
|
||||
.seq="Ctrl+Alt+F1" },
|
||||
|
||||
{ .name="mute", .desc="Toggle mute",
|
||||
.seq="Ctrl+Alt+M" }
|
||||
|
||||
{ .name="mute", .desc="Toggle mute",
|
||||
.seq="Ctrl+Alt+M" }
|
||||
};
|
||||
|
||||
char vmm_path[1024] = { '\0'}; /* TEMPORARY - VM manager path to scan for VMs */
|
||||
@@ -276,6 +276,7 @@ extern double exp_pow_table[0x800];
|
||||
char exe_path[2048]; /* path (dir) of executable */
|
||||
char usr_path[1024]; /* path (dir) of user data */
|
||||
char cfg_path[1024]; /* full path of config file */
|
||||
char global_cfg_path[1024]; /* full path of config file */
|
||||
FILE *stdlog = NULL; /* file to log output to */
|
||||
#if 0
|
||||
int scrnsz_x = SCREEN_RES_X; /* current screen size, X */
|
||||
@@ -313,7 +314,7 @@ static int suppr_seen = 1;
|
||||
void pclog_ensure_stdlog_open(void);
|
||||
#endif
|
||||
|
||||
/*
|
||||
/*
|
||||
Ensures STDLOG is open for pclog_ex and pclog_ex_cyclic
|
||||
*/
|
||||
void pclog_ensure_stdlog_open(void)
|
||||
@@ -617,10 +618,11 @@ pc_show_usage(char *s)
|
||||
#ifdef USE_INSTRUMENT
|
||||
"-J or --instrument name\t- set 'name' to be the profiling instrument\n"
|
||||
#endif
|
||||
"-L or --logfile pat\t\t- set 'path' to be the logfile\n"
|
||||
"-L or --logfile path\t\t- set 'path' to be the logfile\n"
|
||||
"-M or --missing\t\t- dump missing machines and video cards\n"
|
||||
"-N or --noconfirm\t\t- do not ask for confirmation on quit\n"
|
||||
"-P or --vmpath path\t\t- set 'path' to be root for vm\n"
|
||||
"-O or --global path\t\t- set 'path' to be global config file\n"
|
||||
"-R or --rompath path\t\t- set 'path' to be ROM path\n"
|
||||
#ifndef USE_SDL_UI
|
||||
"-S or --settings\t\t\t- show only the settings dialog\n"
|
||||
@@ -660,6 +662,7 @@ pc_init(int argc, char *argv[])
|
||||
char *ppath = NULL;
|
||||
char *rpath = NULL;
|
||||
char *cfg = NULL;
|
||||
char *global = NULL;
|
||||
char *p;
|
||||
char temp[2048];
|
||||
char *fn[FDD_NUM] = { NULL };
|
||||
@@ -779,6 +782,11 @@ usage:
|
||||
#ifdef DEPRECATE_USAGE
|
||||
deprecated = 0;
|
||||
#endif
|
||||
} else if (!strcasecmp(argv[c], "--global") || !strcasecmp(argv[c], "-O")) {
|
||||
if ((c + 1) == argc || plat_dir_check(argv[c + 1]))
|
||||
goto usage;
|
||||
|
||||
global = argv[++c];
|
||||
} else if (!strcasecmp(argv[c], "--image") || !strcasecmp(argv[c], "-I")) {
|
||||
if ((c + 1) == argc)
|
||||
goto usage;
|
||||
@@ -1010,6 +1018,14 @@ usage:
|
||||
/* At this point, we can safely create the full path name. */
|
||||
path_append_filename(cfg_path, usr_path, p);
|
||||
|
||||
/* Build the global configuration file path. */
|
||||
if (global == NULL) {
|
||||
plat_get_global_config_dir(global_cfg_path, sizeof(global_cfg_path));
|
||||
path_append_filename(global_cfg_path, global_cfg_path, CONFIG_FILE);
|
||||
} else {
|
||||
strncpy(global_cfg_path, global, sizeof(global_cfg_path) - 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the current directory's name
|
||||
*
|
||||
@@ -1051,6 +1067,7 @@ usage:
|
||||
pclog("# ROM path: %s\n", rom_path->path);
|
||||
}
|
||||
|
||||
pclog("# Global configuration file: %s\n", global_cfg_path);
|
||||
pclog("# Configuration file: %s\n#\n\n", cfg_path);
|
||||
if (strlen(vmm_path) != 0) {
|
||||
vmm_enabled = 1;
|
||||
|
||||
164
src/config.c
164
src/config.c
@@ -90,6 +90,7 @@ static int cy;
|
||||
static int cw;
|
||||
static int ch;
|
||||
static ini_t config;
|
||||
static ini_t global;
|
||||
|
||||
#ifdef ENABLE_CONFIG_LOG
|
||||
int config_do_log = ENABLE_CONFIG_LOG;
|
||||
@@ -109,6 +110,33 @@ config_log(const char *fmt, ...)
|
||||
# define config_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
/* Load global configuration */
|
||||
static void
|
||||
load_global(void)
|
||||
{
|
||||
ini_section_t cat = ini_find_section(global, "");
|
||||
char *p;
|
||||
|
||||
p = ini_section_get_string(cat, "language", NULL);
|
||||
if (p != NULL)
|
||||
lang_id = plat_language_code(p);
|
||||
else
|
||||
lang_id = plat_language_code(DEFAULT_LANGUAGE);
|
||||
|
||||
open_dir_usr_path = ini_section_get_int(cat, "open_dir_usr_path", 0);
|
||||
|
||||
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);
|
||||
|
||||
inhibit_multimedia_keys = ini_section_get_int(cat, "inhibit_multimedia_keys", 0);
|
||||
|
||||
mouse_sensitivity = ini_section_get_double(cat, "mouse_sensitivity", 1.0);
|
||||
if (mouse_sensitivity < 0.1)
|
||||
mouse_sensitivity = 0.1;
|
||||
else if (mouse_sensitivity > 2.0)
|
||||
mouse_sensitivity = 2.0;
|
||||
}
|
||||
|
||||
/* Load "General" section. */
|
||||
static void
|
||||
@@ -132,8 +160,6 @@ load_general(void)
|
||||
|
||||
video_filter_method = ini_section_get_int(cat, "video_filter_method", 1);
|
||||
|
||||
inhibit_multimedia_keys = ini_section_get_int(cat, "inhibit_multimedia_keys", 0);
|
||||
|
||||
force_43 = !!ini_section_get_int(cat, "force_43", 0);
|
||||
scale = ini_section_get_int(cat, "scale", 1);
|
||||
if (scale > 9)
|
||||
@@ -181,26 +207,8 @@ load_general(void)
|
||||
hide_tool_bar = ini_section_get_int(cat, "hide_tool_bar", 0);
|
||||
sound_muted = ini_section_get_int(cat, "sound_muted", 0);
|
||||
|
||||
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);
|
||||
|
||||
p = ini_section_get_string(cat, "language", NULL);
|
||||
if (p != NULL)
|
||||
lang_id = plat_language_code(p);
|
||||
else
|
||||
lang_id = plat_language_code(DEFAULT_LANGUAGE);
|
||||
|
||||
mouse_sensitivity = ini_section_get_double(cat, "mouse_sensitivity", 1.0);
|
||||
if (mouse_sensitivity < 0.1)
|
||||
mouse_sensitivity = 0.1;
|
||||
else if (mouse_sensitivity > 2.0)
|
||||
mouse_sensitivity = 2.0;
|
||||
|
||||
enable_discord = !!ini_section_get_int(cat, "enable_discord", 0);
|
||||
|
||||
open_dir_usr_path = ini_section_get_int(cat, "open_dir_usr_path", 0);
|
||||
|
||||
video_framerate = ini_section_get_int(cat, "video_gl_framerate", -1);
|
||||
video_vsync = ini_section_get_int(cat, "video_gl_vsync", 0);
|
||||
|
||||
@@ -1989,7 +1997,21 @@ config_load(void)
|
||||
int i;
|
||||
ini_section_t c;
|
||||
|
||||
config_log("Loading config file '%s'..\n", cfg_path);
|
||||
config_log("Loading global config file '%s'...\n", global_cfg_path);
|
||||
|
||||
global = ini_read(global_cfg_path);
|
||||
|
||||
if (global == NULL) {
|
||||
global = ini_new();
|
||||
|
||||
lang_id = plat_language_code(DEFAULT_LANGUAGE);
|
||||
|
||||
config_log("Global config file not present or invalid!\n");
|
||||
} else {
|
||||
load_global();
|
||||
}
|
||||
|
||||
config_log("Loading VM config file '%s'...\n", cfg_path);
|
||||
|
||||
memset(hdd, 0, sizeof(hard_disk_t));
|
||||
memset(cdrom, 0, sizeof(cdrom_t) * CDROM_NUM);
|
||||
@@ -2001,8 +2023,7 @@ config_load(void)
|
||||
config = ini_read(cfg_path);
|
||||
|
||||
if (config == NULL) {
|
||||
config = ini_new();
|
||||
config_changed = 1;
|
||||
config = ini_new();
|
||||
|
||||
cpu_f = (cpu_family_t *) &cpu_families[0];
|
||||
cpu = 0;
|
||||
@@ -2067,9 +2088,7 @@ config_load(void)
|
||||
cassette_pcm = 0;
|
||||
cassette_ui_writeprot = 0;
|
||||
|
||||
lang_id = plat_language_code(DEFAULT_LANGUAGE);
|
||||
|
||||
config_log("Config file not present or invalid!\n");
|
||||
config_log("VM config file not present or invalid!\n");
|
||||
} else {
|
||||
load_general(); /* General */
|
||||
for (i = 0; i < MONITORS_NUM; i++)
|
||||
@@ -2107,22 +2126,66 @@ config_load(void)
|
||||
if (c != NULL)
|
||||
ini_rename_section(c, "3Dfx Voodoo Banshee");
|
||||
|
||||
/* Mark the configuration as changed. */
|
||||
config_changed = 1;
|
||||
|
||||
config_log("Config loaded.\n\n");
|
||||
config_log("VM config loaded.\n\n");
|
||||
}
|
||||
|
||||
/* Mark the configuration as changed. */
|
||||
config_changed = 1;
|
||||
|
||||
video_copy = (video_grayscale || invert_display) ? video_transform_copy : memcpy;
|
||||
}
|
||||
|
||||
/* Save global configuration */
|
||||
static void
|
||||
save_global(void)
|
||||
{
|
||||
ini_section_t cat = ini_find_or_create_section(global, "");
|
||||
char buffer[512] = { 0 };
|
||||
|
||||
if (lang_id == plat_language_code(DEFAULT_LANGUAGE))
|
||||
ini_section_delete_var(cat, "language");
|
||||
else {
|
||||
plat_language_code_r(lang_id, buffer, 511);
|
||||
ini_section_set_string(cat, "language", buffer);
|
||||
}
|
||||
|
||||
if (open_dir_usr_path)
|
||||
ini_section_set_int(cat, "open_dir_usr_path", open_dir_usr_path);
|
||||
else
|
||||
ini_section_delete_var(cat, "open_dir_usr_path");
|
||||
|
||||
if (confirm_reset != 1)
|
||||
ini_section_set_int(cat, "confirm_reset", confirm_reset);
|
||||
else
|
||||
ini_section_delete_var(cat, "confirm_reset");
|
||||
|
||||
if (confirm_exit != 1)
|
||||
ini_section_set_int(cat, "confirm_exit", confirm_exit);
|
||||
else
|
||||
ini_section_delete_var(cat, "confirm_exit");
|
||||
|
||||
if (confirm_save != 1)
|
||||
ini_section_set_int(cat, "confirm_save", confirm_save);
|
||||
else
|
||||
ini_section_delete_var(cat, "confirm_save");
|
||||
|
||||
if (inhibit_multimedia_keys == 1)
|
||||
ini_section_set_int(cat, "inhibit_multimedia_keys", inhibit_multimedia_keys);
|
||||
else
|
||||
ini_section_delete_var(cat, "inhibit_multimedia_keys");
|
||||
|
||||
if (mouse_sensitivity != 1.0)
|
||||
ini_section_set_double(cat, "mouse_sensitivity", mouse_sensitivity);
|
||||
else
|
||||
ini_section_delete_var(cat, "mouse_sensitivity");
|
||||
}
|
||||
|
||||
/* Save "General" section. */
|
||||
static void
|
||||
save_general(void)
|
||||
{
|
||||
ini_section_t cat = ini_find_or_create_section(config, "General");
|
||||
char temp[512];
|
||||
char buffer[512] = { 0 };
|
||||
|
||||
const char *va_name;
|
||||
|
||||
@@ -2130,10 +2193,6 @@ save_general(void)
|
||||
if (force_10ms == 0)
|
||||
ini_section_delete_var(cat, "force_10ms");
|
||||
|
||||
ini_section_set_int(cat, "inhibit_multimedia_keys", inhibit_multimedia_keys);
|
||||
if (inhibit_multimedia_keys == 0)
|
||||
ini_section_delete_var(cat, "inhibit_multimedia_keys");
|
||||
|
||||
ini_section_set_int(cat, "sound_muted", sound_muted);
|
||||
if (sound_muted == 0)
|
||||
ini_section_delete_var(cat, "sound_muted");
|
||||
@@ -2234,43 +2293,11 @@ save_general(void)
|
||||
else
|
||||
ini_section_delete_var(cat, "hide_tool_bar");
|
||||
|
||||
if (confirm_reset != 1)
|
||||
ini_section_set_int(cat, "confirm_reset", confirm_reset);
|
||||
else
|
||||
ini_section_delete_var(cat, "confirm_reset");
|
||||
|
||||
if (confirm_exit != 1)
|
||||
ini_section_set_int(cat, "confirm_exit", confirm_exit);
|
||||
else
|
||||
ini_section_delete_var(cat, "confirm_exit");
|
||||
|
||||
if (confirm_save != 1)
|
||||
ini_section_set_int(cat, "confirm_save", confirm_save);
|
||||
else
|
||||
ini_section_delete_var(cat, "confirm_save");
|
||||
|
||||
if (mouse_sensitivity != 1.0)
|
||||
ini_section_set_double(cat, "mouse_sensitivity", mouse_sensitivity);
|
||||
else
|
||||
ini_section_delete_var(cat, "mouse_sensitivity");
|
||||
|
||||
if (lang_id == plat_language_code(DEFAULT_LANGUAGE))
|
||||
ini_section_delete_var(cat, "language");
|
||||
else {
|
||||
plat_language_code_r(lang_id, buffer, 511);
|
||||
ini_section_set_string(cat, "language", buffer);
|
||||
}
|
||||
|
||||
if (enable_discord)
|
||||
ini_section_set_int(cat, "enable_discord", enable_discord);
|
||||
else
|
||||
ini_section_delete_var(cat, "enable_discord");
|
||||
|
||||
if (open_dir_usr_path)
|
||||
ini_section_set_int(cat, "open_dir_usr_path", open_dir_usr_path);
|
||||
else
|
||||
ini_section_delete_var(cat, "open_dir_usr_path");
|
||||
|
||||
if (video_framerate != -1)
|
||||
ini_section_set_int(cat, "video_gl_framerate", video_framerate);
|
||||
else
|
||||
@@ -3377,6 +3404,9 @@ save_other_removable_devices(void)
|
||||
void
|
||||
config_save(void)
|
||||
{
|
||||
save_global(); /* Global */
|
||||
ini_write(global, global_cfg_path);
|
||||
|
||||
save_general(); /* General */
|
||||
for (uint8_t i = 0; i < MONITORS_NUM; i++)
|
||||
save_monitor(i); /* Monitors */
|
||||
|
||||
@@ -181,6 +181,7 @@ extern int hook_enabled; /* (C) Keyboard hook is enabled */
|
||||
extern char exe_path[2048]; /* path (dir) of executable */
|
||||
extern char usr_path[1024]; /* path (dir) of user data */
|
||||
extern char cfg_path[1024]; /* full path of config file */
|
||||
extern char global_cfg_path[1024]; /* full path of global config file */
|
||||
extern int open_dir_usr_path; /* default file open dialog directory of usr_path */
|
||||
extern char uuid[MAX_UUID_LEN]; /* UUID or machine identifier */
|
||||
extern char vmm_path[1024]; /* VM Manager path to scan (temporary) */
|
||||
|
||||
@@ -143,8 +143,8 @@ extern int plat_getcwd(char *bufp, int max);
|
||||
extern int plat_chdir(char *path);
|
||||
extern void plat_tempfile(char *bufp, char *prefix, char *suffix);
|
||||
extern void plat_get_exe_name(char *s, int size);
|
||||
extern void plat_get_global_config_dir(char *outbuf, uint8_t len);
|
||||
extern void plat_get_global_data_dir(char *outbuf, uint8_t len);
|
||||
extern void plat_get_global_config_dir(char *outbuf, size_t len);
|
||||
extern void plat_get_global_data_dir(char *outbuf, size_t len);
|
||||
extern void plat_get_temp_dir(char *outbuf, uint8_t len);
|
||||
extern void plat_init_rom_paths(void);
|
||||
extern int plat_dir_check(char *path);
|
||||
|
||||
@@ -62,6 +62,26 @@ if(APPLE AND USE_QT6)
|
||||
find_package(Qt6Gui/Qt6QICNSPlugin REQUIRED)
|
||||
endif()
|
||||
|
||||
if (UNIX)
|
||||
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)
|
||||
if (NOT VDE_LIB)
|
||||
message(WARNING "Could not find VDE. The library will not be bundled and any related features will be disabled.")
|
||||
else()
|
||||
add_compile_definitions(HAS_VDE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
if (UNIX AND NOT APPLE) # Support for TAP on Linux and BSD, supposedly.
|
||||
find_path(HAS_TAP "linux/if_tun.h" PATHS ${TAP_INCLUDE_DIR} "/usr/include /usr/local/include" "/opt/homebrew/include" )
|
||||
if(HAS_TAP)
|
||||
add_compile_definitions(HAS_TAP)
|
||||
else()
|
||||
message(WARNING "TAP support not available. Are you on some BSD?")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_library(plat STATIC
|
||||
qt.c
|
||||
qt_main.cpp
|
||||
|
||||
@@ -662,7 +662,7 @@ plat_chdir(char *path)
|
||||
}
|
||||
|
||||
void
|
||||
plat_get_global_config_dir(char *outbuf, const uint8_t len)
|
||||
plat_get_global_config_dir(char *outbuf, const size_t len)
|
||||
{
|
||||
const auto dir = QDir(QStandardPaths::standardLocations(QStandardPaths::AppConfigLocation)[0]);
|
||||
if (!dir.exists()) {
|
||||
@@ -674,7 +674,7 @@ plat_get_global_config_dir(char *outbuf, const uint8_t len)
|
||||
}
|
||||
|
||||
void
|
||||
plat_get_global_data_dir(char *outbuf, const uint8_t len)
|
||||
plat_get_global_data_dir(char *outbuf, const size_t len)
|
||||
{
|
||||
const auto dir = QDir(QStandardPaths::standardLocations(QStandardPaths::AppDataLocation)[0]);
|
||||
if (!dir.exists()) {
|
||||
|
||||
@@ -110,7 +110,7 @@ IntroPage(QWidget *parent)
|
||||
|
||||
newConfigRadioButton = new QRadioButton(tr("New configuration"));
|
||||
// auto newDescription = new QLabel(tr("Choose this option to start with a fresh configuration."));
|
||||
existingConfigRadioButton = new QRadioButton(tr("Use existing configuraion"));
|
||||
existingConfigRadioButton = new QRadioButton(tr("Use existing configuration"));
|
||||
// auto existingDescription = new QLabel(tr("Use this option if you'd like to paste in the configuration file from an existing system."));
|
||||
newConfigRadioButton->setChecked(true);
|
||||
|
||||
@@ -223,6 +223,7 @@ WithExistingConfigPage::isComplete() const
|
||||
NameAndLocationPage::
|
||||
NameAndLocationPage(QWidget *parent)
|
||||
{
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
setTitle(tr("System name and location"));
|
||||
|
||||
#if defined(_WIN32)
|
||||
@@ -234,6 +235,10 @@ NameAndLocationPage(QWidget *parent)
|
||||
#endif
|
||||
|
||||
const auto topLabel = new QLabel(tr("Enter the name of the system and choose the location"));
|
||||
#else
|
||||
setTitle(tr("System name"));
|
||||
const auto topLabel = new QLabel(tr("Enter the name of the system"));
|
||||
#endif
|
||||
topLabel->setWordWrap(true);
|
||||
|
||||
const auto chooseDirectoryButton = new QPushButton();
|
||||
@@ -246,6 +251,7 @@ NameAndLocationPage(QWidget *parent)
|
||||
registerField("systemName*", systemName);
|
||||
systemNameValidation = new QLabel();
|
||||
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
const auto systemLocationLabel = new QLabel(tr("System Location"));
|
||||
systemLocation = new QLineEdit();
|
||||
// TODO: FIXME: This is using the CLI arg and needs to instead use a proper variable
|
||||
@@ -253,6 +259,13 @@ NameAndLocationPage(QWidget *parent)
|
||||
registerField("systemLocation*", systemLocation);
|
||||
systemLocationValidation = new QLabel();
|
||||
systemLocationValidation->setWordWrap(true);
|
||||
#endif
|
||||
|
||||
const auto displayNameLabel = new QLabel(tr("Display Name (optional)"));
|
||||
displayName = new QLineEdit();
|
||||
// Special event filter to override enter key
|
||||
displayName->installEventFilter(this);
|
||||
registerField("displayName*", displayName);
|
||||
|
||||
const auto layout = new QGridLayout();
|
||||
layout->addWidget(topLabel, 0, 0, 1, -1);
|
||||
@@ -265,6 +278,7 @@ NameAndLocationPage(QWidget *parent)
|
||||
// Set height on validation because it may not always be present
|
||||
layout->setRowMinimumHeight(3, 20);
|
||||
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
// Another spacer
|
||||
layout->setRowMinimumHeight(4, 20);
|
||||
layout->addWidget(systemLocationLabel, 5, 0);
|
||||
@@ -273,11 +287,18 @@ NameAndLocationPage(QWidget *parent)
|
||||
// Validation text
|
||||
layout->addWidget(systemLocationValidation, 6, 0, 1, -1);
|
||||
layout->setRowMinimumHeight(6, 20);
|
||||
#endif
|
||||
|
||||
// Another spacer
|
||||
layout->setRowMinimumHeight(7, 20);
|
||||
layout->addWidget(displayNameLabel, 8, 0);
|
||||
layout->addWidget(displayName, 8, 1);
|
||||
|
||||
setLayout(layout);
|
||||
|
||||
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
connect(chooseDirectoryButton, &QPushButton::clicked, this, &NameAndLocationPage::chooseDirectoryLocation);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
@@ -286,6 +307,7 @@ NameAndLocationPage::nextId() const
|
||||
return VMManagerAddMachine::Page_Conclusion;
|
||||
}
|
||||
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
void
|
||||
NameAndLocationPage::chooseDirectoryLocation()
|
||||
{
|
||||
@@ -294,23 +316,31 @@ NameAndLocationPage::chooseDirectoryLocation()
|
||||
systemLocation->setText(QDir::toNativeSeparators(directory));
|
||||
emit completeChanged();
|
||||
}
|
||||
#endif
|
||||
bool
|
||||
NameAndLocationPage::isComplete() const
|
||||
{
|
||||
bool nameValid = false;
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
bool locationValid = false;
|
||||
#endif
|
||||
// return true if complete
|
||||
if (systemName->text().isEmpty()) {
|
||||
systemNameValidation->setText(tr("Please enter a system name"));
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
} else if (!systemName->text().contains(dirValidate)) {
|
||||
systemNameValidation->setText(tr("System name cannot contain certain characters"));
|
||||
} else if (const QDir newDir = QDir::cleanPath(systemLocation->text() + "/" + systemName->text()); newDir.exists()) {
|
||||
#else
|
||||
} else if (const QDir newDir = QDir::cleanPath(QString(vmm_path) + "/" + systemName->text()); newDir.exists()) {
|
||||
#endif
|
||||
systemNameValidation->setText(tr("System name already exists"));
|
||||
} else {
|
||||
systemNameValidation->clear();
|
||||
nameValid = true;
|
||||
}
|
||||
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
if (systemLocation->text().isEmpty()) {
|
||||
systemLocationValidation->setText(tr("Please enter a directory for the system"));
|
||||
} else if (const auto dir = QDir(systemLocation->text()); !dir.exists()) {
|
||||
@@ -321,6 +351,9 @@ NameAndLocationPage::isComplete() const
|
||||
}
|
||||
|
||||
return nameValid && locationValid;
|
||||
#else
|
||||
return nameValid;
|
||||
#endif
|
||||
}
|
||||
bool
|
||||
NameAndLocationPage::eventFilter(QObject *watched, QEvent *event)
|
||||
@@ -354,17 +387,27 @@ ConclusionPage(QWidget *parent)
|
||||
const auto systemNameLabel = new QLabel(tr("System name:"));
|
||||
systemNameLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
|
||||
systemName = new QLabel();
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
const auto systemLocationLabel = new QLabel(tr("System location:"));
|
||||
systemLocationLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
|
||||
systemLocation = new QLabel();
|
||||
#endif
|
||||
|
||||
displayNameLabel = new QLabel(tr("Display name:"));
|
||||
displayNameLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
|
||||
displayName = new QLabel();
|
||||
|
||||
const auto layout = new QGridLayout();
|
||||
layout->addWidget(topLabel, 0, 0, 1, -1);
|
||||
layout->setRowMinimumHeight(1, 20);
|
||||
layout->addWidget(systemNameLabel, 2, 0);
|
||||
layout->addWidget(systemName, 2, 1);
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
layout->addWidget(systemLocationLabel, 3, 0);
|
||||
layout->addWidget(systemLocation, 3, 1);
|
||||
#endif
|
||||
layout->addWidget(displayNameLabel, 4, 0);
|
||||
layout->addWidget(displayName, 4, 1);
|
||||
|
||||
setLayout(layout);
|
||||
}
|
||||
@@ -373,10 +416,21 @@ ConclusionPage(QWidget *parent)
|
||||
void
|
||||
ConclusionPage::initializePage()
|
||||
{
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
const auto finalPath = QDir::cleanPath(field("systemLocation").toString() + "/" + field("systemName").toString());
|
||||
const auto nativePath = QDir::toNativeSeparators(finalPath);
|
||||
#endif
|
||||
const auto systemNameDisplay = field("systemName").toString();
|
||||
const auto displayNameDisplay = field("displayName").toString();
|
||||
|
||||
systemName->setText(systemNameDisplay);
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
systemLocation->setText(nativePath);
|
||||
#endif
|
||||
if (!displayNameDisplay.isEmpty())
|
||||
displayName->setText(displayNameDisplay);
|
||||
else {
|
||||
displayNameLabel->setVisible(false);
|
||||
displayName->setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,12 +90,17 @@ public:
|
||||
[[nodiscard]] int nextId() const override;
|
||||
private:
|
||||
QLineEdit *systemName;
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
QLineEdit *systemLocation;
|
||||
#endif
|
||||
QLineEdit *displayName;
|
||||
QLabel *systemNameValidation;
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
QLabel *systemLocationValidation;
|
||||
QRegularExpression dirValidate;
|
||||
private slots:
|
||||
void chooseDirectoryLocation();
|
||||
#endif
|
||||
protected:
|
||||
[[nodiscard]] bool isComplete() const override;
|
||||
bool eventFilter(QObject *watched, QEvent *event) override;
|
||||
@@ -109,7 +114,11 @@ public:
|
||||
private:
|
||||
QLabel *topLabel;
|
||||
QLabel *systemName;
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
QLabel *systemLocation;
|
||||
#endif
|
||||
QLabel *displayNameLabel;
|
||||
QLabel *displayName;
|
||||
protected:
|
||||
void initializePage() override;
|
||||
};
|
||||
|
||||
@@ -33,6 +33,9 @@ VMManagerConfig::VMManagerConfig(const ConfigType type, const QString& section)
|
||||
config_type = type;
|
||||
|
||||
settings = new QSettings(configFile, QSettings::IniFormat, this);
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||
settings->setIniCodec("UTF-8");
|
||||
#endif
|
||||
settings->setFallbacksEnabled(false);
|
||||
if(type == ConfigType::System && !section.isEmpty()) {
|
||||
settings->beginGroup(section);
|
||||
|
||||
@@ -107,6 +107,13 @@ VMManagerMain::VMManagerMain(QWidget *parent) :
|
||||
});
|
||||
killIcon.setEnabled(selected_sysconfig->process->state() == QProcess::Running);
|
||||
|
||||
QAction deleteAction(tr("&Delete"));
|
||||
contextMenu.addAction(&deleteAction);
|
||||
connect(&deleteAction, &QAction::triggered, [this, parent] {
|
||||
deleteSystem(selected_sysconfig);
|
||||
});
|
||||
deleteAction.setEnabled(selected_sysconfig->process->state() == QProcess::NotRunning);
|
||||
|
||||
contextMenu.addSeparator();
|
||||
|
||||
QAction showRawConfigFile(tr("Show &config file"));
|
||||
@@ -181,11 +188,19 @@ VMManagerMain::currentSelectionChanged(const QModelIndex ¤t,
|
||||
return;
|
||||
}
|
||||
|
||||
disconnect(selected_sysconfig, &VMManagerSystem::configurationChanged, this, &VMManagerMain::onConfigUpdated);
|
||||
/* hack to prevent strange segfaults when adding a machine after
|
||||
removing all machines previously */
|
||||
if (selected_sysconfig->config_signal_connected == true) {
|
||||
disconnect(selected_sysconfig, &VMManagerSystem::configurationChanged, this, &VMManagerMain::onConfigUpdated);
|
||||
selected_sysconfig->config_signal_connected = false;
|
||||
}
|
||||
const auto mapped_index = proxy_model->mapToSource(current);
|
||||
selected_sysconfig = vm_model->getConfigObjectForIndex(mapped_index);
|
||||
vm_details->updateData(selected_sysconfig);
|
||||
connect(selected_sysconfig, &VMManagerSystem::configurationChanged, this, &VMManagerMain::onConfigUpdated);
|
||||
if (selected_sysconfig->config_signal_connected == false) {
|
||||
connect(selected_sysconfig, &VMManagerSystem::configurationChanged, this, &VMManagerMain::onConfigUpdated);
|
||||
selected_sysconfig->config_signal_connected = true;
|
||||
}
|
||||
|
||||
// Emit that the selection changed, include with the process state
|
||||
emit selectionChanged(current, selected_sysconfig->process->state());
|
||||
@@ -349,14 +364,19 @@ VMManagerMain::newMachineWizard()
|
||||
const auto wizard = new VMManagerAddMachine(this);
|
||||
if (wizard->exec() == QDialog::Accepted) {
|
||||
const auto newName = wizard->field("systemName").toString();
|
||||
#ifdef CUSTOM_SYSTEM_LOCATION
|
||||
const auto systemDir = wizard->field("systemLocation").toString();
|
||||
#else
|
||||
const auto systemDir = QDir(vmm_path).path();
|
||||
#endif
|
||||
const auto existingConfiguration = wizard->field("existingConfiguration").toString();
|
||||
addNewSystem(newName, systemDir, existingConfiguration);
|
||||
const auto displayName = wizard->field("displayName").toString();
|
||||
addNewSystem(newName, systemDir, displayName, existingConfiguration);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
VMManagerMain::addNewSystem(const QString &name, const QString &dir, const QString &configFile)
|
||||
VMManagerMain::addNewSystem(const QString &name, const QString &dir, const QString &displayName, const QString &configFile)
|
||||
{
|
||||
const auto newSytemDirectory = QDir(QDir::cleanPath(dir + "/" + name));
|
||||
|
||||
@@ -419,6 +439,8 @@ VMManagerMain::addNewSystem(const QString &name, const QString &dir, const QStri
|
||||
delete new_system;
|
||||
return;
|
||||
}
|
||||
auto added_system = vm_model->getConfigObjectForIndex(created_object);
|
||||
added_system->setDisplayName(displayName);
|
||||
// Get the index of the newly-created system and select it
|
||||
const QModelIndex mapped_index = proxy_model->mapFromSource(created_object);
|
||||
ui->listView->setCurrentIndex(mapped_index);
|
||||
@@ -426,6 +448,33 @@ VMManagerMain::addNewSystem(const QString &name, const QString &dir, const QStri
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
VMManagerMain::deleteSystem(VMManagerSystem *sysconfig)
|
||||
{
|
||||
QMessageBox msgbox(QMessageBox::Icon::Warning, tr("Warning"), tr("Do you really want to delete the virtual machine \"%1\" and all its files? This action cannot be undone!").arg(sysconfig->displayName), QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, qobject_cast<QWidget *>(this->parent()));
|
||||
msgbox.exec();
|
||||
if (msgbox.result() == QMessageBox::Yes) {
|
||||
auto qrmdir = new QDir(sysconfig->config_dir);
|
||||
if (const bool rmdirResult = qrmdir->removeRecursively(); !rmdirResult) {
|
||||
QMessageBox::critical(this, tr("Remove directory failed"), tr("Some files in the machine's directory were unable to be deleted. Please delete them manually."));
|
||||
return;
|
||||
}
|
||||
auto config = new VMManagerConfig(VMManagerConfig::ConfigType::General);
|
||||
config->remove(sysconfig->uuid);
|
||||
vm_model->removeConfigFromModel(sysconfig);
|
||||
delete sysconfig;
|
||||
|
||||
if (vm_model->rowCount(QModelIndex()) <= 0) {
|
||||
/* no machines left - get rid of the last machine's leftovers */
|
||||
ui->detailsArea->layout()->removeWidget(vm_details);
|
||||
delete vm_details;
|
||||
vm_details = new VMManagerDetails();
|
||||
ui->detailsArea->layout()->addWidget(vm_details);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QStringList
|
||||
VMManagerMain::getSearchCompletionList() const
|
||||
{
|
||||
|
||||
@@ -70,7 +70,8 @@ public slots:
|
||||
void shutdownForceButtonPressed() const;
|
||||
void searchSystems(const QString &text) const;
|
||||
void newMachineWizard();
|
||||
void addNewSystem(const QString &name, const QString &dir, const QString &configFile = {});
|
||||
void deleteSystem(VMManagerSystem *sysconfig);
|
||||
void addNewSystem(const QString &name, const QString &dir, const QString &displayName = QString(), const QString &configFile = {});
|
||||
#if __GNUC__ >= 11
|
||||
[[nodiscard]] QStringList getSearchCompletionList() const;
|
||||
#else
|
||||
|
||||
@@ -140,6 +140,18 @@ VMManagerModel::addConfigToModel(VMManagerSystem *system_config)
|
||||
connect(system_config, &VMManagerSystem::itemDataChanged, this, &VMManagerModel::modelDataChanged);
|
||||
endInsertRows();
|
||||
}
|
||||
|
||||
void
|
||||
VMManagerModel::removeConfigFromModel(VMManagerSystem *system_config)
|
||||
{
|
||||
const QModelIndex index = getIndexForConfigFile(system_config->config_file);
|
||||
disconnect(system_config, &VMManagerSystem::itemDataChanged, this, &VMManagerModel::modelDataChanged);
|
||||
beginRemoveRows(QModelIndex(), index.row(), index.row());
|
||||
machines.remove(index.row());
|
||||
endRemoveRows();
|
||||
emit systemDataChanged();
|
||||
}
|
||||
|
||||
void
|
||||
VMManagerModel::modelDataChanged()
|
||||
{
|
||||
@@ -177,4 +189,4 @@ VMManagerModel::getActiveMachineCount()
|
||||
running++;
|
||||
}
|
||||
return running;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ public:
|
||||
[[nodiscard]] QVariant headerData(int section, Qt::Orientation orientation,
|
||||
int role) const override;
|
||||
void addConfigToModel(VMManagerSystem *system_config);
|
||||
void removeConfigFromModel(VMManagerSystem *system_config);
|
||||
|
||||
[[nodiscard]] VMManagerSystem * getConfigObjectForIndex(const QModelIndex &index) const;
|
||||
QModelIndex getIndexForConfigFile(const QFileInfo& config_file);
|
||||
|
||||
@@ -234,6 +234,9 @@ VMManagerSystem::loadSettings()
|
||||
}
|
||||
// qInfo() << "Loaded "<< config_file.filePath() << "status:" << settings.status();
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||
settings.setIniCodec("UTF-8");
|
||||
#endif
|
||||
// Clear out the config hash in case the config is reloaded
|
||||
for (const auto &outer_key : config_hash.keys()) {
|
||||
config_hash[outer_key].clear();
|
||||
|
||||
@@ -136,6 +136,7 @@ public:
|
||||
QProcess *process = new QProcess();
|
||||
|
||||
bool window_obscured;
|
||||
bool config_signal_connected = false;
|
||||
|
||||
QString getDisplayValue(VMManager::Display::Name key);
|
||||
QFileInfoList getScreenshots();
|
||||
|
||||
@@ -49,6 +49,13 @@ typedef struct ioctl_t {
|
||||
WCHAR path[256];
|
||||
} ioctl_t;
|
||||
|
||||
typedef struct _CDROM_FULL_TOC {
|
||||
UCHAR Length[2];
|
||||
UCHAR FirstCompleteSession;
|
||||
UCHAR LastCompleteSession;
|
||||
CDROM_TOC_FULL_TOC_DATA_BLOCK Descriptors[MAXIMUM_NUMBER_TRACKS + 2];
|
||||
} CDROM_FULL_TOC;
|
||||
|
||||
static int ioctl_read_dvd_structure(const void *local, uint8_t layer, uint8_t format,
|
||||
uint8_t *buffer, uint32_t *info);
|
||||
|
||||
@@ -124,7 +131,7 @@ ioctl_read_normal_toc(ioctl_t *ioctl, uint8_t *toc_buf, int32_t *tracks_num)
|
||||
|
||||
const int temp = DeviceIoControl(ioctl->handle, IOCTL_CDROM_READ_TOC_EX,
|
||||
&cur_read_toc_ex, sizeof(CDROM_READ_TOC_EX),
|
||||
cur_full_toc, 65535,
|
||||
cur_full_toc, sizeof(CDROM_TOC),
|
||||
(LPDWORD) &size, NULL);
|
||||
ioctl_log(ioctl->log, "temp = %i\n", temp);
|
||||
|
||||
@@ -179,7 +186,7 @@ ioctl_read_raw_toc(ioctl_t *ioctl)
|
||||
if (!ioctl->is_dvd) {
|
||||
status = DeviceIoControl(ioctl->handle, IOCTL_CDROM_READ_TOC_EX,
|
||||
&cur_read_toc_ex, sizeof(CDROM_READ_TOC_EX),
|
||||
cur_full_toc, 65535,
|
||||
cur_full_toc, sizeof(CDROM_FULL_TOC),
|
||||
(LPDWORD) &size, NULL);
|
||||
ioctl_log(ioctl->log, "status = %i\n", status);
|
||||
}
|
||||
|
||||
@@ -645,19 +645,16 @@ scsi_cdrom_bus_speed(scsi_cdrom_t *dev)
|
||||
{
|
||||
double ret = -1.0;
|
||||
|
||||
if (dev && dev->drv && (dev->drv->bus_type == CDROM_BUS_SCSI)) {
|
||||
dev->callback = -1.0; /* Speed depends on SCSI controller */
|
||||
return 0.0;
|
||||
} else {
|
||||
if (dev && dev->drv)
|
||||
ret = ide_atapi_get_period(dev->drv->ide_channel);
|
||||
if (ret == -1.0) {
|
||||
if (dev)
|
||||
dev->callback = -1.0;
|
||||
return 0.0;
|
||||
} else
|
||||
return 1000000.0 / ret;
|
||||
if (dev && dev->drv)
|
||||
ret = ide_atapi_get_period(dev->drv->ide_channel);
|
||||
|
||||
if (ret == -1.0) {
|
||||
if (dev)
|
||||
dev->callback = -1.0;
|
||||
ret = 0.0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -671,7 +668,12 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev)
|
||||
double bytes_per_second;
|
||||
double period;
|
||||
|
||||
if (dev->was_cached != -1) {
|
||||
if (dev->was_cached == -1) {
|
||||
if (dev->drv->bus_type == CDROM_BUS_SCSI)
|
||||
dev->callback = -1.0; /* Speed depends on SCSI controller */
|
||||
else
|
||||
dev->callback = 512.0 + (scsi_cdrom_bus_speed(dev) * (double) (dev->packet_len));
|
||||
} else {
|
||||
if (dev->was_cached) {
|
||||
dev->callback += 512.0;
|
||||
scsi_cdrom_set_callback(dev);
|
||||
@@ -686,27 +688,21 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev)
|
||||
/* 44100 * 16 bits * 2 channels = 176400 bytes per second */
|
||||
bytes_per_second = 176400.0;
|
||||
bytes_per_second *= (double) dev->drv->cur_speed;
|
||||
} else {
|
||||
bytes_per_second = scsi_cdrom_bus_speed(dev);
|
||||
if (bytes_per_second == 0.0) {
|
||||
dev->callback = -1; /* Speed depends on SCSI controller */
|
||||
return;
|
||||
|
||||
period = 1000000.0 / bytes_per_second;
|
||||
scsi_cdrom_log(dev->log, "Byte transfer period: %lf us\n", period);
|
||||
if (dev->was_cached == -1)
|
||||
period *= (double) dev->packet_len;
|
||||
else {
|
||||
const int num = ((dev->drv->bus_type == CDROM_BUS_SCSI) ||
|
||||
(dev->block_len == 0)) ? dev->sectors_num :
|
||||
((scsi_cdrom_current_mode(dev) == 2) ? 1 : dev->sectors_num);
|
||||
|
||||
period *= ((double) num) * 2352.0;
|
||||
}
|
||||
scsi_cdrom_log(dev->log, "Sector transfer period: %lf us\n", period);
|
||||
dev->callback += period;
|
||||
}
|
||||
|
||||
period = 1000000.0 / bytes_per_second;
|
||||
scsi_cdrom_log(dev->log, "Byte transfer period: %lf us\n", period);
|
||||
if (dev->was_cached == -1)
|
||||
period *= (double) dev->packet_len;
|
||||
else {
|
||||
const int num = ((dev->drv->bus_type == CDROM_BUS_SCSI) ||
|
||||
(dev->block_len == 0)) ? dev->sectors_num :
|
||||
((scsi_cdrom_current_mode(dev) == 2) ? 1 : dev->sectors_num);
|
||||
|
||||
period *= ((double) num) * 2352.0;
|
||||
}
|
||||
scsi_cdrom_log(dev->log, "Sector transfer period: %lf us\n", period);
|
||||
dev->callback += period;
|
||||
}
|
||||
scsi_cdrom_set_callback(dev);
|
||||
}
|
||||
|
||||
@@ -873,7 +873,7 @@ plat_init_rom_paths(void)
|
||||
#undef TMP_PATH_BUFSIZE
|
||||
|
||||
void
|
||||
plat_get_global_config_dir(char *outbuf, const uint8_t len)
|
||||
plat_get_global_config_dir(char *outbuf, const size_t len)
|
||||
{
|
||||
char *prefPath = SDL_GetPrefPath(NULL, "86Box");
|
||||
strncpy(outbuf, prefPath, len);
|
||||
@@ -882,7 +882,7 @@ plat_get_global_config_dir(char *outbuf, const uint8_t len)
|
||||
}
|
||||
|
||||
void
|
||||
plat_get_global_data_dir(char *outbuf, const uint8_t len)
|
||||
plat_get_global_data_dir(char *outbuf, const size_t len)
|
||||
{
|
||||
char *prefPath = SDL_GetPrefPath(NULL, "86Box");
|
||||
strncpy(outbuf, prefPath, len);
|
||||
|
||||
@@ -912,9 +912,9 @@ const device_t jega_device = {
|
||||
};
|
||||
|
||||
const device_t jvga_device = {
|
||||
.name = "OKIVGA/H-2 (JVGA/H)",
|
||||
.name = "OKI VGA/H-2 (JVGA/H)",
|
||||
.internal_name = "jvga",
|
||||
.flags = DEVICE_ISA,
|
||||
.flags = DEVICE_ISA16,
|
||||
.local = 0,
|
||||
.init = jvga_standalone_init,
|
||||
.close = jega_close,
|
||||
|
||||
Reference in New Issue
Block a user