diff --git a/bootstrap b/bootstrap index 2341f5b..9a2963c 100755 --- a/bootstrap +++ b/bootstrap @@ -20,6 +20,8 @@ fi # when one can just read the README aclocal && \ autoheader && \ +touch ltconfig && \ libtoolize --copy --automake && \ automake --foreign --add-missing --copy && \ +touch depcomp && \ autoconf diff --git a/configure.in b/configure.in index 1b42dd3..1aa79a6 100644 --- a/configure.in +++ b/configure.in @@ -5,6 +5,8 @@ AC_CONFIG_AUX_DIR(.) AC_CONFIG_SRCDIR(src/main.c) AM_CONFIG_HEADER(config.h) +AM_PROG_AS + AC_CANONICAL_SYSTEM AC_DEFINE_UNQUOTED(BUILDHOST, "${target_cpu}-${target_os}", [Set to the canonical name of the target machine]) diff --git a/src/gl_image.c b/src/gl_image.c index 1038ee5..84f4674 100644 --- a/src/gl_image.c +++ b/src/gl_image.c @@ -1434,7 +1434,7 @@ void GL_InitImages(void){ Draw_GetPalette(); if( qglColorTableEXT){ - ri.FS_LoadFile( "pics/16to8.dat",(void **)&gl_state.d_16to8table); + ri.FS_LoadFile( "pics/16to8.dat",(void **)(char *)&gl_state.d_16to8table); if( !gl_state.d_16to8table) ri.Sys_Error( ERR_FATAL, "Couldn't load pics/16to8.pcx"); } diff --git a/src/snd_alsa.c b/src/snd_alsa.c index 9042c78..be9e9c0 100644 --- a/src/snd_alsa.c +++ b/src/snd_alsa.c @@ -42,52 +42,49 @@ static int buffer_bytes; /* * The sample rates which will be attempted. */ -static int RATES[] = { - 44100, 22050, 11025, 8000 - }; +static int RATES[] = { 48000, 44100, 22050, 11025, 8000 }; /* * Initialize ALSA pcm device, and bind it to sndinfo. */ qboolean SNDDMA_Init(struct sndinfo *s){ - int i, r, err, dir; - + int i, err, dir; + unsigned int r; si = s; - + if(!strcmp(si->device->string, "/dev/dsp")) //silly oss default si->device->string = "default"; - + if((err = snd_pcm_open(&pcm_handle, si->device->string, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0){ si->Com_Printf("ALSA: cannot open device %s(%s)\n", si->device->string, snd_strerror(err)); return false; } - + if((err = snd_pcm_hw_params_malloc(&hw_params)) < 0){ si->Com_Printf("ALSA: cannot allocate hw params(%s)\n", snd_strerror(err)); return false; } - + if((err = snd_pcm_hw_params_any(pcm_handle, hw_params)) < 0){ si->Com_Printf("ALSA: cannot init hw params(%s)\n", snd_strerror(err)); snd_pcm_hw_params_free(hw_params); return false; } - + if((err = snd_pcm_hw_params_set_access(pcm_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0){ si->Com_Printf("ALSA: cannot set access(%s)\n", snd_strerror(err)); snd_pcm_hw_params_free(hw_params); return false; } - + si->dma->samplebits = si->bits->value; if(si->dma->samplebits != 8){ //try 16 by default - si->dma->samplebits = 16; //ensure this is set for other calculations - + if((err = snd_pcm_hw_params_set_format(pcm_handle, hw_params, SND_PCM_FORMAT_S16)) < 0){ si->Com_Printf("ALSA: 16 bit not supported, trying 8\n"); @@ -102,12 +99,11 @@ qboolean SNDDMA_Init(struct sndinfo *s){ return false; } } - + si->dma->speed =(int)si->speed->value; if(si->dma->speed){ //try specified rate - r = si->dma->speed; - + if((err = snd_pcm_hw_params_set_rate_near(pcm_handle, hw_params, &r, &dir)) < 0) si->Com_Printf("ALSA: cannot set rate %d(%s)\n", r, snd_strerror(err)); else { //rate succeeded, but is perhaps slightly different @@ -117,12 +113,10 @@ qboolean SNDDMA_Init(struct sndinfo *s){ } } if(!si->dma->speed){ //or all available ones - for(i = 0; i < sizeof(RATES); i++){ - r = RATES[i]; dir = 0; - + if((err = snd_pcm_hw_params_set_rate_near(pcm_handle, hw_params, &r, &dir)) < 0) si->Com_Printf("ALSA: cannot set rate %d(%s)\n", r, snd_strerror(err)); else { //rate succeeded, but is perhaps slightly different @@ -138,12 +132,12 @@ qboolean SNDDMA_Init(struct sndinfo *s){ snd_pcm_hw_params_free(hw_params); return false; } - + si->dma->channels =(int)si->channels->value; - + if(si->dma->channels < 1 || si->dma->channels > 2) si->dma->channels = 2; //ensure either stereo or mono - + if((err = snd_pcm_hw_params_set_channels(pcm_handle, hw_params, si->dma->channels)) < 0){ si->Com_Printf("ALSA: cannot set channels %d(%s)\n", @@ -151,44 +145,44 @@ qboolean SNDDMA_Init(struct sndinfo *s){ snd_pcm_hw_params_free(hw_params); return false; } - + period_size = BUFFER_SAMPLES / 2 / si->dma->channels; - + if((err = snd_pcm_hw_params_set_period_size_near(pcm_handle, hw_params, &period_size, 0)) < 0){ si->Com_Printf("ALSA: cannot set period size near(%s)\n", snd_strerror(err)); snd_pcm_hw_params_free(hw_params); return false; } - + buffer_size = period_size * 2; - + if((err = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hw_params, &buffer_size)) < 0){ si->Com_Printf("ALSA: cannot set buffer size near(%s)\n", snd_strerror(err)); snd_pcm_hw_params_free(hw_params); return false; } - + if((err = snd_pcm_hw_params(pcm_handle, hw_params)) < 0){ //set params si->Com_Printf("ALSA: cannot set params(%s)\n", snd_strerror(err)); snd_pcm_hw_params_free(hw_params); return false; } - + sample_bytes = si->dma->samplebits / 8; buffer_bytes = BUFFER_SAMPLES * sample_bytes; - + si->dma->buffer = malloc(buffer_bytes); //allocate pcm frame buffer memset(si->dma->buffer, 0, buffer_bytes); - + si->dma->samplepos = 0; - + si->dma->samples = BUFFER_SAMPLES; si->dma->submission_chunk = SUBMISSION_CHUNK; - + snd_pcm_prepare(pcm_handle); - + return true; } @@ -196,10 +190,9 @@ qboolean SNDDMA_Init(struct sndinfo *s){ * Returns the current sample position, if sound is running. */ int SNDDMA_GetDMAPos(void){ - if(si->dma->buffer) return si->dma->samplepos; - + si->Com_Printf("Sound not inizialized\n"); return 0; } @@ -208,12 +201,11 @@ int SNDDMA_GetDMAPos(void){ * Closes the ALSA pcm device and frees the dma buffer. */ void SNDDMA_Shutdown(void){ - if(si->dma->buffer){ snd_pcm_drop(pcm_handle); snd_pcm_close(pcm_handle); } - + free(si->dma->buffer); si->dma->buffer = NULL; } @@ -224,22 +216,22 @@ void SNDDMA_Shutdown(void){ void SNDDMA_Submit(void){ int s, w, frames; void *start; - + if(!si->dma->buffer) return; - + s = si->dma->samplepos * sample_bytes; start =(void *) & si->dma->buffer[s]; - + frames = si->dma->submission_chunk / si->dma->channels; - + if((w = snd_pcm_writei(pcm_handle, start, frames)) < 0){ //write to card snd_pcm_prepare(pcm_handle); //xrun occured return; } - + si->dma->samplepos += w * si->dma->channels; //mark progress - + if(si->dma->samplepos >= si->dma->samples) si->dma->samplepos = 0; //wrap buffer } diff --git a/src/snd_mix.c b/src/snd_mix.c index f34eeb9..5c5105c 100644 --- a/src/snd_mix.c +++ b/src/snd_mix.c @@ -447,31 +447,30 @@ __declspec( naked) void S_PaintChannelFrom8(channel_t *ch, sfxcache_t *sc, int c #else /* HAVE_MASM */ # ifndef USE_ASM void S_PaintChannelFrom8(channel_t *ch, sfxcache_t *sc, int count, int offset){ - int data; + int data, i; int *lscale, *rscale; unsigned char *sfx; - int i; portable_samplepair_t *samp; - + if(ch->leftvol > 255) ch->leftvol = 255; if(ch->rightvol > 255) ch->rightvol = 255; - + //ZOID-- >>11 has been changed to >>3, >>11 didn't make much sense //as it would always be zero. - lscale = snd_scaletable[ ch->leftvol >> 3]; - rscale = snd_scaletable[ ch->rightvol >> 3]; - sfx =(signed char *)sc->data + ch->pos; - + lscale = snd_scaletable[ch->leftvol >> 3]; + rscale = snd_scaletable[ch->rightvol >> 3]; + sfx = (unsigned char *)sc->data + ch->pos; + samp = &paintbuffer[offset]; - + for(i = 0; i < count; i++, samp++){ data = sfx[i]; samp->left += lscale[data]; samp->right += rscale[data]; } - + ch->pos += count; } # endif /* !USE_ASM */ @@ -484,11 +483,11 @@ void S_PaintChannelFrom16(channel_t *ch, sfxcache_t *sc, int count, int offset){ signed short *sfx; int i; portable_samplepair_t *samp; - + leftvol = ch->leftvol * snd_vol; rightvol = ch->rightvol * snd_vol; sfx =(signed short *)sc->data + ch->pos; - + samp = &paintbuffer[offset]; for(i = 0; i < count; i++, samp++){ data = sfx[i]; @@ -497,6 +496,6 @@ void S_PaintChannelFrom16(channel_t *ch, sfxcache_t *sc, int count, int offset){ samp->left += left; samp->right += right; } - + ch->pos += count; } diff --git a/src/sv_user.c b/src/sv_user.c index 72d23e2..e3b8baf 100644 --- a/src/sv_user.c +++ b/src/sv_user.c @@ -41,7 +41,7 @@ SV_BeginDemoServer */ void SV_BeginDemoserver(void){ char name[MAX_OSPATH]; - + Com_sprintf(name, sizeof(name), "demos/%s", sv.name); FS_FOpenFile(name, &sv.demofile); if(!sv.demofile) @@ -51,7 +51,7 @@ void SV_BeginDemoserver(void){ /* ================ SV_New_f - + Sends the first message from the server to a connected client. This will be sent on the initial connection and upon each server load. ================ @@ -60,42 +60,42 @@ void SV_New_f(void){ char *gamedir; int playernum; edict_t *ent; - + Com_DPrintf("New() from %s\n", sv_client->name); - + if(sv_client->state != cs_connected){ Com_Printf("New not valid -- already spawned\n"); return; } - + // demo servers just dump the file message if(sv.state == ss_demo){ SV_BeginDemoserver(); return; } - + // // serverdata needs to go over for all types of servers // to make sure the protocol is right, and to set the gamedir // gamedir = Cvar_VariableString("gamedir"); - + // send the serverdata MSG_WriteByte(&sv_client->netchan.message, svc_serverdata); MSG_WriteLong(&sv_client->netchan.message, PROTOCOL_VERSION); MSG_WriteLong(&sv_client->netchan.message, svs.spawncount); MSG_WriteByte(&sv_client->netchan.message, sv.attractloop); MSG_WriteString(&sv_client->netchan.message, gamedir); - + if(sv.state == ss_cinematic || sv.state == ss_pic) playernum = -1; else playernum = sv_client - svs.clients; MSG_WriteShort(&sv_client->netchan.message, playernum); - + // send full levelname MSG_WriteString(&sv_client->netchan.message, sv.configstrings[CS_NAME]); - + // // game server // @@ -105,12 +105,11 @@ void SV_New_f(void){ ent->s.number = playernum + 1; sv_client->edict = ent; memset(&sv_client->lastcmd, 0, sizeof(sv_client->lastcmd)); - + // begin fetching configstrings MSG_WriteByte(&sv_client->netchan.message, svc_stufftext); MSG_WriteString(&sv_client->netchan.message, va("cmd configstrings %i 0\n", svs.spawncount)); } - } /* @@ -120,25 +119,25 @@ SV_Configstrings_f */ void SV_Configstrings_f(void){ int start; - + Com_DPrintf("Configstrings() from %s\n", sv_client->name); - + if(sv_client->state != cs_connected){ Com_Printf("configstrings not valid -- already spawned\n"); return; } - + // handle the case of a level changing while a client was connecting if( atoi(Cmd_Argv(1)) != svs.spawncount){ Com_Printf("SV_Configstrings_f from different level\n"); SV_New_f(); return; } - + start = atoi(Cmd_Argv(2)); - + // write a packet full of data - + while( sv_client->netchan.message.cursize < MAX_MSGLEN / 2 && start < MAX_CONFIGSTRINGS){ if(sv.configstrings[start][0]){ @@ -148,9 +147,9 @@ void SV_Configstrings_f(void){ } start++; } - + // send next command - + if(start == MAX_CONFIGSTRINGS){ MSG_WriteByte(&sv_client->netchan.message, svc_stufftext); MSG_WriteString(&sv_client->netchan.message, va("cmd baselines %i 0\n", svs.spawncount)); @@ -169,27 +168,27 @@ void SV_Baselines_f(void){ int start; entity_state_t nullstate; entity_state_t *base; - + Com_DPrintf("Baselines() from %s\n", sv_client->name); - + if(sv_client->state != cs_connected){ Com_Printf("baselines not valid -- already spawned\n"); return; } - + // handle the case of a level changing while a client was connecting if( atoi(Cmd_Argv(1)) != svs.spawncount){ Com_Printf("SV_Baselines_f from different level\n"); SV_New_f(); return; } - + start = atoi(Cmd_Argv(2)); - + memset(&nullstate, 0, sizeof(nullstate)); - + // write a packet full of data - + while( sv_client->netchan.message.cursize < MAX_MSGLEN / 2 && start < MAX_EDICTS){ base = &sv.baselines[start]; @@ -199,9 +198,9 @@ void SV_Baselines_f(void){ } start++; } - + // send next command - + if(start == MAX_EDICTS){ MSG_WriteByte(&sv_client->netchan.message, svc_stufftext); MSG_WriteString(&sv_client->netchan.message, va("precache %i\n", svs.spawncount)); @@ -218,19 +217,19 @@ SV_Begin_f */ void SV_Begin_f(void){ Com_DPrintf("Begin() from %s\n", sv_client->name); - + // handle the case of a level changing while a client was connecting - if( atoi(Cmd_Argv(1)) != svs.spawncount){ + if(atoi(Cmd_Argv(1)) != svs.spawncount){ Com_Printf("SV_Begin_f from different level\n"); SV_New_f(); return; } - + sv_client->state = cs_spawned; - + // call the game begin function ge->ClientBegin(sv_player); - + Cbuf_InsertFromDefer(); } @@ -242,20 +241,18 @@ SV_NextDownload_f ================== */ void SV_NextDownload_f(void){ - int r; - int percent; - int size; - + int percent, size, r; + if(!sv_client->download) return; - + r = sv_client->downloadsize - sv_client->downloadcount; if(r > 1024) r = 1024; - + MSG_WriteByte(&sv_client->netchan.message, svc_download); MSG_WriteShort(&sv_client->netchan.message, r); - + sv_client->downloadcount += r; size = sv_client->downloadsize; if(!size) @@ -264,10 +261,10 @@ void SV_NextDownload_f(void){ MSG_WriteByte(&sv_client->netchan.message, percent); SZ_Write(&sv_client->netchan.message, sv_client->download + sv_client->downloadcount - r, r); - + if(sv_client->downloadcount != sv_client->downloadsize) return; - + FS_FreeFile(sv_client->download); sv_client->download = NULL; } @@ -286,12 +283,12 @@ void SV_BeginDownload_f(void){ extern cvar_t *allow_download_maps; extern int file_from_pak; // ZOID did file come from pak? int offset = 0; - + name = Cmd_Argv(1); - + if(Cmd_Argc() > 2) offset = atoi(Cmd_Argv(2)); // downloaded offset - + // hacked by zoid to allow more conrol over download // first off, no .. or global allow check if(strstr(name, "..") || strstr(name, "\\/") || !allow_download->value @@ -314,17 +311,17 @@ void SV_BeginDownload_f(void){ MSG_WriteByte(&sv_client->netchan.message, 0); return; } - - + + if(sv_client->download) FS_FreeFile(sv_client->download); - - sv_client->downloadsize = FS_LoadFile(name,(void **) & sv_client->download); + + sv_client->downloadsize = FS_LoadFile(name, (void **)(char *)&sv_client->download); sv_client->downloadcount = offset; - + if(offset > sv_client->downloadsize) sv_client->downloadcount = sv_client->downloadsize; - + if(!sv_client->download // special check for maps, if it came from a pak file, don't allow // download ZOID @@ -334,13 +331,13 @@ void SV_BeginDownload_f(void){ FS_FreeFile(sv_client->download); sv_client->download = NULL; } - + MSG_WriteByte(&sv_client->netchan.message, svc_download); MSG_WriteShort(&sv_client->netchan.message, -1); MSG_WriteByte(&sv_client->netchan.message, 0); return; } - + SV_NextDownload_f(); Com_DPrintf("Downloading %s to %s\n", name, sv_client->name); } @@ -353,7 +350,7 @@ void SV_BeginDownload_f(void){ /* ================= SV_Disconnect_f - + The client is going to disconnect, so remove the connection immediately ================= */ @@ -372,17 +369,16 @@ Dumps the serverinfo info string void SV_ShowServerinfo_f(void){ cvar_t *cvar; char line[MAX_STRING_CHARS]; - + if(!sv_client){ //print to server console Info_Print(Cvar_Serverinfo()); return; } - + for(cvar = cvar_vars; cvar; cvar = cvar->next){ - if(!(cvar->flags & CVAR_SERVERINFO)) continue; //only print serverinfo cvars - + snprintf(line, MAX_STRING_CHARS, "%s %s\n", cvar->name, cvar->string); SV_ClientPrintf(sv_client, PRINT_MEDIUM, line); } @@ -391,11 +387,11 @@ void SV_ShowServerinfo_f(void){ void SV_Nextserver(void){ char *v; - + //ZOID, ss_pic can be nextserver'd in coop mode if(sv.state == ss_game ||(sv.state == ss_pic && !coop->value)) return; // can't nextserver while playing a normal game - + svs.spawncount++; // make sure another doesn't sneak in v = Cvar_VariableString("nextserver"); if(!v[0]) @@ -410,7 +406,7 @@ void SV_Nextserver(void){ /* ================== SV_Nextserver_f - + A cinematic has completed or been aborted by a client, so move to the next server, ================== @@ -420,9 +416,9 @@ void SV_Nextserver_f(void){ Com_DPrintf("Nextserver() from wrong level, from %s\n", sv_client->name); return; // leftover from last server } - + Com_DPrintf("Nextserver() from %s\n", sv_client->name); - + SV_Nextserver(); } @@ -439,20 +435,20 @@ ucmd_t ucmds[] = {"configstrings", SV_Configstrings_f}, {"baselines", SV_Baselines_f}, {"begin", SV_Begin_f}, - + {"nextserver", SV_Nextserver_f}, - + {"disconnect", SV_Disconnect_f}, - + // issued by hand at client consoles {"info", SV_ShowServerinfo_f}, - + {"download", SV_BeginDownload_f}, {"nextdl", SV_NextDownload_f}, - + {NULL, NULL} }; - + /* ================== SV_ExecuteUserCommand @@ -460,25 +456,25 @@ SV_ExecuteUserCommand */ void SV_ExecuteUserCommand(char *s){ ucmd_t *u; - + /* http://www.quakesrc.org/forum/topicDisplay.php?topicID=160 * the client can read the rcon_password variable, among others * so don't do any macro expansion on the server side */ Cmd_TokenizeString(s, false); sv_player = sv_client->edict; - - // SV_BeginRedirect(RD_CLIENT); - + +// SV_BeginRedirect(RD_CLIENT); + for(u = ucmds; u->name; u++) if(!strcmp(Cmd_Argv(0), u->name)){ u->func(); break; } - + if(!u->name && sv.state == ss_game) ge->ClientCommand(sv_player); - - // SV_EndRedirect(); + +// SV_EndRedirect(); } /* @@ -494,12 +490,12 @@ USER CMD EXECUTION void SV_ClientThink(client_t *cl, usercmd_t *cmd) { cl->commandMsec -= cmd->msec; - + if(cl->commandMsec < 0 && sv_enforcetime->value){ Com_DPrintf("commandMsec underflow from %s\n", cl->name); return; } - + ge->ClientThink(cl->edict, cmd); } @@ -509,14 +505,14 @@ void SV_ClientThink(client_t *cl, usercmd_t *cmd) /* =================== SV_ExecuteClientMessage - + The current net_message is parsed for the given client =================== */ void SV_ExecuteClientMessage(client_t *cl){ int c; char *s; - + usercmd_t nullcmd; usercmd_t oldest, oldcmd, newcmd; int net_drop; @@ -525,43 +521,43 @@ void SV_ExecuteClientMessage(client_t *cl){ int checksumIndex; qboolean move_issued; int lastframe; - + sv_client = cl; sv_player = sv_client->edict; - + // only allow one move command move_issued = false; stringCmdCount = 0; - + while(1){ if(net_message.readcount > net_message.cursize){ Com_Printf("SV_ReadClientMessage: badread\n"); SV_DropClient(cl); return; } - + c = MSG_ReadByte(&net_message); if(c == -1) break; - + switch(c){ default: Com_Printf("SV_ReadClientMessage: unknown command char\n"); SV_DropClient(cl); return; - + case clc_nop: break; - + case clc_userinfo: strncpy(cl->userinfo, MSG_ReadString(&net_message), sizeof(cl->userinfo) - 1); SV_UserinfoChanged(cl); break; - + case clc_move: if(move_issued) return; // someone is trying to cheat... - + move_issued = true; checksumIndex = net_message.readcount; checksum = MSG_ReadByte(&net_message); @@ -573,66 +569,60 @@ void SV_ExecuteClientMessage(client_t *cl){ svs.realtime - cl->frames[cl->lastframe & UPDATE_MASK].senttime; } } - + memset(&nullcmd, 0, sizeof(nullcmd)); MSG_ReadDeltaUsercmd(&net_message, &nullcmd, &oldest); MSG_ReadDeltaUsercmd(&net_message, &oldest, &oldcmd); MSG_ReadDeltaUsercmd(&net_message, &oldcmd, &newcmd); - - if( cl->state != cs_spawned){ + + if(cl->state != cs_spawned){ cl->lastframe = -1; break; } - + // if the checksum fails, ignore the rest of the packet calculatedChecksum = COM_BlockSequenceCRCByte( net_message.data + checksumIndex + 1, net_message.readcount - checksumIndex - 1, cl->netchan.incoming_sequence); - + if(calculatedChecksum != checksum){ Com_DPrintf("Failed command checksum for %s(%d != %d)/%d\n", cl->name, calculatedChecksum, checksum, cl->netchan.incoming_sequence); return; } - + if(!paused->value){ net_drop = cl->netchan.dropped; if(net_drop < 20){ - - //if(net_drop > 2) - - // Com_Printf("drop %i\n", net_drop); +// if(net_drop > 2) +// Com_Printf("drop %i\n", net_drop); while(net_drop > 2){ SV_ClientThink(cl, &cl->lastcmd); - net_drop--; } if(net_drop > 1) SV_ClientThink(cl, &oldest); - if(net_drop > 0) SV_ClientThink(cl, &oldcmd); - } SV_ClientThink(cl, &newcmd); } - + cl->lastcmd = newcmd; break; - + case clc_stringcmd: s = MSG_ReadString(&net_message); - + // malicious users may try using too many string commands if(++stringCmdCount < MAX_STRINGCMDS) SV_ExecuteUserCommand(s); - + if(cl->state == cs_zombie) return; // disconnect command break; } } } - diff --git a/src/vid_menu.c b/src/vid_menu.c index 01e35ee..930e0e5 100644 --- a/src/vid_menu.c +++ b/src/vid_menu.c @@ -224,6 +224,7 @@ void VID_MenuInit( void){ "[1152 768 ]", /* apple tibook */ "[1280 854 ]", /* apple tibook */ "[1440 900 ]", /* apple powerbook g4 17" */ + "[1680 1050]", /* 20" widescreen LCD */ 0 }; static const char *refs[] = { diff --git a/src/vid_so.c b/src/vid_so.c index 0a8d0e8..a3a295f 100644 --- a/src/vid_so.c +++ b/src/vid_so.c @@ -166,7 +166,8 @@ vidmode_t vid_modes[] = { { "Mode 11: 1024x480", 1024, 480, 11 }, /* Sony VAIO Pocketbook */ { "Mode 12: 1152x768", 1152, 768, 12 }, /* Apple TiBook */ { "Mode 13: 1280x854", 1280, 854, 13 }, /* Apple TiBook */ - { "Mode 14: 1440x900", 1440, 900, 14 } /* Apple 17" Powerbook G4 */ + { "Mode 14: 1440x900", 1440, 900, 14 }, /* Apple 17" Powerbook G4 */ + { "Mode 15: 1680x1050", 1680, 1050, 15 } /* 20" widescreen LCD */ }; qboolean VID_GetModeInfo( unsigned int *width, unsigned int *height, int mode){