static void AdvancedDisplayConfig(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(sizes_table)) { TXT_CAST_ARG(txt_table_t, sizes_table); txt_window_t *window; txt_checkbox_t *ar_checkbox; window = TXT_NewWindow("Advanced display options"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_SetColumnWidths(window, 40); TXT_AddWidgets(window, ar_checkbox = TXT_NewCheckBox("Force correct aspect ratio", &aspect_ratio_correct), TXT_If(gamemission == heretic || gamemission == hexen || gamemission == strife, TXT_NewCheckBox("Graphical startup", &graphical_startup)), TXT_If(gamemission == doom || gamemission == heretic || gamemission == strife, TXT_NewCheckBox("Show ENDOOM screen on exit", &show_endoom)), #ifdef HAVE_LIBPNG TXT_NewCheckBox("Save screenshots in PNG format", &png_screenshots), #endif NULL); TXT_SignalConnect(ar_checkbox, "changed", GenerateSizesTable, sizes_table); }
static void ConfigExtraButtons(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused)) { txt_window_t *window; txt_table_t *buttons_table; window = TXT_NewWindow("Additional mouse buttons"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_AddWidgets(window, buttons_table = TXT_NewTable(2), NULL); TXT_SetColumnWidths(buttons_table, 24, 5); AddMouseControl(buttons_table, "Move backward", &mousebbackward); AddMouseControl(buttons_table, "Use", &mousebuse); AddMouseControl(buttons_table, "Strafe left", &mousebstrafeleft); AddMouseControl(buttons_table, "Strafe right", &mousebstraferight); if (gamemission == hexen || gamemission == strife) { AddMouseControl(buttons_table, "Jump", &mousebjump); } AddMouseControl(buttons_table, "Previous weapon", &mousebprevweapon); AddMouseControl(buttons_table, "Next weapon", &mousebnextweapon); }
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); }
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 ConfigMouse(void) { txt_window_t *window; window = TXT_NewWindow("Mouse configuration"); TXT_SetTableColumns(window, 2); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TestConfigAction()); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_AddWidgets(window, TXT_NewCheckBox("Enable mouse", &usemouse), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewInvertedCheckBox("Allow vertical mouse movement", &novert), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewCheckBox("Grab mouse in windowed mode", &grabmouse), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewCheckBox("Double click acts as \"use\"", &dclick_use), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewSeparator("Mouse motion"), TXT_NewLabel("Speed"), TXT_NewSpinControl(&mouseSensitivity, 1, 256), TXT_NewLabel("Acceleration"), TXT_NewFloatSpinControl(&mouse_acceleration, 1.0, 5.0), TXT_NewLabel("Acceleration threshold"), TXT_NewSpinControl(&mouse_threshold, 0, 32), TXT_NewSeparator("Buttons"), NULL); AddMouseControl(window, "Fire/Attack", &mousebfire); AddMouseControl(window, "Move forward", &mousebforward); AddMouseControl(window, "Strafe on", &mousebstrafe); TXT_AddWidget(window, TXT_NewButton2("More controls...", ConfigExtraButtons, NULL)); }
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 ConfigDisplay(TXT_UNCAST_ARG(widget), void *user_data) { txt_window_t *window; txt_table_t *sizes_table; txt_window_action_t *advanced_button; // Open the window window = TXT_NewWindow("Display Configuration"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); // Build window: TXT_AddWidgets(window, TXT_NewCheckBox("Full screen", &fullscreen), TXT_NewConditional(&fullscreen, 0, sizes_table = TXT_NewTable(3)), NULL); TXT_SetColumnWidths(window, 42); // 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, 6); GenerateSizesTable(NULL, sizes_table); // Button to open "advanced" window. // Need to pass a pointer to the window sizes 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, sizes_table); }
static void StartGameMenu(const char *window_title, int multiplayer) { txt_window_t *window; txt_widget_t *iwad_selector; window = TXT_NewWindow(window_title); TXT_SetTableColumns(window, 2); TXT_SetColumnWidths(window, 12, 6); if (multiplayer) { TXT_SetWindowHelpURL(window, MULTI_START_HELP_URL); } else { TXT_SetWindowHelpURL(window, LEVEL_WARP_HELP_URL); } TXT_SetWindowAction(window, TXT_HORIZ_CENTER, WadWindowAction()); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, StartGameAction(multiplayer)); TXT_AddWidgets(window, TXT_NewLabel("Game"), iwad_selector = IWADSelector(), NULL); if (gamemission == hexen) { txt_dropdown_list_t *cc_dropdown; TXT_AddWidgets(window, TXT_NewLabel("Character class "), cc_dropdown = TXT_NewDropdownList(&character_class, character_classes, 3), NULL); // Update skill level dropdown when the character class is changed: TXT_SignalConnect(cc_dropdown, "changed", UpdateWarpType, NULL); } TXT_AddWidgets(window, TXT_NewLabel("Skill"), skillbutton = TXT_NewDropdownList(&skill, doom_skills, 5), TXT_NewLabel("Level warp"), warpbutton = TXT_NewButton2("?", LevelSelectDialog, NULL), NULL); if (multiplayer) { TXT_AddWidgets(window, TXT_NewLabel("Game type"), GameTypeDropdown(), TXT_NewLabel("Time limit"), TXT_NewHorizBox(TXT_NewIntInputBox(&timer, 2), TXT_NewLabel("minutes"), NULL), NULL); } TXT_AddWidgets(window, TXT_NewSeparator("Monster options"), TXT_NewInvertedCheckBox("Monsters enabled", &nomonsters), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewCheckBox("Fast monsters", &fast), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewCheckBox("Respawning monsters", &respawn), TXT_TABLE_OVERFLOW_RIGHT, NULL); if (multiplayer) { TXT_AddWidgets(window, TXT_NewSeparator("Advanced"), TXT_NewLabel("UDP port"), TXT_NewIntInputBox(&udpport, 5), TXT_NewInvertedCheckBox("Register with master server", &privateserver), TXT_TABLE_OVERFLOW_RIGHT, NULL); } TXT_AddWidgets(window, TXT_NewButton2("Add extra parameters...", OpenExtraParamsWindow, NULL), TXT_TABLE_OVERFLOW_RIGHT, NULL); TXT_SignalConnect(iwad_selector, "changed", UpdateWarpType, NULL); UpdateWarpType(NULL, NULL); UpdateWarpButton(); }
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); }
void ConfigSound(void) { txt_window_t *window; txt_table_t *extra_table; txt_dropdown_list_t *sfx_mode_control; txt_dropdown_list_t *music_mode_control; int num_sfx_modes, num_music_modes; // Work out what sfx mode we are currently using: if (snd_sfxdevice == SNDDEVICE_PCSPEAKER) { snd_sfxmode = SFXMODE_PCSPEAKER; } else if (snd_sfxdevice >= SNDDEVICE_SB) { snd_sfxmode = SFXMODE_DIGITAL; } else { snd_sfxmode = SFXMODE_DISABLED; } // Is music enabled? switch (snd_musicdevice) { case SNDDEVICE_GENMIDI: snd_musicmode = MUSICMODE_NATIVE; break; case SNDDEVICE_CD: snd_musicmode = MUSICMODE_CD; break; case SNDDEVICE_SB: case SNDDEVICE_ADLIB: case SNDDEVICE_AWE32: snd_musicmode = MUSICMODE_OPL; break; case SNDDEVICE_GUS: snd_musicmode = MUSICMODE_GUS; break; default: snd_musicmode = MUSICMODE_DISABLED; break; } // Doom has PC speaker sound effects, but others do not: if (gamemission == doom) { num_sfx_modes = NUM_SFXMODES; } else { num_sfx_modes = NUM_SFXMODES - 1; } // Hexen has CD audio; others do not. if (gamemission == hexen) { num_music_modes = NUM_MUSICMODES; } else { num_music_modes = NUM_MUSICMODES - 1; } // Build the window window = TXT_NewWindow("Sound configuration"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_SetTableColumns(window, 2); TXT_SetColumnWidths(window, 19, 15); TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP, TXT_SCREEN_W / 2, 5); TXT_AddWidgets(window, TXT_NewSeparator("Sound effects"), TXT_NewLabel("Sound effects"), sfx_mode_control = TXT_NewDropdownList(&snd_sfxmode, sfxmode_strings, num_sfx_modes), TXT_NewLabel("Sound channels"), TXT_NewSpinControl(&numChannels, 1, 8), TXT_NewLabel("SFX volume"), TXT_NewSpinControl(&sfxVolume, 0, 15), NULL); // Only show for games that implemented pitch shifting: if (gamemission == doom || gamemission == heretic || gamemission == hexen) { TXT_AddWidgets(window, TXT_NewCheckBox("Pitch-shifted sounds", &snd_pitchshift), TXT_TABLE_OVERFLOW_RIGHT, NULL); } if (gamemission == strife) { TXT_AddWidgets(window, TXT_NewLabel("Voice volume"), TXT_NewSpinControl(&voiceVolume, 0, 15), TXT_NewCheckBox("Show text with voices", &show_talk), TXT_TABLE_OVERFLOW_RIGHT, NULL); } TXT_AddWidgets(window, TXT_NewSeparator("Music"), TXT_NewLabel("Music"), music_mode_control = TXT_NewDropdownList(&snd_musicmode, musicmode_strings, num_music_modes), TXT_NewLabel("Music volume"), TXT_NewSpinControl(&musicVolume, 0, 15), extra_table = TXT_NewTable(2), TXT_TABLE_OVERFLOW_RIGHT, NULL); TXT_SetColumnWidths(extra_table, 19, 15); TXT_SignalConnect(sfx_mode_control, "changed", UpdateSndDevices, NULL); TXT_SignalConnect(music_mode_control, "changed", UpdateSndDevices, NULL); // Update extra_table when the music mode is changed, and build it now. TXT_SignalConnect(music_mode_control, "changed", UpdateExtraTable, extra_table); UpdateExtraTable(music_mode_control, extra_table); }
void ConfigDisplay(void) { txt_window_t *window; txt_table_t *modes_table; txt_separator_t *modes_separator; txt_window_action_t *advanced_button; txt_checkbox_t *fs_checkbox; int num_columns; int num_rows; int window_y; // First time in? Initialise selected_screen_{width,height} if (selected_screen_width == 0) { selected_screen_width = screen_width; selected_screen_height = screen_height; } // Open the window window = TXT_NewWindow("Display Configuration"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); // 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. BuildFullscreenModesList(); if (num_screen_modes_fullscreen <= 24) { num_columns = 3; } else if (num_screen_modes_fullscreen <= 40) { num_columns = 4; } else { num_columns = 5; } modes_table = TXT_NewTable(num_columns); // Build window: TXT_AddWidget(window, fs_checkbox = TXT_NewCheckBox("Full screen", &fullscreen)); TXT_AddWidgets(window, modes_separator = TXT_NewSeparator(""), modes_table, NULL); TXT_SignalConnect(fs_checkbox, "changed", GenerateModesTable, modes_table); TXT_SignalConnect(fs_checkbox, "changed", UpdateModeSeparator, modes_separator); // 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. num_rows = (num_screen_modes_fullscreen + num_columns - 1) / num_columns; if (num_rows < 4) { num_rows = 4; } 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); UpdateModeSeparator(NULL, modes_separator); // 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); }