Skip to content

Commit

Permalink
Built-in manager
Browse files Browse the repository at this point in the history
Missing features:
1. Multi-selection not done yet.
2. Icons for VMs.
  • Loading branch information
Cacodemon345 committed Jan 28, 2024
1 parent c9e74d8 commit 178e551
Show file tree
Hide file tree
Showing 19 changed files with 2,335 additions and 46 deletions.
34 changes: 29 additions & 5 deletions src/86box.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,11 @@ int video_fullscreen_scale_maximized = 0; /* (C) Whether
int do_auto_pause = 0; /* (C) Auto-pause the emulator on focus
loss */


int manager_mode = 0;

config_manager_t manager_config;

/* Statistics. */
extern int mmuflush;
extern int readlnum;
Expand All @@ -217,9 +222,10 @@ extern int CPUID;
extern int output;
int atfullspeed;

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 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 cfg_global_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 */
Expand Down Expand Up @@ -452,6 +458,7 @@ pc_init(int argc, char *argv[])
char *ppath = NULL;
char *rpath = NULL;
char *cfg = NULL;
char *global_cfg = NULL;
char *p;
char temp[2048];
char *fn[FDD_NUM] = { NULL };
Expand Down Expand Up @@ -547,6 +554,7 @@ pc_init(int argc, char *argv[])
#ifndef USE_SDL_UI
printf("-S or --settings - show only the settings dialog\n");
#endif
printf("-U or --globalconfig - set 'path' to be global config file\n");
printf("-V or --vmname name - overrides the name of the running VM\n");
printf("-X or --clear what - clears the 'what' (cmos/flash/both)\n");
printf("-Y or --donothing - do not show any UI or run the emulation\n");
Expand Down Expand Up @@ -589,6 +597,11 @@ pc_init(int argc, char *argv[])
goto usage;

cfg = argv[++c];
} else if (!strcasecmp(argv[c], "--globalconfig") || !strcasecmp(argv[c], "-U")) {
if ((c + 1) == argc || plat_dir_check(argv[c + 1]))
goto usage;

global_cfg = argv[++c];
} else if (!strcasecmp(argv[c], "--image") || !strcasecmp(argv[c], "-I")) {
if ((c + 1) == argc)
goto usage;
Expand Down Expand Up @@ -725,7 +738,8 @@ pc_init(int argc, char *argv[])
create it. */
if (!plat_dir_check(usr_path))
plat_dir_create(usr_path);
}
} else
manager_mode = 1;

// Add the VM-local ROM path.
path_append_filename(temp, usr_path, "roms");
Expand Down Expand Up @@ -808,6 +822,15 @@ pc_init(int argc, char *argv[])
/* At this point, we can safely create the full path name. */
path_append_filename(cfg_path, usr_path, p);

cfg_global_path[0] = 0;
if (global_cfg == NULL) {
plat_get_global_config_dir(cfg_global_path);
path_slash(cfg_global_path);
strncat(cfg_global_path, CONFIG_FILE, sizeof(CONFIG_FILE));
} else {
strncpy(cfg_global_path, global_cfg, sizeof(cfg_global_path) - 1);
}

/*
* Get the current directory's name
*
Expand Down Expand Up @@ -837,7 +860,8 @@ pc_init(int argc, char *argv[])
pclog("# ROM path: %s\n", rom_path->path);
}

pclog("# Configuration file: %s\n#\n\n", cfg_path);
pclog("# Configuration file: %s\n", cfg_path);
pclog("# Global configuration file: %s\n#\n\n", cfg_global_path);
/*
* We are about to read the configuration file, which MAY
* put data into global variables (the hard- and floppy
Expand Down
253 changes: 230 additions & 23 deletions src/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ static int cx;
static int cy;
static int cw;
static int ch;
static ini_t config;
static ini_t config, config_global;

#ifdef ENABLE_CONFIG_LOG
int config_do_log = ENABLE_CONFIG_LOG;
Expand Down Expand Up @@ -1534,6 +1534,7 @@ void
config_load(void)
{
int i;
int default_create = 0;

config_log("Loading config file '%s'..\n", cfg_path);

Expand All @@ -1548,6 +1549,32 @@ config_load(void)

if (!config) {
config = ini_new();
default_create = 1;

config_changed = 1;
}

load_general(); /* General */
for (i = 0; i < MONITORS_NUM; i++)
load_monitor(i); /* Monitors */
load_machine(); /* Machine */
load_video(); /* Video */
load_input_devices(); /* Input devices */
load_sound(); /* Sound */
load_network(); /* Network */
load_ports(); /* Ports (COM & LPT) */
load_storage_controllers(); /* Storage controllers */
load_hard_disks(); /* Hard disks */
load_floppy_and_cdrom_drives(); /* Floppy and CD-ROM drives */
load_other_removable_devices(); /* Other removable devices */
load_other_peripherals(); /* Other peripherals */

