304 lines
11 KiB
C
304 lines
11 KiB
C
#include "ibm.h"
|
|
#include "device.h"
|
|
#include "allegro-main.h"
|
|
#include "allegro-gui.h"
|
|
#include "config.h"
|
|
|
|
static device_t *config_device;
|
|
|
|
#define MAX_CONFIG_SIZE 64
|
|
#define MAX_CONFIG_SELECTIONS 8
|
|
|
|
static device_config_selection_t *config_selections[MAX_CONFIG_SELECTIONS];
|
|
|
|
#define list_proc_device_func(i) \
|
|
static char *list_proc_device_ ## i(int index, int *list_size) \
|
|
{ \
|
|
device_config_selection_t *config = config_selections[i]; \
|
|
\
|
|
if (index < 0) \
|
|
{ \
|
|
int c = 0; \
|
|
\
|
|
while (config[c].description[0]) \
|
|
c++; \
|
|
\
|
|
*list_size = c; \
|
|
return NULL; \
|
|
} \
|
|
\
|
|
return config[index].description; \
|
|
}
|
|
|
|
list_proc_device_func(0)
|
|
list_proc_device_func(1)
|
|
list_proc_device_func(2)
|
|
list_proc_device_func(3)
|
|
list_proc_device_func(4)
|
|
list_proc_device_func(5)
|
|
list_proc_device_func(6)
|
|
list_proc_device_func(7)
|
|
|
|
static DIALOG deviceconfig_dialog[MAX_CONFIG_SIZE] =
|
|
{
|
|
{d_shadow_box_proc, 0, 0, 568,332,0,0xffffff,0,0, 0,0,0,0,0} // 0
|
|
};
|
|
|
|
void deviceconfig_open(device_t *device)
|
|
{
|
|
DIALOG *d;
|
|
device_config_t *config = device->config;
|
|
int y = 10;
|
|
int dialog_pos = 1;
|
|
int list_pos = 0;
|
|
int c;
|
|
int id_ok, id_cancel;
|
|
|
|
memset((void *)((uintptr_t)deviceconfig_dialog) + sizeof(DIALOG), 0, sizeof(deviceconfig_dialog) - sizeof(DIALOG));
|
|
deviceconfig_dialog[0].x = deviceconfig_dialog[0].y = 0;
|
|
|
|
while (config->type != -1)
|
|
{
|
|
d = &deviceconfig_dialog[dialog_pos];
|
|
|
|
switch (config->type)
|
|
{
|
|
case CONFIG_BINARY:
|
|
d->x = 32;
|
|
d->y = y;
|
|
|
|
d->w = 118*2;
|
|
d->h = 15;
|
|
|
|
d->dp = config->description;
|
|
d->proc = d_check_proc;
|
|
|
|
d->flags = config_get_int(device->name, config->name, config->default_int) ? D_SELECTED : 0;
|
|
d->bg = 0xffffff;
|
|
d->fg = 0;
|
|
|
|
dialog_pos++;
|
|
|
|
y += 20;
|
|
break;
|
|
|
|
case CONFIG_SELECTION:
|
|
if (list_pos >= MAX_CONFIG_SELECTIONS)
|
|
break;
|
|
|
|
d->x = 32;
|
|
d->y = y;
|
|
|
|
d->w = 80;
|
|
d->h = 15;
|
|
|
|
d->dp = config->description;
|
|
d->proc = d_text_proc;
|
|
|
|
d->flags = 0;
|
|
d->bg = 0xffffff;
|
|
d->fg = 0;
|
|
|
|
d++;
|
|
|
|
d->x = 250;
|
|
d->y = y;
|
|
|
|
d->w = 304;
|
|
d->h = 20;
|
|
|
|
switch (list_pos)
|
|
{
|
|
case 0 : d->dp = list_proc_device_0; break;
|
|
case 1 : d->dp = list_proc_device_1; break;
|
|
case 2 : d->dp = list_proc_device_2; break;
|
|
case 3 : d->dp = list_proc_device_3; break;
|
|
case 4 : d->dp = list_proc_device_4; break;
|
|
case 5 : d->dp = list_proc_device_5; break;
|
|
case 6 : d->dp = list_proc_device_6; break;
|
|
case 7 : d->dp = list_proc_device_7; break;
|
|
}
|
|
d->proc = d_list_proc;
|
|
|
|
d->flags = 0;
|
|
d->bg = 0xffffff;
|
|
d->fg = 0;
|
|
|
|
config_selections[list_pos++] = config->selection;
|
|
|
|
c = 0;
|
|
while (config->selection[c].description[0])
|
|
{
|
|
if (config_get_int(device->name, config->name, config->default_int) == config->selection[c].value)
|
|
d->d1 = c;
|
|
c++;
|
|
}
|
|
|
|
dialog_pos += 2;
|
|
|
|
y += 20;
|
|
break;
|
|
|
|
case CONFIG_MIDI:
|
|
break;
|
|
}
|
|
|
|
config++;
|
|
|
|
if (dialog_pos >= MAX_CONFIG_SIZE-3)
|
|
break;
|
|
}
|
|
|
|
d = &deviceconfig_dialog[dialog_pos];
|
|
|
|
id_ok = dialog_pos;
|
|
id_cancel = dialog_pos + 1;
|
|
|
|
d->x = 226;
|
|
d->y = y+8;
|
|
|
|
d->w = 50;
|
|
d->h = 16;
|
|
|
|
d->dp = "OK";
|
|
d->proc = d_button_proc;
|
|
|
|
d->flags = D_EXIT;
|
|
d->bg = 0xffffff;
|
|
d->fg = 0;
|
|
|
|
d++;
|
|
|
|
d->x = 296;
|
|
d->y = y+8;
|
|
|
|
d->w = 50;
|
|
d->h = 16;
|
|
|
|
d->dp = "Cancel";
|
|
d->proc = d_button_proc;
|
|
|
|
d->flags = D_EXIT;
|
|
d->bg = 0xffffff;
|
|
d->fg = 0;
|
|
|
|
deviceconfig_dialog[0].h = y + 28;
|
|
|
|
config_device = device;
|
|
|
|
while (1)
|
|
{
|
|
position_dialog(deviceconfig_dialog, SCREEN_W/2 - deviceconfig_dialog[0].w/2, SCREEN_H/2 - deviceconfig_dialog[0].h/2);
|
|
|
|
c = popup_dialog(deviceconfig_dialog, 1);
|
|
|
|
position_dialog(deviceconfig_dialog, -(SCREEN_W/2 - deviceconfig_dialog[0].w/2), -(SCREEN_H/2 - deviceconfig_dialog[0].h/2));
|
|
|
|
if (c == id_ok)
|
|
{
|
|
int changed = 0;
|
|
|
|
dialog_pos = 1;
|
|
config = device->config;
|
|
|
|
while (config->type != -1)
|
|
{
|
|
int val;
|
|
|
|
d = &deviceconfig_dialog[dialog_pos];
|
|
|
|
switch (config->type)
|
|
{
|
|
case CONFIG_BINARY:
|
|
val = (d->flags & D_SELECTED) ? 1 : 0;
|
|
|
|
if (val != config_get_int(device->name, config->name, config->default_int))
|
|
changed = 1;
|
|
|
|
dialog_pos++;
|
|
break;
|
|
|
|
case CONFIG_SELECTION:
|
|
if (list_pos >= MAX_CONFIG_SELECTIONS)
|
|
break;
|
|
|
|
d++;
|
|
|
|
val = config->selection[d->d1].value;
|
|
|
|
if (val != config_get_int(device->name, config->name, config->default_int))
|
|
changed = 1;
|
|
|
|
dialog_pos += 2;
|
|
break;
|
|
|
|
case CONFIG_MIDI:
|
|
break;
|
|
}
|
|
|
|
config++;
|
|
|
|
if (dialog_pos >= MAX_CONFIG_SIZE-3)
|
|
break;
|
|
}
|
|
|
|
if (!changed)
|
|
return;
|
|
|
|
if (alert("This will reset 86Box!", "Okay to continue?", NULL, "OK", "Cancel", 0, 0) != 1)
|
|
continue;
|
|
|
|
dialog_pos = 1;
|
|
config = device->config;
|
|
|
|
while (config->type != -1)
|
|
{
|
|
int val;
|
|
|
|
d = &deviceconfig_dialog[dialog_pos];
|
|
|
|
switch (config->type)
|
|
{
|
|
case CONFIG_BINARY:
|
|
val = (d->flags & D_SELECTED) ? 1 : 0;
|
|
|
|
config_set_int(config_device->name, config->name, val);
|
|
|
|
dialog_pos++;
|
|
break;
|
|
|
|
case CONFIG_SELECTION:
|
|
if (list_pos >= MAX_CONFIG_SELECTIONS)
|
|
break;
|
|
|
|
d++;
|
|
|
|
val = config->selection[d->d1].value;
|
|
|
|
config_set_int(config_device->name, config->name, val);
|
|
|
|
dialog_pos += 2;
|
|
break;
|
|
|
|
case CONFIG_MIDI:
|
|
break;
|
|
}
|
|
|
|
config++;
|
|
|
|
if (dialog_pos >= MAX_CONFIG_SIZE-3)
|
|
break;
|
|
}
|
|
|
|
saveconfig();
|
|
|
|
resetpchard();
|
|
|
|
return;
|
|
}
|
|
|
|
if (c == id_cancel)
|
|
break;
|
|
}
|
|
}
|