static void AddMouseControl(TXT_UNCAST_ARG(table), char *label, int *var) { TXT_CAST_ARG(txt_table_t, table); txt_mouse_input_t *mouse_input; TXT_AddWidget(table, TXT_NewLabel(label)); mouse_input = TXT_NewMouseInput(var); TXT_AddWidget(table, mouse_input); TXT_SignalConnect(mouse_input, "set", MouseSetCallback, var); }
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 QueryPeriodicCallback(TXT_UNCAST_ARG(results_table)) { TXT_CAST_ARG(txt_table_t, results_table); if (!NET_Query_Poll(QueryResponseCallback, results_table)) { TXT_SetPeriodicCallback(NULL, NULL, 0); if (query_servers_found == 0) { TXT_AddWidget(results_table, NULL); TXT_AddWidget(results_table, TXT_NewLabel("No servers found.")); } } }
static void OpenPromptWindow(txt_key_input_t *key_input) { txt_window_t *window; txt_label_t *label; // Silently update when the shift button is held down. key_input->check_conflicts = !TXT_GetModifierState(TXT_MOD_SHIFT); window = TXT_NewWindow(NULL); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TXT_NewWindowAbortAction(window)); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); label = TXT_NewLabel("Press the new key..."); TXT_AddWidget(window, label); TXT_SetWidgetAlign(label, TXT_HORIZ_CENTER); TXT_SetKeyListener(window, KeyPressCallback, key_input); // Disable key mappings while we prompt for the key press TXT_EnableKeyMapping(0); // Grab input while reading the key. On Windows Mobile // handheld devices, the hardware keypresses are only // detected when input is grabbed. SDL_WM_GrabInput(SDL_GRAB_ON); TXT_SignalConnect(window, "closed", ReleaseGrab, NULL); }
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) { if (screen_modes_fullscreen == NULL) { 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, 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); if (vidmode > 0) { screen_width = modes[vidmode].w; screen_height = modes[vidmode].h; } }
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 FillRowToEnd(txt_table_t *table) { while ((table->num_widgets % table->columns) != 0) { TXT_AddWidget(table, &txt_table_overflow_right); } }
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_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_SetColumnWidths(window, 35); TXT_AddWidgets(window, ar_checkbox = TXT_NewCheckBox("Fix aspect ratio", &aspect_ratio_correct), NULL); if (gamemission == heretic || gamemission == hexen || gamemission == strife) { TXT_AddWidget(window, TXT_NewCheckBox("Graphical startup", &graphical_startup)); } if (gamemission == doom || gamemission == heretic || gamemission == strife) { TXT_AddWidget(window, TXT_NewCheckBox("Show ENDOOM screen on exit", &show_endoom)); } if (gamemission == doom || gamemission == strife) { TXT_AddWidget(window, TXT_NewCheckBox("Show disk activity indicator", &show_diskicon)); } #ifdef HAVE_LIBPNG TXT_AddWidget(window, TXT_NewCheckBox("Save screenshots in PNG format", &png_screenshots)); #endif TXT_SignalConnect(ar_checkbox, "changed", GenerateModesTable, modes_table); }
static void OpenSelectorWindow(txt_dropdown_list_t *list) { txt_window_t *window; int i; // Open a simple window with no title bar or action buttons. window = TXT_NewWindow(NULL); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, NULL); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); // Position the window so that the currently selected item appears // over the top of the list widget. TXT_SetWindowPosition(window, TXT_HORIZ_LEFT, TXT_VERT_TOP, list->widget.x - 2, SelectorWindowY(list)); // Add a button to the window for each option in the list. for (i=0; i<list->num_values; ++i) { txt_button_t *button; callback_data_t *data; button = TXT_NewButton(list->values[i]); TXT_AddWidget(window, button); // Callback struct data = malloc(sizeof(callback_data_t)); data->list = list; data->window = window; data->item = i; // When the button is pressed, invoke the button press callback TXT_SignalConnect(button, "pressed", ItemSelected, data); // When the window is closed, free back the callback struct TXT_SignalConnect(window, "closed", FreeCallbackData, data); // Is this the currently-selected value? If so, select the button // in the window as the default. if (i == *list->variable) { TXT_SelectWidget(window, button); } } // Catch presses of escape in this window and close it. TXT_SetKeyListener(window, SelectorWindowListener, NULL); }
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 GenerateSizesTable(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(sizes_table)) { TXT_CAST_ARG(txt_table_t, sizes_table); window_size_t *sizes; boolean have_size; int i; // Pick which window sizes list to use if (aspect_ratio_correct == 1) { sizes = window_sizes_scaled; } else { sizes = window_sizes_unscaled; } // Build the table TXT_ClearTable(sizes_table); TXT_SetColumnWidths(sizes_table, 14, 14, 14); TXT_AddWidget(sizes_table, TXT_NewSeparator("Window size")); have_size = false; for (i = 0; sizes[i].w != 0; ++i) { TXT_AddWidget(sizes_table, SizeSelectButton(&sizes[i])); have_size = have_size || window_width == sizes[i].w; } // Windows can be any arbitrary size. We key off the width of the // window in pixels. If the current size is not in the list of // standard (integer multiply) sizes, create a special button to // mean "the current window size". if (!have_size) { static window_size_t current_size; current_size.w = window_width; current_size.h = window_height; TXT_AddWidget(sizes_table, SizeSelectButton(¤t_size)); } }
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)); }
static void OpenWadsWindow(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(user_data)) { txt_window_t *window; int i; window = TXT_NewWindow("Add WADs"); for (i=0; i<NUM_WADS; ++i) { TXT_AddWidget(window, TXT_NewInputBox(&wads[i], 60)); } }
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 OpenExtraParamsWindow(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(user_data)) { txt_window_t *window; int i; window = TXT_NewWindow("Extra command line parameters"); for (i=0; i<NUM_EXTRA_PARAMS; ++i) { TXT_AddWidget(window, TXT_NewInputBox(&extra_params[i], 70)); } }
static void OpenErrorWindow(void) { txt_window_t *window; window = TXT_NewWindow(NULL); TXT_AddWidget(window, TXT_NewLabel("Please configure a joystick first!")); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TXT_NewWindowEscapeAction(window)); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); }
void PwnBox(TXT_UNCAST_ARG(widget), void *user_data) { txt_window_t *window; txt_window_action_t *close_button; window = TXT_NewWindow("Pwned!"); TXT_AddWidget(window, TXT_NewLabel(" BOOM! HEADSHOT! ")); close_button = TXT_NewWindowAction(KEY_ENTER, "Close"); TXT_SignalConnect(close_button, "pressed", ClosePwnBox, window); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, close_button); }
static void OpenWadsWindow(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(user_data)) { txt_window_t *window; int i; window = TXT_NewWindow("Add WADs"); for (i=0; i<NUM_WADS; ++i) { TXT_AddWidget(window, TXT_NewFileSelector(&wads[i], 60, "Select a WAD file", wad_extensions)); } }
static void ServerQueryWindow(const char *title) { txt_table_t *results_table; query_servers_found = 0; query_window = TXT_NewWindow(title); TXT_AddWidget(query_window, TXT_NewScrollPane(70, 10, results_table = TXT_NewTable(3))); TXT_SetColumnWidths(results_table, 7, 22, 40); TXT_SetPeriodicCallback(QueryPeriodicCallback, results_table, 1); TXT_SignalConnect(query_window, "closed", QueryWindowClosed, NULL); }
static void BuildMasterStatusWindow(void) { txt_window_t *master_window; master_window = TXT_NewWindow(NULL); master_msg_label = TXT_NewLabel(""); TXT_AddWidget(master_window, master_msg_label); // This window is here purely for information, so it should be // in the background. TXT_LowerWindow(master_window); TXT_SetWindowPosition(master_window, TXT_HORIZ_CENTER, TXT_VERT_CENTER, TXT_SCREEN_W / 2, TXT_SCREEN_H - 4); TXT_SetWindowAction(master_window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(master_window, TXT_HORIZ_CENTER, NULL); TXT_SetWindowAction(master_window, TXT_HORIZ_RIGHT, NULL); }
static void OpenWaitDialog(void) { txt_window_action_t *cancel; TXT_SetDesktopTitle(PACKAGE_STRING); window = TXT_NewWindow("Waiting for game start..."); TXT_AddWidget(window, TXT_NewLabel("\nPlease wait...\n\n")); cancel = TXT_NewWindowAction(KEY_ESCAPE, "Cancel"); TXT_SignalConnect(cancel, "pressed", EscapePressed, NULL); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, cancel); TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_BOTTOM, TXT_SCREEN_W / 2, TXT_SCREEN_H - 9); old_max_players = 0; }
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)); }
txt_window_t *TXT_MessageBox(char *title, char *message, ...) { txt_window_t *window; char buf[256]; va_list args; va_start(args, message); TXT_vsnprintf(buf, sizeof(buf), message, args); va_end(args); window = TXT_NewWindow(title); TXT_AddWidget(window, TXT_NewLabel(buf)); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TXT_NewWindowEscapeAction(window)); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); return window; }
static void TestCallback(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(data)) { execute_context_t *exec; char *main_cfg; char *extra_cfg; txt_window_t *testwindow; txt_label_t *label; testwindow = TXT_NewWindow("Starting Doom"); label = TXT_NewLabel("Starting Doom to test the\n" "settings. Please wait."); TXT_SetWidgetAlign(label, TXT_HORIZ_CENTER); TXT_AddWidget(testwindow, label); TXT_DrawDesktop(); // Save temporary configuration files with the current configuration main_cfg = TempFile("tmp.cfg"); extra_cfg = TempFile("extratmp.cfg"); M_SaveMainDefaults(main_cfg); M_SaveExtraDefaults(extra_cfg); // Run with the -testcontrols parameter exec = NewExecuteContext(); AddCmdLineParameter(exec, "-testcontrols"); AddCmdLineParameter(exec, "-config \"%s\"", main_cfg); AddCmdLineParameter(exec, "-extraconfig \"%s\"", extra_cfg); ExecuteDoom(exec); TXT_CloseWindow(testwindow); // Delete the temporary config files remove(main_cfg); remove(extra_cfg); free(main_cfg); free(extra_cfg); }
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)); } }
txt_window_t *TXT_NewWindow(char *title) { int i; txt_window_t *win; win = malloc(sizeof(txt_window_t)); TXT_InitTable(&win->table, 1); if (title == NULL) { win->title = NULL; } else { win->title = strdup(title); } win->x = TXT_SCREEN_W / 2; win->y = TXT_SCREEN_H / 2; win->horiz_align = TXT_HORIZ_CENTER; win->vert_align = TXT_VERT_CENTER; win->key_listener = NULL; win->mouse_listener = NULL; TXT_AddWidget(win, TXT_NewSeparator(NULL)); for (i=0; i<3; ++i) win->actions[i] = NULL; TXT_AddDesktopWindow(win); // Default actions TXT_SetWindowAction(win, TXT_HORIZ_LEFT, TXT_NewWindowEscapeAction(win)); TXT_SetWindowAction(win, TXT_HORIZ_RIGHT, TXT_NewWindowSelectAction(win)); return win; }
static void OpenPromptWindow(txt_joystick_input_t *joystick_input) { txt_window_t *window; txt_label_t *label; SDL_Joystick *joystick; if (SDL_Init(SDL_INIT_JOYSTICK) < 0) { return; } // Check the current joystick is valid joystick = SDL_JoystickOpen(joystick_index); if (joystick == NULL) { OpenErrorWindow(); return; } // Open the prompt window window = TXT_NewWindow(NULL); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TXT_NewWindowAbortAction(window)); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); label = TXT_NewLabel("Press the new joystick button..."); TXT_AddWidget(window, label); TXT_SetWidgetAlign(label, TXT_HORIZ_CENTER); TXT_SDL_SetEventCallback(EventCallback, joystick_input); TXT_SignalConnect(window, "closed", PromptWindowClosed, joystick); joystick_input->prompt_window = window; SDL_JoystickEventState(SDL_ENABLE); }
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_AddWidgets(TXT_UNCAST_ARG(table), ...) { TXT_CAST_ARG(txt_table_t, table); va_list args; txt_widget_t *widget; va_start(args, TXT_UNCAST_ARG_NAME(table)); // Keep adding widgets until a NULL is reached. for (;;) { widget = va_arg(args, txt_widget_t *); if (widget == NULL) { break; } TXT_AddWidget(table, widget); } va_end(args); }