ref: 7093b65c7d3aa88e6fcaaf2994e76db27d8c31aa
parent: c724b3877a4d67e6ed377df84e454ec11d6c4f1c
author: Simon Howard <fraggle@gmail.com>
date: Tue Mar 22 15:49:31 EDT 2011
Reorganise the display settings window. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 2306
--- a/setup/display.c
+++ b/setup/display.c
@@ -519,23 +519,17 @@
#if defined(_WIN32) && !defined(_WIN32_WCE)
-static int win32_video_driver = 0;
+static int use_directx = 1;
-static char *win32_video_drivers[] =
-{
- "DirectX",
- "Windows GDI",
-};
-
static void SetWin32VideoDriver(void)
{
if (!strcmp(video_driver, "windib"))
{
- win32_video_driver = 1;
+ use_directx = 0;
}
else
{
- win32_video_driver = 0;
+ use_directx = 1;
}
}
@@ -543,14 +537,16 @@
TXT_UNCAST_ARG(modes_table))
{
TXT_CAST_ARG(txt_table_t, modes_table);
- char *drivers[] =
+
+ if (use_directx)
{
- "",
- "windib",
- };
+ video_driver = "";
+ }
+ else
+ {
+ video_driver = "windib";
+ }
- video_driver = drivers[win32_video_driver != 0];
-
// When the video driver is changed, we need to restart the textscreen
// library.
@@ -569,7 +565,49 @@
#endif
+static void AdvancedDisplayConfig(TXT_UNCAST_ARG(widget),
+ TXT_UNCAST_ARG(modes_table))
+{
+ TXT_CAST_ARG(txt_table_t, modes_table);
+ txt_window_t *window;
+ txt_checkbox_t *ar_checkbox;
+ window = TXT_NewWindow("Advanced display options");
+
+ TXT_SetColumnWidths(window, 35);
+
+ TXT_AddWidgets(window,
+ ar_checkbox = TXT_NewCheckBox("Fix aspect ratio",
+ &aspect_ratio_correct),
+ TXT_NewCheckBox("Show ENDOOM screen on exit", &show_endoom),
+ NULL);
+
+ TXT_SignalConnect(ar_checkbox, "changed", GenerateModesTable, modes_table);
+
+ // On Windows, there is an extra control to change between
+ // the Windows GDI and DirectX video drivers.
+
+#if defined(_WIN32) && !defined(_WIN32_WCE)
+ {
+ txt_radiobutton_t *dx_button, *gdi_button;
+
+ TXT_AddWidgets(window,
+ TXT_NewSeparator("Windows video driver"),
+ dx_button = TXT_NewRadioButton("DirectX",
+ &use_directx, 1),
+ gdi_button = TXT_NewRadioButton("Windows GDI",
+ &use_directx, 0),
+ NULL);
+
+ TXT_SignalConnect(dx_button, "selected",
+ UpdateVideoDriver, modes_table);
+ TXT_SignalConnect(gdi_button, "selected",
+ UpdateVideoDriver, modes_table);
+ SetWin32VideoDriver();
+ }
+#endif
+}
+
void ConfigDisplay(void)
{
txt_window_t *window;
@@ -576,8 +614,8 @@
txt_table_t *modes_table;
txt_table_t *bpp_table;
txt_checkbox_t *fs_checkbox;
- txt_checkbox_t *ar_checkbox;
- txt_dropdown_list_t *bpp_selector;
+ txt_window_action_t *advanced_button;
+ int i;
int num_columns;
int num_rows;
int window_y;
@@ -597,15 +635,9 @@
}
// Open the window
-
+
window = TXT_NewWindow("Display Configuration");
- TXT_AddWidgets(window,
- fs_checkbox = TXT_NewCheckBox("Fullscreen", &fullscreen),
- ar_checkbox = TXT_NewCheckBox("Correct aspect ratio",
- &aspect_ratio_correct),
- NULL);
-
// Some machines can have lots of video modes. This tries to
// keep a limit of six lines by increasing the number of
// columns. In extreme cases, the window is moved up slightly.
@@ -612,11 +644,11 @@
BuildFullscreenModesList();
- if (num_screen_modes_fullscreen <= 18)
+ if (num_screen_modes_fullscreen <= 24)
{
num_columns = 3;
}
- else if (num_screen_modes_fullscreen <= 24)
+ else if (num_screen_modes_fullscreen <= 40)
{
num_columns = 4;
}
@@ -625,76 +657,83 @@
num_columns = 5;
}
- num_rows = (num_screen_modes_fullscreen + num_columns - 1) / num_columns;
-
- if (num_rows < 10)
- {
- window_y = 6 - ((num_rows + 1) / 2);
- }
- else
- {
- window_y = 1;
- }
-
modes_table = TXT_NewTable(num_columns);
- // The window is set at a fixed vertical position. This keeps
- // the top of the window stationary when switching between
- // fullscreen and windowed mode (which causes the window's
- // height to change).
+ // Build window:
- TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP,
- TXT_SCREEN_W / 2, window_y);
+ TXT_AddWidget(window,
+ fs_checkbox = TXT_NewCheckBox("Full screen", &fullscreen));
- // On Windows, there is an extra control to change between
- // the Windows GDI and DirectX video drivers.
-
-#if defined(_WIN32) && !defined(_WIN32_WCE)
+ if (num_supported_bpps > 1)
{
- txt_table_t *driver_table;
- txt_dropdown_list_t *driver_list;
-
- driver_table = TXT_NewTable(2);
-
- TXT_SetColumnWidths(driver_table, 20, 0);
-
- TXT_AddWidgets(driver_table,
- TXT_NewLabel("Video driver"),
- driver_list = TXT_NewDropdownList(&win32_video_driver,
- win32_video_drivers,
- 2),
+ TXT_AddWidgets(window,
+ TXT_NewSeparator("Color depth"),
+ bpp_table = TXT_NewTable(4),
NULL);
- TXT_SignalConnect(driver_list, "changed",
- UpdateVideoDriver, modes_table);
- SetWin32VideoDriver();
+ for (i = 0; i < num_supported_bpps; ++i)
+ {
+ txt_radiobutton_t *button;
- TXT_AddWidget(window, driver_table);
+ button = TXT_NewRadioButton(supported_bpps[i],
+ &selected_bpp, i);
+
+ TXT_AddWidget(bpp_table, button);
+ TXT_SignalConnect(button, "selected", UpdateBPP, modes_table);
+ }
}
-#endif
- // Screen modes list
-
TXT_AddWidgets(window,
TXT_NewSeparator("Screen mode"),
- bpp_table = TXT_NewTable(2),
modes_table,
- TXT_NewSeparator("Misc."),
- TXT_NewCheckBox("Show ENDOOM screen", &show_endoom),
NULL);
- TXT_AddWidgets(bpp_table,
- TXT_NewLabel("Color depth: "),
- bpp_selector = TXT_NewDropdownList(&selected_bpp,
- supported_bpps,
- num_supported_bpps),
- NULL);
+ TXT_SignalConnect(fs_checkbox, "changed", GenerateModesTable, modes_table);
+ // How many rows high will the configuration window be?
+ // Need to take into account number of fullscreen modes, and also
+ // number of supported pixel depths.
+ // The windowed modes list is four rows, so take the maximum of
+ // windowed and fullscreen.
- TXT_SignalConnect(bpp_selector, "changed", UpdateBPP, modes_table);
- TXT_SignalConnect(fs_checkbox, "changed", GenerateModesTable, modes_table);
- TXT_SignalConnect(ar_checkbox, "changed", GenerateModesTable, modes_table);
+ num_rows = (num_screen_modes_fullscreen + num_columns - 1) / num_columns;
+ if (num_rows < 4)
+ {
+ num_rows = 4;
+ }
+
+ if (num_supported_bpps > 1)
+ {
+ num_rows += 2;
+ }
+
+ if (num_rows < 14)
+ {
+ window_y = 8 - ((num_rows + 1) / 2);
+ }
+ else
+ {
+ window_y = 1;
+ }
+
+ // The window is set at a fixed vertical position. This keeps
+ // the top of the window stationary when switching between
+ // fullscreen and windowed mode (which causes the window's
+ // height to change).
+
+ TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP,
+ TXT_SCREEN_W / 2, window_y);
+
GenerateModesTable(NULL, modes_table);
+
+ // Button to open "advanced" window.
+ // Need to pass a pointer to the modes table, as some of the options
+ // in there trigger a rebuild of it.
+
+ advanced_button = TXT_NewWindowAction('a', "Advanced");
+ TXT_SetWindowAction(window, TXT_HORIZ_CENTER, advanced_button);
+ TXT_SignalConnect(advanced_button, "pressed",
+ AdvancedDisplayConfig, modes_table);
}