static void CalibrateJoystick(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused)) { // Try to open all available joysticks. If none are opened successfully, // bomb out with an error. if (!OpenAllJoysticks()) { NoJoystick(); return; } calibration_window = TXT_NewWindow("Gamepad/Joystick calibration"); TXT_AddWidgets(calibration_window, TXT_NewStrut(0, 1), TXT_NewLabel("Center the D-pad or joystick,\n" "and press a button."), TXT_NewStrut(0, 1), NULL); TXT_SetWindowAction(calibration_window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(calibration_window, TXT_HORIZ_CENTER, TXT_NewWindowAbortAction(calibration_window)); TXT_SetWindowAction(calibration_window, TXT_HORIZ_RIGHT, NULL); TXT_SDL_SetEventCallback(CalibrationEventCallback, NULL); TXT_SignalConnect(calibration_window, "closed", CalibrateWindowClosed, NULL); // Start calibration joystick_index = -1; }
void ScrollingMenu(void) { txt_window_t *window; txt_button_t *button; txt_table_t *table; window = TXT_NewWindow("Scrollable menu"); table = TXT_NewTable(1); TXT_AddWidgets(table, TXT_NewButton("Configure display"), TXT_NewButton("Configure joystick"), TXT_NewButton("Configure keyboard"), TXT_NewButton("Configure mouse"), TXT_NewButton("Configure sound"), TXT_NewStrut(0, 1), button = TXT_NewButton("Save Parameters and launch DOOM"), TXT_NewStrut(0, 1), TXT_NewButton("Start a network game"), TXT_NewButton("Join a network game"), TXT_NewButton("Multiplayer configuration"), NULL); TXT_SignalConnect(button, "pressed", PwnBox, NULL); TXT_AddWidget(window, TXT_NewScrollPane(0, 6, table)); }
static void BuildWindow(void) { char buf[50]; txt_table_t *table; int i; TXT_ClearTable(window); table = TXT_NewTable(3); TXT_AddWidget(window, table); // Add spacers TXT_AddWidget(table, NULL); TXT_AddWidget(table, TXT_NewStrut(25, 1)); TXT_AddWidget(table, TXT_NewStrut(17, 1)); // Player labels for (i = 0; i < net_client_wait_data.max_players; ++i) { sprintf(buf, " %i. ", i + 1); TXT_AddWidget(table, TXT_NewLabel(buf)); player_labels[i] = TXT_NewLabel(""); ip_labels[i] = TXT_NewLabel(""); TXT_AddWidget(table, player_labels[i]); TXT_AddWidget(table, ip_labels[i]); } drone_label = TXT_NewLabel(""); TXT_AddWidget(window, drone_label); }
static void VKBCreateWindow(txt_inputbox_t *inputbox, int charset_index) { int i; txt_table_t *keyboard; txt_table_t *softact; txt_table_t *softact_okcancel; txt_table_t *organizer; txt_window_action_t *cancel, *caps; //Create Widgets vkb_window = TXT_NewWindow(NULL); vkb_inputbox = inputbox; vkb_charset_index = charset_index; vkb_label = TXT_NewLabel(""); keyboard = TXT_NewTable(19); organizer = TXT_NewTable(3); softact = TXT_NewTable(1); //Populate Window TXT_AddWidget(vkb_window, vkb_label); TXT_AddWidget(vkb_window, TXT_NewSeparator(NULL)); TXT_AddWidget(vkb_window, organizer); TXT_AddWidget(organizer, keyboard); TXT_AddWidget(organizer, TXT_NewStrut(1, 0)); TXT_AddWidget(organizer, softact); //Create Actions cancel = TXT_NewWindowAction(KEY_BBUTTON, "Revert"); caps = TXT_NewWindowAction(KEY_YBUTTON, "Caps"); TXT_SignalConnect(cancel, "pressed", VKBCloseWindow, 0); TXT_SignalConnect(caps, "pressed", VKBCycleCharsets, 0); TXT_AddWidget(softact, TXT_NewButton2("Backspace", VKBBackspace, NULL)); TXT_AddWidget(softact, TXT_NewButton2("Caps-Lock", VKBCycleCharsets, NULL)); TXT_AddWidget(softact, TXT_NewButton2("Revert", VKBCloseWindow, 0)); TXT_AddWidget(softact, TXT_NewButton2("Accept", VKBCloseWindow, 1)); //Create buttons and populate keyboard table for (i=0; vkb_charset[vkb_charset_index][i] != '\0'; i++) { char button[] = {vkb_charset[vkb_charset_index][i], '\0'}; TXT_AddWidget(keyboard, TXT_NewButton2(button, VKBAddCharacter, button[0])); //, VKBAddCharacter)); //Don't add padding on the last of row if ((i+1) % 10) { TXT_AddWidget(keyboard, TXT_NewStrut(1, 0)); } } //Format & Update things TXT_SetWindowAction(vkb_window, TXT_HORIZ_LEFT, cancel); TXT_SetWindowAction(vkb_window, TXT_HORIZ_RIGHT, caps); TXT_SetWidgetAlign(keyboard, TXT_HORIZ_CENTER); TXT_SetBGColor(vkb_label, TXT_COLOR_BLACK); TXT_LayoutWindow(vkb_window); VKBUpdateLabel(); inputbox->editing = 1; }
void TXT_ConfigureJoystickAxis(txt_joystick_axis_t *joystick_axis, int using_button, txt_joystick_axis_callback_t callback) { // Open the joystick first. if (SDL_Init(SDL_INIT_JOYSTICK) < 0) { return; } joystick_axis->joystick = SDL_JoystickOpen(joystick_index); if (joystick_axis->joystick == NULL) { TXT_MessageBox(NULL, "Please configure a controller first!"); return; } SDL_JoystickEventState(SDL_ENABLE); // Build the prompt window. joystick_axis->config_window = TXT_NewWindow("Gamepad/Joystick calibration"); TXT_AddWidgets(joystick_axis->config_window, TXT_NewStrut(0, 1), joystick_axis->config_label = TXT_NewLabel(""), TXT_NewStrut(0, 1), NULL); TXT_SetWindowAction(joystick_axis->config_window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(joystick_axis->config_window, TXT_HORIZ_CENTER, TXT_NewWindowAbortAction(joystick_axis->config_window)); TXT_SetWindowAction(joystick_axis->config_window, TXT_HORIZ_RIGHT, NULL); TXT_SetWidgetAlign(joystick_axis->config_window, TXT_HORIZ_CENTER); if (using_button >= 0) { joystick_axis->config_stage = CONFIG_STAGE1; joystick_axis->config_button = using_button; IdentifyBadAxes(joystick_axis); } else { joystick_axis->config_stage = CONFIG_CENTER; } SetCalibrationLabel(joystick_axis); // Close the joystick and shut down joystick subsystem when the window // is closed. TXT_SignalConnect(joystick_axis->config_window, "closed", CalibrateWindowClosed, joystick_axis); TXT_SDL_SetEventCallback(EventCallback, joystick_axis); // When successfully calibrated, invoke this callback: joystick_axis->callback = callback; }
static void AddSectionLabel(txt_table_t *table, char *title, boolean add_space) { char buf[64]; if (add_space) { TXT_AddWidgets(table, TXT_NewStrut(0, 1), TXT_NewStrut(0, 1), NULL); } M_snprintf(buf, sizeof(buf), " - %s - ", title); TXT_AddWidgets(table, TXT_NewLabel(buf), TXT_NewStrut(0, 0), NULL); }
static void QuitConfirm(void *unused1, void *unused2) { txt_window_t *window; txt_label_t *label; txt_button_t *yes_button; txt_button_t *no_button; window = TXT_NewWindow(NULL); TXT_AddWidgets(window, label = TXT_NewLabel("Exiting setup.\nSave settings?"), TXT_NewStrut(24, 0), yes_button = TXT_NewButton2(" Yes ", DoQuit, DoQuit), no_button = TXT_NewButton2(" No ", DoQuit, NULL), NULL); TXT_SetWidgetAlign(label, TXT_HORIZ_CENTER); TXT_SetWidgetAlign(yes_button, TXT_HORIZ_CENTER); TXT_SetWidgetAlign(no_button, TXT_HORIZ_CENTER); // Only an "abort" button in the middle. TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TXT_NewWindowAbortAction(window)); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); }
void TXT_SetTableColumns(TXT_UNCAST_ARG(table), int new_columns) { TXT_CAST_ARG(txt_table_t, table); txt_widget_t **new_widgets; txt_widget_t *widget; int new_num_widgets; int i, j, x; // We need as many full rows as are in the current list, plus the // remainder from the last row. new_num_widgets = (table->num_widgets / table->columns) * new_columns + (table->num_widgets % table->columns); new_widgets = calloc(new_num_widgets, sizeof(txt_widget_t *)); // Reset and add one by one from the old table. new_num_widgets = 0; for (i = 0; i < table->num_widgets; ++i) { widget = table->widgets[i]; x = i % table->columns; if (x < new_columns) { new_widgets[new_num_widgets] = widget; ++new_num_widgets; } else if (IsActualWidget(widget)) { TXT_DestroyWidget(widget); } // When we reach the last column of a row, we must pad it out with // extra widgets to reach the next row. if (x == table->columns - 1) { for (j = table->columns; j < new_columns; ++j) { // First row? We need to add struts that are used to apply // the column widths. if (i < table->columns) { widget = &TXT_NewStrut(0, 0)->widget; } else { widget = &txt_table_overflow_right; } new_widgets[new_num_widgets] = widget; ++new_num_widgets; } } } free(table->widgets); table->widgets = new_widgets; table->num_widgets = new_num_widgets; table->columns = new_columns; }
static void OpenGameSelectDialog(GameSelectCallback callback) { mission_config_t *mission = NULL; txt_window_t *window; const iwad_t **iwads; int num_games; int i; window = TXT_NewWindow("Select game"); TXT_AddWidget(window, TXT_NewLabel("Select a game to configure:\n")); num_games = 0; // Add a button for each game. for (i=0; i<arrlen(mission_configs); ++i) { // Do we have any IWADs for this game installed? // If so, add a button. iwads = D_FindAllIWADs(mission_configs[i].mask); if (iwads[0] != NULL) { mission = &mission_configs[i]; TXT_AddWidget(window, TXT_NewButton2(mission_configs[i].label, GameSelected, &mission_configs[i])); ++num_games; } free(iwads); } TXT_AddWidget(window, TXT_NewStrut(0, 1)); // No IWADs found at all? Fall back to doom, then. if (num_games == 0) { TXT_CloseWindow(window); SetMission(DEFAULT_MISSION); callback(); return; } // Only one game? Use that game, and don't bother with a dialog. if (num_games == 1) { TXT_CloseWindow(window); SetMission(mission); callback(); return; } game_selected_callback = callback; }
void MainMenu(void) { txt_window_t *window; txt_window_action_t *quit_action; txt_window_action_t *warp_action; window = TXT_NewWindow("Main Menu"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_AddWidgets(window, TXT_NewButton2("Configure Display", (TxtWidgetSignalFunc) ConfigDisplay, NULL), TXT_NewButton2("Configure Sound", (TxtWidgetSignalFunc) ConfigSound, NULL), TXT_NewButton2("Configure Keyboard", (TxtWidgetSignalFunc) ConfigKeyboard, NULL), TXT_NewButton2("Configure Mouse", (TxtWidgetSignalFunc) ConfigMouse, NULL), TXT_NewButton2("Configure Gamepad/Joystick", (TxtWidgetSignalFunc) ConfigJoystick, NULL), NULL); // The compatibility window is only appropriate for Doom/Strife. if (gamemission == doom || gamemission == strife) { txt_button_t *button; button = TXT_NewButton2("Compatibility", (TxtWidgetSignalFunc) CompatibilitySettings, NULL); TXT_AddWidget(window, button); } TXT_AddWidgets(window, GetLaunchButton(), TXT_NewStrut(0, 1), TXT_NewButton2("Start a Network Game", (TxtWidgetSignalFunc) StartMultiGame, NULL), TXT_NewButton2("Join a Network Game", (TxtWidgetSignalFunc) JoinMultiGame, NULL), TXT_NewButton2("Multiplayer Configuration", (TxtWidgetSignalFunc) MultiplayerConfig, NULL), NULL); quit_action = TXT_NewWindowAction(KEY_ESCAPE, "Quit"); warp_action = TXT_NewWindowAction(KEY_F2, "Warp"); TXT_SignalConnect(quit_action, "pressed", QuitConfirm, NULL); TXT_SignalConnect(warp_action, "pressed", (TxtWidgetSignalFunc) WarpMenu, NULL); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, quit_action); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, warp_action); TXT_SetKeyListener(window, MainMenuKeyPress, NULL); }
static void CalibrateJoystick(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused)) { calibrate_stage = CALIBRATE_CENTER; // Try to open all available joysticks. If none are opened successfully, // bomb out with an error. if (!OpenAllJoysticks()) { NoJoystick(); return; } calibration_window = TXT_NewWindow("Gamepad/Joystick calibration"); TXT_AddWidgets(calibration_window, TXT_NewLabel("Please follow the following instructions\n" "in order to calibrate your controller."), TXT_NewStrut(0, 1), calibration_label = TXT_NewLabel("zzz"), TXT_NewStrut(0, 1), NULL); TXT_SetWindowAction(calibration_window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(calibration_window, TXT_HORIZ_CENTER, TXT_NewWindowAbortAction(calibration_window)); TXT_SetWindowAction(calibration_window, TXT_HORIZ_RIGHT, NULL); TXT_SetWidgetAlign(calibration_label, TXT_HORIZ_CENTER); TXT_SDL_SetEventCallback(CalibrationEventCallback, NULL); TXT_SignalConnect(calibration_window, "closed", CalibrateWindowClosed, NULL); // Start calibration joystick_index = -1; calibrate_stage = CALIBRATE_CENTER; SetCalibrationLabel(); }
void BuildGUI() { txt_window_t *window; txt_table_t *table; window = TXT_NewWindow("Calculator"); input_box = TXT_NewLabel("asdf"); TXT_SetBGColor(input_box, TXT_COLOR_BLACK); TXT_AddWidget(window, input_box); TXT_AddWidget(window, TXT_NewSeparator(NULL)); TXT_AddWidget(window, TXT_NewStrut(0, 1)); table = TXT_NewTable(4); TXT_AddWidget(window, table); TXT_SetWidgetAlign(table, TXT_HORIZ_CENTER); AddNumberButton(table, 7); AddNumberButton(table, 8); AddNumberButton(table, 9); AddOperatorButton(table, "*", OP_MULT); AddNumberButton(table, 4); AddNumberButton(table, 5); AddNumberButton(table, 6); AddOperatorButton(table, "-", OP_MINUS); AddNumberButton(table, 1); AddNumberButton(table, 2); AddNumberButton(table, 3); AddOperatorButton(table, "+", OP_PLUS); AddNumberButton(table, 0); TXT_AddWidget(table, NULL); TXT_AddWidget(table, TXT_NewButton2(" = ", Calculate, NULL)); AddOperatorButton(table, "/", OP_DIV); TXT_AddWidget(window, TXT_NewStrut(0, 1)); UpdateInputBox(); }
void JoinMultiGame(void) { txt_window_t *window; txt_table_t *gameopt_table; txt_table_t *serveropt_table; txt_inputbox_t *address_box; window = TXT_NewWindow("Join multiplayer game"); TXT_SetWindowHelpURL(window, MULTI_JOIN_HELP_URL); TXT_AddWidgets(window, gameopt_table = TXT_NewTable(2), TXT_NewSeparator("Server"), serveropt_table = TXT_NewTable(1), TXT_NewStrut(0, 1), TXT_NewButton2("Add extra parameters...", OpenExtraParamsWindow, NULL), NULL); TXT_SetColumnWidths(gameopt_table, 12, 12); TXT_AddWidgets(gameopt_table, TXT_NewLabel("Game"), IWADSelector(), NULL); if (gamemission == hexen) { TXT_AddWidgets(gameopt_table, TXT_NewLabel("Character class "), TXT_NewDropdownList(&character_class, character_classes, 3), NULL); } TXT_AddWidgets(serveropt_table, TXT_NewHorizBox( TXT_NewLabel("Connect to address: "), address_box = TXT_NewInputBox(&connect_address, 30), NULL), TXT_NewButton2("Find server on Internet...", FindInternetServer, NULL), TXT_NewButton2("Find server on local network...", FindLANServer, NULL), NULL); TXT_SelectWidget(window, address_box); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, WadWindowAction()); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, JoinGameAction()); }
void MultiplayerConfig(TXT_UNCAST_ARG(widget), void *user_data) { txt_window_t *window; txt_label_t *label; txt_table_t *table; char buf[10]; int i; window = TXT_NewWindow("Multiplayer Configuration"); TXT_SetWindowHelpURL(window, MULTI_CONFIG_HELP_URL); TXT_AddWidgets(window, TXT_NewStrut(0, 1), TXT_NewHorizBox(TXT_NewLabel("Player name: "), TXT_NewInputBox(&net_player_name, 25), NULL), TXT_NewStrut(0, 1), TXT_NewSeparator("Chat macros"), NULL); table = TXT_NewTable(2); for (i=0; i<10; ++i) { M_snprintf(buf, sizeof(buf), "#%i ", i + 1); label = TXT_NewLabel(buf); TXT_SetFGColor(label, TXT_COLOR_BRIGHT_CYAN); TXT_AddWidgets(table, label, TXT_NewInputBox(&chat_macros[(i + 1) % 10], 40), NULL); } TXT_AddWidget(window, table); }
void MultiplayerConfig(void) { txt_window_t *window; txt_label_t *label; txt_table_t *table; char buf[10]; int i; window = TXT_NewWindow("Multiplayer Configuration"); TXT_AddWidgets(window, TXT_NewStrut(0, 1), TXT_NewHorizBox(TXT_NewLabel("Player name: "), TXT_NewInputBox(&net_player_name, 25), NULL), TXT_NewStrut(0, 1), TXT_NewSeparator("Chat macros"), NULL); table = TXT_NewTable(2); for (i=0; i<10; ++i) { sprintf(buf, "#%i ", i + 1); label = TXT_NewLabel(buf); TXT_SetFGColor(label, TXT_COLOR_BRIGHT_CYAN); TXT_AddWidgets(table, label, TXT_NewInputBox(&chat_macros[(i + 1) % 10], 40), NULL); } TXT_AddWidget(window, table); }
void TXT_InitTable(txt_table_t *table, int columns) { int i; TXT_InitWidget(table, &txt_table_class); table->columns = columns; table->widgets = NULL; table->num_widgets = 0; table->selected_x = 0; table->selected_y = 0; // Add a strut for each column at the start of the table. // These are used by the TXT_SetColumnWidths function below: // the struts are created with widths of 0 each, but this // function changes them. for (i=0; i<columns; ++i) { TXT_AddWidget(table, TXT_NewStrut(0, 0)); } }
void JoinMultiGame(void) { txt_window_t *window; txt_table_t *gameopt_table; txt_table_t *serveropt_table; txt_inputbox_t *address_box; window = TXT_NewWindow("Join multiplayer game"); TXT_AddWidgets(window, gameopt_table = TXT_NewTable(2), TXT_NewSeparator("Server"), serveropt_table = TXT_NewTable(2), TXT_NewStrut(0, 1), TXT_NewButton2("Add extra parameters...", OpenExtraParamsWindow, NULL), NULL); TXT_SetColumnWidths(gameopt_table, 12, 12); TXT_AddWidgets(gameopt_table, TXT_NewLabel("Game"), IWADSelector(), NULL); TXT_AddWidgets(serveropt_table, TXT_NewRadioButton("Connect to address:", &jointype, JOIN_ADDRESS), address_box = TXT_NewInputBox(&connect_address, 30), TXT_NewRadioButton("Auto-join LAN game", &jointype, JOIN_AUTO_LAN), NULL); TXT_SignalConnect(address_box, "changed", SelectAddressJoin, NULL); TXT_SelectWidget(window, address_box); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, WadWindowAction()); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, JoinGameAction()); }
void SetupWindow(void) { txt_window_t *window; txt_table_t *table; txt_table_t *rightpane; txt_checkbox_t *cheesy_checkbox; txt_window_action_t *pwn; txt_label_t *toplabel; char buf[100]; int i; window = TXT_NewWindow("Window test"); TXT_AddWidget(window, TXT_NewSeparator("Main section")); table = TXT_NewTable(3); toplabel = TXT_NewLabel("This is a multiline label.\n" "A single label object contains \n" "all three of these lines.\n"); TXT_AddWidget(window, toplabel); TXT_SetWidgetAlign(toplabel, TXT_HORIZ_CENTER); //TXT_AddWidget(window, TXT_NewScrollPane(15, 4, table)); TXT_AddWidget(window, table); for (i=0; i<5; ++i) { sprintf(buf, "Option %i in a table:", i + 1); TXT_AddWidget(table, TXT_NewLabel(buf)); sprintf(buf, " Button %i-1 ", i + 1); TXT_AddWidget(table, TXT_NewButton(buf)); sprintf(buf, " Button %i-2 ", i + 1); TXT_AddWidget(table, TXT_NewButton(buf)); } TXT_AddWidget(window, TXT_NewStrut(0, 1)); value_label = TXT_NewLabel(""); TXT_AddWidget(window, value_label); table = TXT_NewTable(2); TXT_AddWidget(window, table); TXT_SetWidgetAlign(table, TXT_HORIZ_CENTER); cheesy_checkbox = TXT_NewCheckBox("Cheesy", &cheesy); TXT_AddWidget(table, cheesy_checkbox); TXT_SignalConnect(cheesy_checkbox, "changed", UpdateLabel, NULL); rightpane = TXT_NewTable(1); TXT_AddWidget(table, rightpane); for (i=0; i<3; ++i) { txt_radiobutton_t *rbut; rbut = TXT_NewRadioButton(radio_values[i], &radiobutton_value, i); TXT_AddWidget(rightpane, rbut); TXT_SignalConnect(rbut, "selected", UpdateLabel, NULL); } UpdateLabel(NULL, NULL); TXT_AddWidget(window, TXT_NewButton2("Close Window", CloseWindow, NULL)); pwn = TXT_NewWindowAction(KEY_F1, "PWN!"); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, pwn); TXT_SignalConnect(pwn, "pressed", PwnBox, NULL); firstwin = window; }
void ConfigSound(TXT_UNCAST_ARG(widget), void *user_data) { txt_window_t *window; txt_window_action_t *music_action; // Build the window window = TXT_NewWindow("Sound configuration"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_SetColumnWidths(window, 40); TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP, TXT_SCREEN_W / 2, 3); music_action = TXT_NewWindowAction('m', "Music Packs"); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, music_action); TXT_SignalConnect(music_action, "pressed", OpenMusicPackDir, NULL); TXT_AddWidgets(window, TXT_NewSeparator("Sound effects"), TXT_NewRadioButton("Disabled", &snd_sfxdevice, SNDDEVICE_NONE), TXT_If(gamemission == doom, TXT_NewRadioButton("PC speaker effects", &snd_sfxdevice, SNDDEVICE_PCSPEAKER)), TXT_NewRadioButton("Digital sound effects", &snd_sfxdevice, SNDDEVICE_SB), TXT_If(gamemission == doom || gamemission == heretic || gamemission == hexen, TXT_NewConditional(&snd_sfxdevice, SNDDEVICE_SB, TXT_NewHorizBox( TXT_NewStrut(4, 0), TXT_NewCheckBox("Pitch-shifted sounds", &snd_pitchshift), NULL))), TXT_If(gamemission == strife, TXT_NewConditional(&snd_sfxdevice, SNDDEVICE_SB, TXT_NewHorizBox( TXT_NewStrut(4, 0), TXT_NewCheckBox("Show text with voices", &show_talk), NULL))), TXT_NewSeparator("Music"), TXT_NewRadioButton("Disabled", &snd_musicdevice, SNDDEVICE_NONE), TXT_NewRadioButton("OPL (Adlib/Soundblaster)", &snd_musicdevice, SNDDEVICE_SB), TXT_NewConditional(&snd_musicdevice, SNDDEVICE_SB, TXT_NewHorizBox( TXT_NewStrut(4, 0), TXT_NewLabel("Chip type: "), OPLTypeSelector(), NULL)), TXT_NewRadioButton("GUS (emulated)", &snd_musicdevice, SNDDEVICE_GUS), TXT_NewConditional(&snd_musicdevice, SNDDEVICE_GUS, TXT_MakeTable(2, TXT_NewStrut(4, 0), TXT_NewLabel("Path to patch files: "), TXT_NewStrut(4, 0), TXT_NewFileSelector(&gus_patch_path, 34, "Select directory containing GUS patches", TXT_DIRECTORY), NULL)), TXT_NewRadioButton("Native MIDI", &snd_musicdevice, SNDDEVICE_GENMIDI), TXT_NewConditional(&snd_musicdevice, SNDDEVICE_GENMIDI, TXT_MakeTable(2, TXT_NewStrut(4, 0), TXT_NewLabel("Timidity configuration file: "), TXT_NewStrut(4, 0), TXT_NewFileSelector(&timidity_cfg_path, 34, "Select Timidity config file", cfg_extension), NULL)), NULL); }