From: havoc Date: Mon, 23 Sep 2002 04:37:33 +0000 (+0000) Subject: almost completely rewrote vid_wgl's mode code, there is no modelist of any kind anymore X-Git-Tag: RELEASE_0_2_0_RC1~213 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=716cb9f1cb2554b0b9d4bbf4cd4e6f4d90faa7e1;p=xonotic%2Fdarkplaces.git almost completely rewrote vid_wgl's mode code, there is no modelist of any kind anymore vid_wgl works again VID_Init renamed to VID_InitMode, it returns false if it was unsuccessful VID_Mode added, which prints mode change message to console and passes on to VID_InitMode git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2421 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/common.c b/common.c index 199a33c0..af2161f5 100644 --- a/common.c +++ b/common.c @@ -36,8 +36,6 @@ mempool_t *pak_mempool; qboolean com_modified; // set true if using non-id files -qboolean msg_suppress_1 = 0; - void COM_InitFilesystem (void); char com_token[1024]; diff --git a/darkplaces.dsp b/darkplaces.dsp index cc27b402..77ae9bd0 100644 --- a/darkplaces.dsp +++ b/darkplaces.dsp @@ -220,10 +220,6 @@ SOURCE=.\image.c # End Source File # Begin Source File -SOURCE=.\in_win.c -# End Source File -# Begin Source File - SOURCE=.\keys.c # End Source File # Begin Source File diff --git a/host.c b/host.c index a5e620d6..8a290bf5 100644 --- a/host.c +++ b/host.c @@ -885,7 +885,18 @@ void Host_Init (void) #ifndef _WIN32 // on non win32, mouse comes before video for security reasons IN_Init (); #endif - VID_Init (vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer); + VID_Init(); + if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer)) + { + if (vid_fullscreen.integer) + { + if (!VID_Mode(true, 640, 480, 16)) + if (!VID_Mode(false, 640, 480, 16)) + Sys_Error("Video modes failed\n"); + } + else + Sys_Error("Requested windowed video mode failed\n"); + } Render_Init(); S_Init (); diff --git a/in_win.c b/in_win.c deleted file mode 100644 index d11cd66b..00000000 --- a/in_win.c +++ /dev/null @@ -1,1134 +0,0 @@ -/* -Copyright (C) 1996-1997 Id Software, Inc. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ -// in_win.c -- windows 95 mouse and joystick code -// 02/21/97 JCB Added extended DirectInput code to support external controllers. - -#include "quakedef.h" -#include "winquake.h" - -#include - -#define DINPUT_BUFFERSIZE 16 -#define iDirectInputCreate(a,b,c,d) pDirectInputCreate(a,b,c,d) - -HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, - LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter); - -// mouse variables -int mouse_buttons; -int mouse_oldbuttonstate; -POINT current_pos; -int mouse_x, mouse_y, old_mouse_x, old_mouse_y, mx_accum, my_accum; - -static qboolean restore_spi; -static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1}; - -unsigned int uiWheelMessage; -qboolean mouseactive; -qboolean mouseinitialized; -static qboolean mouseparmsvalid, mouseactivatetoggle; -static qboolean mouseshowtoggle = 1; -static qboolean dinput_acquired; - -static unsigned int mstate_di; - -// joystick defines and variables -// where should defines be moved? -#define JOY_ABSOLUTE_AXIS 0x00000000 // control like a joystick -#define JOY_RELATIVE_AXIS 0x00000010 // control like a mouse, spinner, trackball -#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V -#define JOY_AXIS_X 0 -#define JOY_AXIS_Y 1 -#define JOY_AXIS_Z 2 -#define JOY_AXIS_R 3 -#define JOY_AXIS_U 4 -#define JOY_AXIS_V 5 - -enum _ControlList -{ - AxisNada = 0, AxisForward, AxisLook, AxisSide, AxisTurn -}; - -DWORD dwAxisFlags[JOY_MAX_AXES] = -{ - JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ, JOY_RETURNR, JOY_RETURNU, JOY_RETURNV -}; - -DWORD dwAxisMap[JOY_MAX_AXES]; -DWORD dwControlMap[JOY_MAX_AXES]; -PDWORD pdwRawValue[JOY_MAX_AXES]; - -// none of these cvars are saved over a session -// this means that advanced controller configuration needs to be executed -// each time. this avoids any problems with getting back to a default usage -// or when changing from one controller to another. this way at least something -// works. -cvar_t in_joystick = {CVAR_SAVE, "joystick","0"}; -cvar_t joy_name = {0, "joyname", "joystick"}; -cvar_t joy_advanced = {0, "joyadvanced", "0"}; -cvar_t joy_advaxisx = {0, "joyadvaxisx", "0"}; -cvar_t joy_advaxisy = {0, "joyadvaxisy", "0"}; -cvar_t joy_advaxisz = {0, "joyadvaxisz", "0"}; -cvar_t joy_advaxisr = {0, "joyadvaxisr", "0"}; -cvar_t joy_advaxisu = {0, "joyadvaxisu", "0"}; -cvar_t joy_advaxisv = {0, "joyadvaxisv", "0"}; -cvar_t joy_forwardthreshold = {0, "joyforwardthreshold", "0.15"}; -cvar_t joy_sidethreshold = {0, "joysidethreshold", "0.15"}; -cvar_t joy_pitchthreshold = {0, "joypitchthreshold", "0.15"}; -cvar_t joy_yawthreshold = {0, "joyyawthreshold", "0.15"}; -cvar_t joy_forwardsensitivity = {0, "joyforwardsensitivity", "-1.0"}; -cvar_t joy_sidesensitivity = {0, "joysidesensitivity", "-1.0"}; -cvar_t joy_pitchsensitivity = {0, "joypitchsensitivity", "1.0"}; -cvar_t joy_yawsensitivity = {0, "joyyawsensitivity", "-1.0"}; -cvar_t joy_wwhack1 = {0, "joywwhack1", "0.0"}; -cvar_t joy_wwhack2 = {0, "joywwhack2", "0.0"}; - -qboolean joy_avail, joy_advancedinit, joy_haspov; -DWORD joy_oldbuttonstate, joy_oldpovstate; - -int joy_id; -DWORD joy_flags; -DWORD joy_numbuttons; - -static LPDIRECTINPUT g_pdi; -static LPDIRECTINPUTDEVICE g_pMouse; - -static JOYINFOEX ji; - -static HINSTANCE hInstDI; - -static qboolean dinput; - -typedef struct MYDATA { - LONG lX; // X axis goes here - LONG lY; // Y axis goes here - LONG lZ; // Z axis goes here - BYTE bButtonA; // One button goes here - BYTE bButtonB; // Another button goes here - BYTE bButtonC; // Another button goes here - BYTE bButtonD; // Another button goes here -} MYDATA; - -static DIOBJECTDATAFORMAT rgodf[] = { - { &GUID_XAxis, FIELD_OFFSET(MYDATA, lX), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { &GUID_YAxis, FIELD_OFFSET(MYDATA, lY), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { &GUID_ZAxis, FIELD_OFFSET(MYDATA, lZ), 0x80000000 | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonA), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonB), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonC), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonD), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, -}; - -#define NUM_OBJECTS (sizeof(rgodf) / sizeof(rgodf[0])) - -static DIDATAFORMAT df = { - sizeof(DIDATAFORMAT), // this structure - sizeof(DIOBJECTDATAFORMAT), // size of object data format - DIDF_RELAXIS, // absolute axis coordinates - sizeof(MYDATA), // device data size - NUM_OBJECTS, // number of objects - rgodf, // and here they are -}; - -// forward-referenced functions -void IN_StartupJoystick (void); -void Joy_AdvancedUpdate_f (void); -void IN_JoyMove (usercmd_t *cmd); - - -/* -=========== -IN_UpdateClipCursor -=========== -*/ -void IN_UpdateClipCursor (void) -{ - - if (mouseinitialized && mouseactive && !dinput) - { - ClipCursor (&window_rect); - } -} - - -/* -=========== -IN_ShowMouse -=========== -*/ -void IN_ShowMouse (void) -{ - if (!mouseshowtoggle) - { - ShowCursor (true); - mouseshowtoggle = 1; - } -} - - -/* -=========== -IN_HideMouse -=========== -*/ -void IN_HideMouse (void) -{ - if (mouseshowtoggle) - { - ShowCursor (false); - mouseshowtoggle = 0; - } -} - - -/* -=========== -IN_ActivateMouse -=========== -*/ -void IN_ActivateMouse (void) -{ - - mouseactivatetoggle = true; - - if (mouseinitialized) - { - if (dinput) - { - if (g_pMouse) - { - if (!dinput_acquired) - { - IDirectInputDevice_Acquire(g_pMouse); - dinput_acquired = true; - } - } - else - { - return; - } - } - else - { - if (mouseparmsvalid) - restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0); - - SetCursorPos (window_center_x, window_center_y); - SetCapture (mainwindow); - ClipCursor (&window_rect); - - } - - mouseactive = true; - } -} - - -/* -=========== -IN_DeactivateMouse -=========== -*/ -void IN_DeactivateMouse (void) -{ - - mouseactivatetoggle = false; - - if (mouseinitialized) - { - if (dinput) - { - if (g_pMouse) - { - if (dinput_acquired) - { - IDirectInputDevice_Unacquire(g_pMouse); - dinput_acquired = false; - } - } - } - else - { - if (restore_spi) - SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0); - - ClipCursor (NULL); - ReleaseCapture (); - } - - mouseactive = false; - } -} - - -/* -=========== -IN_InitDInput -=========== -*/ -qboolean IN_InitDInput (void) -{ - HRESULT hr; - DIPROPDWORD dipdw = { - { - sizeof(DIPROPDWORD), // diph.dwSize - sizeof(DIPROPHEADER), // diph.dwHeaderSize - 0, // diph.dwObj - DIPH_DEVICE, // diph.dwHow - }, - DINPUT_BUFFERSIZE, // dwData - }; - - if (!hInstDI) - { - hInstDI = LoadLibrary("dinput.dll"); - - if (hInstDI == NULL) - { - Con_SafePrintf ("Couldn't load dinput.dll\n"); - return false; - } - } - - if (!pDirectInputCreate) - { - pDirectInputCreate = (void *)GetProcAddress(hInstDI,"DirectInputCreateA"); - - if (!pDirectInputCreate) - { - Con_SafePrintf ("Couldn't get DI proc addr\n"); - return false; - } - } - -// register with DirectInput and get an IDirectInput to play with. - hr = iDirectInputCreate(global_hInstance, DIRECTINPUT_VERSION, &g_pdi, NULL); - - if (FAILED(hr)) - { - return false; - } - -// obtain an interface to the system mouse device. - hr = IDirectInput_CreateDevice(g_pdi, &GUID_SysMouse, &g_pMouse, NULL); - - if (FAILED(hr)) - { - Con_SafePrintf ("Couldn't open DI mouse device\n"); - return false; - } - -// set the data format to "mouse format". - hr = IDirectInputDevice_SetDataFormat(g_pMouse, &df); - - if (FAILED(hr)) - { - Con_SafePrintf ("Couldn't set DI mouse format\n"); - return false; - } - -// set the cooperativity level. - hr = IDirectInputDevice_SetCooperativeLevel(g_pMouse, mainwindow, - DISCL_EXCLUSIVE | DISCL_FOREGROUND); - - if (FAILED(hr)) - { - Con_SafePrintf ("Couldn't set DI coop level\n"); - return false; - } - - -// set the buffer size to DINPUT_BUFFERSIZE elements. -// the buffer size is a DWORD property associated with the device - hr = IDirectInputDevice_SetProperty(g_pMouse, DIPROP_BUFFERSIZE, &dipdw.diph); - - if (FAILED(hr)) - { - Con_SafePrintf ("Couldn't set DI buffersize\n"); - return false; - } - - return true; -} - - -/* -=========== -IN_StartupMouse -=========== -*/ -void IN_StartupMouse (void) -{ - if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) - return; - - mouseinitialized = true; - - if (COM_CheckParm ("-dinput")) - { - dinput = IN_InitDInput (); - - if (dinput) - { - Con_SafePrintf ("DirectInput initialized\n"); - } - else - { - Con_SafePrintf ("DirectInput not initialized\n"); - } - } - - if (!dinput) - { - mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0); - - if (mouseparmsvalid) - { - if ( COM_CheckParm ("-noforcemspd") ) - newmouseparms[2] = originalmouseparms[2]; - - if ( COM_CheckParm ("-noforcemaccel") ) - { - newmouseparms[0] = originalmouseparms[0]; - newmouseparms[1] = originalmouseparms[1]; - } - - if ( COM_CheckParm ("-noforcemparms") ) - { - newmouseparms[0] = originalmouseparms[0]; - newmouseparms[1] = originalmouseparms[1]; - newmouseparms[2] = originalmouseparms[2]; - } - } - } - - mouse_buttons = 3; - -// if a fullscreen video mode was set before the mouse was initialized, -// set the mouse state appropriately - if (mouseactivatetoggle) - IN_ActivateMouse (); -} - - -/* -=========== -IN_Init -=========== -*/ -void IN_Init (void) -{ - // joystick variables - Cvar_RegisterVariable (&in_joystick); - Cvar_RegisterVariable (&joy_name); - Cvar_RegisterVariable (&joy_advanced); - Cvar_RegisterVariable (&joy_advaxisx); - Cvar_RegisterVariable (&joy_advaxisy); - Cvar_RegisterVariable (&joy_advaxisz); - Cvar_RegisterVariable (&joy_advaxisr); - Cvar_RegisterVariable (&joy_advaxisu); - Cvar_RegisterVariable (&joy_advaxisv); - Cvar_RegisterVariable (&joy_forwardthreshold); - Cvar_RegisterVariable (&joy_sidethreshold); - Cvar_RegisterVariable (&joy_pitchthreshold); - Cvar_RegisterVariable (&joy_yawthreshold); - Cvar_RegisterVariable (&joy_forwardsensitivity); - Cvar_RegisterVariable (&joy_sidesensitivity); - Cvar_RegisterVariable (&joy_pitchsensitivity); - Cvar_RegisterVariable (&joy_yawsensitivity); - Cvar_RegisterVariable (&joy_wwhack1); - Cvar_RegisterVariable (&joy_wwhack2); - - Cmd_AddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f); - - uiWheelMessage = RegisterWindowMessage ( "MSWHEEL_ROLLMSG" ); - - IN_StartupMouse (); - IN_StartupJoystick (); -} - -/* -=========== -IN_Shutdown -=========== -*/ -void IN_Shutdown (void) -{ - IN_DeactivateMouse (); - IN_ShowMouse (); - - if (g_pMouse) - { - IDirectInputDevice_Release(g_pMouse); - g_pMouse = NULL; - } - - if (g_pdi) - { - IDirectInput_Release(g_pdi); - g_pdi = NULL; - } -} - - -/* -=========== -IN_MouseEvent -=========== -*/ -void IN_MouseEvent (int mstate) -{ - int i; - - if (mouseactive && !dinput) - { - // perform button actions - for (i=0 ; i 14000.0) - fTemp = 14000.0; - // restore direction information - fAxisValue = (fAxisValue > 0.0) ? fTemp : -fTemp; - } - } - - // convert range from -32768..32767 to -1..1 - fAxisValue /= 32768.0; - - switch (dwAxisMap[i]) - { - case AxisForward: - if ((joy_advanced.integer == 0) && mouselook) - { - // user wants forward control to become look control - if (fabs(fAxisValue) > joy_pitchthreshold.value) - { - // if mouse invert is on, invert the joystick pitch value - // only absolute control support here (joy_advanced is false) - if (m_pitch.value < 0.0) - { - cl.viewangles[PITCH] -= (fAxisValue * joy_pitchsensitivity.value) * aspeed * cl_pitchspeed.value; - } - else - { - cl.viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity.value) * aspeed * cl_pitchspeed.value; - } - V_StopPitchDrift(); - } - else - { - // no pitch movement - // disable pitch return-to-center unless requested by user - // *** this code can be removed when the lookspring bug is fixed - // *** the bug always has the lookspring feature on - if(lookspring.value == 0.0) - V_StopPitchDrift(); - } - } - else - { - // user wants forward control to be forward control - if (fabs(fAxisValue) > joy_forwardthreshold.value) - { - cmd->forwardmove += (fAxisValue * joy_forwardsensitivity.value) * speed * cl_forwardspeed.value; - } - } - break; - - case AxisSide: - if (fabs(fAxisValue) > joy_sidethreshold.value) - { - cmd->sidemove += (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; - } - break; - - case AxisTurn: - if ((in_strafe.state & 1) || (lookstrafe.integer && mouselook)) - { - // user wants turn control to become side control - if (fabs(fAxisValue) > joy_sidethreshold.value) - { - cmd->sidemove -= (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; - } - } - else - { - // user wants turn control to be turn control - if (fabs(fAxisValue) > joy_yawthreshold.value) - { - if(dwControlMap[i] == JOY_ABSOLUTE_AXIS) - { - cl.viewangles[YAW] += (fAxisValue * joy_yawsensitivity.value) * aspeed * cl_yawspeed.value; - } - else - { - cl.viewangles[YAW] += (fAxisValue * joy_yawsensitivity.value) * speed * 180.0; - } - - } - } - break; - - case AxisLook: - if (mouselook) - { - if (fabs(fAxisValue) > joy_pitchthreshold.value) - { - // pitch movement detected and pitch movement desired by user - if(dwControlMap[i] == JOY_ABSOLUTE_AXIS) - { - cl.viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity.value) * aspeed * cl_pitchspeed.value; - } - else - { - cl.viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity.value) * speed * 180.0; - } - V_StopPitchDrift(); - } - else - { - // no pitch movement - // disable pitch return-to-center unless requested by user - // *** this code can be removed when the lookspring bug is fixed - // *** the bug always has the lookspring feature on - if(lookspring.integer == 0) - V_StopPitchDrift(); - } - } - break; - - default: - break; - } - } -} - diff --git a/quakedef.h b/quakedef.h index 0c809003..86529c7e 100644 --- a/quakedef.h +++ b/quakedef.h @@ -225,8 +225,6 @@ void Host_Quit_f (void); void Host_ClientCommands (const char *fmt, ...); void Host_ShutdownServer (qboolean crash); -// suppresses resolution and cache size console output and fullscreen DIB focus gain/loss -extern qboolean msg_suppress_1; // skill level for currently loaded level (in case the user changes the cvar while the level is running, this reflects the level actually in use) extern int current_skill; diff --git a/vid.h b/vid.h index 8076076c..708514ec 100644 --- a/vid.h +++ b/vid.h @@ -102,7 +102,8 @@ void GL_Init (void); void VID_CheckExtensions(void); -void VID_Init (int fullscreen, int width, int height, int bpp); +void VID_Init (void); +int VID_Mode(int fullscreen, int width, int height, int bpp); // Called at startup void VID_Shutdown (void); diff --git a/vid_glx.c b/vid_glx.c index a80277ff..706cb5fd 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -83,8 +83,6 @@ Atom wm_delete_window_atom; #define X_MASK (KEY_MASK | MOUSE_MASK | VisibilityChangeMask | StructureNotifyMask ) -viddef_t vid; // global video state - static qboolean mouse_avail = true; static qboolean mouse_active = false, usingmouse = false; static float mouse_x, mouse_y; @@ -636,7 +634,14 @@ int VID_SetGamma(float prescale, float gamma, float scale, float base) #endif } -void VID_Init(int fullscreen, int width, int height, int bpp) +void VID_Init(void) +{ + Cvar_RegisterVariable (&vid_dga); + Cvar_RegisterVariable (&vid_dga_mouseaccel); + InitSig(); // trap evil signals +} + +int VID_InitMode(int fullscreen, int width, int height, int bpp) { int i; // LordHavoc: FIXME: finish this code, we need to allocate colors before we can store them @@ -670,15 +675,15 @@ void VID_Init(int fullscreen, int width, int height, int bpp) int MajorVersion, MinorVersion; if (!GL_OpenLibrary("libGL.so.1")) - Sys_Error("Unable to load GL driver\n"); - - Cvar_RegisterVariable (&vid_dga); - Cvar_RegisterVariable (&vid_dga_mouseaccel); + { + Con_Printf("Unable to load GL driver\n"); + return false; + } if (!(vidx11_display = XOpenDisplay(NULL))) { - fprintf(stderr, "Error couldn't open the X display\n"); - exit(1); + Con_Printf("Couldn't open the X display\n"); + return false; } scrnum = DefaultScreen(vidx11_display); @@ -699,7 +704,10 @@ void VID_Init(int fullscreen, int width, int height, int bpp) || (qglXMakeCurrent = GL_GetProcAddress("glXMakeCurrent")) == NULL || (qglXSwapBuffers = GL_GetProcAddress("glXSwapBuffers")) == NULL || (qglXQueryExtensionsString = GL_GetProcAddress("glXQueryExtensionsString")) == NULL) - Sys_Error("glX functions not found in %s\n", gl_driver); + { + Con_Printf("glX functions not found in %s\n", gl_driver); + return false; + } visinfo = NULL; // LordHavoc: FIXME: finish this code, we need to allocate colors before we can store them @@ -712,8 +720,8 @@ void VID_Init(int fullscreen, int width, int height, int bpp) visinfo = qglXChooseVisual(vidx11_display, scrnum, nogammaattrib); if (!visinfo) { - Sys_Error("couldn't get an RGB, Double-buffered, Depth visual\n"); - exit(1); + Con_Printf("Couldn't get an RGB, Double-buffered, Depth visual\n"); + return false; } } @@ -824,13 +832,9 @@ void VID_Init(int fullscreen, int width, int height, int bpp) GL_CheckExtension("GLX_ARB_get_proc_address", getprocaddressfuncs, "-nogetprocaddress", false); gl_videosyncavailable = GL_CheckExtension("GLX_SGI_video_sync", videosyncfuncs, "-novideosync", false); - InitSig(); // trap evil signals - vid_hidden = false; - GL_Init(); - - Con_SafePrintf ("Video mode %dx%d initialized.\n", width, height); + return true; } void Sys_SendKeyEvents(void) diff --git a/vid_null.c b/vid_null.c index 6a14679b..ad2881eb 100644 --- a/vid_null.c +++ b/vid_null.c @@ -23,9 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. int cl_available = false; -// global video state -viddef_t vid; - void VID_Shutdown(void) { } @@ -67,11 +64,15 @@ int VID_SetGamma(float prescale, float gamma, float scale, float base) return FALSE; } -void VID_Init(int fullscreen, int width, int height, int bpp) +void VID_Init(void) { InitSig(); // trap evil signals } +int VID_InitMode(int fullscreen, int width, int height, int bpp) +{ +} + int GL_OpenLibrary(const char *name) { return false; diff --git a/vid_shared.c b/vid_shared.c index ad8e0d34..561e0d8d 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -1,12 +1,15 @@ #include "quakedef.h" +// global video state +viddef_t vid; + // LordHavoc: these are only set in wgl qboolean isG200 = false; // LordHavoc: the Matrox G200 can't do per pixel alpha, and it uses a D3D driver for GL... ugh... qboolean isRagePro = false; // LordHavoc: the ATI Rage Pro has limitations with per pixel alpha (the color scaler does not apply to per pixel alpha images...), although not as bad as a G200. // LordHavoc: GL_ARB_multitexture support -int gl_textureunits; +int gl_textureunits = 0; // LordHavoc: GL_ARB_texture_env_combine or GL_EXT_texture_env_combine support int gl_combine_extension = false; // LordHavoc: GL_EXT_compiled_vertex_array support @@ -21,9 +24,9 @@ int vid_hidden = false; int vid_activewindow = true; cvar_t vid_fullscreen = {0, "vid_fullscreen", "1"}; -cvar_t vid_width = {0, "vid_width", "640"}; -cvar_t vid_height = {0, "vid_height", "480"}; -cvar_t vid_bitsperpixel = {0, "vid_bitsperpixel", "15"}; +cvar_t vid_width = {0, "vid_width", "800"}; +cvar_t vid_height = {0, "vid_height", "600"}; +cvar_t vid_bitsperpixel = {0, "vid_bitsperpixel", "32"}; cvar_t vid_mouse = {CVAR_SAVE, "vid_mouse", "1"}; cvar_t gl_combine = {0, "gl_combine", "1"}; @@ -427,3 +430,15 @@ void VID_InitCvars(void) Cvar_SetQuick(&vid_bitsperpixel, com_argv[i+1]); } +extern int VID_InitMode (int fullscreen, int width, int height, int bpp); +int VID_Mode(int fullscreen, int width, int height, int bpp) +{ + if (fullscreen) + Con_Printf("Video: %dx%dx%d fullscreen\n", width, height, bpp); + else + Con_Printf("Video: %dx%d windowed\n", width, height); + if (VID_InitMode(fullscreen, width, height, bpp)) + return true; + else + return false; +} diff --git a/vid_wgl.c b/vid_wgl.c index 7287e2c1..0c8004be 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -68,270 +68,47 @@ static gl_extensionfunctionlist_t wglswapintervalfuncs[] = {NULL, NULL} }; -#define MAX_MODE_LIST 30 -#define VID_ROW_SIZE 3 -#define MAXWIDTH 10000 -#define MAXHEIGHT 10000 - -#define MODE_WINDOWED 0 -#define NO_MODE (MODE_WINDOWED - 1) -#define MODE_FULLSCREEN_DEFAULT (MODE_WINDOWED + 1) - -typedef struct { - modestate_t type; - int width; - int height; - int modenum; - int dib; - int fullscreen; - int bpp; - char modedesc[17]; -} vmode_t; - -typedef struct { - int width; - int height; -} lmode_t; - -lmode_t lowresmodes[] = { - {320, 200}, - {320, 240}, - {400, 300}, - {512, 384}, -}; +void VID_RestoreGameGamma(void); +void VID_GetSystemGamma(void); +void VID_RestoreSystemGamma(void); qboolean scr_skipupdate; -static vmode_t modelist[MAX_MODE_LIST]; -static int nummodes; -static vmode_t badmode; - static DEVMODE gdevmode; static qboolean vid_initialized = false; -static qboolean windowed, leavecurrentmode; static qboolean vid_wassuspended = false; static int vid_usingmouse; extern qboolean mouseactive; // from in_win.c static HICON hIcon; -int DIBWidth, DIBHeight; -RECT WindowRect; -DWORD WindowStyle, ExWindowStyle; - HWND mainwindow; -int vid_modenum = NO_MODE; -int vid_realmode; -int vid_default = MODE_WINDOWED; -static int windowed_default; -unsigned char vid_curpal[256*3]; - -HGLRC baseRC; -HDC maindc; - -HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); - -// global video state -viddef_t vid; +//HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); -modestate_t modestate = MS_UNINIT; +static int vid_isfullscreen; -void VID_MenuDraw (void); -void VID_MenuKey (int key); +//void VID_MenuDraw (void); +//void VID_MenuKey (int key); -LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); -void AppActivate(BOOL fActive, BOOL minimize); -char *VID_GetModeDescription (int mode); -void ClearAllStates (void); -void VID_UpdateWindowStatus (void); +//LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +//void AppActivate(BOOL fActive, BOOL minimize); +//void ClearAllStates (void); +//void VID_UpdateWindowStatus (void); //==================================== -int window_center_x, window_center_y, window_x, window_y, window_width, window_height; -RECT window_rect; - -// direct draw software compatability stuff - -void CenterWindow(HWND hWndCenter, int width, int height, BOOL lefttopjustify) -{ - int CenterX, CenterY; - - CenterX = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; - CenterY = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; - if (CenterX > CenterY*2) - CenterX >>= 1; // dual screens - CenterX = (CenterX < 0) ? 0: CenterX; - CenterY = (CenterY < 0) ? 0: CenterY; - SetWindowPos (hWndCenter, NULL, CenterX, CenterY, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW | SWP_DRAWFRAME); -} - -qboolean VID_SetWindowedMode (int modenum) -{ - int lastmodestate, width, height; - RECT rect; - - lastmodestate = modestate; - - WindowRect.top = WindowRect.left = 0; - - WindowRect.right = modelist[modenum].width; - WindowRect.bottom = modelist[modenum].height; - - DIBWidth = modelist[modenum].width; - DIBHeight = modelist[modenum].height; - - WindowStyle = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; - ExWindowStyle = 0; - - rect = WindowRect; - AdjustWindowRectEx(&rect, WindowStyle, false, 0); - - width = rect.right - rect.left; - height = rect.bottom - rect.top; - - // Create the DIB window - mainwindow = CreateWindowEx (ExWindowStyle, gamename, gamename, WindowStyle, rect.left, rect.top, width, height, NULL, NULL, global_hInstance, NULL); - - if (!mainwindow) - Sys_Error ("Couldn't create DIB window"); - - // Center and show the DIB window - CenterWindow(mainwindow, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top, false); - - ShowWindow (mainwindow, SW_SHOWDEFAULT); - UpdateWindow (mainwindow); - - modestate = MS_WINDOWED; - - SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); - SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); - - return true; -} - - -qboolean VID_SetFullDIBMode (int modenum) -{ - int lastmodestate, width, height; - RECT rect; - - if (!leavecurrentmode) - { - gdevmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - gdevmode.dmBitsPerPel = modelist[modenum].bpp; - gdevmode.dmPelsWidth = modelist[modenum].width; - gdevmode.dmPelsHeight = modelist[modenum].height; - gdevmode.dmSize = sizeof (gdevmode); - - if (ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) - Sys_Error ("Couldn't set fullscreen DIB mode"); - } - - lastmodestate = modestate; - modestate = MS_FULLDIB; - - WindowRect.top = WindowRect.left = 0; - - WindowRect.right = modelist[modenum].width; - WindowRect.bottom = modelist[modenum].height; - - DIBWidth = modelist[modenum].width; - DIBHeight = modelist[modenum].height; - - WindowStyle = WS_POPUP; - ExWindowStyle = 0; - - rect = WindowRect; - AdjustWindowRectEx(&rect, WindowStyle, false, 0); - - width = rect.right - rect.left; - height = rect.bottom - rect.top; - - // Create the DIB window - mainwindow = CreateWindowEx (ExWindowStyle, gamename, gamename, WindowStyle, rect.left, rect.top, width, height, NULL, NULL, global_hInstance, NULL); - - if (!mainwindow) - Sys_Error ("Couldn't create DIB window"); - - ShowWindow (mainwindow, SW_SHOWDEFAULT); - UpdateWindow (mainwindow); - -// needed because we're not getting WM_MOVE messages fullscreen on NT - window_x = 0; - window_y = 0; - - SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); - SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); - - return true; -} - - -int VID_SetMode (int modenum) -{ - int original_mode; - qboolean stat = 0; - MSG msg; - - if ((windowed && (modenum != 0)) || (!windowed && (modenum < 1)) || (!windowed && (modenum >= nummodes))) - Sys_Error ("Bad video mode\n"); - - CDAudio_Pause (); - - if (vid_modenum == NO_MODE) - original_mode = windowed_default; - else - original_mode = vid_modenum; - - // Set either the fullscreen or windowed mode - if (modelist[modenum].type == MS_WINDOWED) - stat = VID_SetWindowedMode(modenum); - else if (modelist[modenum].type == MS_FULLDIB) - stat = VID_SetFullDIBMode(modenum); - else - Sys_Error ("VID_SetMode: Bad mode type in modelist"); - - window_width = DIBWidth; - window_height = DIBHeight; - VID_UpdateWindowStatus (); - - CDAudio_Resume (); - - if (!stat) - Sys_Error ("Couldn't set video mode"); - -// now we try to make sure we get the focus on the mode switch, because -// sometimes in some systems we don't. We grab the foreground, then -// finish setting up, pump all our messages, and sleep for a little while -// to let messages finish bouncing around the system, then we put -// ourselves at the top of the z order, then grab the foreground again, -// Who knows if it helps, but it probably doesn't hurt - SetForegroundWindow (mainwindow); - vid_modenum = modenum; - Cvar_SetValue ("vid_mode", (float)vid_modenum); - - while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - Sleep (100); - - SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOCOPYBITS); - - SetForegroundWindow (mainwindow); - -// fix the leftover Alt from any Alt-Tab or the like that switched us away - ClearAllStates (); - - if (!msg_suppress_1) - Con_SafePrintf ("Video mode %s initialized.\n", VID_GetModeDescription (vid_modenum)); +int window_x, window_y, window_width, window_height; +int window_center_x, window_center_y; - return true; -} +void IN_ShowMouse (void); +void IN_DeactivateMouse (void); +void IN_HideMouse (void); +void IN_ActivateMouse (void); +void IN_MouseEvent (int mstate); +void IN_UpdateClipCursor (void); +qboolean mouseinitialized; +static qboolean dinput; /* ================ @@ -340,14 +117,18 @@ VID_UpdateWindowStatus */ void VID_UpdateWindowStatus (void) { - window_rect.left = window_x; - window_rect.top = window_y; - window_rect.right = window_x + window_width; - window_rect.bottom = window_y + window_height; - window_center_x = (window_rect.left + window_rect.right) / 2; - window_center_y = (window_rect.top + window_rect.bottom) / 2; - - IN_UpdateClipCursor (); + window_center_x = window_x + window_width / 2; + window_center_y = window_y + window_height / 2; + + if (mouseinitialized && mouseactive && !dinput) + { + RECT window_rect; + window_rect.left = window_x; + window_rect.top = window_y; + window_rect.right = window_x + window_width; + window_rect.bottom = window_y + window_height; + ClipCursor (&window_rect); + } } @@ -360,26 +141,30 @@ VID_GetWindowSize */ void VID_GetWindowSize (int *x, int *y, int *width, int *height) { - *x = *y = 0; - *width = WindowRect.right - WindowRect.left; - *height = WindowRect.bottom - WindowRect.top; + *x = 0; + *y = 0; + *width = window_width; + *height = window_height; } void VID_Finish (void) { + HDC hdc; int vid_usemouse; if (r_render.integer && !scr_skipupdate) { qglFinish(); - SwapBuffers(maindc); + hdc = GetDC(mainwindow); + SwapBuffers(hdc); + ReleaseDC(mainwindow, hdc); } // handle the mouse state when windowed if that's changed vid_usemouse = false; if (vid_mouse.integer && !key_consoleactive) vid_usemouse = true; - if (modestate == MS_FULLDIB) + if (vid_isfullscreen) vid_usemouse = true; if (!vid_activewindow) vid_usemouse = false; @@ -403,92 +188,9 @@ void VID_Finish (void) } } -void VID_SetDefaultMode (void) -{ - IN_DeactivateMouse (); -} - -void VID_RestoreSystemGamma(void); - -void VID_Shutdown (void) -{ - HGLRC hRC; - HDC hDC; - - if (vid_initialized) - { - if (qwglGetCurrentContext) - hRC = qwglGetCurrentContext(); - if (qwglGetCurrentDC) - hDC = qwglGetCurrentDC(); - - if (qwglMakeCurrent) - qwglMakeCurrent(NULL, NULL); - - if (hRC && qwglDeleteContext) - qwglDeleteContext(hRC); - - // close the library before we get rid of the window - GL_CloseLibrary(); - - if (hDC && mainwindow) - ReleaseDC(mainwindow, hDC); - - if (modestate == MS_FULLDIB) - ChangeDisplaySettings (NULL, 0); - - if (maindc && mainwindow) - ReleaseDC (mainwindow, maindc); - - AppActivate(false, false); - - VID_RestoreSystemGamma(); - } -} - - //========================================================================== -BOOL bSetupPixelFormat(HDC hDC) -{ - static PIXELFORMATDESCRIPTOR pfd = { - sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd - 1, // version number - PFD_DRAW_TO_WINDOW // support window - | PFD_SUPPORT_OPENGL // support OpenGL - | PFD_DOUBLEBUFFER , // double buffered - PFD_TYPE_RGBA, // RGBA type - 24, // 24-bit color depth - 0, 0, 0, 0, 0, 0, // color bits ignored - 0, // no alpha buffer - 0, // shift bit ignored - 0, // no accumulation buffer - 0, 0, 0, 0, // accum bits ignored - 32, // 32-bit z-buffer - 0, // no stencil buffer - 0, // no auxiliary buffer - PFD_MAIN_PLANE, // main layer - 0, // reserved - 0, 0, 0 // layer masks ignored - }; - int pixelformat; - - if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ) - { - MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); - return false; - } - - if (SetPixelFormat(hDC, pixelformat, &pfd) == false) - { - MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); - return false; - } - - return true; -} - qbyte scantokey[128] = @@ -583,7 +285,7 @@ void AppActivate(BOOL fActive, BOOL minimize) if (fActive) { - if (modestate == MS_FULLDIB) + if (vid_isfullscreen) { if (vid_wassuspended) { @@ -604,7 +306,7 @@ void AppActivate(BOOL fActive, BOOL minimize) vid_usingmouse = false; IN_DeactivateMouse (); IN_ShowMouse (); - if (modestate == MS_FULLDIB) + if (vid_isfullscreen) { ChangeDisplaySettings (NULL, 0); vid_wassuspended = true; @@ -628,7 +330,7 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch (uMsg) { case WM_KILLFOCUS: - if (modestate == MS_FULLDIB) + if (vid_isfullscreen) ShowWindow(mainwindow, SW_SHOWMINNOACTIVE); break; @@ -735,375 +437,82 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } -/* -================= -VID_NumModes -================= -*/ -int VID_NumModes (void) +//static int grabsysgamma = true; +WORD systemgammaramps[3][256], currentgammaramps[3][256]; + +int VID_SetGamma(float prescale, float gamma, float scale, float base) { - return nummodes; -} + int i; + HDC hdc; + hdc = GetDC (NULL); + BuildGammaTable16(prescale, gamma, scale, base, ¤tgammaramps[0][0]); + for (i = 0;i < 256;i++) + currentgammaramps[1][i] = currentgammaramps[2][i] = currentgammaramps[0][i]; -/* -================= -VID_GetModePtr -================= -*/ -vmode_t *VID_GetModePtr (int modenum) -{ + i = SetDeviceGammaRamp(hdc, ¤tgammaramps[0][0]); - if ((modenum >= 0) && (modenum < nummodes)) - return &modelist[modenum]; - else - return &badmode; + ReleaseDC (NULL, hdc); + return i; // return success or failure } - -/* -================= -VID_GetModeDescription -================= -*/ -char *VID_GetModeDescription (int mode) +void VID_RestoreGameGamma(void) { - char *pinfo; - vmode_t *pv; - static char temp[100]; + VID_UpdateGamma(true); +} - if ((mode < 0) || (mode >= nummodes)) - return NULL; +void VID_GetSystemGamma(void) +{ + HDC hdc; + hdc = GetDC (NULL); - if (!leavecurrentmode) - { - pv = VID_GetModePtr (mode); - pinfo = pv->modedesc; - } - else - { - sprintf (temp, "Desktop resolution (%dx%d)", modelist[MODE_FULLSCREEN_DEFAULT].width, modelist[MODE_FULLSCREEN_DEFAULT].height); - pinfo = temp; - } + GetDeviceGammaRamp(hdc, &systemgammaramps[0][0]); - return pinfo; + ReleaseDC (NULL, hdc); } - -// KJB: Added this to return the mode driver name in description for console - -char *VID_GetExtModeDescription (int mode) +void VID_RestoreSystemGamma(void) { - static char pinfo[40]; - vmode_t *pv; - - if ((mode < 0) || (mode >= nummodes)) - return NULL; + HDC hdc; + hdc = GetDC (NULL); - pv = VID_GetModePtr (mode); - if (modelist[mode].type == MS_FULLDIB) - { - if (!leavecurrentmode) - sprintf(pinfo,"%s fullscreen", pv->modedesc); - else - sprintf (pinfo, "Desktop resolution (%dx%d)", modelist[MODE_FULLSCREEN_DEFAULT].width, modelist[MODE_FULLSCREEN_DEFAULT].height); - } - else - { - if (modestate == MS_WINDOWED) - sprintf(pinfo, "%s windowed", pv->modedesc); - else - sprintf(pinfo, "windowed"); - } + SetDeviceGammaRamp(hdc, &systemgammaramps[0][0]); - return pinfo; + ReleaseDC (NULL, hdc); } +//======================================================== +// Video menu stuff +//======================================================== -/* -================= -VID_DescribeCurrentMode_f -================= -*/ -void VID_DescribeCurrentMode_f (void) -{ - Con_Printf ("%s\n", VID_GetExtModeDescription (vid_modenum)); -} +#if 0 +extern void M_Menu_Options_f (void); +extern void M_Print (float cx, float cy, char *str); +extern void M_PrintWhite (float cx, float cy, char *str); +extern void M_DrawCharacter (float cx, float cy, int num); +extern void M_DrawPic (float cx, float cy, char *picname); +static int vid_wmodes; -/* -================= -VID_NumModes_f -================= -*/ -void VID_NumModes_f (void) +typedef struct { - if (nummodes == 1) - Con_Printf ("%d video mode is available\n", nummodes); - else - Con_Printf ("%d video modes are available\n", nummodes); -} + int modenum; + char *desc; + int iscur; +} modedesc_t; + +#define MAX_COLUMN_SIZE 9 +#define MODE_AREA_HEIGHT (MAX_COLUMN_SIZE + 2) +#define MAX_MODEDESCS (MAX_COLUMN_SIZE*3) +static modedesc_t modedescs[MAX_MODEDESCS]; /* -================= -VID_DescribeMode_f -================= +================ +VID_MenuDraw +================ */ -void VID_DescribeMode_f (void) -{ - int t, modenum; - - modenum = atoi (Cmd_Argv(1)); - - t = leavecurrentmode; - leavecurrentmode = 0; - - Con_Printf ("%s\n", VID_GetExtModeDescription (modenum)); - - leavecurrentmode = t; -} - - -/* -================= -VID_DescribeModes_f -================= -*/ -void VID_DescribeModes_f (void) -{ - int i, lnummodes, t; - char *pinfo; - vmode_t *pv; - - lnummodes = VID_NumModes (); - - t = leavecurrentmode; - leavecurrentmode = 0; - - for (i=1 ; i= MAX_MODE_LIST) - return; - modelist[nummodes].type = type; - modelist[nummodes].width = width; - modelist[nummodes].height = height; - modelist[nummodes].modenum = modenum; - modelist[nummodes].dib = dib; - modelist[nummodes].fullscreen = fullscreen; - modelist[nummodes].bpp = bpp; - if (bpp == 0) - sprintf (modelist[nummodes].modedesc, "%dx%d", width, height); - else - sprintf (modelist[nummodes].modedesc, "%dx%dx%d", width, height, bpp); - for (i = 0;i < nummodes;i++) - { - if (!memcmp(&modelist[i], &modelist[nummodes], sizeof(vmode_t))) - return; - } - nummodes++; -} - -void VID_InitDIB (HINSTANCE hInstance) -{ - int w, h; - WNDCLASS wc; - - // Register the frame class - wc.style = 0; - wc.lpfnWndProc = (WNDPROC)MainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = 0; - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = NULL; - wc.lpszMenuName = 0; - wc.lpszClassName = gamename; - - if (!RegisterClass (&wc) ) - Sys_Error ("Couldn't register window class"); - - if (COM_CheckParm("-width")) - w = atoi(com_argv[COM_CheckParm("-width")+1]); - else - w = 640; - - if (w < 320) - w = 320; - - if (COM_CheckParm("-height")) - h = atoi(com_argv[COM_CheckParm("-height")+1]); - else - h = w * 240/320; - - if (h < 240) - h = 240; - - VID_AddMode(MS_WINDOWED, w, h, 0, 1, 0, 0); -} - - -/* -================= -VID_InitFullDIB -================= -*/ -void VID_InitFullDIB (HINSTANCE hInstance) -{ - DEVMODE devmode; - int modenum; - int originalnummodes; - int numlowresmodes; - int j; - int bpp; - int done; - BOOL stat; - -// enumerate >8 bpp modes - originalnummodes = nummodes; - modenum = 0; - - do - { - stat = EnumDisplaySettings (NULL, modenum, &devmode); - - if ((devmode.dmBitsPerPel >= 15) && (devmode.dmPelsWidth <= MAXWIDTH) && (devmode.dmPelsHeight <= MAXHEIGHT) && (nummodes < MAX_MODE_LIST)) - { - devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - - if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL) - VID_AddMode(MS_FULLDIB, devmode.dmPelsWidth, devmode.dmPelsHeight, 0, 1, 1, devmode.dmBitsPerPel); - } - - modenum++; - } - while (stat); - -// see if there are any low-res modes that aren't being reported - numlowresmodes = sizeof(lowresmodes) / sizeof(lowresmodes[0]); - bpp = 16; - done = 0; - - do - { - for (j=0 ; (j rating) - { - bestrating = rating; - bestmode = i; - } - } - } + SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); + SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); + + VID_UpdateWindowStatus (); - if (bestmode < 0) - Sys_Error ("Specified video mode not available"); + // now we try to make sure we get the focus on the mode switch, because + // sometimes in some systems we don't. We grab the foreground, then + // finish setting up, pump all our messages, and sleep for a little while + // to let messages finish bouncing around the system, then we put + // ourselves at the top of the z order, then grab the foreground again, + // Who knows if it helps, but it probably doesn't hurt + SetForegroundWindow (mainwindow); + + while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage (&msg); + DispatchMessage (&msg); } - vid_initialized = true; + Sleep (100); - VID_SetMode (vid_default); + SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOCOPYBITS); + + SetForegroundWindow (mainwindow); + + // fix the leftover Alt from any Alt-Tab or the like that switched us away + ClearAllStates (); + + hdc = GetDC(mainwindow); + + if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0) + { + VID_Shutdown(); + Con_Printf("ChoosePixelFormat(%d, %p) failed\n", hdc, &pfd); + return false; + } - maindc = GetDC(mainwindow); - bSetupPixelFormat(maindc); + if (SetPixelFormat(hdc, pixelformat, &pfd) == false) + { + VID_Shutdown(); + Con_Printf("SetPixelFormat(%d, %d, %p) failed\n", hdc, pixelformat, &pfd); + return false; + } if (!GL_CheckExtension("wgl", wglfuncs, NULL, false)) - Sys_Error("wgl functions not found\n"); + { + VID_Shutdown(); + Con_Printf("wgl functions not found\n"); + return false; + } - baseRC = qwglCreateContext( maindc ); + baseRC = qwglCreateContext(hdc); if (!baseRC) - Sys_Error ("Could not initialize GL (wglCreateContext failed).\n\nMake sure you are in 65536 color mode, and try running -window."); - if (!qwglMakeCurrent( maindc, baseRC )) - Sys_Error ("wglMakeCurrent failed"); - + { + VID_Shutdown(); + Con_Printf("Could not initialize GL (wglCreateContext failed).\n\nMake sure you are in 65536 color mode, and try running -window.\n"); + return false; + } + if (!qwglMakeCurrent(hdc, baseRC)) + { + VID_Shutdown(); + Con_Printf("wglMakeCurrent(%d, %d) failed\n", hdc, baseRC); + return false; + } + qglGetString = GL_GetProcAddress("glGetString"); if (qglGetString == NULL) - Sys_Error ("glGetString does not exist"); + { + VID_Shutdown(); + Con_Printf("glGetString not found\n"); + return false; + } gl_renderer = qglGetString(GL_RENDERER); gl_vendor = qglGetString(GL_VENDOR); gl_version = qglGetString(GL_VERSION); @@ -1321,9 +858,10 @@ void VID_Init (int fullscreen, int width, int height, int bpp) gl_platformextensions = ""; if (GL_CheckExtension("WGL_ARB_extensions_string", getextensionsstringfuncs, NULL, false)) - gl_platformextensions = qwglGetExtensionsStringARB(maindc); + gl_platformextensions = qwglGetExtensionsStringARB(hdc); gl_videosyncavailable = GL_CheckExtension("WGL_EXT_swap_control", wglswapintervalfuncs, NULL, false); + ReleaseDC(mainwindow, hdc); GL_Init (); @@ -1336,13 +874,1146 @@ void VID_Init (int fullscreen, int width, int height, int bpp) if (strncasecmp(gl_renderer,"Matrox G200 Direct3D",20)==0) // a D3D driver for GL? sigh... isG200 = true; - vid_realmode = vid_modenum; + //vid_menudrawfn = VID_MenuDraw; + //vid_menukeyfn = VID_MenuKey; + vid_hidden = false; + vid_initialized = true; + return true; +} + +void VID_Shutdown (void) +{ + HGLRC hRC = 0; + HDC hDC = 0; - vid_menudrawfn = VID_MenuDraw; - vid_menukeyfn = VID_MenuKey; + if (vid_initialized) + { + vid_initialized = false; + if (qwglGetCurrentContext) + hRC = qwglGetCurrentContext(); + if (qwglGetCurrentDC) + hDC = qwglGetCurrentDC(); - strcpy (badmode.modedesc, "Bad mode"); + if (qwglMakeCurrent) + qwglMakeCurrent(NULL, NULL); - vid_hidden = false; + if (hRC && qwglDeleteContext) + qwglDeleteContext(hRC); + + // close the library before we get rid of the window + GL_CloseLibrary(); + + if (hDC && mainwindow) + ReleaseDC(mainwindow, hDC); + + if (vid_isfullscreen) + ChangeDisplaySettings (NULL, 0); + + AppActivate(false, false); + + VID_RestoreSystemGamma(); + } +} + + +// input code + +#include + +#define DINPUT_BUFFERSIZE 16 +#define iDirectInputCreate(a,b,c,d) pDirectInputCreate(a,b,c,d) + +HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, + LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter); + +// mouse variables +int mouse_buttons; +int mouse_oldbuttonstate; +POINT current_pos; +int mouse_x, mouse_y, old_mouse_x, old_mouse_y, mx_accum, my_accum; + +static qboolean restore_spi; +static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1}; + +unsigned int uiWheelMessage; +qboolean mouseactive; +//qboolean mouseinitialized; +static qboolean mouseparmsvalid, mouseactivatetoggle; +static qboolean mouseshowtoggle = 1; +static qboolean dinput_acquired; + +static unsigned int mstate_di; + +// joystick defines and variables +// where should defines be moved? +#define JOY_ABSOLUTE_AXIS 0x00000000 // control like a joystick +#define JOY_RELATIVE_AXIS 0x00000010 // control like a mouse, spinner, trackball +#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V +#define JOY_AXIS_X 0 +#define JOY_AXIS_Y 1 +#define JOY_AXIS_Z 2 +#define JOY_AXIS_R 3 +#define JOY_AXIS_U 4 +#define JOY_AXIS_V 5 + +enum _ControlList +{ + AxisNada = 0, AxisForward, AxisLook, AxisSide, AxisTurn +}; + +DWORD dwAxisFlags[JOY_MAX_AXES] = +{ + JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ, JOY_RETURNR, JOY_RETURNU, JOY_RETURNV +}; + +DWORD dwAxisMap[JOY_MAX_AXES]; +DWORD dwControlMap[JOY_MAX_AXES]; +PDWORD pdwRawValue[JOY_MAX_AXES]; + +// none of these cvars are saved over a session +// this means that advanced controller configuration needs to be executed +// each time. this avoids any problems with getting back to a default usage +// or when changing from one controller to another. this way at least something +// works. +cvar_t in_joystick = {CVAR_SAVE, "joystick","0"}; +cvar_t joy_name = {0, "joyname", "joystick"}; +cvar_t joy_advanced = {0, "joyadvanced", "0"}; +cvar_t joy_advaxisx = {0, "joyadvaxisx", "0"}; +cvar_t joy_advaxisy = {0, "joyadvaxisy", "0"}; +cvar_t joy_advaxisz = {0, "joyadvaxisz", "0"}; +cvar_t joy_advaxisr = {0, "joyadvaxisr", "0"}; +cvar_t joy_advaxisu = {0, "joyadvaxisu", "0"}; +cvar_t joy_advaxisv = {0, "joyadvaxisv", "0"}; +cvar_t joy_forwardthreshold = {0, "joyforwardthreshold", "0.15"}; +cvar_t joy_sidethreshold = {0, "joysidethreshold", "0.15"}; +cvar_t joy_pitchthreshold = {0, "joypitchthreshold", "0.15"}; +cvar_t joy_yawthreshold = {0, "joyyawthreshold", "0.15"}; +cvar_t joy_forwardsensitivity = {0, "joyforwardsensitivity", "-1.0"}; +cvar_t joy_sidesensitivity = {0, "joysidesensitivity", "-1.0"}; +cvar_t joy_pitchsensitivity = {0, "joypitchsensitivity", "1.0"}; +cvar_t joy_yawsensitivity = {0, "joyyawsensitivity", "-1.0"}; +cvar_t joy_wwhack1 = {0, "joywwhack1", "0.0"}; +cvar_t joy_wwhack2 = {0, "joywwhack2", "0.0"}; + +qboolean joy_avail, joy_advancedinit, joy_haspov; +DWORD joy_oldbuttonstate, joy_oldpovstate; + +int joy_id; +DWORD joy_flags; +DWORD joy_numbuttons; + +static LPDIRECTINPUT g_pdi; +static LPDIRECTINPUTDEVICE g_pMouse; + +static JOYINFOEX ji; + +static HINSTANCE hInstDI; + +//static qboolean dinput; + +typedef struct MYDATA { + LONG lX; // X axis goes here + LONG lY; // Y axis goes here + LONG lZ; // Z axis goes here + BYTE bButtonA; // One button goes here + BYTE bButtonB; // Another button goes here + BYTE bButtonC; // Another button goes here + BYTE bButtonD; // Another button goes here +} MYDATA; + +static DIOBJECTDATAFORMAT rgodf[] = { + { &GUID_XAxis, FIELD_OFFSET(MYDATA, lX), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, + { &GUID_YAxis, FIELD_OFFSET(MYDATA, lY), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, + { &GUID_ZAxis, FIELD_OFFSET(MYDATA, lZ), 0x80000000 | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, + { 0, FIELD_OFFSET(MYDATA, bButtonA), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, + { 0, FIELD_OFFSET(MYDATA, bButtonB), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, + { 0, FIELD_OFFSET(MYDATA, bButtonC), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, + { 0, FIELD_OFFSET(MYDATA, bButtonD), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, +}; + +#define NUM_OBJECTS (sizeof(rgodf) / sizeof(rgodf[0])) + +static DIDATAFORMAT df = { + sizeof(DIDATAFORMAT), // this structure + sizeof(DIOBJECTDATAFORMAT), // size of object data format + DIDF_RELAXIS, // absolute axis coordinates + sizeof(MYDATA), // device data size + NUM_OBJECTS, // number of objects + rgodf, // and here they are +}; + +// forward-referenced functions +void IN_StartupJoystick (void); +void Joy_AdvancedUpdate_f (void); +void IN_JoyMove (usercmd_t *cmd); + + +/* +=========== +IN_ShowMouse +=========== +*/ +void IN_ShowMouse (void) +{ + if (!mouseshowtoggle) + { + ShowCursor (true); + mouseshowtoggle = 1; + } +} + + +/* +=========== +IN_HideMouse +=========== +*/ +void IN_HideMouse (void) +{ + if (mouseshowtoggle) + { + ShowCursor (false); + mouseshowtoggle = 0; + } +} + + +/* +=========== +IN_ActivateMouse +=========== +*/ +void IN_ActivateMouse (void) +{ + + mouseactivatetoggle = true; + + if (mouseinitialized) + { + if (dinput) + { + if (g_pMouse) + { + if (!dinput_acquired) + { + IDirectInputDevice_Acquire(g_pMouse); + dinput_acquired = true; + } + } + else + { + return; + } + } + else + { + RECT window_rect; + window_rect.left = window_x; + window_rect.top = window_y; + window_rect.right = window_x + window_width; + window_rect.bottom = window_y + window_height; + + if (mouseparmsvalid) + restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0); + + SetCursorPos (window_center_x, window_center_y); + SetCapture (mainwindow); + ClipCursor (&window_rect); + } + + mouseactive = true; + } +} + + +/* +=========== +IN_DeactivateMouse +=========== +*/ +void IN_DeactivateMouse (void) +{ + + mouseactivatetoggle = false; + + if (mouseinitialized) + { + if (dinput) + { + if (g_pMouse) + { + if (dinput_acquired) + { + IDirectInputDevice_Unacquire(g_pMouse); + dinput_acquired = false; + } + } + } + else + { + if (restore_spi) + SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0); + + ClipCursor (NULL); + ReleaseCapture (); + } + + mouseactive = false; + } +} + + +/* +=========== +IN_InitDInput +=========== +*/ +qboolean IN_InitDInput (void) +{ + HRESULT hr; + DIPROPDWORD dipdw = { + { + sizeof(DIPROPDWORD), // diph.dwSize + sizeof(DIPROPHEADER), // diph.dwHeaderSize + 0, // diph.dwObj + DIPH_DEVICE, // diph.dwHow + }, + DINPUT_BUFFERSIZE, // dwData + }; + + if (!hInstDI) + { + hInstDI = LoadLibrary("dinput.dll"); + + if (hInstDI == NULL) + { + Con_SafePrintf ("Couldn't load dinput.dll\n"); + return false; + } + } + + if (!pDirectInputCreate) + { + pDirectInputCreate = (void *)GetProcAddress(hInstDI,"DirectInputCreateA"); + + if (!pDirectInputCreate) + { + Con_SafePrintf ("Couldn't get DI proc addr\n"); + return false; + } + } + +// register with DirectInput and get an IDirectInput to play with. + hr = iDirectInputCreate(global_hInstance, DIRECTINPUT_VERSION, &g_pdi, NULL); + + if (FAILED(hr)) + { + return false; + } + +// obtain an interface to the system mouse device. + hr = IDirectInput_CreateDevice(g_pdi, &GUID_SysMouse, &g_pMouse, NULL); + + if (FAILED(hr)) + { + Con_SafePrintf ("Couldn't open DI mouse device\n"); + return false; + } + +// set the data format to "mouse format". + hr = IDirectInputDevice_SetDataFormat(g_pMouse, &df); + + if (FAILED(hr)) + { + Con_SafePrintf ("Couldn't set DI mouse format\n"); + return false; + } + +// set the cooperativity level. + hr = IDirectInputDevice_SetCooperativeLevel(g_pMouse, mainwindow, + DISCL_EXCLUSIVE | DISCL_FOREGROUND); + + if (FAILED(hr)) + { + Con_SafePrintf ("Couldn't set DI coop level\n"); + return false; + } + + +// set the buffer size to DINPUT_BUFFERSIZE elements. +// the buffer size is a DWORD property associated with the device + hr = IDirectInputDevice_SetProperty(g_pMouse, DIPROP_BUFFERSIZE, &dipdw.diph); + + if (FAILED(hr)) + { + Con_SafePrintf ("Couldn't set DI buffersize\n"); + return false; + } + + return true; +} + + +/* +=========== +IN_StartupMouse +=========== +*/ +void IN_StartupMouse (void) +{ + if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) + return; + + mouseinitialized = true; + + if (COM_CheckParm ("-dinput")) + { + dinput = IN_InitDInput (); + + if (dinput) + { + Con_SafePrintf ("DirectInput initialized\n"); + } + else + { + Con_SafePrintf ("DirectInput not initialized\n"); + } + } + + if (!dinput) + { + mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0); + + if (mouseparmsvalid) + { + if ( COM_CheckParm ("-noforcemspd") ) + newmouseparms[2] = originalmouseparms[2]; + + if ( COM_CheckParm ("-noforcemaccel") ) + { + newmouseparms[0] = originalmouseparms[0]; + newmouseparms[1] = originalmouseparms[1]; + } + + if ( COM_CheckParm ("-noforcemparms") ) + { + newmouseparms[0] = originalmouseparms[0]; + newmouseparms[1] = originalmouseparms[1]; + newmouseparms[2] = originalmouseparms[2]; + } + } + } + + mouse_buttons = 3; + +// if a fullscreen video mode was set before the mouse was initialized, +// set the mouse state appropriately + if (mouseactivatetoggle) + IN_ActivateMouse (); +} + + +/* +=========== +IN_Init +=========== +*/ +void IN_Init (void) +{ + // joystick variables + Cvar_RegisterVariable (&in_joystick); + Cvar_RegisterVariable (&joy_name); + Cvar_RegisterVariable (&joy_advanced); + Cvar_RegisterVariable (&joy_advaxisx); + Cvar_RegisterVariable (&joy_advaxisy); + Cvar_RegisterVariable (&joy_advaxisz); + Cvar_RegisterVariable (&joy_advaxisr); + Cvar_RegisterVariable (&joy_advaxisu); + Cvar_RegisterVariable (&joy_advaxisv); + Cvar_RegisterVariable (&joy_forwardthreshold); + Cvar_RegisterVariable (&joy_sidethreshold); + Cvar_RegisterVariable (&joy_pitchthreshold); + Cvar_RegisterVariable (&joy_yawthreshold); + Cvar_RegisterVariable (&joy_forwardsensitivity); + Cvar_RegisterVariable (&joy_sidesensitivity); + Cvar_RegisterVariable (&joy_pitchsensitivity); + Cvar_RegisterVariable (&joy_yawsensitivity); + Cvar_RegisterVariable (&joy_wwhack1); + Cvar_RegisterVariable (&joy_wwhack2); + + Cmd_AddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f); + + uiWheelMessage = RegisterWindowMessage ( "MSWHEEL_ROLLMSG" ); + + IN_StartupMouse (); + IN_StartupJoystick (); +} + +/* +=========== +IN_Shutdown +=========== +*/ +void IN_Shutdown (void) +{ + IN_DeactivateMouse (); + IN_ShowMouse (); + + if (g_pMouse) + { + IDirectInputDevice_Release(g_pMouse); + g_pMouse = NULL; + } + + if (g_pdi) + { + IDirectInput_Release(g_pdi); + g_pdi = NULL; + } +} + + +/* +=========== +IN_MouseEvent +=========== +*/ +void IN_MouseEvent (int mstate) +{ + int i; + + if (mouseactive && !dinput) + { + // perform button actions + for (i=0 ; i 14000.0) + fTemp = 14000.0; + // restore direction information + fAxisValue = (fAxisValue > 0.0) ? fTemp : -fTemp; + } + } + + // convert range from -32768..32767 to -1..1 + fAxisValue /= 32768.0; + + switch (dwAxisMap[i]) + { + case AxisForward: + if ((joy_advanced.integer == 0) && mouselook) + { + // user wants forward control to become look control + if (fabs(fAxisValue) > joy_pitchthreshold.value) + { + // if mouse invert is on, invert the joystick pitch value + // only absolute control support here (joy_advanced is false) + if (m_pitch.value < 0.0) + { + cl.viewangles[PITCH] -= (fAxisValue * joy_pitchsensitivity.value) * aspeed * cl_pitchspeed.value; + } + else + { + cl.viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity.value) * aspeed * cl_pitchspeed.value; + } + V_StopPitchDrift(); + } + else + { + // no pitch movement + // disable pitch return-to-center unless requested by user + // *** this code can be removed when the lookspring bug is fixed + // *** the bug always has the lookspring feature on + if(lookspring.value == 0.0) + V_StopPitchDrift(); + } + } + else + { + // user wants forward control to be forward control + if (fabs(fAxisValue) > joy_forwardthreshold.value) + { + cmd->forwardmove += (fAxisValue * joy_forwardsensitivity.value) * speed * cl_forwardspeed.value; + } + } + break; + + case AxisSide: + if (fabs(fAxisValue) > joy_sidethreshold.value) + { + cmd->sidemove += (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; + } + break; + + case AxisTurn: + if ((in_strafe.state & 1) || (lookstrafe.integer && mouselook)) + { + // user wants turn control to become side control + if (fabs(fAxisValue) > joy_sidethreshold.value) + { + cmd->sidemove -= (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; + } + } + else + { + // user wants turn control to be turn control + if (fabs(fAxisValue) > joy_yawthreshold.value) + { + if(dwControlMap[i] == JOY_ABSOLUTE_AXIS) + { + cl.viewangles[YAW] += (fAxisValue * joy_yawsensitivity.value) * aspeed * cl_yawspeed.value; + } + else + { + cl.viewangles[YAW] += (fAxisValue * joy_yawsensitivity.value) * speed * 180.0; + } + + } + } + break; + + case AxisLook: + if (mouselook) + { + if (fabs(fAxisValue) > joy_pitchthreshold.value) + { + // pitch movement detected and pitch movement desired by user + if(dwControlMap[i] == JOY_ABSOLUTE_AXIS) + { + cl.viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity.value) * aspeed * cl_pitchspeed.value; + } + else + { + cl.viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity.value) * speed * 180.0; + } + V_StopPitchDrift(); + } + else + { + // no pitch movement + // disable pitch return-to-center unless requested by user + // *** this code can be removed when the lookspring bug is fixed + // *** the bug always has the lookspring feature on + if(lookspring.integer == 0) + V_StopPitchDrift(); + } + } + break; + + default: + break; + } + } } diff --git a/winquake.h b/winquake.h index fead9350..554f1ec9 100644 --- a/winquake.h +++ b/winquake.h @@ -24,10 +24,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include -#ifndef SERVERONLY #include #include -#endif #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A @@ -36,8 +34,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern HINSTANCE global_hInstance; extern int global_nCmdShow; -#ifndef SERVERONLY - extern LPDIRECTDRAW lpDD; extern LPDIRECTDRAWSURFACE lpPrimary; extern LPDIRECTDRAWSURFACE lpFrontBuffer; @@ -51,37 +47,13 @@ extern DWORD gSndBufSize; void VID_LockBuffer (void); void VID_UnlockBuffer (void); -#endif - -typedef enum {MS_WINDOWED, MS_FULLSCREEN, MS_FULLDIB, MS_UNINIT} modestate_t; - -extern modestate_t modestate; - extern HWND mainwindow; -void IN_ShowMouse (void); -void IN_DeactivateMouse (void); -void IN_HideMouse (void); -void IN_ActivateMouse (void); -void IN_MouseEvent (int mstate); - extern qboolean winsock_lib_initialized; -extern int window_center_x, window_center_y, window_x, window_y; -extern RECT window_rect; - -extern qboolean mouseinitialized; - -extern HANDLE hinput, houtput; - -void IN_UpdateClipCursor (void); -void CenterWindow(HWND hWndCenter, int width, int height, BOOL lefttopjustify); - void S_BlockSound (void); void S_UnblockSound (void); -void VID_SetDefaultMode (void); - int (PASCAL FAR *pWSAStartup)(WORD wVersionRequired, LPWSADATA lpWSAData); int (PASCAL FAR *pWSACleanup)(void); int (PASCAL FAR *pWSAGetLastError)(void);