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); }
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 StartMultiGame(void) { txt_window_t *window; txt_table_t *gameopt_table; txt_table_t *advanced_table; txt_widget_t *iwad_selector; window = TXT_NewWindow("Start multiplayer game"); TXT_AddWidgets(window, gameopt_table = TXT_NewTable(2), TXT_NewSeparator("Monster options"), TXT_NewInvertedCheckBox("Monsters enabled", &nomonsters), TXT_NewCheckBox("Fast monsters", &fast), TXT_NewCheckBox("Respawning monsters", &respawn), TXT_NewSeparator("Advanced"), advanced_table = TXT_NewTable(2), TXT_NewButton2("Add extra parameters...", OpenExtraParamsWindow, NULL), NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, WadWindowAction()); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, StartGameAction()); TXT_SetColumnWidths(gameopt_table, 12, 12); TXT_AddWidgets(gameopt_table, TXT_NewLabel("Game"), iwad_selector = IWADSelector(), TXT_NewLabel("Skill"), skillbutton = TXT_NewDropdownList(&skill, skills, 5), TXT_NewLabel("Game type"), TXT_NewDropdownList(&deathmatch, gamemodes, 3), TXT_NewLabel("Level warp"), warpbutton = TXT_NewButton2("????", LevelSelectDialog, NULL), TXT_NewLabel("Time limit"), TXT_NewHorizBox(TXT_NewIntInputBox(&timer, 2), TXT_NewLabel("minutes"), NULL), NULL); TXT_SetColumnWidths(advanced_table, 12, 12); TXT_SignalConnect(iwad_selector, "changed", UpdateWarpType, NULL); TXT_AddWidgets(advanced_table, TXT_NewLabel("UDP port"), TXT_NewIntInputBox(&udpport, 5), NULL); UpdateWarpType(NULL, NULL); UpdateWarpButton(); }
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()); }
static txt_button_t *GetLaunchButton(void) { char *label; switch (gamemission) { case doom: label = "Save parameters and launch DOOM"; break; case heretic: label = "Save parameters and launch Heretic"; break; case hexen: label = "Save parameters and launch Hexen"; break; case strife: label = "Save parameters and launch STRIFE!"; break; default: label = "Save parameters and launch game"; break; } return TXT_NewButton2(label, LaunchDoom, NULL); }
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 AddOperatorButton(txt_table_t *table, char *label, operator_t op) { char buf[10]; operator_t *op_copy; op_copy = malloc(sizeof(operator_t)); *op_copy = op; TXT_snprintf(buf, sizeof(buf), " %s ", label); TXT_AddWidget(table, TXT_NewButton2(buf, Operator, op_copy)); }
void AddNumberButton(txt_table_t *table, int value) { char buf[10]; int *val_copy; val_copy = malloc(sizeof(int)); *val_copy = value; TXT_snprintf(buf, sizeof(buf), " %i ", value); TXT_AddWidget(table, TXT_NewButton2(buf, InsertNumber, val_copy)); }
static void QueryResponseCallback(net_addr_t *addr, net_querydata_t *querydata, unsigned int ping_time, TXT_UNCAST_ARG(results_table)) { TXT_CAST_ARG(txt_table_t, results_table); char ping_time_str[16]; char description[47]; // When we connect we'll have to negotiate a common protocol that we // can agree upon between the client and server. If we can't then we // won't be able to connect, so it's pointless to include it in the // results list. If protocol==NET_PROTOCOL_UNKNOWN then this may be // an old, pre-3.0 Chocolate Doom server that doesn't support the new // protocol negotiation mechanism, or it may be an incompatible fork. if (querydata->protocol == NET_PROTOCOL_UNKNOWN) { return; } M_snprintf(ping_time_str, sizeof(ping_time_str), "%ims", ping_time); // Build description from server name field. Because there is limited // space, we only include the player count if there are already players // connected to the server. if (querydata->num_players > 0) { M_snprintf(description, sizeof(description), "(%d/%d) ", querydata->num_players, querydata->max_players); } else { M_StringCopy(description, "", sizeof(description)); } M_StringConcat(description, querydata->description, sizeof(description)); TXT_AddWidgets(results_table, TXT_NewLabel(ping_time_str), TXT_NewButton2(NET_AddrToString(addr), SelectQueryAddress, querydata), TXT_NewLabel(description), NULL); ++query_servers_found; }
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)); }
static void QueryResponseCallback(net_addr_t *addr, net_querydata_t *querydata, unsigned int ping_time, TXT_UNCAST_ARG(results_table)) { TXT_CAST_ARG(txt_table_t, results_table); char ping_time_str[16]; char description[47]; M_snprintf(ping_time_str, sizeof(ping_time_str), "%ims", ping_time); M_StringCopy(description, querydata->description, sizeof(description)); TXT_AddWidgets(results_table, TXT_NewLabel(ping_time_str), TXT_NewButton2(NET_AddrToString(addr), SelectQueryAddress, querydata), TXT_NewLabel(description), NULL); ++query_servers_found; }
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_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 ConfigKeyboard(void) { txt_window_t *window; txt_table_t *movement_table; txt_table_t *action_table; txt_table_t *dialogs_table; txt_checkbox_t *run_control; always_run = joybspeed >= 20; window = TXT_NewWindow("Keyboard configuration"); TXT_AddWidgets(window, TXT_NewSeparator("Movement"), movement_table = TXT_NewTable(4), TXT_NewSeparator("Action"), action_table = TXT_NewTable(4), dialogs_table = TXT_NewTable(2), TXT_NewSeparator("Misc."), run_control = TXT_NewCheckBox("Always run", &always_run), TXT_NewInvertedCheckBox("Use native keyboard mapping", &vanilla_keyboard_mapping), NULL); TXT_SetColumnWidths(movement_table, 15, 8, 15, 8); TXT_SignalConnect(run_control, "changed", UpdateJoybSpeed, NULL); AddKeyControl(movement_table, "Move Forward", &key_up); AddKeyControl(movement_table, " Strafe Left", &key_strafeleft); AddKeyControl(movement_table, "Move Backward", &key_down); AddKeyControl(movement_table, " Strafe Right", &key_straferight); AddKeyControl(movement_table, "Turn Left", &key_left); AddKeyControl(movement_table, " Speed On", &key_speed); AddKeyControl(movement_table, "Turn Right", &key_right); AddKeyControl(movement_table, " Strafe On", &key_strafe); if (gamemission == hexen || gamemission == strife) { AddKeyControl(movement_table, "Jump", &key_jump); } TXT_SetColumnWidths(action_table, 15, 8, 15, 8); AddKeyControl(action_table, "Fire/Attack", &key_fire); AddKeyControl(action_table, " Use", &key_use); // Other key bindings are stored in separate sub-dialogs: TXT_SetColumnWidths(dialogs_table, 24, 24); TXT_AddWidgets(dialogs_table, TXT_NewButton2("More controls...", ConfigExtraKeys, NULL), TXT_NewButton2("Other keys...", OtherKeysDialog, NULL), NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TestConfigAction()); }
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(); }