Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

rw_in_svgalib.c (8584B)


      1 #include <termios.h>
      2 #include <sys/ioctl.h>
      3 #include <sys/stat.h>
      4 #include <sys/vt.h>
      5 #include <stdarg.h>
      6 #include <stdio.h>
      7 #include <signal.h>
      8 #include <sys/mman.h>
      9 
     10 #include <asm/io.h>
     11 
     12 #include "vga.h"
     13 #include "vgakeyboard.h"
     14 #include "vgamouse.h"
     15 
     16 #include "../ref_soft/r_local.h"
     17 #include "../client/keys.h"
     18 #include "../linux/rw_linux.h"
     19 
     20 /*****************************************************************************/
     21 /* KEYBOARD                                                                  */
     22 /*****************************************************************************/
     23 
     24 static unsigned char scantokey[128];
     25 Key_Event_fp_t Key_Event_fp;
     26 
     27 static void keyhandler(int scancode, int state)
     28 {
     29 	int sc;
     30 
     31 	sc = scancode & 0x7f;
     32 //ri.Con_Printf(PRINT_ALL, "scancode=%x (%d%s)\n", scancode, sc, scancode&0x80?"+128":"");
     33 	Key_Event_fp(scantokey[sc], state == KEY_EVENTPRESS);
     34 }
     35 
     36 void KBD_Init(Key_Event_fp_t fp)
     37 {
     38 	int i;
     39 
     40 	Key_Event_fp = fp;
     41 
     42 	for (i=0 ; i<128 ; i++)
     43 		scantokey[i] = ' ';
     44 
     45 	scantokey[  1] = K_ESCAPE;
     46 	scantokey[  2] = '1';
     47 	scantokey[  3] = '2';
     48 	scantokey[  4] = '3';
     49 	scantokey[  5] = '4';
     50 	scantokey[  6] = '5';
     51 	scantokey[  7] = '6';
     52 	scantokey[  8] = '7';
     53 	scantokey[  9] = '8';
     54 	scantokey[ 10] = '9';
     55 	scantokey[ 11] = '0';
     56 	scantokey[ 12] = '-';
     57 	scantokey[ 13] = '=';
     58 	scantokey[ 14] = K_BACKSPACE;
     59 	scantokey[ 15] = K_TAB;
     60 	scantokey[ 16] = 'q';       
     61 	scantokey[ 17] = 'w';       
     62 	scantokey[ 18] = 'e';       
     63 	scantokey[ 19] = 'r';       
     64 	scantokey[ 20] = 't';       
     65 	scantokey[ 21] = 'y';       
     66 	scantokey[ 22] = 'u';       
     67 	scantokey[ 23] = 'i';       
     68 	scantokey[ 24] = 'o';       
     69 	scantokey[ 25] = 'p';       
     70 	scantokey[ 26] = '[';
     71 	scantokey[ 27] = ']';
     72 	scantokey[ 28] = K_ENTER;
     73 	scantokey[ 29] = K_CTRL; //left
     74 	scantokey[ 30] = 'a';
     75 	scantokey[ 31] = 's';       
     76 	scantokey[ 32] = 'd';       
     77 	scantokey[ 33] = 'f';       
     78 	scantokey[ 34] = 'g';       
     79 	scantokey[ 35] = 'h';       
     80 	scantokey[ 36] = 'j';       
     81 	scantokey[ 37] = 'k';       
     82 	scantokey[ 38] = 'l';       
     83 	scantokey[ 39] = ';';
     84 	scantokey[ 40] = '\'';
     85 	scantokey[ 41] = '`';
     86 	scantokey[ 42] = K_SHIFT; //left
     87 	scantokey[ 43] = '\\';
     88 	scantokey[ 44] = 'z';       
     89 	scantokey[ 45] = 'x';  
     90 	scantokey[ 46] = 'c';
     91 	scantokey[ 47] = 'v';       
     92 	scantokey[ 48] = 'b';
     93 	scantokey[ 49] = 'n';       
     94 	scantokey[ 50] = 'm';       
     95 	scantokey[ 51] = ',';
     96 	scantokey[ 52] = '.';
     97 	scantokey[ 53] = '/';
     98 	scantokey[ 54] = K_SHIFT; //right
     99 	scantokey[ 55] = '*'; //keypad
    100 	scantokey[ 56] = K_ALT; //left
    101 	scantokey[ 57] = ' ';
    102 	// 58 caps lock
    103 	scantokey[ 59] = K_F1;
    104 	scantokey[ 60] = K_F2;
    105 	scantokey[ 61] = K_F3;
    106 	scantokey[ 62] = K_F4;
    107 	scantokey[ 63] = K_F5;
    108 	scantokey[ 64] = K_F6;
    109 	scantokey[ 65] = K_F7;
    110 	scantokey[ 66] = K_F8;
    111 	scantokey[ 67] = K_F9;
    112 	scantokey[ 68] = K_F10;
    113 	// 69 numlock
    114 	// 70 scrollock
    115 	scantokey[ 71] = K_KP_HOME;
    116 	scantokey[ 72] = K_KP_UPARROW;
    117 	scantokey[ 73] = K_KP_PGUP;
    118 	scantokey[ 74] = K_KP_MINUS;
    119 	scantokey[ 75] = K_KP_LEFTARROW;
    120 	scantokey[ 76] = K_KP_5;
    121 	scantokey[ 77] = K_KP_RIGHTARROW;
    122 	scantokey[ 79] = K_KP_END;
    123 	scantokey[ 78] = K_KP_PLUS;
    124 	scantokey[ 80] = K_KP_DOWNARROW;
    125 	scantokey[ 81] = K_KP_PGDN;
    126 	scantokey[ 82] = K_KP_INS;
    127 	scantokey[ 83] = K_KP_DEL;
    128 	// 84 to 86 not used
    129 	scantokey[ 87] = K_F11;
    130 	scantokey[ 88] = K_F12;
    131 	// 89 to 95 not used
    132 	scantokey[ 96] = K_KP_ENTER; //keypad enter
    133 	scantokey[ 97] = K_CTRL; //right
    134 	scantokey[ 98] = K_KP_SLASH;
    135 	scantokey[ 99] = K_F12; // print screen, bind to screenshot by default
    136 	scantokey[100] = K_ALT; // right
    137 
    138 	scantokey[101] = K_PAUSE; // break
    139 	scantokey[102] = K_HOME;
    140 	scantokey[103] = K_UPARROW;
    141 	scantokey[104] = K_PGUP;
    142 	scantokey[105] = K_LEFTARROW;
    143 	scantokey[106] = K_RIGHTARROW;
    144 	scantokey[107] = K_END;
    145 	scantokey[108] = K_DOWNARROW;
    146 	scantokey[109] = K_PGDN;
    147 	scantokey[110] = K_INS;
    148 	scantokey[111] = K_DEL;
    149 
    150 	scantokey[119] = K_PAUSE;
    151 
    152 	if (keyboard_init())
    153 		Sys_Error("keyboard_init() failed");
    154 	keyboard_seteventhandler(keyhandler);
    155 	keyboard_translatekeys(DONT_CATCH_CTRLC);
    156 }
    157 
    158 void KBD_Update(void)
    159 {
    160 	while (keyboard_update())
    161 		;
    162 }
    163 
    164 void KBD_Close(void)
    165 {
    166 	keyboard_close();
    167 }
    168 
    169 /*****************************************************************************/
    170 /* MOUSE                                                                     */
    171 /*****************************************************************************/
    172 
    173 // this is inside the renderer shared lib, so these are called from vid_so
    174 
    175 static qboolean	UseMouse = true;
    176 
    177 static int		mouserate = MOUSE_DEFAULTSAMPLERATE;
    178 
    179 static int     mouse_buttons;
    180 static int     mouse_buttonstate;
    181 static int     mouse_oldbuttonstate;
    182 static float   mouse_x, mouse_y;
    183 static float	old_mouse_x, old_mouse_y;
    184 static int		mx, my;
    185 
    186 static cvar_t	*m_filter;
    187 static cvar_t	*in_mouse;
    188 
    189 static cvar_t	*mdev;
    190 static cvar_t	*mrate;
    191 
    192 static qboolean	mlooking;
    193 
    194 // state struct passed in Init
    195 static in_state_t	*in_state;
    196 
    197 static cvar_t *sensitivity;
    198 static cvar_t *lookstrafe;
    199 static cvar_t *m_side;
    200 static cvar_t *m_yaw;
    201 static cvar_t *m_pitch;
    202 static cvar_t *m_forward;
    203 static cvar_t *freelook;
    204 
    205 static void Force_CenterView_f (void)
    206 {
    207 	in_state->viewangles[PITCH] = 0;
    208 }
    209 
    210 static void RW_IN_MLookDown (void) 
    211 { 
    212 	mlooking = true; 
    213 }
    214 
    215 static void RW_IN_MLookUp (void) 
    216 {
    217 	mlooking = false;
    218 	in_state->IN_CenterView_fp ();
    219 }
    220 
    221 static void mousehandler(int buttonstate, int dx, int dy)
    222 {
    223 	mouse_buttonstate = buttonstate;
    224 	mx += dx;
    225 	my += dy;
    226 }
    227 
    228 void RW_IN_Init(in_state_t *in_state_p)
    229 {
    230 	int mtype;
    231 	int i;
    232 
    233 	in_state = in_state_p;
    234 
    235 	// mouse variables
    236 	m_filter = ri.Cvar_Get ("m_filter", "0", 0);
    237     in_mouse = ri.Cvar_Get ("in_mouse", "1", CVAR_ARCHIVE);
    238 	freelook = ri.Cvar_Get( "freelook", "0", 0 );
    239 	lookstrafe = ri.Cvar_Get ("lookstrafe", "0", 0);
    240 	sensitivity = ri.Cvar_Get ("sensitivity", "3", 0);
    241 	m_pitch = ri.Cvar_Get ("m_pitch", "0.022", 0);
    242 	m_yaw = ri.Cvar_Get ("m_yaw", "0.022", 0);
    243 	m_forward = ri.Cvar_Get ("m_forward", "1", 0);
    244 	m_side = ri.Cvar_Get ("m_side", "0.8", 0);
    245 
    246 	ri.Cmd_AddCommand ("+mlook", RW_IN_MLookDown);
    247 	ri.Cmd_AddCommand ("-mlook", RW_IN_MLookUp);
    248 
    249 	ri.Cmd_AddCommand ("force_centerview", Force_CenterView_f);
    250 
    251 	mouse_buttons = 3;
    252 
    253 	mtype = vga_getmousetype();
    254 
    255 	mdev = ri.Cvar_Get ("mdev", "/dev/mouse", 0);
    256 	mrate = ri.Cvar_Get ("mrate", "1200", 0);
    257 
    258 //		printf("Mouse: dev=%s,type=%s,speed=%d\n",
    259 //			mousedev, mice[mtype].name, mouserate);
    260 
    261 	if (mouse_init(mdev->string, mtype, (int)mrate->value))
    262 	{
    263 		ri.Con_Printf(PRINT_ALL, "No mouse found\n");
    264 		UseMouse = false;
    265 	}
    266 	else
    267 		mouse_seteventhandler(mousehandler);
    268 }
    269 
    270 void RW_IN_Shutdown(void)
    271 {
    272 	mouse_close();
    273 }
    274 
    275 /*
    276 ===========
    277 IN_Commands
    278 ===========
    279 */
    280 void RW_IN_Commands (void)
    281 {
    282 	if (!UseMouse)
    283 		return;
    284 
    285 	// poll mouse values
    286 	mouse_update();
    287 
    288 	// perform button actions
    289 	if ((mouse_buttonstate & MOUSE_LEFTBUTTON) &&
    290 		!(mouse_oldbuttonstate & MOUSE_LEFTBUTTON))
    291 		in_state->Key_Event_fp (K_MOUSE1, true);
    292 	else if (!(mouse_buttonstate & MOUSE_LEFTBUTTON) &&
    293 		(mouse_oldbuttonstate & MOUSE_LEFTBUTTON))
    294 		in_state->Key_Event_fp (K_MOUSE1, false);
    295 
    296 	if ((mouse_buttonstate & MOUSE_RIGHTBUTTON) &&
    297 		!(mouse_oldbuttonstate & MOUSE_RIGHTBUTTON))
    298 		in_state->Key_Event_fp (K_MOUSE2, true);
    299 	else if (!(mouse_buttonstate & MOUSE_RIGHTBUTTON) &&
    300 		(mouse_oldbuttonstate & MOUSE_RIGHTBUTTON))
    301 		in_state->Key_Event_fp (K_MOUSE2, false);
    302 
    303 	if ((mouse_buttonstate & MOUSE_MIDDLEBUTTON) &&
    304 		!(mouse_oldbuttonstate & MOUSE_MIDDLEBUTTON))
    305 		Key_Event_fp (K_MOUSE3, true);
    306 	else if (!(mouse_buttonstate & MOUSE_MIDDLEBUTTON) &&
    307 		(mouse_oldbuttonstate & MOUSE_MIDDLEBUTTON))
    308 		in_state->Key_Event_fp (K_MOUSE3, false);
    309 
    310 	mouse_oldbuttonstate = mouse_buttonstate;
    311 }
    312 
    313 /*
    314 ===========
    315 IN_Move
    316 ===========
    317 */
    318 void RW_IN_Move (usercmd_t *cmd)
    319 {
    320 	if (!UseMouse)
    321 		return;
    322 
    323 	// poll mouse values
    324 	mouse_update();
    325 
    326 	if (m_filter->value)
    327 	{
    328 		mouse_x = (mx + old_mouse_x) * 0.5;
    329 		mouse_y = (my + old_mouse_y) * 0.5;
    330 	}
    331 	else
    332 	{
    333 		mouse_x = mx;
    334 		mouse_y = my;
    335 	}
    336 	old_mouse_x = mx;
    337 	old_mouse_y = my;
    338 
    339 	if (!mx && !my)
    340 		return;
    341 
    342 	mx = my = 0; // clear for next update
    343 
    344 	mouse_x *= sensitivity->value;
    345 	mouse_y *= sensitivity->value;
    346 
    347 // add mouse X/Y movement to cmd
    348 	if ( (*in_state->in_strafe_state & 1) || 
    349 		(lookstrafe->value && mlooking ))
    350 		cmd->sidemove += m_side->value * mouse_x;
    351 	else
    352 		in_state->viewangles[YAW] -= m_yaw->value * mouse_x;
    353 
    354 	if ( (mlooking || freelook->value) && 
    355 		!(*in_state->in_strafe_state & 1))
    356 	{
    357 		in_state->viewangles[PITCH] += m_pitch->value * mouse_y;
    358 	}
    359 	else
    360 	{
    361 		cmd->forwardmove -= m_forward->value * mouse_y;
    362 	}
    363 }
    364 
    365 void RW_IN_Frame (void)
    366 {
    367 }
    368 
    369 void RW_IN_Activate(void)
    370 {
    371 }
    372 
    373 
    374