BOOL (WINAPI *qwglSwapIntervalEXT)(int interval);
const char *(WINAPI *qwglGetExtensionsStringARB)(HDC hdc);
-static gl_extensionfunctionlist_t wglfuncs[] =
+static dllfunction_t wglfuncs[] =
{
{"wglChoosePixelFormat", (void **) &qwglChoosePixelFormat},
{"wglDescribePixelFormat", (void **) &qwglDescribePixelFormat},
{NULL, NULL}
};
-static gl_extensionfunctionlist_t wglswapintervalfuncs[] =
+static dllfunction_t wglswapintervalfuncs[] =
{
{"wglSwapIntervalEXT", (void **) &qwglSwapIntervalEXT},
{NULL, NULL}
};
-void VID_RestoreGameGamma(void);
-void VID_GetSystemGamma(void);
-void VID_RestoreSystemGamma(void);
-
qboolean scr_skipupdate;
static DEVMODE gdevmode;
HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion,
LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter);
+// LordHavoc: thanks to backslash for this support for mouse buttons 4 and 5
+/* backslash :: imouse explorer buttons */
+/* These are #ifdefed out for non-Win2K in the February 2001 version of
+ MS's platform SDK, but we need them for compilation. . . */
+#ifndef WM_XBUTTONDOWN
+ #define WM_XBUTTONDOWN 0x020B
+ #define WM_XBUTTONUP 0x020C
+#endif
+#ifndef MK_XBUTTON1
+ #define MK_XBUTTON1 0x0020
+ #define MK_XBUTTON2 0x0040
+// LordHavoc: lets hope this allows more buttons in the future...
+ #define MK_XBUTTON3 0x0080
+ #define MK_XBUTTON4 0x0100
+ #define MK_XBUTTON5 0x0200
+ #define MK_XBUTTON6 0x0400
+ #define MK_XBUTTON7 0x0800
+#endif
+/* :: backslash */
+
// mouse variables
int mouse_buttons;
int mouse_oldbuttonstate;
void IN_StartupJoystick (void);
void Joy_AdvancedUpdate_f (void);
void IN_JoyMove (usercmd_t *cmd);
+void IN_StartupMouse (void);
/*
================
qbyte scantokey[128] =
{
-// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0 ,27 ,'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,'0' ,'-' ,'=' ,K_BACKSPACE,9 , // 0
- 'q' ,'w' ,'e' ,'r' ,'t' ,'y' ,'u' ,'i' ,'o' ,'p' ,'[' ,']' ,13 ,K_CTRL ,'a' ,'s' , // 1
- 'd' ,'f' ,'g' ,'h' ,'j' ,'k' ,'l' ,';' ,'\'' ,'`' ,K_SHIFT,'\\' ,'z' ,'x' ,'c' ,'v' , // 2
- 'b' ,'n' ,'m' ,',' ,'.' ,'/' ,K_SHIFT,'*' ,K_ALT ,' ' ,0 ,K_F1 ,K_F2 ,K_F3 ,K_F4 ,K_F5 , // 3
- K_F6 ,K_F7 ,K_F8 ,K_F9 ,K_F10,K_PAUSE,0 ,K_HOME,K_UPARROW,K_PGUP,'-' ,K_LEFTARROW,'5' ,K_RIGHTARROW,'+' ,K_END , // 4
- K_DOWNARROW,K_PGDN,K_INS,K_DEL,0 ,0 ,0 ,K_F11 ,K_F12 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
+// 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0 ,27 ,'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,'0' ,'-' ,'=' ,K_BACKSPACE,9 ,//0
+ 'q' ,'w' ,'e' ,'r' ,'t' ,'y' ,'u' ,'i' ,'o' ,'p' ,'[' ,']' ,13 ,K_CTRL ,'a' ,'s' ,//1
+ 'd' ,'f' ,'g' ,'h' ,'j' ,'k' ,'l' ,';' ,'\'' ,'`' ,K_SHIFT ,'\\' ,'z' ,'x' ,'c' ,'v' ,//2
+ 'b' ,'n' ,'m' ,',' ,'.' ,'/' ,K_SHIFT,'*' ,K_ALT ,' ' ,0 ,K_F1 ,K_F2 ,K_F3 ,K_F4 ,K_F5 ,//3
+ K_F6 ,K_F7 ,K_F8 ,K_F9 ,K_F10,K_PAUSE,0 ,K_HOME,K_UPARROW,K_PGUP,K_KP_MINUS,K_LEFTARROW,K_KP_5,K_RIGHTARROW,K_KP_PLUS ,K_END,//4
+ K_DOWNARROW,K_PGDN,K_INS,K_DEL,0 ,0 ,0 ,K_F11 ,K_F12 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,//5
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,//6
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 //7
};
*/
int MapKey (int key, int virtualkey)
{
- key = (key>>16)&255;
- if (key > 127)
- return 0;
- if (scantokey[key] == 0)
- Con_DPrintf("key 0x%02x has no translation\n", key);
- return scantokey[key];
+ int result;
+ int modified = (key >> 16) & 255;
+ qboolean is_extended = false;
+
+ if (modified < 128 && scantokey[modified])
+ result = scantokey[modified];
+ else
+ {
+ result = 0;
+ Con_DPrintf("key 0x%02x (0x%8x, 0x%8x) has no translation\n", modified, key, virtualkey);
+ }
+
+ if (key & (1 << 24))
+ is_extended = true;
+
+ if ( !is_extended )
+ {
+ switch ( result )
+ {
+ case K_HOME:
+ return K_KP_HOME;
+ case K_UPARROW:
+ return K_KP_UPARROW;
+ case K_PGUP:
+ return K_KP_PGUP;
+ case K_LEFTARROW:
+ return K_KP_LEFTARROW;
+ case K_RIGHTARROW:
+ return K_KP_RIGHTARROW;
+ case K_END:
+ return K_KP_END;
+ case K_DOWNARROW:
+ return K_KP_DOWNARROW;
+ case K_PGDN:
+ return K_KP_PGDN;
+ case K_INS:
+ return K_KP_INS;
+ case K_DEL:
+ return K_KP_DEL;
+ default:
+ return result;
+ }
+ }
+ else
+ {
+ switch ( result )
+ {
+ case 0x0D:
+ return K_KP_ENTER;
+ case 0x2F:
+ return K_KP_SLASH;
+ case 0xAF:
+ return K_KP_PLUS;
+ }
+ return result;
+ }
}
/*
IN_ClearStates ();
}
-void VID_RestoreGameGamma(void);
extern qboolean host_loopactive;
void AppActivate(BOOL fActive, BOOL minimize)
if (fActive)
{
+ vid_allowhwgamma = true;
if (vid_isfullscreen)
{
if (vid_wassuspended)
// LordHavoc: from dabb, fix for alt-tab bug in NVidia drivers
MoveWindow(mainwindow,0,0,gdevmode.dmPelsWidth,gdevmode.dmPelsHeight,false);
}
- if (host_loopactive)
- VID_RestoreGameGamma();
}
if (!fActive)
{
+ vid_allowhwgamma = false;
vid_usingmouse = false;
IN_DeactivateMouse ();
IN_ShowMouse ();
case WM_RBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
+ case WM_XBUTTONDOWN: // backslash :: imouse explorer buttons
+ case WM_XBUTTONUP: // backslash :: imouse explorer buttons
case WM_MOUSEMOVE:
temp = 0;
if (wParam & MK_MBUTTON)
temp |= 4;
+ /* backslash :: imouse explorer buttons */
+ if (wParam & MK_XBUTTON1)
+ temp |= 8;
+
+ if (wParam & MK_XBUTTON2)
+ temp |= 16;
+ /* :: backslash */
+
+ // LordHavoc: lets hope this allows more buttons in the future...
+ if (wParam & MK_XBUTTON3)
+ temp |= 32;
+ if (wParam & MK_XBUTTON4)
+ temp |= 64;
+ if (wParam & MK_XBUTTON5)
+ temp |= 128;
+ if (wParam & MK_XBUTTON6)
+ temp |= 256;
+ if (wParam & MK_XBUTTON7)
+ temp |= 512;
+
IN_MouseEvent (temp);
break;
break;
- case WM_DESTROY:
- {
- if (mainwindow)
- DestroyWindow (mainwindow);
-
- PostQuitMessage (0);
- }
- break;
+ //case WM_DESTROY:
+ // PostQuitMessage (0);
+ // break;
case MM_MCINOTIFY:
lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam);
return lRet;
}
-
-//static int grabsysgamma = true;
-WORD systemgammaramps[3][256], currentgammaramps[3][256];
-
-int VID_SetGamma(float prescale, float gamma, float scale, float base)
+int VID_SetGamma(unsigned short *ramps)
{
- 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];
-
- i = SetDeviceGammaRamp(hdc, ¤tgammaramps[0][0]);
-
+ HDC hdc = GetDC (NULL);
+ int i = SetDeviceGammaRamp(hdc, ramps);
ReleaseDC (NULL, hdc);
return i; // return success or failure
}
-void VID_RestoreGameGamma(void)
-{
- VID_UpdateGamma(true);
-}
-
-void VID_GetSystemGamma(void)
+int VID_GetGamma(unsigned short *ramps)
{
- HDC hdc;
- hdc = GetDC (NULL);
-
- GetDeviceGammaRamp(hdc, &systemgammaramps[0][0]);
-
+ HDC hdc = GetDC (NULL);
+ int i = GetDeviceGammaRamp(hdc, ramps);
ReleaseDC (NULL, hdc);
+ return i; // return success or failure
}
-void VID_RestoreSystemGamma(void)
-{
- HDC hdc;
- hdc = GetDC (NULL);
-
- SetDeviceGammaRamp(hdc, &systemgammaramps[0][0]);
-
- ReleaseDC (NULL, hdc);
-}
-
-//========================================================
-// Video menu stuff
-//========================================================
-
-#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;
-
-typedef struct
-{
- 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_MenuDraw
-================
-*/
-void VID_MenuDraw (void)
-{
- cachepic_t *p;
- char *ptr;
- int lnummodes, i, k, column, row;
- vmode_t *pv;
-
- p = Draw_CachePic ("gfx/vidmodes.lmp");
- M_DrawPic ( (320-p->width)/2, 4, "gfx/vidmodes.lmp");
-
- vid_wmodes = 0;
- lnummodes = VID_NumModes ();
-
- for (i=1 ; (i<lnummodes) && (vid_wmodes < MAX_MODEDESCS) ; i++)
- {
- ptr = VID_GetModeDescription (i);
- pv = VID_GetModePtr (i);
-
- k = vid_wmodes;
-
- modedescs[k].modenum = i;
- modedescs[k].desc = ptr;
- modedescs[k].iscur = 0;
-
- if (i == vid_modenum)
- modedescs[k].iscur = 1;
-
- vid_wmodes++;
-
- }
-
- if (vid_wmodes > 0)
- {
- M_Print (2*8, 36+0*8, "Fullscreen Modes (WIDTHxHEIGHTxBPP)");
-
- column = 8;
- row = 36+2*8;
-
- for (i=0 ; i<vid_wmodes ; i++)
- {
- if (modedescs[i].iscur)
- M_PrintWhite (column, row, modedescs[i].desc);
- else
- M_Print (column, row, modedescs[i].desc);
-
- column += 13*8;
-
- if ((i % VID_ROW_SIZE) == (VID_ROW_SIZE - 1))
- {
- column = 8;
- row += 8;
- }
- }
- }
-
- M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*2, "Video modes must be set from the");
- M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*3, "command line with -width <width>");
- M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4, "and -bpp <bits-per-pixel>");
- M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6, "Select windowed mode with -window");
-}
-
-
-/*
-================
-VID_MenuKey
-================
-*/
-void VID_MenuKey (int key)
-{
- switch (key)
- {
- case K_ESCAPE:
- S_LocalSound ("misc/menu1.wav");
- M_Menu_Options_f ();
- break;
-
- default:
- break;
- }
-}
-#endif
-
static HINSTANCE gldll;
int GL_OpenLibrary(const char *name)
{
- Con_Printf("Loading GL driver %s\n", name);
+ Con_Printf("Loading OpenGL driver %s\n", name);
GL_CloseLibrary();
if (!(gldll = LoadLibrary(name)))
{
HGLRC baseRC;
int CenterX, CenterY;
const char *gldrivername;
-
+
if (vid_initialized)
Sys_Error("VID_InitMode called when video is already initialised\n");
+ // if stencil is enabled, ask for alpha too
if (stencil)
+ {
pfd.cStencilBits = 8;
+ pfd.cAlphaBits = 8;
+ }
else
+ {
pfd.cStencilBits = 0;
+ pfd.cAlphaBits = 0;
+ }
gldrivername = "opengl32.dll";
i = COM_CheckParm("-gl_driver");
memset(&gdevmode, 0, sizeof(gdevmode));
- VID_GetSystemGamma();
-
vid_isfullscreen = false;
if (fullscreen)
{
mainwindow = CreateWindowEx (ExWindowStyle, "DarkPlacesWindowClass", gamename, WindowStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, global_hInstance, NULL);
if (!mainwindow)
{
+ Con_Printf("CreateWindowEx(%d, %s, %s, %d, %d, %d, %d, %d, %p, %p, %d, %p) failed\n", ExWindowStyle, "DarkPlacesWindowClass", gamename, WindowStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, global_hInstance, NULL);
VID_Shutdown();
- Con_Printf("CreateWindowEx(%d, %s, %s, %d, %d, %d, %d, %d, %p, %p, %d, %p) failed\n", ExWindowStyle, gamename, gamename, WindowStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, global_hInstance, NULL);
return false;
}
// 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)
HGLRC hRC = 0;
HDC hDC = 0;
- if (vid_initialized)
- {
- vid_initialized = false;
- IN_Shutdown();
-
- 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 (vid_isfullscreen)
- ChangeDisplaySettings (NULL, 0);
-
- AppActivate(false, false);
-
- VID_RestoreSystemGamma();
- }
+ VID_RestoreSystemGamma();
+
+ vid_initialized = false;
+ IN_Shutdown();
+ 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);
+ AppActivate(false, false);
+ if (mainwindow)
+ DestroyWindow(mainwindow);
+ mainwindow = 0;
+ if (vid_isfullscreen)
+ ChangeDisplaySettings (NULL, 0);
+ vid_isfullscreen = false;
}
if (!hInstDI)
{
hInstDI = LoadLibrary("dinput.dll");
-
+
if (hInstDI == NULL)
{
Con_SafePrintf ("Couldn't load dinput.dll\n");
*/
void IN_StartupMouse (void)
{
- if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe"))
+ if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe"))
return;
mouseinitialized = true;
if (mouseparmsvalid)
{
- if ( COM_CheckParm ("-noforcemspd") )
+ if ( COM_CheckParm ("-noforcemspd") )
newmouseparms[2] = originalmouseparms[2];
- if ( COM_CheckParm ("-noforcemaccel") )
+ if ( COM_CheckParm ("-noforcemaccel") )
{
newmouseparms[0] = originalmouseparms[0];
newmouseparms[1] = originalmouseparms[1];
}
- if ( COM_CheckParm ("-noforcemparms") )
+ if ( COM_CheckParm ("-noforcemparms") )
{
newmouseparms[0] = originalmouseparms[0];
newmouseparms[1] = originalmouseparms[1];
}
}
- mouse_buttons = 3;
+ mouse_buttons = 10;
// if a fullscreen video mode was set before the mouse was initialized,
// set the mouse state appropriately
{
Key_Event (K_MOUSE1 + i, false);
}
- }
-
+ }
+
mouse_oldbuttonstate = mstate;
}
}
}
-/*
-===============
-IN_StartupJoystick
+/*
===============
-*/
-void IN_StartupJoystick (void)
+IN_StartupJoystick
+===============
+*/
+void IN_StartupJoystick (void)
{
int numdevs;
JOYCAPS jc;
MMRESULT mmr;
mmr = 0;
-
+
// assume no joystick
- joy_avail = false;
+ joy_avail = false;
// abort startup if user requests no joystick
- if (COM_CheckParm ("-nojoy") || COM_CheckParm("-safe"))
- return;
-
+ if (COM_CheckParm ("-nojoy") || COM_CheckParm("-safe"))
+ return;
+
// verify joystick driver is present
if ((numdevs = joyGetNumDevs ()) == 0)
{
if ((mmr = joyGetPosEx (joy_id, &ji)) == JOYERR_NOERROR)
break;
- }
+ }
// abort startup if we didn't find a valid joystick
if (mmr != JOYERR_NOERROR)
memset (&jc, 0, sizeof(jc));
if ((mmr = joyGetDevCaps (joy_id, &jc, sizeof(jc))) != JOYERR_NOERROR)
{
- Con_Printf ("\njoystick not found -- invalid joystick capabilities (%x)\n\n", mmr);
+ Con_Printf ("\njoystick not found -- invalid joystick capabilities (%x)\n\n", mmr);
return;
}
// mark the joystick as available and advanced initialization not completed
// this is needed as cvars are not available during initialization
- joy_avail = true;
+ joy_avail = true;
joy_advancedinit = false;
- Con_Printf ("\njoystick detected\n\n");
+ Con_Printf ("\njoystick detected\n\n");
}
}
-/*
-===============
+/*
+===============
IN_ReadJoystick
-===============
-*/
+===============
+*/
qboolean IN_ReadJoystick (void)
{
// verify joystick is available and that the user wants to use it
if (!joy_avail || !in_joystick.integer)
{
- return;
+ return;
}
// collect the joystick data, if possible
}
}
- // convert range from -32768..32767 to -1..1
+ // convert range from -32768..32767 to -1..1
fAxisValue /= 32768.0;
switch (dwAxisMap[i])
{
// 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)