19fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
29fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCopyright (C) 1996-1997 Id Software, Inc.
39fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
49fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is free software; you can redistribute it and/or
59fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammodify it under the terms of the GNU General Public License
69fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamas published by the Free Software Foundation; either version 2
79fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamof the License, or (at your option) any later version.
89fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
99fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is distributed in the hope that it will be useful,
109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambut WITHOUT ANY WARRANTY; without even the implied warranty of
119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSee the GNU General Public License for more details.
149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamYou should have received a copy of the GNU General Public License
169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamalong with this program; if not, write to the Free Software
179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// vid_win.c -- Win32 video driver
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "winquake.h"
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "d_local.h"
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "resource.h"
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define MAX_MODE_LIST	30
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define VID_ROW_SIZE	3
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	dibonly;
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int		Minimized;
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHWND		mainwindow;
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow);
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			DIBWidth, DIBHeight;
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	DDActive;
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamRECT		WindowRect;
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDWORD		WindowStyle, ExWindowStyle;
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			window_center_x, window_center_y, window_x, window_y, window_width, window_height;
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamRECT		window_rect;
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic DEVMODE	gdevmode;
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic qboolean	startwindowed = 0, windowed_mode_set;
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int		firstupdate = 1;
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic qboolean	vid_initialized = false, vid_palettized;
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int		lockcount;
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int		vid_fulldib_on_focus_mode;
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic qboolean	force_minimized, in_mode_set, is_mode0x13, force_mode_set;
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int		vid_stretched, windowed_mouse;
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic qboolean	palette_changed, syscolchg, vid_mode_set, hide_window, pal_is_nostatic;
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic HICON	hIcon;
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamviddef_t	vid;				// global video state
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define MODE_WINDOWED			0
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define MODE_SETTABLE_WINDOW	2
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NO_MODE					(MODE_WINDOWED - 1)
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define MODE_FULLSCREEN_DEFAULT	(MODE_WINDOWED + 3)
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// Note that 0 is MODE_WINDOWED
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_mode = {"vid_mode","0", false};
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// Note that 0 is MODE_WINDOWED
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		_vid_default_mode = {"_vid_default_mode","0", true};
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// Note that 3 is MODE_FULLSCREEN_DEFAULT
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		_vid_default_mode_win = {"_vid_default_mode_win","3", true};
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_wait = {"vid_wait","0"};
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_nopageflip = {"vid_nopageflip","0", true};
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		_vid_wait_override = {"_vid_wait_override", "0", true};
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_config_x = {"vid_config_x","800", true};
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_config_y = {"vid_config_y","600", true};
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_stretch_by_2 = {"vid_stretch_by_2","1", true};
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		_windowed_mouse = {"_windowed_mouse","0", true};
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_fullscreen_mode = {"vid_fullscreen_mode","3", true};
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_windowed_mode = {"vid_windowed_mode","0", true};
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		block_switch = {"block_switch","0", true};
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_window_x = {"vid_window_x", "0", true};
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcvar_t		vid_window_y = {"vid_window_y", "0", true};
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct {
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		width;
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		height;
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} lmode_t;
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamlmode_t	lowresmodes[] = {
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{320, 200},
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{320, 240},
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{400, 300},
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{512, 384},
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream};
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			vid_modenum = NO_MODE;
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			vid_testingmode, vid_realmode;
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdouble		vid_testendtime;
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			vid_default = MODE_WINDOWED;
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int	windowed_default;
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammodestate_t	modestate = MS_UNINIT;
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic byte		*vid_surfcache;
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int		vid_surfcachesize;
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int		VID_highhunkmark;
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamunsigned char	vid_curpal[256*3];
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamunsigned short	d_8to16table[256];
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamunsigned	d_8to24table[256];
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint     driver = grDETECT,mode;
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambool    useWinDirect = true, useDirectDraw = true;
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMGLDC	*mgldc = NULL,*memdc = NULL,*dibdc = NULL,*windc = NULL;
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct {
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modestate_t	type;
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			width;
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			height;
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			modenum;
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			mode13;
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			stretched;
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			dib;
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			fullscreen;
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			bpp;
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			halfscreen;
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		modedesc[13];
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} vmode_t;
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic vmode_t	modelist[MAX_MODE_LIST];
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int		nummodes;
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic vmode_t	*pcurrentmode;
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint		aPage;					// Current active display page
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint		vPage;					// Current visible display page
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint		waitVRT = true;			// True to wait for retrace on flip
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic vmode_t	badmode;
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic byte	backingbuf[48*24];
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_MenuDraw (void);
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_MenuKey (int key);
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid AppActivate(BOOL fActive, BOOL minimize);
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_RememberWindowPos
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_RememberWindowPos (void)
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	RECT	rect;
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (GetWindowRect (mainwindow, &rect))
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if ((rect.left < GetSystemMetrics (SM_CXSCREEN)) &&
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			(rect.top < GetSystemMetrics (SM_CYSCREEN))  &&
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			(rect.right > 0)                             &&
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			(rect.bottom > 0))
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_SetValue ("vid_window_x", (float)rect.left);
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_SetValue ("vid_window_y", (float)rect.top);
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_CheckWindowXY
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_CheckWindowXY (void)
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (((int)vid_window_x.value > (GetSystemMetrics (SM_CXSCREEN) - 160)) ||
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		((int)vid_window_y.value > (GetSystemMetrics (SM_CYSCREEN) - 120)) ||
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		((int)vid_window_x.value < 0)									   ||
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		((int)vid_window_y.value < 0))
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Cvar_SetValue ("vid_window_x", 0.0);
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Cvar_SetValue ("vid_window_y", 0.0 );
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_UpdateWindowStatus
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_UpdateWindowStatus (void)
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_rect.left = window_x;
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_rect.top = window_y;
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_rect.right = window_x + window_width;
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_rect.bottom = window_y + window_height;
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_center_x = (window_rect.left + window_rect.right) / 2;
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_center_y = (window_rect.top + window_rect.bottom) / 2;
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	IN_UpdateClipCursor ();
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamClearAllStates
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid ClearAllStates (void)
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// send an up event for each key, to make sure the server clears them all
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<256 ; i++)
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Key_Event (i, false);
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Key_ClearStates ();
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	IN_ClearStates ();
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_CheckAdequateMem
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean VID_CheckAdequateMem (int width, int height)
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		tbuffersize;
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	tbuffersize = width * height * sizeof (*d_pzbuffer);
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	tbuffersize += D_SurfaceCacheForRes (width, height);
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// see if there's enough memory, allowing for the normal mode 0x13 pixel,
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// z, and surface buffers
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((host_parms.memsize - tbuffersize + SURFCACHE_SIZE_AT_320X200 +
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		 0x10000 * 3) < minimum_memory)
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return false;		// not enough memory for mode
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return true;
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_AllocBuffers
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean VID_AllocBuffers (int width, int height)
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		tsize, tbuffersize;
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	tbuffersize = width * height * sizeof (*d_pzbuffer);
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	tsize = D_SurfaceCacheForRes (width, height);
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	tbuffersize += tsize;
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// see if there's enough memory, allowing for the normal mode 0x13 pixel,
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// z, and surface buffers
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((host_parms.memsize - tbuffersize + SURFCACHE_SIZE_AT_320X200 +
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		 0x10000 * 3) < minimum_memory)
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_SafePrintf ("Not enough memory for video mode\n");
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return false;		// not enough memory for mode
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_surfcachesize = tsize;
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (d_pzbuffer)
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		D_FlushCaches ();
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Hunk_FreeToHighMark (VID_highhunkmark);
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		d_pzbuffer = NULL;
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_highhunkmark = Hunk_HighMark ();
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d_pzbuffer = Hunk_HighAllocName (tbuffersize, "video");
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_surfcache = (byte *)d_pzbuffer +
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			width * height * sizeof (*d_pzbuffer);
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return true;
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid initFatalError(void)
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_exit();
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_fatalError(MGL_errorMsg(MGL_result()));
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	exit(EXIT_FAILURE);
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint VID_Suspend (MGLDC *dc,m_int flags)
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (flags & MGL_DEACTIVATE)
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// FIXME: this doesn't currently work on NT
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (block_switch.value && !WinNT)
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return MGL_NO_DEACTIVATE;
3169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_BlockSound ();
3199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_ClearBuffer ();
3209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		IN_RestoreOriginalMouseState ();
3229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CDAudio_Pause ();
3239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// keep WM_PAINT from trying to redraw
3259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		in_mode_set = true;
3269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		block_drawing = true;	// so we don't try to draw while switched away
3289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return MGL_NO_SUSPEND_APP;
3309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (flags & MGL_REACTIVATE)
3329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		IN_SetQuakeMouseState ();
3349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// fix the leftover Alt from any Alt-Tab or the like that switched us away
3359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ClearAllStates ();
3369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CDAudio_Resume ();
3379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_UnblockSound ();
3389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		in_mode_set = false;
3409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid.recalc_refdef = 1;
3429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		block_drawing = false;
3449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return MGL_NO_SUSPEND_APP;
3469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid registerAllDispDrivers(void)
3529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	/* Event though these driver require WinDirect, we register
3549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	 * them so that they will still be available even if DirectDraw
3559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	 * is present and the user has disable the high performance
3569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	 * WinDirect modes.
3579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	 */
3589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_registerDriver(MGL_VGA8NAME,VGA8_driver);
3599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	MGL_registerDriver(MGL_VGAXNAME,VGAX_driver);
3609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	/* Register display drivers */
3629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (useWinDirect)
3639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//we don't want VESA 1.X drivers		MGL_registerDriver(MGL_SVGA8NAME,SVGA8_driver);
3659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_registerDriver(MGL_LINEAR8NAME,LINEAR8_driver);
3669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!COM_CheckParm ("-novbeaf"))
3689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_registerDriver(MGL_ACCEL8NAME,ACCEL8_driver);
3699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (useDirectDraw)
3729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_registerDriver(MGL_DDRAW8NAME,DDRAW8_driver);
3749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid registerAllMemDrivers(void)
3799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	/* Register memory context drivers */
3819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_registerDriver(MGL_PACKED8NAME,PACKED8_driver);
3829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_InitMGLFull (HINSTANCE hInstance)
3869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i, xRes, yRes, bits, vMode, lowres, curmode, temp;
3889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			lowstretchedres, stretchedmode, lowstretched;
3899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    uchar		*m;
3909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// FIXME: NT is checked for because MGL currently has a bug that causes it
3929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// to try to use WinDirect modes even on NT
3939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (COM_CheckParm("-nowindirect") ||
3949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		COM_CheckParm("-nowd") ||
3959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		COM_CheckParm("-novesa") ||
3969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		WinNT)
3979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		useWinDirect = false;
3999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (COM_CheckParm("-nodirectdraw") || COM_CheckParm("-noddraw") || COM_CheckParm("-nodd"))
4029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		useDirectDraw = false;
4039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Initialise the MGL
4059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_unregisterAllDrivers();
4069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	registerAllDispDrivers();
4079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	registerAllMemDrivers();
4089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_detectGraph(&driver,&mode);
4099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	m = MGL_availableModes();
4109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (m[0] != 0xFF)
4129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lowres = lowstretchedres = 99999;
4149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lowstretched = 0;
4159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		curmode = 0;
4169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// find the lowest-res mode, or a mode we can stretch up to and get
4189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// lowest-res that way
4199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i = 0; m[i] != 0xFF; i++)
4209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_modeResolution(m[i], &xRes, &yRes,&bits);
4229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((bits == 8) &&
4249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(xRes <= MAXWIDTH) &&
4259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(yRes <= MAXHEIGHT) &&
4269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(curmode < MAX_MODE_LIST))
4279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
4289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (m[i] == grVGA_320x200x256)
4299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					is_mode0x13 = true;
4309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (!COM_CheckParm("-noforcevga"))
4329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
4339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (m[i] == grVGA_320x200x256)
4349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
4359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						mode = i;
4369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						break;
4379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
4389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
4399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (xRes < lowres)
4419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
4429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					lowres = xRes;
4439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					mode = i;
4449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
4459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if ((xRes < lowstretchedres) && ((xRes >> 1) >= 320))
4479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
4489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					lowstretchedres = xRes >> 1;
4499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					stretchedmode = i;
4509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
4519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
4529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			curmode++;
4549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
4559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// if there's a mode we can stretch by 2 up to, thereby effectively getting
4579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// a lower-res mode than the lowest-res real but still at least 320x200, that
4589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// will be our default mode
4599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (lowstretchedres < lowres)
4609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			mode = stretchedmode;
4629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			lowres = lowstretchedres;
4639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			lowstretched = 1;
4649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
4659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// build the mode list, leaving room for the low-res stretched mode, if any
4679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		nummodes++;		// leave room for default mode
4689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i = 0; m[i] != 0xFF; i++)
4709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_modeResolution(m[i], &xRes, &yRes,&bits);
4729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((bits == 8) &&
4749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(xRes <= MAXWIDTH) &&
4759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(yRes <= MAXHEIGHT) &&
4769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(nummodes < MAX_MODE_LIST))
4779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
4789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (i == mode)
4799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
4809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (lowstretched)
4819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
4829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						stretchedmode = nummodes;
4839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						curmode = nummodes++;
4849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
4859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					else
4869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
4879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						curmode = MODE_FULLSCREEN_DEFAULT;
4889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
4899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
4909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				else
4919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
4929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					curmode = nummodes++;
4939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
4949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].type = MS_FULLSCREEN;
4969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].width = xRes;
4979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].height = yRes;
4989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				sprintf (modelist[curmode].modedesc, "%dx%d", xRes, yRes);
4999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (m[i] == grVGA_320x200x256)
5019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[curmode].mode13 = 1;
5029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				else
5039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[curmode].mode13 = 0;
5049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].modenum = m[i];
5069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].stretched = 0;
5079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].dib = 0;
5089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].fullscreen = 1;
5099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].halfscreen = 0;
5109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[curmode].bpp = 8;
5119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
5129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (lowstretched)
5159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
5169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modelist[MODE_FULLSCREEN_DEFAULT] = modelist[stretchedmode];
5179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modelist[MODE_FULLSCREEN_DEFAULT].stretched = 1;
5189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modelist[MODE_FULLSCREEN_DEFAULT].width >>= 1;
5199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modelist[MODE_FULLSCREEN_DEFAULT].height >>= 1;
5209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			sprintf (modelist[MODE_FULLSCREEN_DEFAULT].modedesc, "%dx%d",
5219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					 modelist[MODE_FULLSCREEN_DEFAULT].width,
5229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					 modelist[MODE_FULLSCREEN_DEFAULT].height);
5239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_default = MODE_FULLSCREEN_DEFAULT;
5269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		temp = m[0];
5289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!MGL_init(&driver, &temp, ""))
5309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
5319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			initFatalError();
5329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_setSuspendAppCallback(VID_Suspend);
5369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMGLDC *createDisplayDC(int forcemem)
5409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/****************************************************************************
5419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*
5429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream* Function:     createDisplayDC
5439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream* Returns:      Pointer to the MGL device context to use for the application
5449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*
5459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream* Description:  Initialises the MGL and creates an appropriate display
5469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*               device context to be used by the GUI. This creates and
5479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*               apropriate device context depending on the system being
5489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*               compile for, and should be the only place where system
5499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*               specific code is required.
5509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*
5519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream****************************************************************************/
5529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    MGLDC			*dc;
5549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pixel_format_t	pf;
5559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				npages;
5569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Start the specified video mode
5589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!MGL_changeDisplayMode(mode))
5599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        initFatalError();
5609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	npages = MGL_availablePages(mode);
5629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (npages > 3)
5649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		npages = 3;
5659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!COM_CheckParm ("-notriplebuf"))
5679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (npages > 2)
5699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
5709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			npages = 2;
5719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((dc = MGL_createDisplayDC(npages)) == NULL)
5759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
5769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!forcemem && (MGL_surfaceAccessType(dc)) == MGL_LINEAR_ACCESS && (dc->mi.maxPage > 0))
5789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_makeCurrentDC(dc);
5809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		memdc = NULL;
5819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// Set up for blitting from a memory buffer
5859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		memdc = MGL_createMemoryDC(MGL_sizex(dc)+1,MGL_sizey(dc)+1,8,&pf);
5869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_makeCurrentDC(memdc);
5879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Enable page flipping even for even for blitted surfaces
5909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (forcemem)
5919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid.numpages = 1;
5939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid.numpages = dc->mi.maxPage + 1;
5979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid.numpages > 1)
5999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// Set up for page flipping
6019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_setActivePage(dc, aPage = 1);
6029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_setVisualPage(dc, vPage = 0, false);
6039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid.numpages > 3)
6069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid.numpages = 3;
6079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid.numpages == 2)
6109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		waitVRT = true;
6119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
6129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		waitVRT = false;
6139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return dc;
6159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_InitMGLDIB (HINSTANCE hInstance)
6199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WNDCLASS		wc;
6219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	HDC				hdc;
6229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				i;
6239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON2));
6259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	/* Register the frame class */
6279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.style         = 0;
6289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.lpfnWndProc   = (WNDPROC)MainWndProc;
6299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.cbClsExtra    = 0;
6309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.cbWndExtra    = 0;
6319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.hInstance     = hInstance;
6329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.hIcon         = 0;
6339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.hCursor       = LoadCursor (NULL,IDC_ARROW);
6349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	wc.hbrBackground = NULL;
6359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.lpszMenuName  = 0;
6369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    wc.lpszClassName = "WinQuake";
6379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (!RegisterClass (&wc) )
6399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Couldn't register window class");
6409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	/* Find the size for the DIB window */
6429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	/* Initialise the MGL for windowed operation */
6439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_setAppInstance(hInstance);
6449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	registerAllMemDrivers();
6459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_initWindowed("");
6469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].type = MS_WINDOWED;
6489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].width = 320;
6499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].height = 240;
6509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (modelist[0].modedesc, "320x240");
6519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].mode13 = 0;
6529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].modenum = MODE_WINDOWED;
6539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].stretched = 0;
6549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].dib = 1;
6559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].fullscreen = 0;
6569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].halfscreen = 0;
6579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[0].bpp = 8;
6589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].type = MS_WINDOWED;
6609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].width = 640;
6619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].height = 480;
6629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (modelist[1].modedesc, "640x480");
6639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].mode13 = 0;
6649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].modenum = MODE_WINDOWED + 1;
6659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].stretched = 1;
6669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].dib = 1;
6679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].fullscreen = 0;
6689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].halfscreen = 0;
6699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[1].bpp = 8;
6709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].type = MS_WINDOWED;
6729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].width = 800;
6739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].height = 600;
6749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (modelist[2].modedesc, "800x600");
6759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].mode13 = 0;
6769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].modenum = MODE_WINDOWED + 2;
6779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].stretched = 1;
6789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].dib = 1;
6799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].fullscreen = 0;
6809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].halfscreen = 0;
6819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modelist[2].bpp = 8;
6829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// automatically stretch the default mode up if > 640x480 desktop resolution
6849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hdc = GetDC(NULL);
6859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((GetDeviceCaps(hdc, HORZRES) > 640) && !COM_CheckParm("-noautostretch"))
6879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_default = MODE_WINDOWED + 1;
6899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
6919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_default = MODE_WINDOWED;
6939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	windowed_default = vid_default;
6969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ReleaseDC(NULL,hdc);
6989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	nummodes = 3;	// reserve space for windowed mode
7009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DDActive = 0;
7029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
7079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_InitFullDIB
7089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
7099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_InitFullDIB (HINSTANCE hInstance)
7119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DEVMODE	devmode;
7139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i, j, modenum, cmodes, existingmode, originalnummodes, lowestres;
7149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		numlowresmodes, bpp, done;
7159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		cstretch, istretch, mstretch;
7169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	BOOL	stat;
7179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// enumerate 8 bpp modes
7199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	originalnummodes = nummodes;
7209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modenum = 0;
7219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lowestres = 99999;
7229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	do
7249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		stat = EnumDisplaySettings (NULL, modenum, &devmode);
7269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if ((devmode.dmBitsPerPel == 8) &&
7289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			(devmode.dmPelsWidth <= MAXWIDTH) &&
7299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			(devmode.dmPelsHeight <= MAXHEIGHT) &&
7309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			(nummodes < MAX_MODE_LIST))
7319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
7329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			devmode.dmFields = DM_BITSPERPEL |
7339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							   DM_PELSWIDTH |
7349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							   DM_PELSHEIGHT;
7359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) ==
7379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					DISP_CHANGE_SUCCESSFUL)
7389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
7399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].type = MS_FULLDIB;
7409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].width = devmode.dmPelsWidth;
7419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].height = devmode.dmPelsHeight;
7429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].modenum = 0;
7439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].mode13 = 0;
7449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].stretched = 0;
7459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].halfscreen = 0;
7469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].dib = 1;
7479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].fullscreen = 1;
7489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[nummodes].bpp = devmode.dmBitsPerPel;
7499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				sprintf (modelist[nummodes].modedesc, "%dx%d",
7509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						 devmode.dmPelsWidth, devmode.dmPelsHeight);
7519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// if the width is more than twice the height, reduce it by half because this
7539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// is probably a dual-screen monitor
7549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (!COM_CheckParm("-noadjustaspect"))
7559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
7569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (modelist[nummodes].width > (modelist[nummodes].height << 1))
7579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
7589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						modelist[nummodes].width >>= 1;
7599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						modelist[nummodes].halfscreen = 1;
7609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						sprintf (modelist[nummodes].modedesc, "%dx%d",
7619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								 modelist[nummodes].width,
7629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								 modelist[nummodes].height);
7639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
7649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
7659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				for (i=originalnummodes, existingmode = 0 ; i<nummodes ; i++)
7679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
7689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ((modelist[nummodes].width == modelist[i].width) &&
7699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						(modelist[nummodes].height == modelist[i].height))
7709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
7719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						existingmode = 1;
7729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						break;
7739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
7749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
7759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (!existingmode)
7779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
7789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (modelist[nummodes].width < lowestres)
7799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						lowestres = modelist[nummodes].width;
7809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					nummodes++;
7829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
7839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
7849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modenum++;
7879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} while (stat);
7889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// see if any of them were actually settable; if so, this is our mode list,
7909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// else enumerate all modes; our mode list is whichever ones are settable
7919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// with > 8 bpp
7929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (nummodes == originalnummodes)
7939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modenum = 0;
7959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lowestres = 99999;
7969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_SafePrintf ("No 8-bpp fullscreen DIB modes found\n");
7989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		do
8009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
8019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			stat = EnumDisplaySettings (NULL, modenum, &devmode);
8029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((((devmode.dmPelsWidth <= MAXWIDTH) &&
8049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  (devmode.dmPelsHeight <= MAXHEIGHT)) ||
8059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				 (!COM_CheckParm("-noadjustaspect") &&
8069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  (devmode.dmPelsWidth <= (MAXWIDTH*2)) &&
8079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  (devmode.dmPelsWidth > (devmode.dmPelsHeight*2)))) &&
8089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(nummodes < MAX_MODE_LIST) &&
8099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(devmode.dmBitsPerPel > 8))
8109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
8119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				devmode.dmFields = DM_BITSPERPEL |
8129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								   DM_PELSWIDTH |
8139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								   DM_PELSHEIGHT;
8149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) ==
8169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						DISP_CHANGE_SUCCESSFUL)
8179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
8189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].type = MS_FULLDIB;
8199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].width = devmode.dmPelsWidth;
8209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].height = devmode.dmPelsHeight;
8219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].modenum = 0;
8229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].mode13 = 0;
8239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].stretched = 0;
8249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].halfscreen = 0;
8259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].dib = 1;
8269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].fullscreen = 1;
8279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].bpp = devmode.dmBitsPerPel;
8289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					sprintf (modelist[nummodes].modedesc, "%dx%d",
8299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							 devmode.dmPelsWidth, devmode.dmPelsHeight);
8309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// if the width is more than twice the height, reduce it by half because this
8329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// is probably a dual-screen monitor
8339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (!COM_CheckParm("-noadjustaspect"))
8349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
8359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						if (modelist[nummodes].width > (modelist[nummodes].height*2))
8369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						{
8379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							modelist[nummodes].width >>= 1;
8389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							modelist[nummodes].halfscreen = 1;
8399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							sprintf (modelist[nummodes].modedesc, "%dx%d",
8409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									 modelist[nummodes].width,
8419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									 modelist[nummodes].height);
8429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						}
8439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
8449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					for (i=originalnummodes, existingmode = 0 ; i<nummodes ; i++)
8469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
8479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						if ((modelist[nummodes].width == modelist[i].width) &&
8489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							(modelist[nummodes].height == modelist[i].height))
8499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						{
8509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						// pick the lowest available bpp
8519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							if (modelist[nummodes].bpp < modelist[i].bpp)
8529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								modelist[i] = modelist[nummodes];
8539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							existingmode = 1;
8559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							break;
8569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						}
8579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
8589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (!existingmode)
8609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
8619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						if (modelist[nummodes].width < lowestres)
8629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							lowestres = modelist[nummodes].width;
8639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						nummodes++;
8659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
8669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
8679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
8689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modenum++;
8709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		} while (stat);
8719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// see if there are any low-res modes that aren't being reported
8749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	numlowresmodes = sizeof(lowresmodes) / sizeof(lowresmodes[0]);
8759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bpp = 8;
8769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	done = 0;
8779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// first make sure the driver doesn't just answer yes to all tests
8799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	devmode.dmBitsPerPel = 8;
8809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	devmode.dmPelsWidth = 42;
8819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	devmode.dmPelsHeight = 37;
8829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
8839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) ==
8859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			DISP_CHANGE_SUCCESSFUL)
8869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		done = 1;
8889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (!done)
8919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (j=0 ; (j<numlowresmodes) && (nummodes < MAX_MODE_LIST) ; j++)
8939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
8949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			devmode.dmBitsPerPel = bpp;
8959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			devmode.dmPelsWidth = lowresmodes[j].width;
8969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			devmode.dmPelsHeight = lowresmodes[j].height;
8979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
8989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) ==
9009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					DISP_CHANGE_SUCCESSFUL)
9019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
9029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].type = MS_FULLDIB;
9039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].width = devmode.dmPelsWidth;
9049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].height = devmode.dmPelsHeight;
9059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].modenum = 0;
9069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].mode13 = 0;
9079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].stretched = 0;
9089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].halfscreen = 0;
9099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].dib = 1;
9109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].fullscreen = 1;
9119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modelist[nummodes].bpp = devmode.dmBitsPerPel;
9129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					sprintf (modelist[nummodes].modedesc, "%dx%d",
9139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							 devmode.dmPelsWidth, devmode.dmPelsHeight);
9149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// we only want the lowest-bpp version of each mode
9169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				for (i=originalnummodes, existingmode = 0 ; i<nummodes ; i++)
9179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
9189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ((modelist[nummodes].width == modelist[i].width)   &&
9199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						(modelist[nummodes].height == modelist[i].height) &&
9209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						(modelist[nummodes].bpp >= modelist[i].bpp))
9219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
9229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						existingmode = 1;
9239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						break;
9249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
9259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
9269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (!existingmode)
9289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
9299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (modelist[nummodes].width < lowestres)
9309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						lowestres = modelist[nummodes].width;
9319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					nummodes++;
9339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
9349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
9359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		switch (bpp)
9389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
9399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			case 8:
9409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				bpp = 16;
9419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
9429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			case 16:
9449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				bpp = 32;
9459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
9469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			case 32:
9489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				done = 1;
9499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
9509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// now add the lowest stretch-by-2 pseudo-modes between 320-wide
9549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// (inclusive) and lowest real res (not inclusive)
9559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// don't bother if we have a real VGA mode 0x13 mode
9569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!is_mode0x13)
9579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=originalnummodes, cstretch=0 ; i<nummodes ; i++)
9599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
9609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (((modelist[i].width >> 1) < lowestres) &&
9619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				((modelist[i].width >> 1) >= 320))
9629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
9639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				lowestres = modelist[i].width >> 1;
9649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				cstretch = 1;
9659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				mstretch = i;
9669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
9679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if ((nummodes + cstretch) > MAX_MODE_LIST)
9709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cstretch = MAX_MODE_LIST - nummodes;
9719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cstretch > 0)
9739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
9749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (i=(nummodes-1) ; i>=originalnummodes ; i--)
9759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modelist[i+cstretch] = modelist[i];
9769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			nummodes += cstretch;
9789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			istretch = originalnummodes;
9799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modelist[istretch] = modelist[mstretch];
9819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modelist[istretch].width >>= 1;
9829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modelist[istretch].height >>= 1;
9839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modelist[istretch].stretched = 1;
9849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			sprintf (modelist[istretch].modedesc, "%dx%d",
9859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					 modelist[istretch].width, modelist[istretch].height);
9869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (nummodes != originalnummodes)
9909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_default = MODE_FULLSCREEN_DEFAULT;
9919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
9929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_SafePrintf ("No fullscreen DIB modes found\n");
9939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
9989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_NumModes
9999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint VID_NumModes (void)
10029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return nummodes;
10049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_GetModePtr
10109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvmode_t *VID_GetModePtr (int modenum)
10139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((modenum >= 0) && (modenum < nummodes))
10169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return &modelist[modenum];
10179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
10189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return &badmode;
10199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_CheckModedescFixup
10259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_CheckModedescFixup (int mode)
10289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		x, y, stretch;
10309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (mode == MODE_SETTABLE_WINDOW)
10329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modelist[mode].stretched = (int)vid_stretch_by_2.value;
10349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		stretch = modelist[mode].stretched;
10359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_config_x.value < (320 << stretch))
10379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_config_x.value = 320 << stretch;
10389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_config_y.value < (200 << stretch))
10409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_config_y.value = 200 << stretch;
10419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		x = (int)vid_config_x.value;
10439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		y = (int)vid_config_y.value;
10449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf (modelist[mode].modedesc, "%dx%d", x, y);
10459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modelist[mode].width = x;
10469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modelist[mode].height = y;
10479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_GetModeDescriptionMemCheck
10549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *VID_GetModeDescriptionMemCheck (int mode)
10579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		*pinfo;
10599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vmode_t		*pv;
10609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((mode < 0) || (mode >= nummodes))
10629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
10639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_CheckModedescFixup (mode);
10659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pv = VID_GetModePtr (mode);
10679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pinfo = pv->modedesc;
10689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (VID_CheckAdequateMem (pv->width, pv->height))
10709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return pinfo;
10729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
10749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
10769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_GetModeDescription
10839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *VID_GetModeDescription (int mode)
10869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		*pinfo;
10889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vmode_t		*pv;
10899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((mode < 0) || (mode >= nummodes))
10919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
10929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_CheckModedescFixup (mode);
10949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pv = VID_GetModePtr (mode);
10969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pinfo = pv->modedesc;
10979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return pinfo;
10989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
11029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
11039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_GetModeDescription2
11049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamTacks on "windowed" or "fullscreen"
11069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
11079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
11089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *VID_GetModeDescription2 (int mode)
11099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static char	pinfo[40];
11119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vmode_t		*pv;
11129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((mode < 0) || (mode >= nummodes))
11149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
11159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_CheckModedescFixup (mode);
11179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pv = VID_GetModePtr (mode);
11199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (modelist[mode].type == MS_FULLSCREEN)
11219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf(pinfo,"%s fullscreen", pv->modedesc);
11239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (modelist[mode].type == MS_FULLDIB)
11259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf(pinfo,"%s fullscreen", pv->modedesc);
11279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
11299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf(pinfo, "%s windowed", pv->modedesc);
11319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return pinfo;
11349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// KJB: Added this to return the mode driver name in description for console
11389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *VID_GetExtModeDescription (int mode)
11409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static char	pinfo[40];
11429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vmode_t		*pv;
11439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((mode < 0) || (mode >= nummodes))
11459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
11469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_CheckModedescFixup (mode);
11489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pv = VID_GetModePtr (mode);
11509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (modelist[mode].type == MS_FULLSCREEN)
11519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf(pinfo,"%s fullscreen %s",pv->modedesc,
11539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				MGL_modeDriverName(pv->modenum));
11549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (modelist[mode].type == MS_FULLDIB)
11569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf(pinfo,"%s fullscreen DIB", pv->modedesc);
11589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
11609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf(pinfo, "%s windowed", pv->modedesc);
11629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return pinfo;
11659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid DestroyDIBWindow (void)
11699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (modestate == MS_WINDOWED)
11729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// destroy the associated MGL DC's; the window gets reused
11749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (windc)
11759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_destroyDC(windc);
11769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (dibdc)
11779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_destroyDC(dibdc);
11789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		windc = dibdc = NULL;
11799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid DestroyFullscreenWindow (void)
11849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (modestate == MS_FULLSCREEN)
11879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// destroy the existing fullscreen mode and DC's
11899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (mgldc)
11909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_destroyDC (mgldc);
11919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (memdc)
11929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_destroyDC (memdc);
11939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		mgldc = memdc = NULL;
11949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid DestroyFullDIBWindow (void)
12009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (modestate == MS_FULLDIB)
12029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ChangeDisplaySettings (NULL, CDS_FULLSCREEN);
12049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Destroy the fullscreen DIB window and associated MGL DC's
12069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (windc)
12079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_destroyDC(windc);
12089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (dibdc)
12099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_destroyDC(dibdc);
12109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		windc = dibdc = NULL;
12119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
12139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean VID_SetWindowedMode (int modenum)
12169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	HDC				hdc;
12189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pixel_format_t	pf;
12199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean		stretched;
12209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				lastmodestate;
12219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	LONG			wlong;
12229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!windowed_mode_set)
12249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (COM_CheckParm ("-resetwinpos"))
12269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
12279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_SetValue ("vid_window_x", 0.0);
12289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_SetValue ("vid_window_y", 0.0);
12299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
12309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		windowed_mode_set;
12329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_CheckModedescFixup (modenum);
12359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DDActive = 0;
12379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lastmodestate = modestate;
12389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DestroyFullscreenWindow ();
12409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DestroyFullDIBWindow ();
12419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (windc)
12439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_destroyDC(windc);
12449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (dibdc)
12459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_destroyDC(dibdc);
12469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	windc = dibdc = NULL;
12479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// KJB: Signal to the MGL that we are going back to windowed mode
12499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!MGL_changeDisplayMode(grWINDOWED))
12509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		initFatalError();
12519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WindowRect.top = WindowRect.left = 0;
12539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WindowRect.right = modelist[modenum].width;
12559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WindowRect.bottom = modelist[modenum].height;
12569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	stretched = modelist[modenum].stretched;
12579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DIBWidth = modelist[modenum].width;
12599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DIBHeight = modelist[modenum].height;
12609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (stretched)
12629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		DIBWidth >>= 1;
12649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		DIBHeight >>= 1;
12659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WindowStyle = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU |
12689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CLIPSIBLINGS |
12699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  WS_CLIPCHILDREN;
12709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ExWindowStyle = 0;
12719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	AdjustWindowRectEx(&WindowRect, WindowStyle, FALSE, 0);
12729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// the first time we're called to set the mode, create the window we'll use
12749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// for the rest of the session
12759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!vid_mode_set)
12769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		mainwindow = CreateWindowEx (
12789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 ExWindowStyle,
12799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 "WinQuake",
12809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 "WinQuake",
12819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 WindowStyle,
12829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 0, 0,
12839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 WindowRect.right - WindowRect.left,
12849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 WindowRect.bottom - WindowRect.top,
12859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 NULL,
12869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 NULL,
12879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 global_hInstance,
12889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			 NULL);
12899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!mainwindow)
12919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("Couldn't create DIB window");
12929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// tell MGL to use this window for fullscreen modes
12949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_registerFullScreenWindow (mainwindow);
12959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_mode_set = true;
12979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
12999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
13009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SetWindowLong(mainwindow, GWL_STYLE, WindowStyle | WS_VISIBLE);
13019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SetWindowLong(mainwindow, GWL_EXSTYLE, ExWindowStyle);
13029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
13039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!SetWindowPos (mainwindow,
13059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   NULL,
13069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   0, 0,
13079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   WindowRect.right - WindowRect.left,
13089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   WindowRect.bottom - WindowRect.top,
13099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   SWP_NOCOPYBITS | SWP_NOZORDER |
13109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						SWP_HIDEWINDOW))
13119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
13129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Couldn't resize DIB window");
13139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
13149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (hide_window)
13169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return true;
13179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// position and show the DIB window
13199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_CheckWindowXY ();
13209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SetWindowPos (mainwindow, NULL, (int)vid_window_x.value,
13219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  (int)vid_window_y.value, 0, 0,
13229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW | SWP_DRAWFRAME);
13239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (force_minimized)
13259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ShowWindow (mainwindow, SW_MINIMIZE);
13269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
13279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ShowWindow (mainwindow, SW_SHOWDEFAULT);
13289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	UpdateWindow (mainwindow);
13309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modestate = MS_WINDOWED;
13329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_fulldib_on_focus_mode = 0;
13339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// because we have set the background brush for the window to NULL
13359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// (to avoid flickering when re-sizing the window on the desktop),
13369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// we clear the window to black when created, otherwise it will be
13379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// empty while Quake starts up.
13389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hdc = GetDC(mainwindow);
13399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	PatBlt(hdc,0,0,WindowRect.right,WindowRect.bottom,BLACKNESS);
13409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ReleaseDC(mainwindow, hdc);
13419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	/* Create the MGL window DC and the MGL memory DC */
13439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((windc = MGL_createWindowedDC(mainwindow)) == NULL)
13449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_fatalError("Unable to create Windowed DC!");
13459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((dibdc = MGL_createMemoryDC(DIBWidth,DIBHeight,8,&pf)) == NULL)
13479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_fatalError("Unable to create Memory DC!");
13489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_makeCurrentDC(dibdc);
13509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.buffer = vid.conbuffer = vid.direct = dibdc->surface;
13529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.rowbytes = vid.conrowbytes = dibdc->mi.bytesPerLine;
13539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.numpages = 1;
13549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.maxwarpwidth = WARP_WIDTH;
13559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.maxwarpheight = WARP_HEIGHT;
13569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.height = vid.conheight = DIBHeight;
13579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.width = vid.conwidth = DIBWidth;
13589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.aspect = ((float)vid.height / (float)vid.width) *
13599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(320.0 / 240.0);
13609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_stretched = stretched;
13629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SendMessage (mainwindow, WM_SETICON, (WPARAM)TRUE, (LPARAM)hIcon);
13649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SendMessage (mainwindow, WM_SETICON, (WPARAM)FALSE, (LPARAM)hIcon);
13659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return true;
13679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
13689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean VID_SetFullscreenMode (int modenum)
13719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DDActive = 1;
13749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DestroyDIBWindow ();
13769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DestroyFullDIBWindow ();
13779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	mode = modelist[modenum].modenum;
13799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Destroy old DC's, resetting back to fullscreen mode
13819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (mgldc)
13829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_destroyDC (mgldc);
13839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (memdc)
13849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_destroyDC (memdc);
13859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	mgldc = memdc = NULL;
13869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((mgldc = createDisplayDC (modelist[modenum].stretched ||
13889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		 (int)vid_nopageflip.value)) == NULL)
13899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
13909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return false;
13919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
13929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modestate = MS_FULLSCREEN;
13949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_fulldib_on_focus_mode = 0;
13959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.buffer = vid.conbuffer = vid.direct = NULL;
13979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.maxwarpwidth = WARP_WIDTH;
13989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.maxwarpheight = WARP_HEIGHT;
13999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DIBHeight = vid.height = vid.conheight = modelist[modenum].height;
14009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DIBWidth = vid.width = vid.conwidth = modelist[modenum].width;
14019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.aspect = ((float)vid.height / (float)vid.width) *
14029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(320.0 / 240.0);
14039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_stretched = modelist[modenum].stretched;
14059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// needed because we're not getting WM_MOVE messages fullscreen on NT
14079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_x = 0;
14089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_y = 0;
14099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// set the large icon, so the Quake icon will show up in the taskbar
14119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SendMessage (mainwindow, WM_SETICON, (WPARAM)1, (LPARAM)hIcon);
14129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SendMessage (mainwindow, WM_SETICON, (WPARAM)0, (LPARAM)hIcon);
14139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// shouldn't be needed, but Kendall needs to let us get the activation
14159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// message for this not to be needed on NT
14169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	AppActivate (true, false);
14179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return true;
14199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
14209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean VID_SetFullDIBMode (int modenum)
14239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
14249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	HDC				hdc;
14259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pixel_format_t	pf;
14269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				lastmodestate;
14279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DDActive = 0;
14299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DestroyFullscreenWindow ();
14319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DestroyDIBWindow ();
14329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (windc)
14349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_destroyDC(windc);
14359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (dibdc)
14369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_destroyDC(dibdc);
14379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	windc = dibdc = NULL;
14389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// KJB: Signal to the MGL that we are going back to windowed mode
14409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!MGL_changeDisplayMode(grWINDOWED))
14419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		initFatalError();
14429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gdevmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
14449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gdevmode.dmBitsPerPel = modelist[modenum].bpp;
14459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gdevmode.dmPelsWidth = modelist[modenum].width << modelist[modenum].stretched <<
14469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						   modelist[modenum].halfscreen;
14479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gdevmode.dmPelsHeight = modelist[modenum].height << modelist[modenum].stretched;
14489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gdevmode.dmSize = sizeof (gdevmode);
14499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
14519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Couldn't set fullscreen DIB mode");
14529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lastmodestate = modestate;
14549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modestate = MS_FULLDIB;
14559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_fulldib_on_focus_mode = modenum;
14569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WindowRect.top = WindowRect.left = 0;
14589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hdc = GetDC(NULL);
14609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WindowRect.right = modelist[modenum].width << modelist[modenum].stretched;
14629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WindowRect.bottom = modelist[modenum].height << modelist[modenum].stretched;
14639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ReleaseDC(NULL,hdc);
14659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DIBWidth = modelist[modenum].width;
14679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DIBHeight = modelist[modenum].height;
14689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	WindowStyle = WS_POPUP | WS_SYSMENU | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
14709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ExWindowStyle = 0;
14719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	AdjustWindowRectEx(&WindowRect, WindowStyle, FALSE, 0);
14729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SetWindowLong(mainwindow, GWL_STYLE, WindowStyle | WS_VISIBLE);
14749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SetWindowLong(mainwindow, GWL_EXSTYLE, ExWindowStyle);
14759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!SetWindowPos (mainwindow,
14779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   NULL,
14789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   0, 0,
14799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   WindowRect.right - WindowRect.left,
14809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   WindowRect.bottom - WindowRect.top,
14819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   SWP_NOCOPYBITS | SWP_NOZORDER))
14829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
14839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Couldn't resize DIB window");
14849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
14859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// position and show the DIB window
14879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SetWindowPos (mainwindow, HWND_TOPMOST, 0, 0, 0, 0,
14889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  SWP_NOSIZE | SWP_SHOWWINDOW | SWP_DRAWFRAME);
14899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ShowWindow (mainwindow, SW_SHOWDEFAULT);
14909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	UpdateWindow (mainwindow);
14919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Because we have set the background brush for the window to NULL
14939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// (to avoid flickering when re-sizing the window on the desktop), we
14949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// clear the window to black when created, otherwise it will be
14959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// empty while Quake starts up.
14969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hdc = GetDC(mainwindow);
14979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	PatBlt(hdc,0,0,WindowRect.right,WindowRect.bottom,BLACKNESS);
14989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ReleaseDC(mainwindow, hdc);
14999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	/* Create the MGL window DC and the MGL memory DC */
15019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((windc = MGL_createWindowedDC(mainwindow)) == NULL)
15029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_fatalError("Unable to create Fullscreen DIB DC!");
15039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((dibdc = MGL_createMemoryDC(DIBWidth,DIBHeight,8,&pf)) == NULL)
15059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_fatalError("Unable to create Memory DC!");
15069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_makeCurrentDC(dibdc);
15089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.buffer = vid.conbuffer = vid.direct = dibdc->surface;
15109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.rowbytes = vid.conrowbytes = dibdc->mi.bytesPerLine;
15119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.numpages = 1;
15129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.maxwarpwidth = WARP_WIDTH;
15139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.maxwarpheight = WARP_HEIGHT;
15149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.height = vid.conheight = DIBHeight;
15159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.width = vid.conwidth = DIBWidth;
15169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.aspect = ((float)vid.height / (float)vid.width) *
15179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(320.0 / 240.0);
15189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_stretched = modelist[modenum].stretched;
15209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// needed because we're not getting WM_MOVE messages fullscreen on NT
15229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_x = 0;
15239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_y = 0;
15249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return true;
15269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
15279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_RestoreOldMode (int original_mode)
15309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
15319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static qboolean	inerror = false;
15329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (inerror)
15349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
15359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	in_mode_set = false;
15379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	inerror = true;
15389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// make sure mode set happens (video mode changes)
15409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_modenum = original_mode - 1;
15419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!VID_SetMode (original_mode, vid_curpal))
15439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
15449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_modenum = MODE_WINDOWED - 1;
15459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!VID_SetMode (windowed_default, vid_curpal))
15479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("Can't set any video mode");
15489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
15499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	inerror = false;
15519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
15529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_SetDefaultMode (void)
15559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
15569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_initialized)
15589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_SetMode (0, vid_curpal);
15599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	IN_DeactivateMouse ();
15619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
15629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint VID_SetMode (int modenum, unsigned char *palette)
15659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
15669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				original_mode, temp, dummy;
15679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean		stat;
15689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    MSG				msg;
15699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	HDC				hdc;
15709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while ((modenum >= nummodes) || (modenum < 0))
15729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
15739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_modenum == NO_MODE)
15749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
15759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (modenum == vid_default)
15769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
15779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modenum = windowed_default;
15789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
15799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
15809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
15819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modenum = vid_default;
15829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
15839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_SetValue ("vid_mode", (float)modenum);
15859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
15869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
15879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
15889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_SetValue ("vid_mode", (float)vid_modenum);
15899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 0;
15909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
15919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
15929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!force_mode_set && (modenum == vid_modenum))
15949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return true;
15959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// so Con_Printfs don't mess us up by forcing vid and snd updates
15979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	temp = scr_disabled_for_loading;
15989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	scr_disabled_for_loading = true;
15999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	in_mode_set = true;
16009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CDAudio_Pause ();
16029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_ClearBuffer ();
16039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_modenum == NO_MODE)
16059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		original_mode = windowed_default;
16069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
16079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		original_mode = vid_modenum;
16089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Set either the fullscreen or windowed mode
16109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (modelist[modenum].type == MS_WINDOWED)
16119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
16129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (_windowed_mouse.value)
16139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
16149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			stat = VID_SetWindowedMode(modenum);
16159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			IN_ActivateMouse ();
16169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			IN_HideMouse ();
16179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
16189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
16199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
16209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			IN_DeactivateMouse ();
16219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			IN_ShowMouse ();
16229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			stat = VID_SetWindowedMode(modenum);
16239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
16249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
16259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (modelist[modenum].type == MS_FULLDIB)
16269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
16279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		stat = VID_SetFullDIBMode(modenum);
16289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		IN_ActivateMouse ();
16299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		IN_HideMouse ();
16309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
16319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
16329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
16339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		stat = VID_SetFullscreenMode(modenum);
16349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		IN_ActivateMouse ();
16359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		IN_HideMouse ();
16369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
16379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_width = vid.width << vid_stretched;
16399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	window_height = vid.height << vid_stretched;
16409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_UpdateWindowStatus ();
16419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CDAudio_Resume ();
16439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	scr_disabled_for_loading = temp;
16449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!stat)
16469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
16479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_RestoreOldMode (original_mode);
16489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return false;
16499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
16509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (hide_window)
16529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return true;
16539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// now we try to make sure we get the focus on the mode switch, because
16559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// sometimes in some systems we don't.  We grab the foreground, then
16569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// finish setting up, pump all our messages, and sleep for a little while
16579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// to let messages finish bouncing around the system, then we put
16589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// ourselves at the top of the z order, then grab the foreground again,
16599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// Who knows if it helps, but it probably doesn't hurt
16609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!force_minimized)
16619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SetForegroundWindow (mainwindow);
16629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hdc = GetDC(NULL);
16649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
16669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_palettized = true;
16679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
16689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_palettized = false;
16699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_SetPalette (palette);
16719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ReleaseDC(NULL,hdc);
16739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_modenum = modenum;
16759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_SetValue ("vid_mode", (float)vid_modenum);
16769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!VID_AllocBuffers (vid.width, vid.height))
16789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
16799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// couldn't get memory for this mode; try to fall back to previous mode
16809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_RestoreOldMode (original_mode);
16819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return false;
16829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
16839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	D_InitCaches (vid_surfcache, vid_surfcachesize);
16859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
16879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
16889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream      	TranslateMessage (&msg);
16899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream      	DispatchMessage (&msg);
16909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
16919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sleep (100);
16939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!force_minimized)
16959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
16969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0,
16979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW |
16989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  SWP_NOCOPYBITS);
16999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SetForegroundWindow (mainwindow);
17019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
17029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fix the leftover Alt from any Alt-Tab or the like that switched us away
17049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ClearAllStates ();
17059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!msg_suppress_1)
17079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_SafePrintf ("%s\n", VID_GetModeDescription (vid_modenum));
17089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_SetPalette (palette);
17109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	in_mode_set = false;
17129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.recalc_refdef = 1;
17139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return true;
17159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
17169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_LockBuffer (void)
17189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
17199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (dibdc)
17219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
17229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lockcount++;
17249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (lockcount > 1)
17269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
17279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_beginDirectAccess();
17299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (memdc)
17319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
17329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// Update surface pointer for linear access modes
17339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid.buffer = vid.conbuffer = vid.direct = memdc->surface;
17349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid.rowbytes = vid.conrowbytes = memdc->mi.bytesPerLine;
17359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
17369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (mgldc)
17379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
17389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// Update surface pointer for linear access modes
17399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid.buffer = vid.conbuffer = vid.direct = mgldc->surface;
17409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid.rowbytes = vid.conrowbytes = mgldc->mi.bytesPerLine;
17419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
17429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_dowarp)
17449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		d_viewbuffer = r_warpbuffer;
17459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
17469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		d_viewbuffer = (void *)(byte *)vid.buffer;
17479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_dowarp)
17499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		screenwidth = WARP_WIDTH;
17509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
17519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		screenwidth = vid.rowbytes;
17529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (lcd_x.value)
17549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		screenwidth <<= 1;
17559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
17569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_UnlockBuffer (void)
17599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
17609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (dibdc)
17619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
17629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lockcount--;
17649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (lockcount > 0)
17669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
17679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (lockcount < 0)
17699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Unbalanced unlock");
17709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_endDirectAccess();
17729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// to turn up any unlocked accesses
17749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.buffer = vid.conbuffer = vid.direct = d_viewbuffer = NULL;
17759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
17779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint VID_ForceUnlockedAndReturnState (void)
17809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
17819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int	lk;
17829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!lockcount)
17849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
17859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lk = lockcount;
17879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (dibdc)
17899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
17909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lockcount = 0;
17919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
17929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
17939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
17949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lockcount = 1;
17959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_UnlockBuffer ();
17969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
17979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return lk;
17999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
18009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_ForceLockState (int lk)
18039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
18049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!dibdc && lk)
18069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
18079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lockcount = 0;
18089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_LockBuffer ();
18099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
18109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lockcount = lk;
18129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
18139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid	VID_SetPalette (unsigned char *palette)
18169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
18179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	INT			i;
18189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	palette_t	pal[256];
18199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    HDC			hdc;
18209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!Minimized)
18229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
18239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		palette_changed = true;
18249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// make sure we have the static colors if we're the active app
18269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		hdc = GetDC(NULL);
18279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_palettized && ActiveApp)
18299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
18309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (GetSystemPaletteUse(hdc) == SYSPAL_STATIC)
18319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
18329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// switch to SYSPAL_NOSTATIC and remap the colors
18339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				SetSystemPaletteUse(hdc, SYSPAL_NOSTATIC);
18349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				syscolchg = true;
18359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pal_is_nostatic = true;
18369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
18379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
18389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ReleaseDC(NULL,hdc);
18409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// Translate the palette values to an MGL palette array and
18429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// set the values.
18439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i = 0; i < 256; i++)
18449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
18459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pal[i].red = palette[i*3];
18469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pal[i].green = palette[i*3+1];
18479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pal[i].blue = palette[i*3+2];
18489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
18499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (DDActive)
18519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
18529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!mgldc)
18539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return;
18549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_setPalette(mgldc,pal,256,0);
18569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_realizePalette(mgldc,256,0,false);
18579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (memdc)
18589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				MGL_setPalette(memdc,pal,256,0);
18599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
18609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
18619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
18629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!windc)
18639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return;
18649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_setPalette(windc,pal,256,0);
18669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_realizePalette(windc,256,0,false);
18679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (dibdc)
18689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
18699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				MGL_setPalette(dibdc,pal,256,0);
18709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				MGL_realizePalette(dibdc,256,0,false);
18719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
18729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
18739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
18749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy (vid_curpal, palette, sizeof(vid_curpal));
18769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (syscolchg)
18789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
18799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		PostMessage (HWND_BROADCAST, WM_SYSCOLORCHANGE, (WPARAM)0, (LPARAM)0);
18809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		syscolchg = false;
18819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
18829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
18839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid	VID_ShiftPalette (unsigned char *palette)
18869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
18879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_SetPalette (palette);
18889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
18899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
18929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
18939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_DescribeCurrentMode_f
18949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
18959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
18969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_DescribeCurrentMode_f (void)
18979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
18989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("%s\n", VID_GetExtModeDescription (vid_modenum));
18999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
19009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
19039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_NumModes_f
19059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
19079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_NumModes_f (void)
19089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
19099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (nummodes == 1)
19119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("%d video mode is available\n", nummodes);
19129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
19139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("%d video modes are available\n", nummodes);
19149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
19159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
19189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_DescribeMode_f
19209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
19229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_DescribeMode_f (void)
19239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
19249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		modenum;
19259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modenum = Q_atoi (Cmd_Argv(1));
19279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("%s\n", VID_GetExtModeDescription (modenum));
19299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
19309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
19339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_DescribeModes_f
19359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
19379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_DescribeModes_f (void)
19389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
19399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i, lnummodes;
19409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		*pinfo;
19419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean	na;
19429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vmode_t		*pv;
19439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	na = false;
19459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lnummodes = VID_NumModes ();
19479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<lnummodes ; i++)
19499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
19509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pv = VID_GetModePtr (i);
19519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pinfo = VID_GetExtModeDescription (i);
19529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (VID_CheckAdequateMem (pv->width, pv->height))
19549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("%2d: %s\n", i, pinfo);
19569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
19589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("**: %s\n", pinfo);
19609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			na = true;
19619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
19639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (na)
19659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
19669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("\n[**: not enough system RAM for mode]\n");
19679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
19689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
19699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
19729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_TestMode_f
19749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
19769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_TestMode_f (void)
19779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
19789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		modenum;
19799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double	testduration;
19809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!vid_testingmode)
19829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
19839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modenum = Q_atoi (Cmd_Argv(1));
19849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (VID_SetMode (modenum, vid_curpal))
19869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_testingmode = 1;
19889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			testduration = Q_atof (Cmd_Argv(2));
19899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (testduration == 0)
19909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				testduration = 5.0;
19919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_testendtime = realtime + testduration;
19929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
19949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
19959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
19989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
19999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_Windowed_f
20009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
20019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
20029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_Windowed_f (void)
20039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
20049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_SetMode ((int)vid_windowed_mode.value, vid_curpal);
20069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
20079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
20109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
20119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_Fullscreen_f
20129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
20139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
20149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_Fullscreen_f (void)
20159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
20169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_SetMode ((int)vid_fullscreen_mode.value, vid_curpal);
20189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
20199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
20229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
20239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_Minimize_f
20249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
20259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
20269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_Minimize_f (void)
20279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
20289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// we only support minimizing windows; if you're fullscreen,
20309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// switch to windowed first
20319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (modestate == MS_WINDOWED)
20329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ShowWindow (mainwindow, SW_MINIMIZE);
20339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
20349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
20389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
20399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_ForceMode_f
20409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
20419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
20429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_ForceMode_f (void)
20439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
20449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		modenum;
20459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double	testduration;
20469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!vid_testingmode)
20489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
20499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modenum = Q_atoi (Cmd_Argv(1));
20509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		force_mode_set = 1;
20529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_SetMode (modenum, vid_curpal);
20539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		force_mode_set = 0;
20549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
20569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid	VID_Init (unsigned char *palette)
20599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
20609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i, bestmatch, bestmatchmetric, t, dr, dg, db;
20619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		basenummodes;
20629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*ptmp;
20639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_mode);
20659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_wait);
20669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_nopageflip);
20679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&_vid_wait_override);
20689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&_vid_default_mode);
20699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&_vid_default_mode_win);
20709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_config_x);
20719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_config_y);
20729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_stretch_by_2);
20739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&_windowed_mouse);
20749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_fullscreen_mode);
20759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_windowed_mode);
20769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&block_switch);
20779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_window_x);
20789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&vid_window_y);
20799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_testmode", VID_TestMode_f);
20819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_nummodes", VID_NumModes_f);
20829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_describecurrentmode", VID_DescribeCurrentMode_f);
20839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_describemode", VID_DescribeMode_f);
20849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_describemodes", VID_DescribeModes_f);
20859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_forcemode", VID_ForceMode_f);
20869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_windowed", VID_Windowed_f);
20879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_fullscreen", VID_Fullscreen_f);
20889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("vid_minimize", VID_Minimize_f);
20899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (COM_CheckParm ("-dibonly"))
20919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dibonly = true;
20929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_InitMGLDIB (global_hInstance);
20949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	basenummodes = nummodes;
20969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!dibonly)
20989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_InitMGLFull (global_hInstance);
20999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// if there are no non-windowed modes, or only windowed and mode 0x13, then use
21019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fullscreen DIBs as well
21029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (((nummodes == basenummodes) ||
21039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		 ((nummodes == (basenummodes + 1)) && is_mode0x13)) &&
21049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		!COM_CheckParm ("-nofulldib"))
21059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
21079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_InitFullDIB (global_hInstance);
21089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
21099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.maxwarpwidth = WARP_WIDTH;
21119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.maxwarpheight = WARP_HEIGHT;
21129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.colormap = host_colormap;
21139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
21149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_testingmode = 0;
21159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// GDI doesn't let us remap palette index 0, so we'll remap color
21179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// mappings from that black to another one
21189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bestmatchmetric = 256*256*3;
21199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=1 ; i<256 ; i++)
21219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
21229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dr = palette[0] - palette[i*3];
21239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dg = palette[1] - palette[i*3+1];
21249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		db = palette[2] - palette[i*3+2];
21259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		t = (dr * dr) + (dg * dg) + (db * db);
21279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (t < bestmatchmetric)
21299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
21309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			bestmatchmetric = t;
21319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			bestmatch = i;
21329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (t == 0)
21349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
21359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
21369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
21379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0, ptmp = vid.colormap ; i<(1<<(VID_CBITS+8)) ; i++, ptmp++)
21399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
21409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*ptmp == 0)
21419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*ptmp = bestmatch;
21429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
21439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (COM_CheckParm("-startwindowed"))
21459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
21469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		startwindowed = 1;
21479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_default = windowed_default;
21489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
21499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (hwnd_dialog)
21519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		DestroyWindow (hwnd_dialog);
21529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// sound initialization has to go here, preceded by a windowed mode set,
21549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// so there's a window for DirectSound to work with but we're not yet
21559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fullscreen so the "hardware already in use" dialog is visible if it
21569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// gets displayed
21579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// keep the window minimized until we're ready for the first real mode set
21599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hide_window = true;
21609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_SetMode (MODE_WINDOWED, palette);
21619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hide_window = false;
21629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_Init ();
21639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_initialized = true;
21659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	force_mode_set = true;
21679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_SetMode (vid_default, palette);
21689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	force_mode_set = false;
21699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_realmode = vid_modenum;
21719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_SetPalette (palette);
21739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_menudrawfn = VID_MenuDraw;
21759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_menukeyfn = VID_MenuKey;
21769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (badmode.modedesc, "Bad mode");
21789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
21799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid	VID_Shutdown (void)
21829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
21839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	HDC				hdc;
21849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				dummy;
21859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_initialized)
21879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
21889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (modestate == MS_FULLDIB)
21899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			ChangeDisplaySettings (NULL, CDS_FULLSCREEN);
21909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		PostMessage (HWND_BROADCAST, WM_PALETTECHANGED, (WPARAM)mainwindow, (LPARAM)0);
21929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		PostMessage (HWND_BROADCAST, WM_SYSCOLORCHANGE, (WPARAM)0, (LPARAM)0);
21939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		AppActivate(false, false);
21959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		DestroyDIBWindow ();
21969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		DestroyFullscreenWindow ();
21979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		DestroyFullDIBWindow ();
21989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (hwnd_dialog)
22009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			DestroyWindow (hwnd_dialog);
22019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (mainwindow)
22039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			DestroyWindow(mainwindow);
22049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_exit();
22069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_testingmode = 0;
22089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_initialized = 0;
22099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
22109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
22119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
22149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
22159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFlipScreen
22169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
22179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
22189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid FlipScreen(vrect_t *rects)
22199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
22209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	HRESULT		ddrval;
22219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Flip the surfaces
22239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (DDActive)
22259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
22269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (mgldc)
22279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
22289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (memdc)
22299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
22309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				while (rects)
22319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
22329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (vid_stretched)
22339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
22349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						MGL_stretchBltCoord(mgldc, memdc,
22359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									rects->x,
22369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									rects->y,
22379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									rects->x + rects->width,
22389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									rects->y + rects->height,
22399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									rects->x << 1,
22409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									rects->y << 1,
22419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									(rects->x + rects->width) << 1,
22429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									(rects->y + rects->height) << 1);
22439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
22449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					else
22459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
22469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						MGL_bitBltCoord(mgldc, memdc,
22479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									rects->x, rects->y,
22489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									(rects->x + rects->width),
22499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									(rects->y + rects->height),
22509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									rects->x, rects->y, MGL_REPLACE_MODE);
22519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
22529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					rects = rects->pnext;
22549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
22559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
22569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (vid.numpages > 1)
22589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
22599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// We have a flipping surface, so do a hard page flip
22609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				aPage = (aPage+1) % vid.numpages;
22619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				vPage = (vPage+1) % vid.numpages;
22629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				MGL_setActivePage(mgldc,aPage);
22639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				MGL_setVisualPage(mgldc,vPage,waitVRT);
22649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
22659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
22669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
22679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
22689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
22699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		HDC hdcScreen;
22709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		hdcScreen = GetDC(mainwindow);
22729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (windc && dibdc)
22749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
22759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_setWinDC(windc,hdcScreen);
22769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			while (rects)
22789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
22799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (vid_stretched)
22809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
22819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					MGL_stretchBltCoord(windc,dibdc,
22829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						rects->x, rects->y,
22839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						rects->x + rects->width, rects->y + rects->height,
22849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						rects->x << 1, rects->y << 1,
22859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						(rects->x + rects->width) << 1,
22869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						(rects->y + rects->height) << 1);
22879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
22889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				else
22899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
22909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					MGL_bitBltCoord(windc,dibdc,
22919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						rects->x, rects->y,
22929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						rects->x + rects->width, rects->y + rects->height,
22939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						rects->x, rects->y, MGL_REPLACE_MODE);
22949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
22959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				rects = rects->pnext;
22979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
22989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
22999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ReleaseDC(mainwindow, hdcScreen);
23019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
23029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
23039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid	VID_Update (vrect_t *rects)
23069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
23079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vrect_t	rect;
23089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	RECT	trect;
23099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!vid_palettized && palette_changed)
23119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
23129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		palette_changed = false;
23139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.x = 0;
23149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.y = 0;
23159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.width = vid.width;
23169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.height = vid.height;
23179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.pnext = NULL;
23189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rects = &rect;
23199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
23209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (firstupdate)
23229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
23239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (modestate == MS_WINDOWED)
23249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
23259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			GetWindowRect (mainwindow, &trect);
23269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((trect.left != (int)vid_window_x.value) ||
23289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(trect.top  != (int)vid_window_y.value))
23299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
23309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (COM_CheckParm ("-resetwinpos"))
23319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
23329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					Cvar_SetValue ("vid_window_x", 0.0);
23339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					Cvar_SetValue ("vid_window_y", 0.0);
23349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
23359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				VID_CheckWindowXY ();
23379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				SetWindowPos (mainwindow, NULL, (int)vid_window_x.value,
23389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  (int)vid_window_y.value, 0, 0,
23399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				  SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW | SWP_DRAWFRAME);
23409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
23419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
23429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if ((_vid_default_mode_win.value != vid_default) &&
23449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			(!startwindowed || (_vid_default_mode_win.value < MODE_FULLSCREEN_DEFAULT)))
23459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
23469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			firstupdate = 0;
23479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (COM_CheckParm ("-resetwinpos"))
23499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
23509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Cvar_SetValue ("vid_window_x", 0.0);
23519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Cvar_SetValue ("vid_window_y", 0.0);
23529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
23539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((_vid_default_mode_win.value < 0) ||
23559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(_vid_default_mode_win.value >= nummodes))
23569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
23579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Cvar_SetValue ("_vid_default_mode_win", windowed_default);
23589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
23599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_SetValue ("vid_mode", _vid_default_mode_win.value);
23619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
23629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
23639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// We've drawn the frame; copy it to the screen
23659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FlipScreen (rects);
23669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_testingmode)
23689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
23699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (realtime >= vid_testendtime)
23709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
23719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			VID_SetMode (vid_realmode, vid_curpal);
23729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_testingmode = 0;
23739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
23749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
23759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
23769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
23779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if ((int)vid_mode.value != vid_realmode)
23789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
23799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			VID_SetMode ((int)vid_mode.value, vid_curpal);
23809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_SetValue ("vid_mode", (float)vid_modenum);
23819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								// so if mode set fails, we don't keep on
23829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								//  trying to set that mode
23839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_realmode = vid_modenum;
23849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
23859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
23869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// handle the mouse state when windowed if that's changed
23889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (modestate == MS_WINDOWED)
23899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
23909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if ((int)_windowed_mouse.value != windowed_mouse)
23919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
23929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (_windowed_mouse.value)
23939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
23949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_ActivateMouse ();
23959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_HideMouse ();
23969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
23979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
23989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
23999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_DeactivateMouse ();
24009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_ShowMouse ();
24019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
24029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			windowed_mouse = (int)_windowed_mouse.value;
24049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
24059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
24069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
24079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
24109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
24119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamD_BeginDirectRect
24129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
24139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
24149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height)
24159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
24169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i, j, reps, repshift;
24179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vrect_t	rect;
24189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!vid_initialized)
24209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
24219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid.aspect > 1.5)
24239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
24249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		reps = 2;
24259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		repshift = 1;
24269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
24279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
24289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
24299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		reps = 1;
24309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		repshift = 0;
24319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
24329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid.numpages == 1)
24349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
24359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_LockBuffer ();
24369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!vid.direct)
24389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("NULL vid.direct pointer");
24399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<(height << repshift) ; i += reps)
24419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
24429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<reps ; j++)
24439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
24449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				memcpy (&backingbuf[(i + j) * 24],
24459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						vid.direct + x + ((y << repshift) + i + j) * vid.rowbytes,
24469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						width);
24479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				memcpy (vid.direct + x + ((y << repshift) + i + j) * vid.rowbytes,
24489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						&pbitmap[(i >> repshift) * width],
24499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						width);
24509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
24519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
24529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_UnlockBuffer ();
24549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.x = x;
24569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.y = y;
24579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.width = width;
24589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.height = height << repshift;
24599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.pnext = NULL;
24609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		FlipScreen (&rect);
24629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
24639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
24649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
24659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// unlock if locked
24669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (lockcount > 0)
24679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_endDirectAccess();
24689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// set the active page to the displayed page
24709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_setActivePage (mgldc, vPage);
24719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// lock the screen
24739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_beginDirectAccess ();
24749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// save from and draw to screen
24769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<(height << repshift) ; i += reps)
24779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
24789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<reps ; j++)
24799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
24809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				memcpy (&backingbuf[(i + j) * 24],
24819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						(byte *)mgldc->surface + x +
24829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						 ((y << repshift) + i + j) * mgldc->mi.bytesPerLine,
24839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						width);
24849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				memcpy ((byte *)mgldc->surface + x +
24859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						 ((y << repshift) + i + j) * mgldc->mi.bytesPerLine,
24869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						&pbitmap[(i >> repshift) * width],
24879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						width);
24889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
24899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
24909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// unlock the screen
24929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_endDirectAccess ();
24939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// restore the original active page
24959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_setActivePage (mgldc, aPage);
24969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// relock the screen if it was locked
24989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (lockcount > 0)
24999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_beginDirectAccess();
25009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
25019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
25029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
25059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
25069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamD_EndDirectRect
25079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
25089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
25099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid D_EndDirectRect (int x, int y, int width, int height)
25109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
25119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i, j, reps, repshift;
25129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vrect_t	rect;
25139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!vid_initialized)
25159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
25169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid.aspect > 1.5)
25189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
25199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		reps = 2;
25209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		repshift = 1;
25219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
25229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
25239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
25249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		reps = 1;
25259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		repshift = 0;
25269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
25279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid.numpages == 1)
25299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
25309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_LockBuffer ();
25319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!vid.direct)
25339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("NULL vid.direct pointer");
25349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<(height << repshift) ; i += reps)
25369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
25379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<reps ; j++)
25389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
25399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				memcpy (vid.direct + x + ((y << repshift) + i + j) * vid.rowbytes,
25409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						&backingbuf[(i + j) * 24],
25419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						width);
25429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
25439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
25449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_UnlockBuffer ();
25469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.x = x;
25489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.y = y;
25499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.width = width;
25509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.height = height << repshift;
25519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rect.pnext = NULL;
25529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		FlipScreen (&rect);
25549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
25559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
25569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
25579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// unlock if locked
25589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (lockcount > 0)
25599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_endDirectAccess();
25609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// set the active page to the displayed page
25629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_setActivePage (mgldc, vPage);
25639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// lock the screen
25659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_beginDirectAccess ();
25669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// restore to the screen
25689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<(height << repshift) ; i += reps)
25699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
25709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<reps ; j++)
25719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
25729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				memcpy ((byte *)mgldc->surface + x +
25739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						 ((y << repshift) + i + j) * mgldc->mi.bytesPerLine,
25749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						&backingbuf[(i + j) * 24],
25759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						width);
25769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
25779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
25789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// unlock the screen
25809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_endDirectAccess ();
25819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// restore the original active page
25839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MGL_setActivePage (mgldc, aPage);
25849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// relock the screen if it was locked
25869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (lockcount > 0)
25879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MGL_beginDirectAccess();
25889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
25899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
25909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//==========================================================================
25939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
25949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte        scantokey[128] =
25959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
25969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//  0           1       2       3       4       5       6       7
25979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//  8           9       A       B       C       D       E       F
25989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	0  ,    27,     '1',    '2',    '3',    '4',    '5',    '6',
25999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	'7',    '8',    '9',    '0',    '-',    '=',    K_BACKSPACE, 9, // 0
26009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	'q',    'w',    'e',    'r',    't',    'y',    'u',    'i',
26019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	'o',    'p',    '[',    ']',    13 ,    K_CTRL,'a',  's',      // 1
26029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	'd',    'f',    'g',    'h',    'j',    'k',    'l',    ';',
26039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	'\'' ,    '`',    K_SHIFT,'\\',  'z',    'x',    'c',    'v',      // 2
26049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	'b',    'n',    'm',    ',',    '.',    '/',    K_SHIFT,'*',
26059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	K_ALT,' ',   0  ,    K_F1, K_F2, K_F3, K_F4, K_F5,   // 3
26069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	K_F6, K_F7, K_F8, K_F9, K_F10,  K_PAUSE,    0  , K_HOME,
26079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	K_UPARROW,K_PGUP,'-',K_LEFTARROW,'5',K_RIGHTARROW,'+',K_END, //4
26089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	K_DOWNARROW,K_PGDN,K_INS,K_DEL,0,0,             0,              K_F11,
26099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	K_F12,0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0,        // 5
26109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0,
26119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0,        // 6
26129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0,
26139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0  ,    0         // 7
26149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream};
26159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
26179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=======
26189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMapKey
26199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMap from windows to quake keynums
26219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=======
26229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
26239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint MapKey (int key)
26249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
26259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	key = (key>>16)&255;
26269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (key > 127)
26279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
26289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return scantokey[key];
26309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
26319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid AppActivate(BOOL fActive, BOOL minimize)
26339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/****************************************************************************
26349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*
26359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream* Function:     AppActivate
26369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream* Parameters:   fActive - True if app is activating
26379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*
26389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream* Description:  If the application is activating, then swap the system
26399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*               into SYSPAL_NOSTATIC mode so that our palettes will display
26409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*               correctly.
26419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*
26429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream****************************************************************************/
26439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
26449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    HDC			hdc;
26459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    int			i, t;
26469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static BOOL	sound_active;
26479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ActiveApp = fActive;
26499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// messy, but it seems to work
26519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_fulldib_on_focus_mode)
26529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
26539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Minimized = minimize;
26549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (Minimized)
26569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			ActiveApp = false;
26579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
26589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MGL_appActivate(windc, ActiveApp);
26609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_initialized)
26629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
26639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// yield the palette if we're losing the focus
26649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		hdc = GetDC(NULL);
26659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
26679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
26689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (ActiveApp)
26699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
26709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if ((modestate == MS_WINDOWED) || (modestate == MS_FULLDIB))
26719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
26729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (GetSystemPaletteUse(hdc) == SYSPAL_STATIC)
26739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
26749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					// switch to SYSPAL_NOSTATIC and remap the colors
26759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						SetSystemPaletteUse(hdc, SYSPAL_NOSTATIC);
26769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						syscolchg = true;
26779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						pal_is_nostatic = true;
26789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
26799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
26809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
26819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if (pal_is_nostatic)
26829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
26839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (GetSystemPaletteUse(hdc) == SYSPAL_NOSTATIC)
26849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
26859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// switch back to SYSPAL_STATIC and the old mapping
26869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					SetSystemPaletteUse(hdc, SYSPAL_STATIC);
26879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					syscolchg = true;
26889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
26899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pal_is_nostatic = false;
26919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
26929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
26939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!Minimized)
26959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			VID_SetPalette (vid_curpal);
26969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		scr_fullupdate = 0;
26989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
26999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ReleaseDC(NULL,hdc);
27009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
27019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// enable/disable sound on focus gain/loss
27039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!ActiveApp && sound_active)
27049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
27059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_BlockSound ();
27069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_ClearBuffer ();
27079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sound_active = false;
27089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
27099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (ActiveApp && !sound_active)
27109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
27119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_UnblockSound ();
27129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_ClearBuffer ();
27139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sound_active = true;
27149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
27159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// minimize/restore fulldib windows/mouse-capture normal windows on demand
27179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!in_mode_set)
27189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
27199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (ActiveApp)
27209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
27219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (vid_fulldib_on_focus_mode)
27229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
27239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (vid_initialized)
27249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
27259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					msg_suppress_1 = true;	// don't want to see normal mode set message
27269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VID_SetMode (vid_fulldib_on_focus_mode, vid_curpal);
27279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					msg_suppress_1 = false;
27289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					t = in_mode_set;
27309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					in_mode_set = true;
27319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					AppActivate (true, false);
27329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					in_mode_set = t;
27339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
27349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_ActivateMouse ();
27369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_HideMouse ();
27379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
27389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if ((modestate == MS_WINDOWED) && _windowed_mouse.value)
27399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
27409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_ActivateMouse ();
27419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_HideMouse ();
27429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
27439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
27449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!ActiveApp)
27469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
27479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (modestate == MS_FULLDIB)
27489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
27499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (vid_initialized)
27509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
27519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					force_minimized = true;
27529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					i = vid_fulldib_on_focus_mode;
27539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					msg_suppress_1 = true;	// don't want to see normal mode set message
27549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VID_SetMode (windowed_default, vid_curpal);
27559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					msg_suppress_1 = false;
27569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					vid_fulldib_on_focus_mode = i;
27579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					force_minimized = false;
27589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// we never seem to get WM_ACTIVATE inactive from this mode set, so we'll
27609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// do it manually
27619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					t = in_mode_set;
27629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					in_mode_set = true;
27639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					AppActivate (false, true);
27649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					in_mode_set = t;
27659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
27669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_DeactivateMouse ();
27689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_ShowMouse ();
27699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
27709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if ((modestate == MS_WINDOWED) && _windowed_mouse.value)
27719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
27729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_DeactivateMouse ();
27739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_ShowMouse ();
27749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
27759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
27769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
27779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
27789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
27819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
27829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_HandlePause
27839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
27849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
27859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_HandlePause (qboolean pause)
27869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
27879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
27889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((modestate == MS_WINDOWED) && _windowed_mouse.value)
27899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
27909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (pause)
27919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
27929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			IN_DeactivateMouse ();
27939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			IN_ShowMouse ();
27949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
27959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
27969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
27979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			IN_ActivateMouse ();
27989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			IN_HideMouse ();
27999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
28009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
28019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
28029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
28059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===================================================================
28069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMAIN WINDOW
28089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===================================================================
28109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
28119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
28139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/* main window procedure */
28159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLONG WINAPI MainWndProc (
28169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    HWND    hWnd,
28179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    UINT    uMsg,
28189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    WPARAM  wParam,
28199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    LPARAM  lParam)
28209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
28219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	LONG			lRet = 0;
28229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				fwKeys, xPos, yPos, fActive, fMinimized, temp;
28239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	HDC				hdc;
28249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	PAINTSTRUCT		ps;
28259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static int		recursiveflag;
28269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	switch (uMsg)
28289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
28299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_CREATE:
28309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
28319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_SYSCOMMAND:
28339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// Check for maximize being hit
28359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			switch (wParam & ~0x0F)
28369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
28379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				case SC_MAXIMIZE:
28389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// if minimized, bring up as a window before going fullscreen,
28399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// so MGL will have the right state to restore
28409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (Minimized)
28419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
28429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						force_mode_set = true;
28439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						VID_SetMode (vid_modenum, vid_curpal);
28449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						force_mode_set = false;
28459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
28469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VID_SetMode ((int)vid_fullscreen_mode.value, vid_curpal);
28489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					break;
28499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream                case SC_SCREENSAVE:
28519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream                case SC_MONITORPOWER:
28529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (modestate != MS_WINDOWED)
28539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
28549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					// don't call DefWindowProc() because we don't want to start
28559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					// the screen saver fullscreen
28569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						break;
28579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
28589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// fall through windowed and allow the screen saver to start
28609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				default:
28629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (!in_mode_set)
28639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
28649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						S_BlockSound ();
28659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						S_ClearBuffer ();
28669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
28679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
28699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (!in_mode_set)
28719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
28729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						S_UnblockSound ();
28739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
28749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
28759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
28769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_MOVE:
28789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			window_x = (int) LOWORD(lParam);
28799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			window_y = (int) HIWORD(lParam);
28809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			VID_UpdateWindowStatus ();
28819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((modestate == MS_WINDOWED) && !in_mode_set && !Minimized)
28839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				VID_RememberWindowPos ();
28849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
28869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_SIZE:
28889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Minimized = false;
28899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!(wParam & SIZE_RESTORED))
28919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
28929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (wParam & SIZE_MINIMIZED)
28939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					Minimized = true;
28949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
28959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
28969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
28979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_SYSCHAR:
28989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// keep Alt-Space from happening
28999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
29009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_ACTIVATE:
29029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			fActive = LOWORD(wParam);
29039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			fMinimized = (BOOL) HIWORD(wParam);
29049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			AppActivate(!(fActive == WA_INACTIVE), fMinimized);
29059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// fix the leftover Alt from any Alt-Tab or the like that switched us away
29079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			ClearAllStates ();
29089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!in_mode_set)
29109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
29119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (windc)
29129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					MGL_activatePalette(windc,true);
29139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				VID_SetPalette(vid_curpal);
29159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
29169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
29189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_PAINT:
29209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			hdc = BeginPaint(hWnd, &ps);
29219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!in_mode_set && host_initialized)
29239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				SCR_UpdateWholeScreen ();
29249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			EndPaint(hWnd, &ps);
29269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
29279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_KEYDOWN:
29299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_SYSKEYDOWN:
29309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!in_mode_set)
29319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Key_Event (MapKey(lParam), true);
29329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
29339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_KEYUP:
29359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_SYSKEYUP:
29369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!in_mode_set)
29379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Key_Event (MapKey(lParam), false);
29389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
29399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// this is complicated because Win32 seems to pack multiple mouse events into
29419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// one update sometimes, so we always check all states and look for events
29429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_LBUTTONDOWN:
29439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_LBUTTONUP:
29449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_RBUTTONDOWN:
29459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_RBUTTONUP:
29469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_MBUTTONDOWN:
29479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_MBUTTONUP:
29489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_MOUSEMOVE:
29499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!in_mode_set)
29509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
29519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				temp = 0;
29529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (wParam & MK_LBUTTON)
29549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					temp |= 1;
29559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (wParam & MK_RBUTTON)
29579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					temp |= 2;
29589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (wParam & MK_MBUTTON)
29609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					temp |= 4;
29619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				IN_MouseEvent (temp);
29639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
29649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
29659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// JACK: This is the mouse wheel with the Intellimouse
29679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// Its delta is either positive or neg, and we generate the proper
29689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// Event.
29699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_MOUSEWHEEL:
29709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((short) HIWORD(wParam) > 0) {
29719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Key_Event(K_MWHEELUP, true);
29729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Key_Event(K_MWHEELUP, false);
29739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			} else {
29749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Key_Event(K_MWHEELDOWN, true);
29759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Key_Event(K_MWHEELDOWN, false);
29769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
29779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
29789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// KJB: Added these new palette functions
29799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_PALETTECHANGED:
29809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((HWND)wParam == hWnd)
29819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
29829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			/* Fall through to WM_QUERYNEWPALETTE */
29839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_QUERYNEWPALETTE:
29849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			hdc = GetDC(NULL);
29859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
29879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				vid_palettized = true;
29889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
29899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				vid_palettized = false;
29909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			ReleaseDC(NULL,hdc);
29929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			scr_fullupdate = 0;
29949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
29959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (vid_initialized && !in_mode_set && windc && MGL_activatePalette(windc,false) && !Minimized)
29969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
29979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				VID_SetPalette (vid_curpal);
29989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				InvalidateRect (mainwindow, NULL, false);
29999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// specifically required if WM_QUERYNEWPALETTE realizes a new palette
30019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				lRet = TRUE;
30029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
30039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
30049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case WM_DISPLAYCHANGE:
30069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!in_mode_set && (modestate == MS_WINDOWED) && !vid_fulldib_on_focus_mode)
30079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
30089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				force_mode_set = true;
30099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				VID_SetMode (vid_modenum, vid_curpal);
30109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				force_mode_set = false;
30119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
30129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
30139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream   	    case WM_CLOSE:
30159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// this causes Close in the right-click task bar menu not to work, but right
30169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// now bad things happen if Close is handled in that case (garbage and a
30179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// crash on Win95)
30189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!in_mode_set)
30199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
30209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit",
30219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES)
30229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
30239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					Sys_Quit ();
30249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
30259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
30269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
30279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case MM_MCINOTIFY:
30299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream            lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam);
30309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
30319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		default:
30339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream            /* pass all unhandled messages to DefWindowProc */
30349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream            lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
30359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	        break;
30369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
30379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    /* return 0 if handled message, 1 if not */
30399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    return lRet;
30409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
30419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void M_Menu_Options_f (void);
30449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void M_Print (int cx, int cy, char *str);
30459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void M_PrintWhite (int cx, int cy, char *str);
30469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void M_DrawCharacter (int cx, int line, int num);
30479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void M_DrawTransPic (int x, int y, qpic_t *pic);
30489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void M_DrawPic (int x, int y, qpic_t *pic);
30499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int	vid_line, vid_wmodes;
30519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct
30539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
30549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		modenum;
30559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*desc;
30569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		iscur;
30579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		ismode13;
30589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		width;
30599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} modedesc_t;
30609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define MAX_COLUMN_SIZE		5
30629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define MODE_AREA_HEIGHT	(MAX_COLUMN_SIZE + 6)
30639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define MAX_MODEDESCS		(MAX_COLUMN_SIZE*3)
30649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic modedesc_t	modedescs[MAX_MODEDESCS];
30669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
30689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
30699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_MenuDraw
30709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
30719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
30729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_MenuDraw (void)
30739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
30749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qpic_t		*p;
30759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		*ptr;
30769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			lnummodes, i, j, k, column, row, dup, dupmode;
30779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		temp[100];
30789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vmode_t		*pv;
30799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	modedesc_t	tmodedesc;
30809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	p = Draw_CachePic ("gfx/vidmodes.lmp");
30829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	M_DrawPic ( (320-p->width)/2, 4, p);
30839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<3 ; i++)
30859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
30869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ptr = VID_GetModeDescriptionMemCheck (i);
30879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modedescs[i].modenum = modelist[i].modenum;
30889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modedescs[i].desc = ptr;
30899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modedescs[i].ismode13 = 0;
30909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modedescs[i].iscur = 0;
30919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_modenum == i)
30939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			modedescs[i].iscur = 1;
30949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
30959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vid_wmodes = 3;
30979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lnummodes = VID_NumModes ();
30989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
30999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=3 ; i<lnummodes ; i++)
31009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
31019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ptr = VID_GetModeDescriptionMemCheck (i);
31029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pv = VID_GetModePtr (i);
31039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// we only have room for 15 fullscreen modes, so don't allow
31059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// 360-wide modes, because if there are 5 320-wide modes and
31069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// 5 360-wide modes, we'll run out of space
31079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (ptr && ((pv->width != 360) || COM_CheckParm("-allow360")))
31089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
31099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			dup = 0;
31109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=3 ; j<vid_wmodes ; j++)
31129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
31139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (!strcmp (modedescs[j].desc, ptr))
31149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
31159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					dup = 1;
31169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					dupmode = j;
31179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					break;
31189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
31199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
31209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (dup || (vid_wmodes < MAX_MODEDESCS))
31229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
31239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (!dup || !modedescs[dupmode].ismode13 || COM_CheckParm("-noforcevga"))
31249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
31259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (dup)
31269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
31279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						k = dupmode;
31289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
31299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					else
31309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					{
31319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						k = vid_wmodes;
31329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					}
31339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modedescs[k].modenum = i;
31359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modedescs[k].desc = ptr;
31369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modedescs[k].ismode13 = pv->mode13;
31379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modedescs[k].iscur = 0;
31389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					modedescs[k].width = pv->width;
31399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (i == vid_modenum)
31419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						modedescs[k].iscur = 1;
31429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (!dup)
31449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						vid_wmodes++;
31459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
31469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
31479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
31489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
31499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// sort the modes on width (to handle picking up oddball dibonly modes
31519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// after all the others)
31529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=3 ; i<(vid_wmodes-1) ; i++)
31539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
31549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (j=(i+1) ; j<vid_wmodes ; j++)
31559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
31569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (modedescs[i].width > modedescs[j].width)
31579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
31589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				tmodedesc = modedescs[i];
31599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modedescs[i] = modedescs[j];
31609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modedescs[j] = tmodedesc;
31619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
31629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
31639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
31649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	M_Print (13*8, 36, "Windowed Modes");
31679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	column = 16;
31699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	row = 36+2*8;
31709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<3; i++)
31729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
31739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (modedescs[i].iscur)
31749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			M_PrintWhite (column, row, modedescs[i].desc);
31759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
31769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			M_Print (column, row, modedescs[i].desc);
31779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		column += 13*8;
31799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
31809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_wmodes > 3)
31829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
31839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_Print (12*8, 36+4*8, "Fullscreen Modes");
31849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		column = 16;
31869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		row = 36+6*8;
31879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=3 ; i<vid_wmodes ; i++)
31899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
31909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (modedescs[i].iscur)
31919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				M_PrintWhite (column, row, modedescs[i].desc);
31929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
31939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				M_Print (column, row, modedescs[i].desc);
31949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			column += 13*8;
31969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
31979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (((i - 3) % VID_ROW_SIZE) == (VID_ROW_SIZE - 1))
31989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
31999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				column = 16;
32009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				row += 8;
32019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
32029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
32039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
32049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// line cursor
32069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_testingmode)
32079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
32089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf (temp, "TESTING %s",
32099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				modedescs[vid_line].desc);
32109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_Print (13*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4, temp);
32119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_Print (9*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6,
32129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				"Please wait 5 seconds...");
32139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
32149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
32159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
32169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_Print (9*8, 36 + MODE_AREA_HEIGHT * 8 + 8,
32179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				"Press Enter to set mode");
32189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_Print (6*8, 36 + MODE_AREA_HEIGHT * 8 + 8*3,
32199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				"T to test mode for 5 seconds");
32209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ptr = VID_GetModeDescription2 (vid_modenum);
32219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (ptr)
32239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
32249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			sprintf (temp, "D to set default: %s", ptr);
32259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			M_Print (2*8, 36 + MODE_AREA_HEIGHT * 8 + 8*5, temp);
32269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
32279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ptr = VID_GetModeDescription2 ((int)_vid_default_mode_win.value);
32299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (ptr)
32319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
32329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			sprintf (temp, "Current default: %s", ptr);
32339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6, temp);
32349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
32359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_Print (15*8, 36 + MODE_AREA_HEIGHT * 8 + 8*8,
32379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				"Esc to exit");
32389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		row = 36 + 2*8 + (vid_line / VID_ROW_SIZE) * 8;
32409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		column = 8 + (vid_line % VID_ROW_SIZE) * 13*8;
32419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_line >= 3)
32439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			row += 3*8;
32449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_DrawCharacter (column, row, 12+((int)(realtime*4)&1));
32469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
32479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
32489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
32519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
32529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamVID_MenuKey
32539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
32549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
32559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VID_MenuKey (int key)
32569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
32579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (vid_testingmode)
32589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
32599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	switch (key)
32619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
32629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case K_ESCAPE:
32639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_LocalSound ("misc/menu1.wav");
32649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_Menu_Options_f ();
32659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
32669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case K_LEFTARROW:
32689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_LocalSound ("misc/menu1.wav");
32699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_line = ((vid_line / VID_ROW_SIZE) * VID_ROW_SIZE) +
32709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				   ((vid_line + 2) % VID_ROW_SIZE);
32719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_line >= vid_wmodes)
32739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_line = vid_wmodes - 1;
32749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
32759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case K_RIGHTARROW:
32779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_LocalSound ("misc/menu1.wav");
32789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_line = ((vid_line / VID_ROW_SIZE) * VID_ROW_SIZE) +
32799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				   ((vid_line + 4) % VID_ROW_SIZE);
32809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_line >= vid_wmodes)
32829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_line = (vid_line / VID_ROW_SIZE) * VID_ROW_SIZE;
32839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
32849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case K_UPARROW:
32869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_LocalSound ("misc/menu1.wav");
32879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_line -= VID_ROW_SIZE;
32889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_line < 0)
32909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
32919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_line += ((vid_wmodes + (VID_ROW_SIZE - 1)) /
32929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VID_ROW_SIZE) * VID_ROW_SIZE;
32939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			while (vid_line >= vid_wmodes)
32959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				vid_line -= VID_ROW_SIZE;
32969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
32979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
32989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
32999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case K_DOWNARROW:
33009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_LocalSound ("misc/menu1.wav");
33019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_line += VID_ROW_SIZE;
33029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
33039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vid_line >= vid_wmodes)
33049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
33059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_line -= ((vid_wmodes + (VID_ROW_SIZE - 1)) /
33069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VID_ROW_SIZE) * VID_ROW_SIZE;
33079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
33089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			while (vid_line < 0)
33099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				vid_line += VID_ROW_SIZE;
33109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
33119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
33129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
33139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case K_ENTER:
33149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_LocalSound ("misc/menu1.wav");
33159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_SetMode (modedescs[vid_line].modenum, vid_curpal);
33169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
33179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
33189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case 'T':
33199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case 't':
33209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_LocalSound ("misc/menu1.wav");
33219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// have to set this before setting the mode because WM_PAINT
33229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// happens during the mode set and does a VID_Update, which
33239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// checks vid_testingmode
33249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_testingmode = 1;
33259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vid_testendtime = realtime + 5.0;
33269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
33279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!VID_SetMode (modedescs[vid_line].modenum, vid_curpal))
33289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
33299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid_testingmode = 0;
33309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
33319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
33329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
33339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case 'D':
33349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	case 'd':
33359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_LocalSound ("misc/menu1.wav");
33369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		firstupdate = 0;
33379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Cvar_SetValue ("_vid_default_mode_win", vid_modenum);
33389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
33399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
33409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	default:
33419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		break;
33429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
33439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3344