static void add_expand(menuSpinControl_t *s, const char *tok) { char buf[MAX_STRING_CHARS], *temp = NULL; const char *data; cmd_macro_t *macro = Cmd_FindMacro(tok); if (macro) { size_t len = macro->function(buf, sizeof(buf)); if (len < sizeof(buf)) { data = buf; } else if (len < INT_MAX) { data = temp = UI_Malloc(len + 1); macro->function(temp, len + 1); } else { Com_Printf("Expanded line exceeded %i chars, discarded.\n", INT_MAX); return; } } else { cvar_t *var = Cvar_FindVar(tok); if (var && !(var->flags & CVAR_PRIVATE)) data = var->string; else return; } while (1) { tok = COM_Parse(&data); if (!data) break; add_string(s, tok); } Z_Free(temp); }
void M_StartServer_MakeGametypesNames( char *list ) { char *s, **ptr; int count, i; size_t size; M_StartServer_FreeGametypesNames(); for( count = 0; UI_ListNameForPosition( list, count, ';' ) != NULL; count++ ); startserver_gametype_names = UI_Malloc( sizeof( ptr ) * ( count + 1 ) ); for( i = 0; i < count; i++ ) { s = UI_ListNameForPosition( list, i, ';' ); size = strlen( s ) + 1; startserver_gametype_names[i] = UI_Malloc( size ); Q_strncpyz( startserver_gametype_names[i], s, size ); } startserver_gametype_names[i] = NULL; }
static void long_args_hack(menuSpinControl_t *s, int argc) { int i; s->itemnames = UI_Malloc(MIN_MENU_ITEMS * sizeof(char *)); for (i = 0; i < argc; i++) { char *tok = Cmd_Argv(cmd_optind + i); if (*tok == '$') { tok++; if (*tok == '$') add_string(s, tok); else add_expand(s, tok); } else { add_string(s, tok); } } s->itemnames[s->numItems] = NULL; }
static void BuildList( void ) { int numDirs, numDemos; void **dirlist, **demolist; char *cache, *p; unsigned flags; size_t len; int i; // this can be a lengthy process S_StopAllSounds(); m_demos.menu.status = "Building list..."; SCR_UpdateScreen(); // list files flags = ui_listalldemos->integer ? 0 : FS_TYPE_REAL | FS_PATH_GAME; dirlist = FS_ListFiles( m_demos.browse, NULL, flags | FS_SEARCH_DIRSONLY, &numDirs ); demolist = FS_ListFiles( m_demos.browse, DEMO_EXTENSIONS, flags | FS_SEARCH_EXTRAINFO, &numDemos ); // alloc entries m_demos.list.items = UI_Malloc( sizeof( demoEntry_t * ) * ( numDirs + numDemos + 1 ) ); m_demos.list.numItems = 0; m_demos.list.curvalue = 0; m_demos.list.prestep = 0; m_demos.widest_map = 3; m_demos.widest_pov = 3; m_demos.total_bytes = 0; // start with minimum size m_demos.menu.size( &m_demos.menu ); if( m_demos.browse[0] ) { BuildDir( "..", ENTRY_UP ); } // add directories if( dirlist ) { for( i = 0; i < numDirs; i++ ) { BuildDir( dirlist[i], ENTRY_DN ); } FS_FreeList( dirlist ); } m_demos.numDirs = m_demos.list.numItems; // add demos if( demolist ) { CalcHash( demolist ); if( ( cache = LoadCache( demolist ) ) != NULL ) { p = cache + 32 + 1; for( i = 0; i < numDemos; i++ ) { BuildName( demolist[i], &p ); } FS_FreeFile( cache ); } else { for( i = 0; i < numDemos; i++ ) { BuildName( demolist[i], NULL ); if( ( i & 7 ) == 0 ) { m_demos.menu.size( &m_demos.menu ); SCR_UpdateScreen(); } } } WriteCache(); FS_FreeList( demolist ); } // update status line and sort if( m_demos.list.numItems ) { Change( &m_demos.list.generic ); if( m_demos.list.sortdir ) { m_demos.list.sort( &m_demos.list, m_demos.list.sortcol ); } } // resize columns m_demos.menu.size( &m_demos.menu ); // format our extra status line i = m_demos.list.numItems - m_demos.numDirs; len = Q_scnprintf( m_demos.status, sizeof( m_demos.status ), "%d demo%s, ", i, i == 1 ? "" : "s" ); Com_FormatSizeLong( m_demos.status + len, sizeof( m_demos.status ) - len, m_demos.total_bytes ); SCR_UpdateScreen(); }
void M_Menu_TV_ChannelAdd_f( void ) { int num, id; char *name, *realname, *address, *gametype, *mapname, *matchname; int numplayers, numspecs; tv_channel_t *prev, *next, *new_chan; if( trap_Cmd_Argc() < 5 ) return; id = atoi( trap_Cmd_Argv( 1 ) ); name = trap_Cmd_Argv( 2 ); realname = trap_Cmd_Argv( 3 ); address = trap_Cmd_Argv( 4 ); numplayers = atoi( trap_Cmd_Argv( 5 ) ); numspecs = atoi( trap_Cmd_Argv( 6 ) ); gametype = trap_Cmd_Argv( 7 ); mapname = trap_Cmd_Argv( 8 ); matchname = trap_Cmd_Argv( 9 ); if( id <= 0 || !name[0] ) return; num = 0; prev = NULL; next = channels; while( next && next->id < id ) { prev = next; next = next->next; num++; } if( next && next->id == id ) { new_chan = next; next = new_chan->next; } else { new_chan = (tv_channel_t *)UI_Malloc( sizeof( tv_channel_t ) ); if( num < scrollbar_curvalue ) scrollbar_curvalue++; } if( prev ) { prev->next = new_chan; } else { channels = new_chan; } new_chan->next = next; new_chan->id = id; Q_strncpyz( new_chan->name, name, sizeof( new_chan->name ) ); Q_strncpyz( new_chan->realname, realname, sizeof( new_chan->realname ) ); Q_strncpyz( new_chan->address, address, sizeof( new_chan->address ) ); Q_strncpyz( new_chan->gametype, gametype, sizeof( new_chan->gametype ) ); Q_strncpyz( new_chan->mapname, mapname, sizeof( new_chan->mapname ) ); Q_strncpyz( new_chan->matchname, matchname, sizeof( new_chan->matchname ) ); Q_strlwr( new_chan->gametype ); Q_strlwr( new_chan->mapname ); new_chan->numplayers = numplayers; new_chan->numspecs = numspecs; M_RefreshScrollWindowList(); }
static void Performance_Init( void ) { menucommon_t *menuitem; int yoffset = 0; char custom_resolution[64]; static char **resolutions; static char *colordepth_names[] = { "desktop", "16 bits", "32 bits", 0 }; static char *plighting_names[] = { "vertex (fast)", "lightmaps (normal)", "per pixel (quality)", "per pixel (no specular)", 0 }; static char **texfilter_names; int anisotropic, spinindex; #ifndef PREDEFINES_PROFILES if( !gfx_profiles ) { int i = 0, num, total, len; char *current, buffer[1024]; total = trap_FS_GetFileList( "profiles", ".cfg", NULL, 0, 0, 0 ); if( total ) gfx_profiles = UI_Malloc( sizeof( char * ) * ( total + 1 ) ); while( i < total ) { if( ( num = trap_FS_GetFileList( "profiles", ".cfg", buffer, sizeof( buffer ), i, total ) ) == 0 ) { i++; // can happen if the filename is too long to fit into the buffer or we're done continue; } // add profiles to profiles list for( current = buffer ; num ; i++, num--, current += len ) { len = strlen( current ) + 1; if( strncmp( current, "gfx_", 4 ) ) continue; COM_StripExtension( current ); gfx_profiles[i] = UI_Malloc( strlen( current + 4 ) + 1 ); strcpy( gfx_profiles[i], current + 4 ); } } } #endif if( !resolutions ) { // count video modes int i, width, height; qboolean wideScreen; for( i = 0; trap_VID_GetModeInfo( &width, &height, &wideScreen, i - 1 ); i++ ) ; resolutions = (char **)UI_Malloc( sizeof( char * ) * ( i + 1 ) ); for( i = 0; trap_VID_GetModeInfo( &width, &height, &wideScreen, i - 1 ); i++ ) { Q_snprintfz( custom_resolution, sizeof( custom_resolution ), "%s%s%i x %i", i ? "" : "custom: ", ( wideScreen ? "W " : "" ), width, height ); resolutions[i] = UI_CopyString( custom_resolution ); } resolutions[i] = NULL; } if( !texfilter_names ) { int i, count; for( count = 0; ; count++ ) { if( trap_Cvar_Value( "gl_ext_texture_filter_anisotropic_max" ) <= (1<<count) ) break; } texfilter_names = (char **)UI_Malloc( sizeof( char * ) * ( count + 1 + 1 ) ); texfilter_names[0] = UI_CopyString( "bilinear" ); for( i = 0; i < count; i++ ) texfilter_names[i+1] = UI_CopyString( va( "trilinear %ixAF", (1<<i) ) ); texfilter_names[i+1] = NULL; } menuitem = UI_InitMenuItem( "m_performance_title1", "GRAPHICS OPTIONS", 0, yoffset, MTYPE_SEPARATOR, ALIGN_CENTER_TOP, uis.fontSystemBig, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); yoffset += trap_SCR_strHeight( menuitem->font ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_profile", "profile", 0, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSpinControl( menuitem, gfx_profiles, trap_Cvar_Value( "ui_gfxprofile" ) ); yoffset += trap_SCR_strHeight( menuitem->font ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_applyprofile", "apply profile", 0, yoffset, MTYPE_ACTION, ALIGN_CENTER_TOP, uis.fontSystemBig, ApplyProfileButton ); Menu_AddItem( &s_performance_menu, menuitem ); yoffset += 1.5 * UI_SetupButton( menuitem, qtrue ); menuitem = UI_InitMenuItem( "m_performance_resolution", "resolution", 0, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSpinControl( menuitem, resolutions, max( trap_Cvar_Value( "r_mode" ), -1 ) + 1 ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_fullscreen", "fullscreen", 0, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSpinControl( menuitem, noyes_names, trap_Cvar_Value( "vid_fullscreen" ) != 0 ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_swapinterval", "vertical sync", 0, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSpinControl( menuitem, noyes_names, trap_Cvar_Value( "r_swapinterval" ) ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_gamma", "brightness", 0, yoffset, MTYPE_SLIDER, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSlider( menuitem, 12, bound( (int)( trap_Cvar_Value( "r_gamma" ) * 10.0f ), 5, 13 ), 5, 13 ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_colorbits", "color quality", 0, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); if( !Q_stricmp( trap_Cvar_String( "r_colorbits" ), "16" ) ) UI_SetupSpinControl( menuitem, colordepth_names, 1 ); else if( !Q_stricmp( trap_Cvar_String( "r_colorbits" ), "32" ) ) UI_SetupSpinControl( menuitem, colordepth_names, 2 ); else UI_SetupSpinControl( menuitem, colordepth_names, 0 ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_picmip", "texture quality", 0, yoffset, MTYPE_SLIDER, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSlider( menuitem, 12, 6-trap_Cvar_Value( "r_picmip" ), 0, 6 ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_filter", "texture filter", 0, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); anisotropic = trap_Cvar_Value( "r_texturefilter" ); if( anisotropic >= 2 ) spinindex = NEARESTEXPOF2( anisotropic ) + 1; else if( !Q_stricmp( trap_Cvar_String( "r_texturemode" ), "GL_LINEAR_MIPMAP_NEAREST" ) ) spinindex = 0; else spinindex = 1; UI_SetupSpinControl( menuitem, texfilter_names, spinindex ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_skymip", "sky quality", 0, yoffset, MTYPE_SLIDER, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSlider( menuitem, 12, (trap_Cvar_Value( "r_fastsky" ) ? 0 : 4-trap_Cvar_Value( "r_skymip" )), 0, 4 ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_LOD_slider", "geometry level of detail", 0, yoffset, MTYPE_SLIDER, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSlider( menuitem, 12, 4-max( trap_Cvar_Value( "r_lodbias" ), NEARESTEXPOF2( trap_Cvar_Value( "r_subdivisions" ) ) ), 0, 4 ); yoffset += trap_SCR_strHeight( menuitem->font ); #if 0 menuitem = UI_InitMenuItem( "m_performance_glsl", "opengl shaders", 0, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSpinControl( menuitem, offon_names, trap_Cvar_Value( "gl_ext_GLSL" ) ); yoffset += trap_SCR_strHeight( menuitem->font ); #endif if( trap_Cvar_Value( "r_lighting_vertexlight" ) ) spinindex = 0; else if( !trap_Cvar_Value( "r_lighting_deluxemapping" ) ) spinindex = 1; else if( trap_Cvar_Value( "r_lighting_specular" ) ) spinindex = 2; else spinindex = 3; menuitem = UI_InitMenuItem( "m_performance_pplighting", "lighting", 0, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupSpinControl( menuitem, plighting_names, spinindex ); yoffset += trap_SCR_strHeight( menuitem->font ); yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_performance_back", "back", -16, yoffset, MTYPE_ACTION, ALIGN_RIGHT_TOP, uis.fontSystemBig, M_genericBackFunc ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupButton( menuitem, qtrue ); menuitem = UI_InitMenuItem( "m_performance_apply", "apply", 16, yoffset, MTYPE_ACTION, ALIGN_LEFT_TOP, uis.fontSystemBig, ApplyButton ); Menu_AddItem( &s_performance_menu, menuitem ); yoffset += UI_SetupButton( menuitem, qtrue ) + UI_BUTTONBOX_VERTICAL_SPACE;; yoffset += trap_SCR_strHeight( uis.fontSystemSmall ); menuitem = UI_InitMenuItem( "m_performance_advanced", "advanced options", 0, yoffset, MTYPE_ACTION, ALIGN_CENTER_TOP, uis.fontSystemBig, AdvancedButton ); Menu_AddItem( &s_performance_menu, menuitem ); UI_SetupButton( menuitem, qtrue ); Menu_Center( &s_performance_menu ); Menu_Init( &s_performance_menu, qfalse ); }
static void MapsList_CreateItems( const char *lastmap ) { int i, j, validmaps; int order; maplist_item_t *items; char mapinfo[MAX_CONFIGSTRING_CHARS], *mapname, *fullname; UI_FreeScrollItemList( &mapList ); for( validmaps = 0; trap_ML_GetMapByNum( validmaps, NULL, 0 ); validmaps++ ) ; if( !validmaps ) { Menu_SetStatusBar( &s_startserver_menu, "No maps found" ); return; } order = trap_Cvar_Value( "ui_maplist_sortmethod" ); items = UI_Malloc( sizeof( *items ) * validmaps ); for( i = 0; i < validmaps; i++ ) { trap_ML_GetMapByNum( i, mapinfo, sizeof( mapinfo ) ); mapname = mapinfo; fullname = mapinfo + strlen( mapname ) + 1; if( order ) items[i].name = UI_CopyString( *fullname ? fullname : mapname ); else items[i].name = UI_CopyString( mapname ); items[i].mapname = UI_CopyString( mapname ); items[i].index = i; // uppercase the first letter and letters that follow whitespaces if( order ) { if( *fullname ) { items[i].name[0] = toupper( items[i].name[0] ); for( j = 1; items[i].name[j]; j++ ) if( items[i].name[j-1] == ' ' ) items[i].name[j] = toupper( items[i].name[j] ); } else { Q_strlwr( items[i].name ); } } else { Q_strlwr( items[i].name ); } } qsort( items, validmaps, sizeof( *items ), ( int ( * )( const void *, const void * ) )MapList_MapSort ); for( i = 0; i < validmaps; i++ ) { if( !strcmp( items[i].mapname, lastmap ) ) mapList_cur_idx = i; UI_AddItemToScrollList( &mapList, items[i].name, (void *)((size_t)(items[i].index)) ); UI_Free( items[i].mapname ); UI_Free( items[i].name ); } UI_Free( items ); }
void PlayerModel_Load(void) { char scratch[MAX_QPATH]; size_t len; int ndirs = 0; char *dirnames[MAX_PLAYERMODELS]; int i, j; char **list; char *s, *p; int numFiles; playerModelInfo_t *pmi; uis.numPlayerModels = 0; // get a list of directories if (!(list = (char **)FS_ListFiles(NULL, "players/*/tris.md2", FS_SEARCH_BYFILTER | FS_SEARCH_SAVEPATH, &numFiles))) { return; } for (i = 0; i < numFiles; i++) { len = Q_strlcpy(scratch, list[i], sizeof(scratch)); if (len >= sizeof(scratch)) continue; // make short name for the model if (!(s = strchr(scratch, '/'))) continue; s++; if (!(p = strchr(s, '/'))) continue; *p = 0; for (j = 0; j < ndirs; j++) { if (!strcmp(dirnames[j], s)) { break; } } if (j != ndirs) { continue; } dirnames[ndirs++] = UI_CopyString(s); if (ndirs == MAX_PLAYERMODELS) { break; } } FS_FreeList((void **)list); if (!ndirs) { return; } // go through the subdirectories for (i = 0; i < ndirs; i++) { int k, s; char **pcxnames; char **skinnames; int npcxfiles; int nskins = 0; // verify the existence of tris.md2 Q_concat(scratch, sizeof(scratch), "players/", dirnames[i], "/tris.md2", NULL); if (!FS_FileExists(scratch)) { goto skip; } // verify the existence of at least one pcx skin Q_concat(scratch, sizeof(scratch), "players/", dirnames[i], NULL); pcxnames = (char **)FS_ListFiles(scratch, ".pcx", 0, &npcxfiles); if (!pcxnames) { goto skip; } // count valid skins, which consist of a skin with a matching "_i" icon for (k = 0; k < npcxfiles; k++) { if (!strstr(pcxnames[k], "_i.pcx")) { if (IconOfSkinExists(pcxnames[k], pcxnames, npcxfiles)) { nskins++; } } } if (!nskins) { FS_FreeList((void **)pcxnames); goto skip; } skinnames = UI_Malloc(sizeof(char *) * (nskins + 1)); skinnames[nskins] = NULL; // copy the valid skins for (s = 0, k = 0; k < npcxfiles; k++) { if (!strstr(pcxnames[k], "_i.pcx")) { if (IconOfSkinExists(pcxnames[k], pcxnames, npcxfiles)) { COM_StripExtension(scratch, pcxnames[k], sizeof(scratch)); skinnames[s++] = UI_CopyString(scratch); } } } FS_FreeList((void **)pcxnames); // at this point we have a valid player model pmi = &uis.pmi[uis.numPlayerModels++]; pmi->nskins = nskins; pmi->skindisplaynames = skinnames; pmi->directory = dirnames[i]; continue; skip: Z_Free(dirnames[i]); } qsort(uis.pmi, uis.numPlayerModels, sizeof(uis.pmi[0]), pmicmpfnc); }