/* Mark the configuration as changed. */
config_changed = 1;

if (!default_create) {
config_log("Config loaded.\n\n");
} else {
config_changed = 1;

cpu_f = (cpu_family_t *) &cpu_families[0];
Expand Down Expand Up @@ -1605,31 +1632,13 @@ config_load(void)
cassette_append = 0;
cassette_pcm = 0;
cassette_ui_writeprot = 0;

config_log("Config file not present or invalid!\n");
} else {
load_general(); /* General */
for (i = 0; i < MONITORS_NUM; i++)
load_monitor(i); /* Monitors */
load_machine(); /* Machine */
load_video(); /* Video */
load_input_devices(); /* Input devices */
load_sound(); /* Sound */
load_network(); /* Network */
load_ports(); /* Ports (COM & LPT) */
load_storage_controllers(); /* Storage controllers */
load_hard_disks(); /* Hard disks */
load_floppy_and_cdrom_drives(); /* Floppy and CD-ROM drives */
load_other_removable_devices(); /* Other removable devices */
load_other_peripherals(); /* Other peripherals */

/* Mark the configuration as changed. */
config_changed = 1;

config_log("Config loaded.\n\n");
config_log("Config file not present or invalid!\n\n");
}

video_copy = (video_grayscale || invert_display) ? video_transform_copy : memcpy;

if (!manager_mode)
config_load_global();
}

/* Save "General" section. */
Expand Down Expand Up @@ -2730,6 +2739,204 @@ config_save(void)
save_other_peripherals(); /* Other peripherals */

ini_write(config, cfg_path);

if (!manager_mode)
config_save_global();
}

void
load_manager_settings_global()
{
char temp[1024] = { 0 };
int i = 0, c = 0;
char *p = NULL;
ini_section_t section = NULL;

/* This only matters when running in manager mode. */
if (!manager_mode) {
memset(&manager_config, 0, sizeof(manager_config));
return;
}

section = ini_find_or_create_section(config_global, "Manager");

manager_config.close_to_tray_icon = !!ini_section_get_int(section, "close_to_tray_icon", 0);
manager_config.minimize_to_tray_icon = !!ini_section_get_int(section, "minimize_to_tray_icon", 0);
manager_config.minimize_when_vm_started = !!ini_section_get_int(section, "minimize_when_vm_started", 0);
manager_config.enable_grid_lines = !!ini_section_get_int(section, "enable_grid_lines", 0);
manager_config.enable_logging = !!ini_section_get_int(section, "enable_logging", 0);

manager_config.logging_path[0] = 0;
strncpy(manager_config.logging_path, ini_section_get_string(section, "logging_path", ""), sizeof(manager_config.logging_path));
}

/* Global config section. */
void
load_manager_vms_global()
{
char temp[1024] = { 0 };
char vms_path_default[1024] = { 0 };
int i = 0, c = 0;
char *p = NULL;
ini_section_t section = NULL;

/* This only matters when running in manager mode. */
if (!manager_mode) {
memset(&manager_config, 0, sizeof(manager_config));
return;
}
plat_get_global_config_dir(vms_path_default);
path_slash(vms_path_default);
strncat(vms_path_default, "86Box VMs", sizeof(vms_path_default) - 1);
strncat(vms_path_default, path_get_slash(vms_path_default), sizeof(vms_path_default) - 1);

memset(manager_config.vm, 0, sizeof(manager_config.vm));
memset(manager_config.vms_path, 0, sizeof(manager_config.vms_path));

section = ini_find_or_create_section(config_global, "Manager");
strncpy(manager_config.vms_path, ini_section_get_string(section, "vms_path", vms_path_default), sizeof(manager_config.vms_path));

for (i = 0; i < 256; i++) {
temp[0] = 0;
snprintf(temp, sizeof(temp) - 1, "VM #%d", i + 1);
section = ini_find_section(config_global, temp);
if (section) {
if (ini_section_get_string(section, "name", "")[0] != 0) {
p = ini_section_get_string(section, "name", "");
strncpy(manager_config.vm[c].name, p, sizeof(manager_config.vm[0].name));
p = ini_section_get_string(section, "description", "");
strncpy(manager_config.vm[c].description, p, sizeof(manager_config.vm[0].description));
p = ini_section_get_string(section, "path", "");
manager_config.vm[c].path[0] = 0;
if (p[0] == 0) {
strncat(manager_config.vm[c].path, vms_path_default, sizeof(manager_config.vm[c].path));
path_slash(manager_config.vm[c].path);
strncat(manager_config.vm[c].path, manager_config.vm[c].name, sizeof(manager_config.vm[c].path));
path_slash(manager_config.vm[c].path);
} else {
strncpy(manager_config.vm[c].path, p, sizeof(manager_config.vm[c].path));
path_slash(manager_config.vm[c].path);
}
c++;
}
}
}
}

