mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-27 06:02:16 +00:00
2cad75bc69
Removed the impulse2/+forward2 etc commands. Added +p2, -p2, p2 commands as a prefixed command instead. don't use + or - on them (so '+p2 forward' to move player 2 forward), this permits a simple generic way to send commands to a single player from an input device. rawinput mice will submit commands/movements based upon idx%maxsplits, they will correctly submit mouse clicks, which will be mapped through the +p2/+p3 commands as appropriate, so each mouse is purely for a single player. Fixed player model visibility in splitscreen mode. Ignoring allow_splitscreen for the local player, cl_splitscreen is technically now the only enabler (though you will need to configure rawinput or binds). Added support for { texturename prefixes. git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3582 fc73d0e0-1445-4013-8a0c-d673dee63da5
363 lines
8 KiB
C
363 lines
8 KiB
C
#include "quakedef.h"
|
|
|
|
#include <SDL.h>
|
|
|
|
SDL_Surface *sdlsurf;
|
|
|
|
qboolean ActiveApp;
|
|
qboolean mouseactive;
|
|
extern qboolean mouseusedforgui;
|
|
extern qboolean vid_isfullscreen;
|
|
|
|
void IN_ActivateMouse(void)
|
|
{
|
|
if (mouseactive)
|
|
return;
|
|
|
|
mouseactive = true;
|
|
SDL_ShowCursor(0);
|
|
SDL_WM_GrabInput(SDL_GRAB_ON);
|
|
}
|
|
|
|
void IN_DeactivateMouse(void)
|
|
{
|
|
if (!mouseactive)
|
|
return;
|
|
|
|
mouseactive = false;
|
|
SDL_ShowCursor(1);
|
|
SDL_WM_GrabInput(SDL_GRAB_OFF);
|
|
}
|
|
|
|
void IN_UpdateGrabs(int fullscreen, int activeapp)
|
|
{
|
|
if (!vid_isfullscreen)
|
|
{
|
|
if (!_windowed_mouse.value)
|
|
{
|
|
if (mouseactive)
|
|
{
|
|
IN_DeactivateMouse ();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((key_dest == key_game||mouseusedforgui) && ActiveApp)
|
|
IN_ActivateMouse ();
|
|
else if (!(key_dest == key_game || mouseusedforgui) || !ActiveApp)
|
|
IN_DeactivateMouse ();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
#define tenoh 0,0,0,0,0, 0,0,0,0,0
|
|
#define fiftyoh tenoh, tenoh, tenoh, tenoh, tenoh
|
|
#define hundredoh fiftyoh, fiftyoh
|
|
static unsigned int tbl_sdltoquake[] =
|
|
{
|
|
0,0,0,0, //SDLK_UNKNOWN = 0,
|
|
0,0,0,0, //SDLK_FIRST = 0,
|
|
K_BACKSPACE, //SDLK_BACKSPACE = 8,
|
|
K_TAB, //SDLK_TAB = 9,
|
|
0,0,
|
|
0, //SDLK_CLEAR = 12,
|
|
K_ENTER, //SDLK_RETURN = 13,
|
|
0,0,0,0,0,
|
|
K_PAUSE, //SDLK_PAUSE = 19,
|
|
0,0,0,0,0,0,0,
|
|
K_ESCAPE, //SDLK_ESCAPE = 27,
|
|
0,0,0,0,
|
|
K_SPACE, //SDLK_SPACE = 32,
|
|
'!', //SDLK_EXCLAIM = 33,
|
|
'"', //SDLK_QUOTEDBL = 34,
|
|
'#', //SDLK_HASH = 35,
|
|
'$', //SDLK_DOLLAR = 36,
|
|
0,
|
|
'&', //SDLK_AMPERSAND = 38,
|
|
'\'', //SDLK_QUOTE = 39,
|
|
'(', //SDLK_LEFTPAREN = 40,
|
|
')', //SDLK_RIGHTPAREN = 41,
|
|
'*', //SDLK_ASTERISK = 42,
|
|
'+', //SDLK_PLUS = 43,
|
|
',', //SDLK_COMMA = 44,
|
|
'-', //SDLK_MINUS = 45,
|
|
'.', //SDLK_PERIOD = 46,
|
|
'/', //SDLK_SLASH = 47,
|
|
'0', //SDLK_0 = 48,
|
|
'1', //SDLK_1 = 49,
|
|
'2', //SDLK_2 = 50,
|
|
'3', //SDLK_3 = 51,
|
|
'4', //SDLK_4 = 52,
|
|
'5', //SDLK_5 = 53,
|
|
'6', //SDLK_6 = 54,
|
|
'7', //SDLK_7 = 55,
|
|
'8', //SDLK_8 = 56,
|
|
'9', //SDLK_9 = 57,
|
|
':', //SDLK_COLON = 58,
|
|
';', //SDLK_SEMICOLON = 59,
|
|
'<', //SDLK_LESS = 60,
|
|
'=', //SDLK_EQUALS = 61,
|
|
'>', //SDLK_GREATER = 62,
|
|
'?', //SDLK_QUESTION = 63,
|
|
'@', //SDLK_AT = 64,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
'[', //SDLK_LEFTBRACKET = 91,
|
|
'\\', //SDLK_BACKSLASH = 92,
|
|
']', //SDLK_RIGHTBRACKET = 93,
|
|
'^', //SDLK_CARET = 94,
|
|
'_', //SDLK_UNDERSCORE = 95,
|
|
'`', //SDLK_BACKQUOTE = 96,
|
|
'a', //SDLK_a = 97,
|
|
'b', //SDLK_b = 98,
|
|
'c', //SDLK_c = 99,
|
|
'd', //SDLK_d = 100,
|
|
'e', //SDLK_e = 101,
|
|
'f', //SDLK_f = 102,
|
|
'g', //SDLK_g = 103,
|
|
'h', //SDLK_h = 104,
|
|
'i', //SDLK_i = 105,
|
|
'j', //SDLK_j = 106,
|
|
'k', //SDLK_k = 107,
|
|
'l', //SDLK_l = 108,
|
|
'm', //SDLK_m = 109,
|
|
'n', //SDLK_n = 110,
|
|
'o', //SDLK_o = 111,
|
|
'p', //SDLK_p = 112,
|
|
'q', //SDLK_q = 113,
|
|
'r', //SDLK_r = 114,
|
|
's', //SDLK_s = 115,
|
|
't', //SDLK_t = 116,
|
|
'u', //SDLK_u = 117,
|
|
'v', //SDLK_v = 118,
|
|
'w', //SDLK_w = 119,
|
|
'x', //SDLK_x = 120,
|
|
'y', //SDLK_y = 121,
|
|
'z', //SDLK_z = 122,
|
|
0,0,0,0,
|
|
K_DEL, //SDLK_DELETE = 127,
|
|
hundredoh /*227*/, tenoh, tenoh, 0,0,0,0,0,0,0,0,
|
|
K_KP_INS, //SDLK_KP0 = 256,
|
|
K_KP_END, //SDLK_KP1 = 257,
|
|
K_KP_DOWNARROW, //SDLK_KP2 = 258,
|
|
K_KP_PGDN, //SDLK_KP3 = 259,
|
|
K_KP_LEFTARROW, //SDLK_KP4 = 260,
|
|
K_KP_5, //SDLK_KP5 = 261,
|
|
K_KP_RIGHTARROW, //SDLK_KP6 = 262,
|
|
K_KP_HOME, //SDLK_KP7 = 263,
|
|
K_KP_UPARROW, //SDLK_KP8 = 264,
|
|
K_KP_PGUP, //SDLK_KP9 = 265,
|
|
K_KP_DEL,//SDLK_KP_PERIOD = 266,
|
|
K_KP_SLASH,//SDLK_KP_DIVIDE = 267,
|
|
K_KP_STAR,//SDLK_KP_MULTIPLY= 268,
|
|
K_KP_MINUS, //SDLK_KP_MINUS = 269,
|
|
K_KP_PLUS, //SDLK_KP_PLUS = 270,
|
|
K_KP_ENTER, //SDLK_KP_ENTER = 271,
|
|
K_KP_EQUALS,//SDLK_KP_EQUALS = 272,
|
|
K_UPARROW, //SDLK_UP = 273,
|
|
K_DOWNARROW,//SDLK_DOWN = 274,
|
|
K_RIGHTARROW,//SDLK_RIGHT = 275,
|
|
K_LEFTARROW,//SDLK_LEFT = 276,
|
|
K_INS, //SDLK_INSERT = 277,
|
|
K_HOME, //SDLK_HOME = 278,
|
|
K_END, //SDLK_END = 279,
|
|
K_PGUP, //SDLK_PAGEUP = 280,
|
|
K_PGDN, //SDLK_PAGEDOWN = 281,
|
|
K_F1, //SDLK_F1 = 282,
|
|
K_F2, //SDLK_F2 = 283,
|
|
K_F3, //SDLK_F3 = 284,
|
|
K_F4, //SDLK_F4 = 285,
|
|
K_F5, //SDLK_F5 = 286,
|
|
K_F6, //SDLK_F6 = 287,
|
|
K_F7, //SDLK_F7 = 288,
|
|
K_F8, //SDLK_F8 = 289,
|
|
K_F9, //SDLK_F9 = 290,
|
|
K_F10, //SDLK_F10 = 291,
|
|
K_F11, //SDLK_F11 = 292,
|
|
K_F12, //SDLK_F12 = 293,
|
|
0, //SDLK_F13 = 294,
|
|
0, //SDLK_F14 = 295,
|
|
0, //SDLK_F15 = 296,
|
|
0,0,0,
|
|
0,//K_NUMLOCK, //SDLK_NUMLOCK = 300,
|
|
K_CAPSLOCK, //SDLK_CAPSLOCK = 301,
|
|
0,//K_SCROLLOCK,//SDLK_SCROLLOCK= 302,
|
|
K_SHIFT, //SDLK_RSHIFT = 303,
|
|
K_SHIFT, //SDLK_LSHIFT = 304,
|
|
K_CTRL, //SDLK_RCTRL = 305,
|
|
K_CTRL, //SDLK_LCTRL = 306,
|
|
K_ALT, //SDLK_RALT = 307,
|
|
K_ALT, //SDLK_LALT = 308,
|
|
0, //SDLK_RMETA = 309,
|
|
0, //SDLK_LMETA = 310,
|
|
0, //SDLK_LSUPER = 311, /* Left "Windows" key */
|
|
0, //SDLK_RSUPER = 312, /* Right "Windows" key */
|
|
0, //SDLK_MODE = 313, /* "Alt Gr" key */
|
|
0, //SDLK_COMPOSE = 314, /* Multi-key compose key */
|
|
0, //SDLK_HELP = 315,
|
|
0, //SDLK_PRINT = 316,
|
|
0, //SDLK_SYSREQ = 317,
|
|
K_PAUSE, //SDLK_BREAK = 318,
|
|
0, //SDLK_MENU = 319,
|
|
0, //SDLK_POWER = 320, /* Power Macintosh power key */
|
|
'e', //SDLK_EURO = 321, /* Some european keyboards */
|
|
0 //SDLK_UNDO = 322, /* Atari keyboard has Undo */
|
|
};
|
|
|
|
static unsigned int tbl_sdltoquakemouse[] =
|
|
{
|
|
K_MOUSE1,
|
|
K_MOUSE3,
|
|
K_MOUSE2,
|
|
K_MWHEELUP,
|
|
K_MWHEELDOWN,
|
|
K_MOUSE4,
|
|
K_MOUSE5,
|
|
K_MOUSE6,
|
|
K_MOUSE7,
|
|
K_MOUSE8,
|
|
K_MOUSE9,
|
|
K_MOUSE10
|
|
};
|
|
|
|
int mouse_x, mouse_y;
|
|
|
|
#ifdef SWQUAKE
|
|
void ResetFrameBuffers(void);
|
|
#endif
|
|
|
|
void Sys_SendKeyEvents(void)
|
|
{
|
|
SDL_Event event;
|
|
while(SDL_PollEvent(&event))
|
|
{
|
|
switch(event.type)
|
|
{
|
|
case SDL_ACTIVEEVENT:
|
|
if (event.active.state & SDL_APPINPUTFOCUS)
|
|
{ //follow keyboard status
|
|
ActiveApp = !!event.active.gain;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case SDL_VIDEORESIZE:
|
|
switch(qrenderer)
|
|
{
|
|
#ifdef GLQUAKE
|
|
case QR_OPENGL:
|
|
vid.pixelwidth = event.resize.w;
|
|
vid.pixelheight = event.resize.h;
|
|
break;
|
|
#endif
|
|
#ifdef SWQUAKE
|
|
case QR_SOFTWARE:
|
|
vid.width = event.resize.w;
|
|
vid.height = event.resize.h;
|
|
ResetFrameBuffers();
|
|
break;
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
case SDL_KEYUP:
|
|
case SDL_KEYDOWN:
|
|
Key_Event(0, tbl_sdltoquake[event.key.keysym.sym], event.key.keysym.unicode, event.key.state);
|
|
break;
|
|
|
|
case SDL_MOUSEMOTION:
|
|
mouse_x += event.motion.xrel;
|
|
mouse_y += event.motion.yrel;
|
|
break;
|
|
|
|
case SDL_MOUSEBUTTONDOWN:
|
|
case SDL_MOUSEBUTTONUP:
|
|
//Hmm. SDL allows for 255 buttons...
|
|
if (event.button.button > sizeof(tbl_sdltoquakemouse)/sizeof(tbl_sdltoquakemouse[0]))
|
|
event.button.button = sizeof(tbl_sdltoquakemouse)/sizeof(tbl_sdltoquakemouse[0]);
|
|
Key_Event(0, tbl_sdltoquakemouse[event.button.button-1], 0, event.button.state);
|
|
break;
|
|
|
|
case SDL_QUIT:
|
|
Cbuf_AddText("quit", RESTRICT_LOCAL);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void IN_Shutdown (void)
|
|
{
|
|
}
|
|
|
|
void IN_ReInit (void)
|
|
{
|
|
IN_ActivateMouse();
|
|
|
|
SDL_EnableUNICODE(SDL_ENABLE);
|
|
}
|
|
|
|
void IN_Init (void)
|
|
{
|
|
#ifdef IN_XFLIP
|
|
Cvar_Register (&in_xflip, "Input Controls");
|
|
#endif
|
|
IN_ReInit();
|
|
}
|
|
void IN_Move (float *movements, int pnum) //add mouse movement to cmd
|
|
{
|
|
#ifdef PEXT_CSQC
|
|
if (CSQC_MouseMove(mouse_x, mouse_y))
|
|
{
|
|
mouse_x = 0;
|
|
mouse_y = 0;
|
|
}
|
|
#endif
|
|
mouse_x *= sensitivity.value*in_sensitivityscale;
|
|
mouse_y *= sensitivity.value*in_sensitivityscale;
|
|
|
|
|
|
if (!cl.paused && mouseactive)
|
|
{
|
|
// add mouse X/Y movement to cmd
|
|
if ( (in_strafe.state[pnum] & 1) || (lookstrafe.value && (in_mlook.state[pnum] & 1) ))
|
|
movements[1] += m_side.value * mouse_x;
|
|
else
|
|
cl.viewangles[pnum][YAW] -= m_yaw.value * mouse_x;
|
|
|
|
if (in_mlook.state[pnum] & 1)
|
|
V_StopPitchDrift (pnum);
|
|
|
|
if ( (in_mlook.state[pnum] & 1) && !(in_strafe.state[pnum] & 1))
|
|
{
|
|
cl.viewangles[pnum][PITCH] += m_pitch.value * mouse_y;
|
|
|
|
CL_ClampPitch(pnum);
|
|
}
|
|
else
|
|
{
|
|
if ((in_strafe.state[pnum] & 1) && noclip_anglehack)
|
|
movements[2] -= m_forward.value * mouse_y;
|
|
else
|
|
movements[0] -= m_forward.value * mouse_y;
|
|
}
|
|
}
|
|
|
|
mouse_x = 0;
|
|
mouse_y = 0;
|
|
}
|
|
void IN_Accumulate(void) //input polling
|
|
{
|
|
}
|
|
void IN_Commands (void) //used to Cbuf_AddText joystick button events in windows.
|
|
{
|
|
}
|
|
|
|
|
|
|