Update chocolate-setup to the new screen mode config system.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 1042
This commit is contained in:
Simon Howard 2008-02-04 22:43:11 +00:00
parent aff2bd33f4
commit 65ed2a3208
5 changed files with 207 additions and 94 deletions

View file

@ -254,7 +254,8 @@ static default_t extra_defaults_list[] =
{"fullscreen", &fullscreen, DEFAULT_INT, 0, 0},
{"aspect_ratio_correct", &aspect_ratio_correct, DEFAULT_INT, 0, 0},
{"startup_delay", &startup_delay, DEFAULT_INT, 0, 0},
{"screenmultiply", &screenmultiply, DEFAULT_INT, 0, 0},
{"screen_width", &screen_width, DEFAULT_INT, 0, 0},
{"screen_height", &screen_height, DEFAULT_INT, 0, 0},
{"grabmouse", &grabmouse, DEFAULT_INT, 0, 0},
{"novert", &novert, DEFAULT_INT, 0, 0},
{"mouse_acceleration", &mouse_acceleration, DEFAULT_FLOAT, 0, 0},

View file

@ -27,44 +27,50 @@
typedef struct
{
char *description;
char *description_4_3;
int screenmultiply;
txt_radiobutton_t *widget;
} vidmode_t;
int w, h;
} screen_mode_t;
enum
// List of aspect ratio-uncorrected modes
static screen_mode_t screen_modes_unscaled[] =
{
RATIO_CORRECT_NONE,
RATIO_CORRECT_LETTERBOX,
RATIO_CORRECT_STRETCH,
NUM_RATIO_CORRECT,
{ 320, 200 },
{ 640, 400 },
{ 960, 600 },
{ 1280, 800 },
{ 1600, 1000 },
{ 0, 0},
};
static vidmode_t modes[] =
// List of aspect ratio-corrected modes
static screen_mode_t screen_modes_scaled[] =
{
{ "320x200", "320x240", 1, NULL },
{ "960x600", "960x720", 3, NULL },
{ "640x400", "640x480", 2, NULL },
{ "1280x800", "1280x960", 4, NULL },
{ "1600x1000", "1600x1200", 5, NULL },
{ NULL, NULL, 0, NULL },
{ 256, 200 },
{ 320, 240 },
{ 512, 400 },
{ 640, 480 },
{ 800, 600 },
{ 960, 720 },
{ 1024, 800 },
{ 1280, 960 },
{ 1280, 1000 },
{ 1600, 1200 },
{ 0, 0},
};
static char *aspect_ratio_strings[] =
{
"Disabled",
"Letterbox mode",
"Stretch to 4:3",
};
// List of fullscreen modes generated at runtime
static screen_mode_t *screen_modes_fullscreen = NULL;
static int vidmode = 0;
char *video_driver = "";
int autoadjust_video_settings = 1;
int aspect_ratio_correct = RATIO_CORRECT_NONE;
int aspect_ratio_correct = 1;
int fullscreen = 1;
int screenmultiply = 1;
int screen_width = 320;
int screen_height = 200;
int startup_delay = 0;
int show_endoom = 1;
@ -103,81 +109,182 @@ static void UpdateVideoDriver(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused))
#endif
// Given the video settings (fullscreen, screenmultiply, etc), find the
// current video mode
static void SetCurrentMode(void)
{
int i;
vidmode = 0;
for (i=0; modes[i].description != NULL; ++i)
{
if (screenmultiply == modes[i].screenmultiply)
{
vidmode = i;
break;
}
}
}
static void ModeSelected(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(mode))
{
TXT_CAST_ARG(vidmode_t, mode);
TXT_CAST_ARG(screen_mode_t, mode);
screenmultiply = mode->screenmultiply;
screen_width = mode->w;
screen_height = mode->h;
}
static void UpdateModes(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused))
static int GoodFullscreenMode(screen_mode_t *mode)
{
int w, h;
w = mode->w;
h = mode->h;
// 320x200 and 640x400 are always good
if ((w == 320 && h == 200) || (w == 640 && h == 400))
{
return 1;
}
return w >= 640 && h >= 480;
}
// Build screen_modes_fullscreen
static void BuildFullscreenModesList(void)
{
SDL_Rect **modes;
screen_mode_t *m1;
screen_mode_t *m2;
screen_mode_t m;
int num_modes;
int i;
for (i=0; modes[i].description != NULL; ++i)
if (screen_modes_fullscreen != NULL)
{
if (aspect_ratio_correct == RATIO_CORRECT_NONE)
return;
}
// Get a list of fullscreen modes and find out how many
// modes are in the list.
modes = SDL_ListModes(NULL, SDL_FULLSCREEN);
for (num_modes=0; modes[num_modes] != NULL; ++num_modes);
// Build the screen_modes_fullscreen array
screen_modes_fullscreen = malloc(sizeof(screen_mode_t) * (num_modes + 1));
for (i=0; i<num_modes; ++i)
{
screen_modes_fullscreen[i].w = modes[i]->w;
screen_modes_fullscreen[i].h = modes[i]->h;
}
screen_modes_fullscreen[i].w = 0;
screen_modes_fullscreen[i].h = 0;
// Reverse the order of the modes list (smallest modes first)
for (i=0; i<num_modes / 2; ++i)
{
m1 = &screen_modes_fullscreen[i];
m2 = &screen_modes_fullscreen[num_modes - 1 - i];
memcpy(&m, m1, sizeof(screen_mode_t));
memcpy(m1, m2, sizeof(screen_mode_t));
memcpy(m2, &m, sizeof(screen_mode_t));
}
}
static int FindBestMode(screen_mode_t *modes)
{
int i;
int best_mode;
int best_mode_diff;
int diff;
best_mode = -1;
best_mode_diff = 0;
for (i=0; modes[i].w != 0; ++i)
{
diff = (screen_width - modes[i].w) * (screen_width - modes[i].w)
+ (screen_height - modes[i].h) * (screen_height - modes[i].h);
if (best_mode == -1 || diff < best_mode_diff)
{
TXT_SetRadioButtonLabel(modes[i].widget, modes[i].description);
}
else
{
TXT_SetRadioButtonLabel(modes[i].widget, modes[i].description_4_3);
best_mode_diff = diff;
best_mode = i;
}
}
return best_mode;
}
static void GenerateModesTable(TXT_UNCAST_ARG(widget),
TXT_UNCAST_ARG(modes_table))
{
TXT_CAST_ARG(txt_table_t, modes_table);
char buf[15];
screen_mode_t *modes;
txt_radiobutton_t *rbutton;
int i;
// Pick which modes list to use
if (fullscreen)
{
BuildFullscreenModesList();
modes = screen_modes_fullscreen;
}
else if (aspect_ratio_correct)
{
modes = screen_modes_scaled;
}
else
{
modes = screen_modes_unscaled;
}
// Build the table
TXT_ClearTable(modes_table);
TXT_SetColumnWidths(modes_table, 14, 14, 14);
for (i=0; modes[i].w != 0; ++i)
{
// Skip bad fullscreen modes
if (fullscreen && !GoodFullscreenMode(&modes[i]))
{
continue;
}
sprintf(buf, "%ix%i", modes[i].w, modes[i].h);
rbutton = TXT_NewRadioButton(buf, &vidmode, i);
TXT_AddWidget(modes_table, rbutton);
TXT_SignalConnect(rbutton, "selected", ModeSelected, &modes[i]);
}
// Find the nearest mode in the list that matches the current
// settings
vidmode = FindBestMode(modes);
}
void ConfigDisplay(void)
{
txt_window_t *window;
txt_table_t *ar_table;
txt_table_t *modes_table;
txt_radiobutton_t *rbutton;
txt_dropdown_list_t *ar_dropdown;
int i;
// Find the current mode
SetCurrentMode();
txt_checkbox_t *fs_checkbox;
txt_checkbox_t *ar_checkbox;
// Open the window
window = TXT_NewWindow("Display Configuration");
TXT_AddWidgets(window,
TXT_NewCheckBox("Fullscreen", &fullscreen),
ar_table = TXT_NewTable(2),
TXT_NewSeparator("Screen mode"),
modes_table = TXT_NewTable(2),
TXT_NewSeparator("Misc."),
TXT_NewCheckBox("Show ENDOOM screen", &show_endoom),
fs_checkbox = TXT_NewCheckBox("Fullscreen", &fullscreen),
ar_checkbox = TXT_NewCheckBox("Correct aspect ratio",
&aspect_ratio_correct),
NULL);
TXT_SetColumnWidths(ar_table, 25, 0);
#ifdef _WIN32
{
txt_table_t *driver_table;
txt_dropdown_list_t *driver_list;
driver_table = TXT_NewTable(2);
TXT_SetColumnWidths(driver_table, 25, 0);
driver_list = TXT_NewDropdownList(&win32_video_driver,
win32_video_drivers,
2);
@ -185,32 +292,25 @@ void ConfigDisplay(void)
TXT_SignalConnect(driver_list, "changed", UpdateVideoDriver, NULL);
SetWin32VideoDriver();
TXT_AddWidgets(ar_table,
TXT_AddWidgets(driver_table,
TXT_NewLabel("Video driver"),
driver_list,
NULL);
TXT_AddWidget(window, driver_table);
}
#endif
TXT_AddWidgets(ar_table,
TXT_NewLabel("Aspect ratio correction"),
ar_dropdown = TXT_NewDropdownList(&aspect_ratio_correct,
aspect_ratio_strings,
NUM_RATIO_CORRECT),
TXT_AddWidgets(window,
TXT_NewSeparator("Screen mode"),
modes_table = TXT_NewTable(3),
TXT_NewSeparator("Misc."),
TXT_NewCheckBox("Show ENDOOM screen", &show_endoom),
NULL);
TXT_SignalConnect(ar_dropdown, "changed", UpdateModes, NULL);
TXT_SignalConnect(fs_checkbox, "changed", GenerateModesTable, modes_table);
TXT_SignalConnect(ar_checkbox, "changed", GenerateModesTable, modes_table);
TXT_SetColumnWidths(modes_table, 14, 14);
for (i=0; modes[i].description != NULL; ++i)
{
rbutton = TXT_NewRadioButton(modes[i].description, &vidmode, i);
modes[i].widget = rbutton;
TXT_AddWidget(modes_table, rbutton);
TXT_SignalConnect(rbutton, "selected", ModeSelected, &modes[i]);
}
UpdateModes(NULL, NULL);
GenerateModesTable(NULL, modes_table);
}

View file

@ -25,7 +25,7 @@
extern int autoadjust_video_settings;
extern int aspect_ratio_correct;
extern int fullscreen;
extern int screenmultiply;
extern int screen_width, screen_height;
extern int startup_delay;
extern int show_endoom;
extern char *video_driver;

View file

@ -33,14 +33,18 @@
#include "txt_strut.h"
#include "txt_table.h"
static void TXT_TableDestructor(TXT_UNCAST_ARG(table))
// Remove all entries from a table
void TXT_ClearTable(TXT_UNCAST_ARG(table))
{
TXT_CAST_ARG(txt_table_t, table);
int i;
// Free all widgets
// Skip over the first (num_columns) widgets in the array, as these
// are the column struts used to control column width
for (i=0; i<table->num_widgets; ++i)
for (i=table->columns; i<table->num_widgets; ++i)
{
if (table->widgets[i] != NULL)
{
@ -48,9 +52,16 @@ static void TXT_TableDestructor(TXT_UNCAST_ARG(table))
}
}
// Free table resources
// Shrink the table to just the column strut widgets
free(table->widgets);
table->num_widgets = table->columns;
}
static void TXT_TableDestructor(TXT_UNCAST_ARG(table))
{
TXT_CAST_ARG(txt_table_t, table);
TXT_ClearTable(table);
}
static int TableRows(txt_table_t *table)

View file

@ -53,6 +53,7 @@ void TXT_AddWidget(TXT_UNCAST_ARG(table), TXT_UNCAST_ARG(widget));
void TXT_AddWidgets(TXT_UNCAST_ARG(table), ...);
int TXT_SelectWidget(TXT_UNCAST_ARG(table), TXT_UNCAST_ARG(widget));
void TXT_SetColumnWidths(TXT_UNCAST_ARG(table), ...);
void TXT_ClearTable(TXT_UNCAST_ARG(table));
#endif /* #ifndef TXT_TABLE_T */