void
save_manager_vms_global()
{
char temp[1024] = { 0 };
char vms_path_default[1024] = { 0 };
ini_section_t section = NULL;
int i = 0, c = 0;

/* This only matters when running in manager mode. */
if (!manager_mode) {
return;
}
plat_get_global_config_dir(vms_path_default);
path_slash(vms_path_default);
strncat(vms_path_default, "86Box VMs", sizeof(vms_path_default) - 1);
strncat(vms_path_default, path_get_slash(vms_path_default), sizeof(vms_path_default) - 1);

section = ini_find_or_create_section(config_global, "Manager");

if (strncmp(manager_config.vms_path, vms_path_default, 1024)) {
ini_section_set_string(section, "vms_path", manager_config.vms_path);
} else {
ini_section_delete_var(section, "vms_path");
}

ini_delete_section_if_empty(config_global, section);

for (i = 0; i < 256; i++) {
temp[0] = 0;
snprintf(temp, sizeof(temp) - 1, "VM #%d", c + 1);
section = ini_find_or_create_section(config_global, temp);
if (manager_config.vm[i].name[0]) {
ini_section_set_string(section, "name", manager_config.vm[i].name);
if (manager_config.vm[i].description[0]) {
ini_section_set_string(section, "description", manager_config.vm[i].description);
} else {
ini_section_delete_var(section, "description");
}
/* Always save paths. */
ini_section_set_string(section, "path", manager_config.vm[i].path);
c++;
} else {
ini_section_delete_var(section, "name");
ini_section_delete_var(section, "description");
ini_section_delete_var(section, "path");
}
ini_delete_section_if_empty(config_global, section);
}
}

void
save_manager_settings_global()
{
char temp[1024] = { 0 };
int i = 0, c = 0;
char *p = NULL;
ini_section_t section = NULL;

/* This only matters when running in manager mode. */
if (!manager_mode) {
return;
}

section = ini_find_or_create_section(config_global, "Manager");

if (manager_config.close_to_tray_icon == 0)
ini_section_delete_var(section, "close_to_tray_icon");
else
ini_section_set_int(section, "close_to_tray_icon", manager_config.close_to_tray_icon);

if (manager_config.minimize_to_tray_icon == 0)
ini_section_delete_var(section, "minimize_to_tray_icon");
else
ini_section_set_int(section, "minimize_to_tray_icon", manager_config.minimize_to_tray_icon);

if (manager_config.minimize_when_vm_started == 0)
ini_section_delete_var(section, "minimize_when_vm_started");
else
ini_section_set_int(section, "minimize_when_vm_started", manager_config.minimize_when_vm_started);

if (manager_config.enable_grid_lines == 0)
ini_section_delete_var(section, "enable_grid_lines");
else
ini_section_set_int(section, "enable_grid_lines", manager_config.enable_grid_lines);

if (manager_config.enable_logging == 0)
ini_section_delete_var(section, "enable_logging");
else
ini_section_set_int(section, "enable_logging", manager_config.enable_logging);

if (manager_config.logging_path[0] == 0)
ini_section_delete_var(section, "logging_path");
else
ini_section_set_string(section, "logging_path", manager_config.logging_path);

ini_delete_section_if_empty(config_global, section);
}

/* Load global config. */
void
config_load_global()
{
config_global = ini_read(cfg_global_path);
load_manager_settings_global();
load_manager_vms_global();
}

/* Save global config. */
void
config_save_global()
{
save_manager_settings_global();
save_manager_vms_global();
ini_write(config_global, cfg_global_path);
}

ini_t
Expand Down
Loading

0 comments on commit 178e551

Please sign in to comment.