mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 15:22:04 +00:00
these are now in libs/video/targets
This commit is contained in:
parent
9d8c1d33c0
commit
6a696881b3
12 changed files with 0 additions and 4590 deletions
|
@ -1,157 +0,0 @@
|
|||
/*
|
||||
in_fbdev.c
|
||||
|
||||
fix this!
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <termios.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include "client.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "QF/keys.h"
|
||||
|
||||
cvar_t *_windowed_mouse;
|
||||
|
||||
int
|
||||
fd_blocking (int fd, int on)
|
||||
{
|
||||
int x;
|
||||
|
||||
#if defined(_POSIX_SOURCE) || !defined(FIONBIO)
|
||||
#if !defined(O_NONBLOCK)
|
||||
# if defined(O_NDELAY)
|
||||
# define O_NONBLOCK O_NDELAY
|
||||
# endif
|
||||
#endif
|
||||
if ((x = fcntl(fd, F_GETFL, 0)) == -1)
|
||||
return -1;
|
||||
if (on)
|
||||
x &= ~O_NONBLOCK;
|
||||
else
|
||||
x |= O_NONBLOCK;
|
||||
|
||||
return fcntl(fd, F_SETFL, x);
|
||||
#else
|
||||
x = !on;
|
||||
|
||||
return ioctl(fd, FIONBIO, &x);
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct termios old_tty, new_tty;
|
||||
static int tty_fd = 0;
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
fd_blocking(0, 0);
|
||||
tcgetattr(tty_fd, &old_tty);
|
||||
new_tty = old_tty;
|
||||
new_tty.c_cc[VMIN] = 1;
|
||||
new_tty.c_cc[VTIME] = 0;
|
||||
new_tty.c_lflag &= ~ICANON;
|
||||
new_tty.c_iflag &= ~IXON;
|
||||
tcsetattr(tty_fd, TCSADRAIN, &new_tty);
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_SendKeyEvents (void)
|
||||
{
|
||||
int k, down;
|
||||
char buf[4];
|
||||
|
||||
if (read(0, buf, 1) == 1) {
|
||||
k = buf[0];
|
||||
switch (k) {
|
||||
case '\r':
|
||||
case '\n':
|
||||
k = K_ENTER;
|
||||
break;
|
||||
case '\033':
|
||||
if (read(0, buf, 2) != 2)
|
||||
break;
|
||||
switch (buf[1]) {
|
||||
case 'A':
|
||||
k = K_UPARROW;
|
||||
break;
|
||||
case 'B':
|
||||
k = K_DOWNARROW;
|
||||
break;
|
||||
case 'C':
|
||||
k = K_RIGHTARROW;
|
||||
break;
|
||||
case 'D':
|
||||
k = K_LEFTARROW;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
down = 1;
|
||||
Key_Event(k, -1, down);
|
||||
Key_Event(k, -1, !down);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
IN_ModeChanged
|
||||
*/
|
||||
void
|
||||
IN_ModeChanged (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_HandlePause (qboolean paused)
|
||||
{
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
|
||||
/*
|
||||
in_null.c
|
||||
|
||||
for systems without a mouse
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
#include "quakedef.h"
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Move (null)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
===========
|
||||
IN_ModeChanged
|
||||
===========
|
||||
*/
|
||||
void
|
||||
IN_ModeChanged (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_HandlePause (qboolean paused)
|
||||
{
|
||||
}
|
|
@ -1,434 +0,0 @@
|
|||
/*
|
||||
in_sdl.c
|
||||
|
||||
general sdl input driver
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
#include "client.h"
|
||||
#include "QF/compat.h"
|
||||
#include "QF/console.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "draw.h"
|
||||
#include "host.h"
|
||||
#include "QF/input.h"
|
||||
#include "QF/joystick.h"
|
||||
#include "QF/keys.h"
|
||||
#include "QF/sys.h"
|
||||
#include "QF/qargs.h"
|
||||
#include "QF/qendian.h"
|
||||
#include "vid.h"
|
||||
#include "view.h"
|
||||
|
||||
#ifdef WIN32
|
||||
// FIXME: this is evil...
|
||||
# include <windows.h>
|
||||
HWND mainwindow;
|
||||
#endif
|
||||
|
||||
cvar_t *m_filter;
|
||||
cvar_t *_windowed_mouse;
|
||||
int old_windowed_mouse;
|
||||
|
||||
int modestate; // FIXME: just to avoid cross-comp.
|
||||
|
||||
// errors - remove later
|
||||
|
||||
static qboolean mouse_avail;
|
||||
static float mouse_x, mouse_y;
|
||||
static float old_mouse_x, old_mouse_y;
|
||||
static int mouse_oldbuttonstate = 0;
|
||||
|
||||
extern viddef_t vid; // global video state
|
||||
|
||||
/*
|
||||
IN_SendKeyEvents
|
||||
*/
|
||||
|
||||
void
|
||||
IN_SendKeyEvents (void)
|
||||
{
|
||||
SDL_Event event;
|
||||
int sym, state, but;
|
||||
int modstate;
|
||||
|
||||
while (SDL_PollEvent (&event)) {
|
||||
switch (event.type) {
|
||||
case SDL_KEYDOWN:
|
||||
case SDL_KEYUP:
|
||||
sym = event.key.keysym.sym;
|
||||
state = event.key.state;
|
||||
modstate = SDL_GetModState ();
|
||||
switch (sym) {
|
||||
case SDLK_DELETE:
|
||||
sym = K_DEL;
|
||||
break;
|
||||
case SDLK_BACKSPACE:
|
||||
sym = K_BACKSPACE;
|
||||
break;
|
||||
case SDLK_F1:
|
||||
sym = K_F1;
|
||||
break;
|
||||
case SDLK_F2:
|
||||
sym = K_F2;
|
||||
break;
|
||||
case SDLK_F3:
|
||||
sym = K_F3;
|
||||
break;
|
||||
case SDLK_F4:
|
||||
sym = K_F4;
|
||||
break;
|
||||
case SDLK_F5:
|
||||
sym = K_F5;
|
||||
break;
|
||||
case SDLK_F6:
|
||||
sym = K_F6;
|
||||
break;
|
||||
case SDLK_F7:
|
||||
sym = K_F7;
|
||||
break;
|
||||
case SDLK_F8:
|
||||
sym = K_F8;
|
||||
break;
|
||||
case SDLK_F9:
|
||||
sym = K_F9;
|
||||
break;
|
||||
case SDLK_F10:
|
||||
sym = K_F10;
|
||||
break;
|
||||
case SDLK_F11:
|
||||
sym = K_F11;
|
||||
break;
|
||||
case SDLK_F12:
|
||||
sym = K_F12;
|
||||
break;
|
||||
case SDLK_BREAK:
|
||||
case SDLK_PAUSE:
|
||||
sym = K_PAUSE;
|
||||
break;
|
||||
case SDLK_UP:
|
||||
sym = K_UPARROW;
|
||||
break;
|
||||
case SDLK_DOWN:
|
||||
sym = K_DOWNARROW;
|
||||
break;
|
||||
case SDLK_RIGHT:
|
||||
sym = K_RIGHTARROW;
|
||||
break;
|
||||
case SDLK_LEFT:
|
||||
sym = K_LEFTARROW;
|
||||
break;
|
||||
case SDLK_INSERT:
|
||||
sym = K_INS;
|
||||
break;
|
||||
case SDLK_HOME:
|
||||
sym = K_HOME;
|
||||
break;
|
||||
case SDLK_END:
|
||||
sym = K_END;
|
||||
break;
|
||||
case SDLK_PAGEUP:
|
||||
sym = K_PGUP;
|
||||
break;
|
||||
case SDLK_PAGEDOWN:
|
||||
sym = K_PGDN;
|
||||
break;
|
||||
case SDLK_RSHIFT:
|
||||
case SDLK_LSHIFT:
|
||||
sym = K_SHIFT;
|
||||
break;
|
||||
case SDLK_RCTRL:
|
||||
case SDLK_LCTRL:
|
||||
sym = K_CTRL;
|
||||
break;
|
||||
case SDLK_RALT:
|
||||
case SDLK_LALT:
|
||||
sym = K_ALT;
|
||||
break;
|
||||
case SDLK_CAPSLOCK:
|
||||
sym = K_CAPSLOCK;
|
||||
break;
|
||||
case SDLK_KP0:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_INS;
|
||||
else
|
||||
sym = SDLK_0;
|
||||
break;
|
||||
case SDLK_KP1:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_END;
|
||||
else
|
||||
sym = SDLK_1;
|
||||
break;
|
||||
case SDLK_KP2:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_DOWNARROW;
|
||||
else
|
||||
sym = SDLK_2;
|
||||
break;
|
||||
case SDLK_KP3:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_PGDN;
|
||||
else
|
||||
sym = SDLK_3;
|
||||
break;
|
||||
case SDLK_KP4:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_LEFTARROW;
|
||||
else
|
||||
sym = SDLK_4;
|
||||
break;
|
||||
case SDLK_KP5:
|
||||
sym = SDLK_5;
|
||||
break;
|
||||
case SDLK_KP6:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_RIGHTARROW;
|
||||
else
|
||||
sym = SDLK_6;
|
||||
break;
|
||||
case SDLK_KP7:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_HOME;
|
||||
else
|
||||
sym = SDLK_7;
|
||||
break;
|
||||
case SDLK_KP8:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_UPARROW;
|
||||
else
|
||||
sym = SDLK_8;
|
||||
break;
|
||||
case SDLK_KP9:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_PGUP;
|
||||
else
|
||||
sym = SDLK_9;
|
||||
break;
|
||||
case SDLK_KP_PERIOD:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_DEL;
|
||||
else
|
||||
sym = SDLK_PERIOD;
|
||||
break;
|
||||
case SDLK_KP_DIVIDE:
|
||||
sym = SDLK_SLASH;
|
||||
break;
|
||||
case SDLK_KP_MULTIPLY:
|
||||
sym = SDLK_ASTERISK;
|
||||
break;
|
||||
case SDLK_KP_MINUS:
|
||||
sym = SDLK_MINUS;
|
||||
break;
|
||||
case SDLK_KP_PLUS:
|
||||
sym = SDLK_PLUS;
|
||||
break;
|
||||
case SDLK_KP_ENTER:
|
||||
sym = SDLK_RETURN;
|
||||
break;
|
||||
case SDLK_KP_EQUALS:
|
||||
sym = SDLK_EQUALS;
|
||||
break;
|
||||
}
|
||||
// If we're not directly handled and still above 255
|
||||
// just force it to 0
|
||||
if (sym > 255)
|
||||
sym = 0;
|
||||
Key_Event (sym, -1, state);
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
but = event.button.button;
|
||||
if (but == 2)
|
||||
but = 3;
|
||||
else if (but == 3)
|
||||
but = 2;
|
||||
|
||||
switch (but) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
Key_Event (K_MOUSE1 + but - 1, 0, event.type
|
||||
== SDL_MOUSEBUTTONDOWN);
|
||||
break;
|
||||
case 4:
|
||||
Key_Event (K_MWHEELUP, 0, event.type == SDL_MOUSEBUTTONDOWN);
|
||||
break;
|
||||
case 5:
|
||||
Key_Event (K_MWHEELDOWN, 0, event.type == SDL_MOUSEBUTTONDOWN);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_MOUSEMOTION:
|
||||
if (_windowed_mouse->value) {
|
||||
if ((event.motion.x != (vid.width / 2))
|
||||
|| (event.motion.y != (vid.height / 2))) {
|
||||
// *2 for vid_sdl.c, *10 for vid_sgl.c.
|
||||
mouse_x = event.motion.xrel * 5;
|
||||
mouse_y = event.motion.yrel * 5;
|
||||
if ((event.motion.x < ((vid.width / 2) - (vid.width / 4)))
|
||||
|| (event.motion.x >
|
||||
((vid.width / 2) + (vid.width / 4)))
|
||||
|| (event.motion.y <
|
||||
((vid.height / 2) - (vid.height / 4)))
|
||||
|| (event.motion.y >
|
||||
((vid.height / 2) + (vid.height / 4))))
|
||||
SDL_WarpMouse (vid.width / 2, vid.height / 2);
|
||||
}
|
||||
} else {
|
||||
// following are *2 in vid_sdl.c, vid_sgl.c is *10
|
||||
mouse_x = event.motion.xrel * 5;
|
||||
mouse_y = event.motion.yrel * 5;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_QUIT:
|
||||
CL_Disconnect ();
|
||||
Sys_Quit ();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
JOY_Command ();
|
||||
|
||||
if (old_windowed_mouse != _windowed_mouse->value) {
|
||||
old_windowed_mouse = _windowed_mouse->value;
|
||||
if (!_windowed_mouse->value) {
|
||||
// SDL_ShowCursor (0);
|
||||
SDL_WM_GrabInput (SDL_GRAB_OFF);
|
||||
} else {
|
||||
SDL_WM_GrabInput (SDL_GRAB_ON);
|
||||
// SDL_ShowCursor (1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
JOY_Init ();
|
||||
|
||||
if (COM_CheckParm ("-nomouse") && !_windowed_mouse->value)
|
||||
return;
|
||||
|
||||
mouse_x = mouse_y = 0.0;
|
||||
mouse_avail = 1;
|
||||
// SDL_ShowCursor (0);
|
||||
// SDL_WM_GrabInput (SDL_GRAB_ON);
|
||||
// FIXME: disable DGA if in_dgamouse says to.
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
JOY_Init_Cvars ();
|
||||
|
||||
_windowed_mouse =
|
||||
Cvar_Get ("_windowed_mouse", "0", CVAR_ARCHIVE, NULL,
|
||||
"If set to 1, quake will grab the mouse in X");
|
||||
m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE, NULL, "Toggle mouse input filtering");
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
mouse_avail = 0;
|
||||
}
|
||||
|
||||
void
|
||||
IN_Frame (void)
|
||||
{
|
||||
int i;
|
||||
int mouse_buttonstate;
|
||||
|
||||
if (!mouse_avail)
|
||||
return;
|
||||
|
||||
i = SDL_GetMouseState (NULL, NULL);
|
||||
/* Quake swaps the second and third buttons */
|
||||
mouse_buttonstate = (i & ~0x06) | ((i & 0x02) << 1) | ((i & 0x04) >> 1);
|
||||
for (i = 0; i < 3; i++) {
|
||||
if ((mouse_buttonstate & (1 << i))
|
||||
&& !(mouse_oldbuttonstate & (1 << i)))
|
||||
Key_Event (K_MOUSE1 + i, 0, true);
|
||||
|
||||
if (!(mouse_buttonstate & (1 << i))
|
||||
&& (mouse_oldbuttonstate & (1 << i)))
|
||||
Key_Event (K_MOUSE1 + i, 0, false);
|
||||
}
|
||||
mouse_oldbuttonstate = mouse_buttonstate;
|
||||
}
|
||||
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
JOY_Move ();
|
||||
|
||||
if (!mouse_avail)
|
||||
return;
|
||||
|
||||
if (m_filter->value) {
|
||||
mouse_x = (mouse_x + old_mouse_x) * 0.5;
|
||||
mouse_y = (mouse_y + old_mouse_y) * 0.5;
|
||||
}
|
||||
old_mouse_x = mouse_x;
|
||||
old_mouse_y = mouse_y;
|
||||
|
||||
mouse_x *= sensitivity->value;
|
||||
mouse_y *= sensitivity->value;
|
||||
|
||||
if ((in_strafe.state & 1) || (lookstrafe->value && (in_mlook.state & 1)))
|
||||
viewdelta.position[0] += mouse_x;
|
||||
else
|
||||
viewdelta.angles[YAW] -= mouse_x;
|
||||
|
||||
if (freelook && !(in_strafe.state & 1)) {
|
||||
viewdelta.angles[PITCH] += mouse_y;
|
||||
} else {
|
||||
if ((in_strafe.state & 1) && noclip_anglehack)
|
||||
viewdelta.position[1] -= mouse_y;
|
||||
else
|
||||
viewdelta.position[2] -= mouse_y;
|
||||
}
|
||||
mouse_x = mouse_y = 0.0;
|
||||
}
|
||||
|
||||
void
|
||||
IN_HandlePause (qboolean paused)
|
||||
{
|
||||
}
|
|
@ -1,410 +0,0 @@
|
|||
|
||||
/*
|
||||
in_svgalib.c
|
||||
|
||||
(description)
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
Copyright (C) 1999-2000 Marcus Sundberg [mackan@stacken.kth.se]
|
||||
Copyright (C) 1999,2000 contributors of the QuakeForge project
|
||||
Please see the file "AUTHORS" for a list of contributors
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <vga.h>
|
||||
#include <vgakeyboard.h>
|
||||
#include <vgamouse.h>
|
||||
|
||||
#include "client.h"
|
||||
#include "QF/cmd.h"
|
||||
#include "QF/compat.h"
|
||||
#include "QF/console.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "host.h"
|
||||
#include "QF/input.h"
|
||||
#include "QF/joystick.h"
|
||||
#include "QF/keys.h"
|
||||
#include "QF/qargs.h"
|
||||
#include "QF/sys.h"
|
||||
#include "view.h"
|
||||
|
||||
static int UseKeyboard = 1;
|
||||
static int UseMouse = 1;
|
||||
static int in_svgalib_inited = 0;
|
||||
|
||||
static unsigned char scantokey[128];
|
||||
static int mouse_buttons;
|
||||
static int mouse_buttonstate;
|
||||
static int mouse_oldbuttonstate;
|
||||
static float mouse_x, mouse_y;
|
||||
static float old_mouse_x, old_mouse_y;
|
||||
static int mx, my;
|
||||
|
||||
static void IN_InitKeyboard (void);
|
||||
static void IN_InitMouse (void);
|
||||
|
||||
cvar_t *_windowed_mouse;
|
||||
cvar_t *m_filter;
|
||||
|
||||
static void
|
||||
keyhandler (int scancode, int state)
|
||||
{
|
||||
int sc;
|
||||
|
||||
sc = scancode & 0x7f;
|
||||
#if 0
|
||||
Con_Printf ("scancode=%x (%d%s)\n", scancode, sc,
|
||||
scancode & 0x80 ? "+128" : "");
|
||||
#endif
|
||||
Key_Event (scantokey[sc], -1, state == KEY_EVENTPRESS);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
mousehandler (int buttonstate, int dx, int dy, int dz, int drx, int dry,
|
||||
int drz)
|
||||
{
|
||||
mouse_buttonstate = buttonstate;
|
||||
mx += dx;
|
||||
my += dy;
|
||||
if (drx > 0) {
|
||||
Key_Event (K_MWHEELUP, 0, 1);
|
||||
Key_Event (K_MWHEELUP, 0, 0);
|
||||
} else if (drx < 0) {
|
||||
Key_Event (K_MWHEELDOWN, 0, 1);
|
||||
Key_Event (K_MWHEELDOWN, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Force_CenterView_f (void)
|
||||
{
|
||||
cl.viewangles[PITCH] = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
if (COM_CheckParm ("-nokbd"))
|
||||
UseKeyboard = 0;
|
||||
if (COM_CheckParm ("-nomouse"))
|
||||
UseMouse = 0;
|
||||
|
||||
if (UseKeyboard)
|
||||
IN_InitKeyboard ();
|
||||
if (UseMouse)
|
||||
IN_InitMouse ();
|
||||
|
||||
JOY_Init ();
|
||||
|
||||
in_svgalib_inited = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
JOY_Init_Cvars ();
|
||||
m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE, NULL,
|
||||
"Toggle mouse input filtering.");
|
||||
}
|
||||
|
||||
static void
|
||||
IN_InitKeyboard (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 128; i++) {
|
||||
scantokey[i] = ' ';
|
||||
}
|
||||
|
||||
scantokey[1] = K_ESCAPE;
|
||||
scantokey[2] = '1';
|
||||
scantokey[3] = '2';
|
||||
scantokey[4] = '3';
|
||||
scantokey[5] = '4';
|
||||
scantokey[6] = '5';
|
||||
scantokey[7] = '6';
|
||||
scantokey[8] = '7';
|
||||
scantokey[9] = '8';
|
||||
scantokey[10] = '9';
|
||||
scantokey[11] = '0';
|
||||
scantokey[12] = '-';
|
||||
scantokey[13] = '=';
|
||||
scantokey[14] = K_BACKSPACE;
|
||||
scantokey[15] = K_TAB;
|
||||
scantokey[16] = 'q';
|
||||
scantokey[17] = 'w';
|
||||
scantokey[18] = 'e';
|
||||
scantokey[19] = 'r';
|
||||
scantokey[20] = 't';
|
||||
scantokey[21] = 'y';
|
||||
scantokey[22] = 'u';
|
||||
scantokey[23] = 'i';
|
||||
scantokey[24] = 'o';
|
||||
scantokey[25] = 'p';
|
||||
scantokey[26] = '[';
|
||||
scantokey[27] = ']';
|
||||
scantokey[28] = K_ENTER;
|
||||
scantokey[29] = K_CTRL; /* left */
|
||||
scantokey[30] = 'a';
|
||||
scantokey[31] = 's';
|
||||
scantokey[32] = 'd';
|
||||
scantokey[33] = 'f';
|
||||
scantokey[34] = 'g';
|
||||
scantokey[35] = 'h';
|
||||
scantokey[36] = 'j';
|
||||
scantokey[37] = 'k';
|
||||
scantokey[38] = 'l';
|
||||
scantokey[39] = ';';
|
||||
scantokey[40] = '\'';
|
||||
scantokey[41] = '`';
|
||||
scantokey[42] = K_SHIFT; /* left */
|
||||
scantokey[43] = '\\';
|
||||
scantokey[44] = 'z';
|
||||
scantokey[45] = 'x';
|
||||
scantokey[46] = 'c';
|
||||
scantokey[47] = 'v';
|
||||
scantokey[48] = 'b';
|
||||
scantokey[49] = 'n';
|
||||
scantokey[50] = 'm';
|
||||
scantokey[51] = ',';
|
||||
scantokey[52] = '.';
|
||||
scantokey[53] = '/';
|
||||
scantokey[54] = K_SHIFT; /* right */
|
||||
scantokey[55] = KP_MULTIPLY;
|
||||
scantokey[56] = K_ALT; /* left */
|
||||
scantokey[57] = ' ';
|
||||
scantokey[58] = K_CAPSLOCK;
|
||||
scantokey[59] = K_F1;
|
||||
scantokey[60] = K_F2;
|
||||
scantokey[61] = K_F3;
|
||||
scantokey[62] = K_F4;
|
||||
scantokey[63] = K_F5;
|
||||
scantokey[64] = K_F6;
|
||||
scantokey[65] = K_F7;
|
||||
scantokey[66] = K_F8;
|
||||
scantokey[67] = K_F9;
|
||||
scantokey[68] = K_F10;
|
||||
scantokey[69] = KP_NUMLCK;
|
||||
scantokey[70] = K_SCRLCK;
|
||||
scantokey[71] = KP_HOME;
|
||||
scantokey[72] = KP_UPARROW;
|
||||
scantokey[73] = KP_PGUP;
|
||||
scantokey[74] = KP_MINUS;
|
||||
scantokey[75] = KP_LEFTARROW;
|
||||
scantokey[76] = KP_5;
|
||||
scantokey[77] = KP_RIGHTARROW;
|
||||
scantokey[79] = KP_END;
|
||||
scantokey[78] = KP_PLUS;
|
||||
scantokey[80] = KP_DOWNARROW;
|
||||
scantokey[81] = KP_PGDN;
|
||||
scantokey[82] = KP_INS;
|
||||
scantokey[83] = KP_DEL;
|
||||
/* 84 to 86 not used */
|
||||
scantokey[87] = K_F11;
|
||||
scantokey[88] = K_F12;
|
||||
/* 89 to 95 not used */
|
||||
scantokey[96] = KP_ENTER; /* keypad enter */
|
||||
scantokey[97] = K_CTRL; /* right */
|
||||
scantokey[98] = KP_DIVIDE;
|
||||
scantokey[99] = K_PRNTSCR; /* print screen */
|
||||
scantokey[100] = K_ALT; /* right */
|
||||
|
||||
scantokey[101] = K_PAUSE; /* break */
|
||||
scantokey[102] = K_HOME;
|
||||
scantokey[103] = K_UPARROW;
|
||||
scantokey[104] = K_PGUP;
|
||||
scantokey[105] = K_LEFTARROW;
|
||||
scantokey[106] = K_RIGHTARROW;
|
||||
scantokey[107] = K_END;
|
||||
scantokey[108] = K_DOWNARROW;
|
||||
scantokey[109] = K_PGDN;
|
||||
scantokey[110] = K_INS;
|
||||
scantokey[111] = K_DEL;
|
||||
scantokey[119] = K_PAUSE;
|
||||
|
||||
if (keyboard_init ()) {
|
||||
Sys_Error ("keyboard_init() failed");
|
||||
}
|
||||
keyboard_seteventhandler (keyhandler);
|
||||
}
|
||||
|
||||
static void
|
||||
IN_InitMouse (void)
|
||||
{
|
||||
int mtype;
|
||||
char *mousedev;
|
||||
int mouserate = MOUSE_DEFAULTSAMPLERATE;
|
||||
|
||||
Cmd_AddCommand ("force_centerview", Force_CenterView_f,
|
||||
"Force viewpoint of player to center");
|
||||
|
||||
mouse_buttons = 3;
|
||||
|
||||
mtype = vga_getmousetype ();
|
||||
|
||||
mousedev = "/dev/mouse";
|
||||
if (getenv ("MOUSEDEV"))
|
||||
mousedev = getenv ("MOUSEDEV");
|
||||
if (COM_CheckParm ("-mdev")) {
|
||||
mousedev = com_argv[COM_CheckParm ("-mdev") + 1];
|
||||
}
|
||||
|
||||
if (getenv ("MOUSERATE"))
|
||||
mouserate = atoi (getenv ("MOUSERATE"));
|
||||
if (COM_CheckParm ("-mrate")) {
|
||||
mouserate = atoi (com_argv[COM_CheckParm ("-mrate") + 1]);
|
||||
}
|
||||
#if 0
|
||||
printf ("Mouse: dev=%s,type=%s,speed=%d\n",
|
||||
mousedev, mice[mtype].name, mouserate);
|
||||
#endif
|
||||
if (mouse_init (mousedev, mtype, mouserate)) {
|
||||
Con_Printf ("No mouse found\n");
|
||||
UseMouse = 0;
|
||||
} else {
|
||||
mouse_seteventhandler ((void *) mousehandler);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
JOY_Shutdown ();
|
||||
Con_Printf ("IN_Shutdown\n");
|
||||
|
||||
if (UseMouse)
|
||||
mouse_close ();
|
||||
if (UseKeyboard)
|
||||
keyboard_close ();
|
||||
in_svgalib_inited = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_SendKeyEvents (void)
|
||||
{
|
||||
if (!in_svgalib_inited)
|
||||
return;
|
||||
|
||||
if (UseKeyboard) {
|
||||
while ((keyboard_update ()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
JOY_Command ();
|
||||
if (UseMouse) {
|
||||
/* Poll mouse values */
|
||||
while (mouse_update ());
|
||||
|
||||
/* Perform button actions */
|
||||
if ((mouse_buttonstate & MOUSE_LEFTBUTTON) &&
|
||||
!(mouse_oldbuttonstate & MOUSE_LEFTBUTTON))
|
||||
Key_Event (K_MOUSE1, 0, true);
|
||||
else if (!(mouse_buttonstate & MOUSE_LEFTBUTTON) &&
|
||||
(mouse_oldbuttonstate & MOUSE_LEFTBUTTON))
|
||||
Key_Event (K_MOUSE1, 0, false);
|
||||
|
||||
if ((mouse_buttonstate & MOUSE_RIGHTBUTTON) &&
|
||||
!(mouse_oldbuttonstate & MOUSE_RIGHTBUTTON))
|
||||
Key_Event (K_MOUSE2, 0, true);
|
||||
else if (!(mouse_buttonstate & MOUSE_RIGHTBUTTON) &&
|
||||
(mouse_oldbuttonstate & MOUSE_RIGHTBUTTON))
|
||||
Key_Event (K_MOUSE2, 0, false);
|
||||
|
||||
if ((mouse_buttonstate & MOUSE_MIDDLEBUTTON) &&
|
||||
!(mouse_oldbuttonstate & MOUSE_MIDDLEBUTTON))
|
||||
Key_Event (K_MOUSE3, 0, true);
|
||||
else if (!(mouse_buttonstate & MOUSE_MIDDLEBUTTON) &&
|
||||
(mouse_oldbuttonstate & MOUSE_MIDDLEBUTTON))
|
||||
Key_Event (K_MOUSE3, 0, false);
|
||||
|
||||
mouse_oldbuttonstate = mouse_buttonstate;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
JOY_Move ();
|
||||
|
||||
if (!UseMouse)
|
||||
return;
|
||||
|
||||
/* Poll mouse values */
|
||||
while (mouse_update ());
|
||||
|
||||
if (m_filter->int_val) {
|
||||
mouse_x = (mx + old_mouse_x) * 0.5;
|
||||
mouse_y = (my + old_mouse_y) * 0.5;
|
||||
} else {
|
||||
mouse_x = mx;
|
||||
mouse_y = my;
|
||||
}
|
||||
old_mouse_x = mx;
|
||||
old_mouse_y = my;
|
||||
|
||||
/* Clear for next update */
|
||||
mx = my = 0;
|
||||
|
||||
mouse_x *= sensitivity->value;
|
||||
mouse_y *= sensitivity->value;
|
||||
|
||||
/* Add mouse X/Y movement to cmd */
|
||||
if ((in_strafe.state & 1) || (lookstrafe->int_val && freelook)) {
|
||||
viewdelta.position[0] += mouse_x;
|
||||
} else {
|
||||
viewdelta.angles[YAW] -= mouse_x;
|
||||
}
|
||||
|
||||
if (freelook && !(in_strafe.state & 1)) {
|
||||
viewdelta.angles[PITCH] += mouse_y;
|
||||
} else {
|
||||
if ((in_strafe.state & 1) && noclip_anglehack) {
|
||||
viewdelta.position[1] -= mouse_y;
|
||||
} else {
|
||||
viewdelta.position[2] -= mouse_y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_HandlePause (qboolean paused)
|
||||
{
|
||||
}
|
|
@ -1,673 +0,0 @@
|
|||
/*
|
||||
in_win.c
|
||||
|
||||
windows 95 mouse stuff
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
// 02/21/97 JCB Added extended DirectInput code to support external controllers.
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "winquake.h"
|
||||
#include <dinput.h>
|
||||
#include "client.h"
|
||||
#include "QF/keys.h"
|
||||
#include "QF/compat.h"
|
||||
#include "QF/console.h"
|
||||
#include "QF/qargs.h"
|
||||
#include "QF/cmd.h"
|
||||
#include "QF/input.h"
|
||||
#include "view.h"
|
||||
#include "host.h"
|
||||
|
||||
#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 public variables
|
||||
|
||||
float mouse_x, mouse_y;
|
||||
qboolean mouseactive;
|
||||
unsigned int uiWheelMessage;
|
||||
|
||||
// mouse local variables
|
||||
|
||||
static int mouse_buttons;
|
||||
static int mouse_oldbuttonstate;
|
||||
static POINT current_pos;
|
||||
static float old_mouse_x, old_mouse_y, mx_accum, my_accum;
|
||||
static qboolean mouseinitialized;
|
||||
static cvar_t *m_filter;
|
||||
static qboolean restore_spi;
|
||||
static int originalmouseparms[3], newmouseparms[3] = { 0, 0, 1 };
|
||||
static qboolean mouseparmsvalid, mouseactivatetoggle;
|
||||
static qboolean mouseshowtoggle = 1;
|
||||
static qboolean dinput_acquired;
|
||||
static unsigned int mstate_di;
|
||||
|
||||
// misc locals
|
||||
|
||||
static LPDIRECTINPUT g_pdi;
|
||||
static LPDIRECTINPUTDEVICE g_pMouse;
|
||||
|
||||
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, joy
|
||||
|
||||
extern void JOY_Command(void);
|
||||
extern void JOY_Init_Cvars(void);
|
||||
extern void JOY_Init (void);
|
||||
extern void JOY_AdvancedUpdate_f (void);
|
||||
extern void JOY_Move (void);
|
||||
|
||||
/*
|
||||
Force_CenterView_f
|
||||
*/
|
||||
static void
|
||||
Force_CenterView_f (void)
|
||||
{
|
||||
cl.viewangles[PITCH] = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
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_SetQuakeMouseState
|
||||
*/
|
||||
void
|
||||
IN_SetQuakeMouseState (void)
|
||||
{
|
||||
if (mouseactivatetoggle)
|
||||
IN_ActivateMouse ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
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_RestoreOriginalMouseState
|
||||
*/
|
||||
void
|
||||
IN_RestoreOriginalMouseState (void)
|
||||
{
|
||||
if (mouseactivatetoggle) {
|
||||
IN_DeactivateMouse ();
|
||||
mouseactivatetoggle = true;
|
||||
}
|
||||
// try to redraw the cursor so it gets reinitialized, because sometimes it
|
||||
// has garbage after the mode switch
|
||||
ShowCursor (TRUE);
|
||||
ShowCursor (FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_InitDInput
|
||||
*/
|
||||
static 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_Printf ("Couldn't load dinput.dll\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pDirectInputCreate) {
|
||||
pDirectInputCreate =
|
||||
(void *) GetProcAddress (hInstDI, "DirectInputCreateA");
|
||||
|
||||
if (!pDirectInputCreate) {
|
||||
Con_Printf ("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_Printf ("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_Printf ("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_Printf ("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_Printf ("Couldn't set DI buffersize\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_StartupMouse
|
||||
*/
|
||||
static void
|
||||
IN_StartupMouse (void)
|
||||
{
|
||||
// HDC hdc;
|
||||
|
||||
if (COM_CheckParm ("-nomouse"))
|
||||
return;
|
||||
|
||||
mouseinitialized = true;
|
||||
|
||||
if (COM_CheckParm ("-dinput")) {
|
||||
dinput = IN_InitDInput ();
|
||||
|
||||
if (dinput) {
|
||||
Con_Printf ("DirectInput initialized\n");
|
||||
} else {
|
||||
Con_Printf ("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)
|
||||
{
|
||||
Cmd_AddCommand ("force_centerview", Force_CenterView_f, "Force view of player to center");
|
||||
|
||||
uiWheelMessage = RegisterWindowMessage ("MSWHEEL_ROLLMSG");
|
||||
|
||||
|
||||
IN_StartupMouse ();
|
||||
|
||||
JOY_Init ();
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
// mouse variables
|
||||
m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE, NULL,
|
||||
"Toggle mouse input filtering.");
|
||||
|
||||
JOY_Init_Cvars();
|
||||
}
|
||||
|
||||
/*
|
||||
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 < mouse_buttons; i++) {
|
||||
if ((mstate & (1 << i)) && !(mouse_oldbuttonstate & (1 << i))) {
|
||||
Key_Event (K_MOUSE1 + i, -1, true);
|
||||
}
|
||||
|
||||
if (!(mstate & (1 << i)) && (mouse_oldbuttonstate & (1 << i))) {
|
||||
Key_Event (K_MOUSE1 + i, -1, false);
|
||||
}
|
||||
}
|
||||
|
||||
mouse_oldbuttonstate = mstate;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_MouseMove
|
||||
*/
|
||||
void
|
||||
IN_MouseMove (void)
|
||||
{
|
||||
int mx, my;
|
||||
|
||||
// HDC hdc;
|
||||
int i;
|
||||
DIDEVICEOBJECTDATA od;
|
||||
DWORD dwElements;
|
||||
HRESULT hr;
|
||||
|
||||
if (!mouseactive)
|
||||
return;
|
||||
|
||||
if (dinput) {
|
||||
mx = 0;
|
||||
my = 0;
|
||||
|
||||
for (;;) {
|
||||
dwElements = 1;
|
||||
|
||||
hr = IDirectInputDevice_GetDeviceData (g_pMouse,
|
||||
sizeof (DIDEVICEOBJECTDATA),
|
||||
&od, &dwElements, 0);
|
||||
|
||||
if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED)) {
|
||||
dinput_acquired = true;
|
||||
IDirectInputDevice_Acquire (g_pMouse);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Unable to read data or no data available */
|
||||
if (FAILED (hr) || dwElements == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Look at the element to see what happened */
|
||||
|
||||
switch (od.dwOfs) {
|
||||
case DIMOFS_X:
|
||||
mx += od.dwData;
|
||||
break;
|
||||
|
||||
case DIMOFS_Y:
|
||||
my += od.dwData;
|
||||
break;
|
||||
|
||||
case DIMOFS_BUTTON0:
|
||||
if (od.dwData & 0x80)
|
||||
mstate_di |= 1;
|
||||
else
|
||||
mstate_di &= ~1;
|
||||
break;
|
||||
|
||||
case DIMOFS_BUTTON1:
|
||||
if (od.dwData & 0x80)
|
||||
mstate_di |= (1 << 1);
|
||||
else
|
||||
mstate_di &= ~(1 << 1);
|
||||
break;
|
||||
|
||||
case DIMOFS_BUTTON2:
|
||||
if (od.dwData & 0x80)
|
||||
mstate_di |= (1 << 2);
|
||||
else
|
||||
mstate_di &= ~(1 << 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// perform button actions
|
||||
for (i = 0; i < mouse_buttons; i++) {
|
||||
if ((mstate_di & (1 << i)) && !(mouse_oldbuttonstate & (1 << i))) {
|
||||
Key_Event (K_MOUSE1 + i, -1, true);
|
||||
}
|
||||
|
||||
if (!(mstate_di & (1 << i)) && (mouse_oldbuttonstate & (1 << i))) {
|
||||
Key_Event (K_MOUSE1 + i, -1, false);
|
||||
}
|
||||
}
|
||||
|
||||
mouse_oldbuttonstate = mstate_di;
|
||||
} else {
|
||||
GetCursorPos (¤t_pos);
|
||||
mx = current_pos.x - window_center_x + mx_accum;
|
||||
my = current_pos.y - window_center_y + my_accum;
|
||||
mx_accum = 0;
|
||||
my_accum = 0;
|
||||
}
|
||||
|
||||
if (m_filter->value) {
|
||||
mouse_x = (mx + old_mouse_x) * 0.5;
|
||||
mouse_y = (my + old_mouse_y) * 0.5;
|
||||
} else {
|
||||
mouse_x = mx;
|
||||
mouse_y = my;
|
||||
}
|
||||
|
||||
old_mouse_x = mx;
|
||||
old_mouse_y = my;
|
||||
|
||||
mouse_x *= sensitivity->value;
|
||||
mouse_y *= sensitivity->value;
|
||||
|
||||
// add mouse X/Y movement to cmd
|
||||
if ((in_strafe.state & 1) || (lookstrafe->int_val && freelook))
|
||||
viewdelta.position[0] += mouse_x;
|
||||
else
|
||||
viewdelta.angles[YAW] -= mouse_x;
|
||||
|
||||
if (freelook && !(in_strafe.state & 1)) {
|
||||
viewdelta.angles[PITCH] += mouse_y;
|
||||
} else {
|
||||
if ((in_strafe.state & 1) && noclip_anglehack)
|
||||
viewdelta.position[1] -= mouse_y;
|
||||
else
|
||||
viewdelta.position[2] -= mouse_y;
|
||||
}
|
||||
|
||||
// if the mouse has moved, force it to the center, so there's room to move
|
||||
if (mx || my) {
|
||||
SetCursorPos (window_center_x, window_center_y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_Move
|
||||
*/
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
|
||||
if (ActiveApp && !Minimized) {
|
||||
IN_MouseMove ();
|
||||
JOY_Move ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_Accumulate
|
||||
*/
|
||||
void
|
||||
IN_Accumulate (void)
|
||||
{
|
||||
// int mx, my;
|
||||
// HDC hdc;
|
||||
|
||||
// if (dinput) return; // If using dinput we don't probably need this
|
||||
|
||||
if (mouseactive) {
|
||||
GetCursorPos (¤t_pos);
|
||||
|
||||
mx_accum += current_pos.x - window_center_x;
|
||||
my_accum += current_pos.y - window_center_y;
|
||||
|
||||
// force the mouse to the center, so there's room to move
|
||||
SetCursorPos (window_center_x, window_center_y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_ClearStates
|
||||
*/
|
||||
void
|
||||
IN_ClearStates (void)
|
||||
{
|
||||
|
||||
if (mouseactive) {
|
||||
mx_accum = 0;
|
||||
my_accum = 0;
|
||||
mouse_oldbuttonstate = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
IN_Commands
|
||||
*/
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
// Joystick
|
||||
JOY_Command();
|
||||
}
|
||||
|
||||
void
|
||||
IN_HandlePause (qboolean paused)
|
||||
{
|
||||
}
|
|
@ -1,562 +0,0 @@
|
|||
/*
|
||||
in_x11.c
|
||||
|
||||
general x11 input driver
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
Copyright (C) 2000 Marcus Sundberg [mackan@stacken.kth.se]
|
||||
Copyright (C) 1999,2000 contributors of the QuakeForge project
|
||||
Please see the file "AUTHORS" for a list of contributors
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifdef HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#endif
|
||||
#ifdef HAVE_STRINGS_H
|
||||
# include <strings.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#define _BSD
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/keysym.h>
|
||||
|
||||
#ifdef HAVE_DGA
|
||||
# include <X11/extensions/XShm.h>
|
||||
# include <X11/extensions/xf86dga.h>
|
||||
#endif
|
||||
|
||||
#include "client.h"
|
||||
#include "QF/compat.h"
|
||||
#include "QF/console.h"
|
||||
#include "context_x11.h"
|
||||
#include "QF/cmd.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "dga_check.h"
|
||||
#include "host.h"
|
||||
#include "QF/input.h"
|
||||
#include "QF/joystick.h"
|
||||
#include "QF/keys.h"
|
||||
#include "QF/qargs.h"
|
||||
#include "QF/sys.h"
|
||||
#include "view.h"
|
||||
|
||||
cvar_t *_windowed_mouse;
|
||||
cvar_t *m_filter;
|
||||
|
||||
cvar_t *in_dga;
|
||||
cvar_t *in_dga_mouseaccel;
|
||||
|
||||
static qboolean dga_avail;
|
||||
static qboolean dga_active;
|
||||
|
||||
static keydest_t old_key_dest = key_none;
|
||||
|
||||
static qboolean mouse_avail;
|
||||
static float mouse_x, mouse_y;
|
||||
static float old_mouse_x, old_mouse_y;
|
||||
static int p_mouse_x, p_mouse_y;
|
||||
|
||||
#define KEY_MASK (KeyPressMask | KeyReleaseMask)
|
||||
#define MOUSE_MASK (ButtonPressMask | ButtonReleaseMask | PointerMotionMask)
|
||||
#define INPUT_MASK (KEY_MASK | MOUSE_MASK)
|
||||
|
||||
static int
|
||||
XLateKey (XKeyEvent * ev, qboolean modified)
|
||||
{
|
||||
char tmp[2];
|
||||
int key = 0;
|
||||
KeySym keysym;
|
||||
|
||||
if (!modified) {
|
||||
keysym = XLookupKeysym (ev, 0);
|
||||
} else {
|
||||
XLookupString (ev, tmp, 1, &keysym, NULL);
|
||||
}
|
||||
|
||||
switch (keysym) {
|
||||
case XK_KP_Page_Up:
|
||||
key = KP_PGUP;
|
||||
break;
|
||||
case XK_Page_Up:
|
||||
key = K_PGUP;
|
||||
break;
|
||||
|
||||
case XK_KP_Page_Down:
|
||||
key = KP_PGDN;
|
||||
break;
|
||||
case XK_Page_Down:
|
||||
key = K_PGDN;
|
||||
break;
|
||||
|
||||
case XK_KP_Home:
|
||||
key = KP_HOME;
|
||||
break;
|
||||
case XK_Home:
|
||||
key = K_HOME;
|
||||
break;
|
||||
|
||||
case XK_KP_End:
|
||||
key = KP_END;
|
||||
break;
|
||||
case XK_End:
|
||||
key = K_END;
|
||||
break;
|
||||
|
||||
case XK_KP_Left:
|
||||
key = KP_LEFTARROW;
|
||||
break;
|
||||
case XK_Left:
|
||||
key = K_LEFTARROW;
|
||||
break;
|
||||
|
||||
case XK_KP_Right:
|
||||
key = KP_RIGHTARROW;
|
||||
break;
|
||||
case XK_Right:
|
||||
key = K_RIGHTARROW;
|
||||
break;
|
||||
|
||||
case XK_KP_Down:
|
||||
key = KP_DOWNARROW;
|
||||
break;
|
||||
case XK_Down:
|
||||
key = K_DOWNARROW;
|
||||
break;
|
||||
|
||||
case XK_KP_Up:
|
||||
key = KP_UPARROW;
|
||||
break;
|
||||
case XK_Up:
|
||||
key = K_UPARROW;
|
||||
break;
|
||||
|
||||
case XK_Escape:
|
||||
key = K_ESCAPE;
|
||||
break;
|
||||
|
||||
case XK_KP_Enter:
|
||||
key = KP_ENTER;
|
||||
break;
|
||||
case XK_Return:
|
||||
key = K_ENTER;
|
||||
break;
|
||||
|
||||
case XK_Tab:
|
||||
key = K_TAB;
|
||||
break;
|
||||
|
||||
case XK_F1:
|
||||
key = K_F1;
|
||||
break;
|
||||
case XK_F2:
|
||||
key = K_F2;
|
||||
break;
|
||||
case XK_F3:
|
||||
key = K_F3;
|
||||
break;
|
||||
case XK_F4:
|
||||
key = K_F4;
|
||||
break;
|
||||
case XK_F5:
|
||||
key = K_F5;
|
||||
break;
|
||||
case XK_F6:
|
||||
key = K_F6;
|
||||
break;
|
||||
case XK_F7:
|
||||
key = K_F7;
|
||||
break;
|
||||
case XK_F8:
|
||||
key = K_F8;
|
||||
break;
|
||||
case XK_F9:
|
||||
key = K_F9;
|
||||
break;
|
||||
case XK_F10:
|
||||
key = K_F10;
|
||||
break;
|
||||
case XK_F11:
|
||||
key = K_F11;
|
||||
break;
|
||||
case XK_F12:
|
||||
key = K_F12;
|
||||
break;
|
||||
|
||||
case XK_BackSpace:
|
||||
key = K_BACKSPACE;
|
||||
break;
|
||||
|
||||
case XK_KP_Delete:
|
||||
key = KP_DEL;
|
||||
break;
|
||||
case XK_Delete:
|
||||
key = K_DEL;
|
||||
break;
|
||||
|
||||
case XK_Pause:
|
||||
key = K_PAUSE;
|
||||
break;
|
||||
|
||||
case XK_Shift_L:
|
||||
case XK_Shift_R:
|
||||
key = K_SHIFT;
|
||||
break;
|
||||
|
||||
case XK_Execute:
|
||||
case XK_Control_L:
|
||||
case XK_Control_R:
|
||||
key = K_CTRL;
|
||||
break;
|
||||
|
||||
case XK_Mode_switch:
|
||||
case XK_Alt_L:
|
||||
case XK_Meta_L:
|
||||
case XK_Alt_R:
|
||||
case XK_Meta_R:
|
||||
key = K_ALT;
|
||||
break;
|
||||
|
||||
case XK_Caps_Lock:
|
||||
key = K_CAPSLOCK;
|
||||
break;
|
||||
case XK_KP_Begin:
|
||||
key = KP_5;
|
||||
break;
|
||||
|
||||
case XK_Insert:
|
||||
key = K_INS;
|
||||
break;
|
||||
case XK_KP_Insert:
|
||||
key = KP_INS;
|
||||
break;
|
||||
|
||||
case XK_KP_Multiply:
|
||||
key = KP_MULTIPLY;
|
||||
break;
|
||||
case XK_KP_Add:
|
||||
key = KP_PLUS;
|
||||
break;
|
||||
case XK_KP_Subtract:
|
||||
key = KP_MINUS;
|
||||
break;
|
||||
case XK_KP_Divide:
|
||||
key = KP_DIVIDE;
|
||||
break;
|
||||
|
||||
/* For Sun keyboards */
|
||||
case XK_F27:
|
||||
key = K_HOME;
|
||||
break;
|
||||
case XK_F29:
|
||||
key = K_PGUP;
|
||||
break;
|
||||
case XK_F33:
|
||||
key = K_END;
|
||||
break;
|
||||
case XK_F35:
|
||||
key = K_PGDN;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (keysym < 128) {
|
||||
/* ASCII keys */
|
||||
key = keysym;
|
||||
if (!modified && ((key >= 'A') && (key <= 'Z'))) {
|
||||
key = key + ('a' - 'A');
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
event_key (XEvent * event)
|
||||
{
|
||||
if (old_key_dest != key_dest) {
|
||||
old_key_dest = key_dest;
|
||||
if (key_dest == key_game) {
|
||||
XAutoRepeatOff (x_disp);
|
||||
} else {
|
||||
XAutoRepeatOn (x_disp);
|
||||
}
|
||||
}
|
||||
Key_Event (XLateKey (&event->xkey, 0), XLateKey (&event->xkey, 1),
|
||||
event->type == KeyPress);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
event_button (XEvent * event)
|
||||
{
|
||||
int but;
|
||||
|
||||
but = event->xbutton.button;
|
||||
if (but == 2)
|
||||
but = 3;
|
||||
else if (but == 3)
|
||||
but = 2;
|
||||
switch (but) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
Key_Event (K_MOUSE1 + but - 1, 0, event->type == ButtonPress);
|
||||
break;
|
||||
case 4:
|
||||
Key_Event (K_MWHEELUP, 0, event->type == ButtonPress);
|
||||
break;
|
||||
case 5:
|
||||
Key_Event (K_MWHEELDOWN, 0, event->type == ButtonPress);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
center_pointer (void)
|
||||
{
|
||||
XEvent event;
|
||||
|
||||
event.type = MotionNotify;
|
||||
event.xmotion.display = x_disp;
|
||||
event.xmotion.window = x_win;
|
||||
event.xmotion.x = vid.width / 2;
|
||||
event.xmotion.y = vid.height / 2;
|
||||
XSendEvent (x_disp, x_win, False, PointerMotionMask, &event);
|
||||
XWarpPointer (x_disp, None, x_win, 0, 0, 0, 0,
|
||||
vid.width / 2, vid.height / 2);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
event_motion (XEvent * event)
|
||||
{
|
||||
if (dga_active) {
|
||||
mouse_x += event->xmotion.x_root * in_dga_mouseaccel->value;
|
||||
mouse_y += event->xmotion.y_root * in_dga_mouseaccel->value;
|
||||
} else {
|
||||
if (vid_fullscreen->int_val || _windowed_mouse->int_val) {
|
||||
if (!event->xmotion.send_event) {
|
||||
mouse_x += (event->xmotion.x - p_mouse_x);
|
||||
mouse_y += (event->xmotion.y - p_mouse_y);
|
||||
if (abs (vid.width / 2 - event->xmotion.x) > vid.width / 4
|
||||
|| abs (vid.height / 2 - event->xmotion.y) > vid.height / 4) {
|
||||
center_pointer ();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mouse_x += (event->xmotion.x - p_mouse_x);
|
||||
mouse_y += (event->xmotion.y - p_mouse_y);
|
||||
}
|
||||
p_mouse_x = event->xmotion.x;
|
||||
p_mouse_y = event->xmotion.y;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
static int old_windowed_mouse;
|
||||
static int old_in_dga;
|
||||
|
||||
JOY_Command ();
|
||||
|
||||
if ((old_windowed_mouse != _windowed_mouse->int_val)
|
||||
|| (old_in_dga != in_dga->int_val)) {
|
||||
old_windowed_mouse = _windowed_mouse->int_val;
|
||||
old_in_dga = in_dga->int_val;
|
||||
|
||||
if (_windowed_mouse->int_val) { // grab the pointer
|
||||
XGrabPointer (x_disp, x_win, True, MOUSE_MASK, GrabModeAsync,
|
||||
GrabModeAsync, x_win, None, CurrentTime);
|
||||
#ifdef HAVE_DGA
|
||||
if (dga_avail && in_dga->int_val && !dga_active) {
|
||||
XF86DGADirectVideo (x_disp, DefaultScreen (x_disp),
|
||||
XF86DGADirectMouse);
|
||||
dga_active = true;
|
||||
}
|
||||
#endif
|
||||
} else { // ungrab the pointer
|
||||
#ifdef HAVE_DGA
|
||||
if (dga_avail && in_dga->int_val && dga_active) {
|
||||
XF86DGADirectVideo (x_disp, DefaultScreen (x_disp), 0);
|
||||
dga_active = false;
|
||||
}
|
||||
#endif
|
||||
XUngrabPointer (x_disp, CurrentTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_SendKeyEvents (void)
|
||||
{
|
||||
/* Get events from X server. */
|
||||
x11_process_events ();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
JOY_Move ();
|
||||
|
||||
if (!mouse_avail)
|
||||
return;
|
||||
|
||||
if (m_filter->int_val) {
|
||||
mouse_x = (mouse_x + old_mouse_x) * 0.5;
|
||||
mouse_y = (mouse_y + old_mouse_y) * 0.5;
|
||||
}
|
||||
old_mouse_x = mouse_x;
|
||||
old_mouse_y = mouse_y;
|
||||
|
||||
mouse_x *= sensitivity->value;
|
||||
mouse_y *= sensitivity->value;
|
||||
|
||||
if ((in_strafe.state & 1) || (lookstrafe->int_val && freelook))
|
||||
viewdelta.position[0] += mouse_x;
|
||||
else
|
||||
viewdelta.angles[YAW] -= mouse_x;
|
||||
|
||||
if (freelook && !(in_strafe.state & 1)) {
|
||||
viewdelta.angles[PITCH] += mouse_y;
|
||||
} else {
|
||||
if ((in_strafe.state & 1) && noclip_anglehack)
|
||||
viewdelta.position[1] -= mouse_y;
|
||||
else
|
||||
viewdelta.position[2] -= mouse_y;
|
||||
}
|
||||
mouse_x = mouse_y = 0.0;
|
||||
}
|
||||
|
||||
/*
|
||||
Called at shutdown
|
||||
*/
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
JOY_Shutdown ();
|
||||
|
||||
Con_Printf ("IN_Shutdown\n");
|
||||
mouse_avail = 0;
|
||||
if (x_disp) {
|
||||
XAutoRepeatOn (x_disp);
|
||||
|
||||
#ifdef HAVE_DGA
|
||||
if (dga_avail)
|
||||
XF86DGADirectVideo (x_disp, DefaultScreen (x_disp), 0);
|
||||
#endif
|
||||
}
|
||||
x11_close_display ();
|
||||
}
|
||||
|
||||
void
|
||||
Force_CenterView_f (void)
|
||||
{
|
||||
cl.viewangles[PITCH] = 0;
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
// open the display
|
||||
if (!x_disp)
|
||||
Sys_Error ("IN: No display!!\n");
|
||||
if (!x_win)
|
||||
Sys_Error ("IN: No window!!\n");
|
||||
|
||||
x11_open_display (); // call to increment the reference
|
||||
// counter
|
||||
|
||||
{
|
||||
int attribmask = CWEventMask;
|
||||
XWindowAttributes attribs_1;
|
||||
XSetWindowAttributes attribs_2;
|
||||
|
||||
XGetWindowAttributes (x_disp, x_win, &attribs_1);
|
||||
|
||||
attribs_2.event_mask = attribs_1.your_event_mask | INPUT_MASK;
|
||||
|
||||
XChangeWindowAttributes (x_disp, x_win, attribmask, &attribs_2);
|
||||
}
|
||||
|
||||
JOY_Init ();
|
||||
|
||||
XAutoRepeatOff (x_disp);
|
||||
|
||||
if (COM_CheckParm ("-nomouse"))
|
||||
return;
|
||||
|
||||
dga_avail = VID_CheckDGA (x_disp, NULL, NULL, NULL);
|
||||
if (vid_fullscreen->int_val) {
|
||||
Cvar_Set (_windowed_mouse, "1");
|
||||
_windowed_mouse->flags |= CVAR_ROM;
|
||||
}
|
||||
|
||||
mouse_x = mouse_y = 0.0;
|
||||
mouse_avail = 1;
|
||||
|
||||
x11_add_event (KeyPress, &event_key);
|
||||
x11_add_event (KeyRelease, &event_key);
|
||||
x11_add_event (ButtonPress, &event_button);
|
||||
x11_add_event (ButtonRelease, &event_button);
|
||||
x11_add_event (MotionNotify, &event_motion);
|
||||
|
||||
Cmd_AddCommand ("force_centerview", Force_CenterView_f,
|
||||
"Force view of player to center");
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
JOY_Init_Cvars ();
|
||||
_windowed_mouse =
|
||||
Cvar_Get ("_windowed_mouse", "0", CVAR_ARCHIVE, NULL,
|
||||
"With this set to 1, quake will grab the mouse from X");
|
||||
m_filter =
|
||||
Cvar_Get ("m_filter", "0", CVAR_ARCHIVE, NULL,
|
||||
"Toggle mouse input filtering.");
|
||||
in_dga = Cvar_Get ("in_dga", "1", CVAR_ARCHIVE, NULL, "DGA Input support");
|
||||
in_dga_mouseaccel = Cvar_Get ("in_dga_mouseaccel", "1", CVAR_ARCHIVE, NULL,
|
||||
"DGA Mouse accelleration multiplier");
|
||||
}
|
||||
|
||||
void
|
||||
IN_HandlePause (qboolean paused)
|
||||
{
|
||||
}
|
|
@ -1,152 +0,0 @@
|
|||
/*
|
||||
in_fbdev.c
|
||||
|
||||
fix this!
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <termios.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include "protocol.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "QF/keys.h"
|
||||
|
||||
cvar_t *_windowed_mouse;
|
||||
|
||||
int
|
||||
fd_blocking (int fd, int on)
|
||||
{
|
||||
int x;
|
||||
|
||||
#if defined(_POSIX_SOURCE) || !defined(FIONBIO)
|
||||
#if !defined(O_NONBLOCK)
|
||||
# if defined(O_NDELAY)
|
||||
# define O_NONBLOCK O_NDELAY
|
||||
# endif
|
||||
#endif
|
||||
if ((x = fcntl(fd, F_GETFL, 0)) == -1)
|
||||
return -1;
|
||||
if (on)
|
||||
x &= ~O_NONBLOCK;
|
||||
else
|
||||
x |= O_NONBLOCK;
|
||||
|
||||
return fcntl(fd, F_SETFL, x);
|
||||
#else
|
||||
x = !on;
|
||||
|
||||
return ioctl(fd, FIONBIO, &x);
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct termios old_tty, new_tty;
|
||||
static int tty_fd = 0;
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
fd_blocking(0, 0);
|
||||
tcgetattr(tty_fd, &old_tty);
|
||||
new_tty = old_tty;
|
||||
new_tty.c_cc[VMIN] = 1;
|
||||
new_tty.c_cc[VTIME] = 0;
|
||||
new_tty.c_lflag &= ~ICANON;
|
||||
new_tty.c_iflag &= ~IXON;
|
||||
tcsetattr(tty_fd, TCSADRAIN, &new_tty);
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_SendKeyEvents (void)
|
||||
{
|
||||
int k, down;
|
||||
char buf[4];
|
||||
|
||||
if (read(0, buf, 1) == 1) {
|
||||
k = buf[0];
|
||||
switch (k) {
|
||||
case '\r':
|
||||
case '\n':
|
||||
k = K_ENTER;
|
||||
break;
|
||||
case '\033':
|
||||
if (read(0, buf, 2) != 2)
|
||||
break;
|
||||
switch (buf[1]) {
|
||||
case 'A':
|
||||
k = K_UPARROW;
|
||||
break;
|
||||
case 'B':
|
||||
k = K_DOWNARROW;
|
||||
break;
|
||||
case 'C':
|
||||
k = K_RIGHTARROW;
|
||||
break;
|
||||
case 'D':
|
||||
k = K_LEFTARROW;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
down = 1;
|
||||
Key_Event(k, -1, down);
|
||||
Key_Event(k, -1, !down);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
IN_ModeChanged
|
||||
*/
|
||||
void
|
||||
IN_ModeChanged (void)
|
||||
{
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/*
|
||||
in_null.c
|
||||
|
||||
for systems without a mouse
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
IN_Move (usercmd_t *cmd)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
IN_ModeChanged
|
||||
*/
|
||||
void
|
||||
IN_ModeChanged (void)
|
||||
{
|
||||
}
|
|
@ -1,434 +0,0 @@
|
|||
/*
|
||||
in_sdl.c
|
||||
|
||||
general sdl input driver
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
#include "client.h"
|
||||
#include "cl_input.h"
|
||||
#include "cl_main.h"
|
||||
#include "QF/compat.h"
|
||||
#include "QF/console.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "draw.h"
|
||||
#include "host.h"
|
||||
#include "QF/input.h"
|
||||
#include "QF/joystick.h"
|
||||
#include "QF/keys.h"
|
||||
#include "QF/sys.h"
|
||||
#include "QF/qargs.h"
|
||||
#include "QF/qendian.h"
|
||||
#include "vid.h"
|
||||
#include "view.h"
|
||||
|
||||
#ifdef WIN32
|
||||
// FIXME: this is evil...
|
||||
# include <windows.h>
|
||||
HWND mainwindow;
|
||||
#endif
|
||||
|
||||
cvar_t *m_filter;
|
||||
cvar_t *_windowed_mouse;
|
||||
int old_windowed_mouse;
|
||||
|
||||
int modestate; // FIXME: just to avoid cross-comp.
|
||||
|
||||
// errors - remove later
|
||||
|
||||
static qboolean mouse_avail;
|
||||
static float mouse_x, mouse_y;
|
||||
static float old_mouse_x, old_mouse_y;
|
||||
static int mouse_oldbuttonstate = 0;
|
||||
|
||||
extern viddef_t vid; // global video state
|
||||
|
||||
/*
|
||||
IN_SendKeyEvents
|
||||
*/
|
||||
|
||||
void
|
||||
IN_SendKeyEvents (void)
|
||||
{
|
||||
SDL_Event event;
|
||||
int sym, state, but;
|
||||
int modstate;
|
||||
|
||||
while (SDL_PollEvent (&event)) {
|
||||
switch (event.type) {
|
||||
case SDL_KEYDOWN:
|
||||
case SDL_KEYUP:
|
||||
sym = event.key.keysym.sym;
|
||||
state = event.key.state;
|
||||
modstate = SDL_GetModState ();
|
||||
switch (sym) {
|
||||
case SDLK_DELETE:
|
||||
sym = K_DEL;
|
||||
break;
|
||||
case SDLK_BACKSPACE:
|
||||
sym = K_BACKSPACE;
|
||||
break;
|
||||
case SDLK_F1:
|
||||
sym = K_F1;
|
||||
break;
|
||||
case SDLK_F2:
|
||||
sym = K_F2;
|
||||
break;
|
||||
case SDLK_F3:
|
||||
sym = K_F3;
|
||||
break;
|
||||
case SDLK_F4:
|
||||
sym = K_F4;
|
||||
break;
|
||||
case SDLK_F5:
|
||||
sym = K_F5;
|
||||
break;
|
||||
case SDLK_F6:
|
||||
sym = K_F6;
|
||||
break;
|
||||
case SDLK_F7:
|
||||
sym = K_F7;
|
||||
break;
|
||||
case SDLK_F8:
|
||||
sym = K_F8;
|
||||
break;
|
||||
case SDLK_F9:
|
||||
sym = K_F9;
|
||||
break;
|
||||
case SDLK_F10:
|
||||
sym = K_F10;
|
||||
break;
|
||||
case SDLK_F11:
|
||||
sym = K_F11;
|
||||
break;
|
||||
case SDLK_F12:
|
||||
sym = K_F12;
|
||||
break;
|
||||
case SDLK_BREAK:
|
||||
case SDLK_PAUSE:
|
||||
sym = K_PAUSE;
|
||||
break;
|
||||
case SDLK_UP:
|
||||
sym = K_UPARROW;
|
||||
break;
|
||||
case SDLK_DOWN:
|
||||
sym = K_DOWNARROW;
|
||||
break;
|
||||
case SDLK_RIGHT:
|
||||
sym = K_RIGHTARROW;
|
||||
break;
|
||||
case SDLK_LEFT:
|
||||
sym = K_LEFTARROW;
|
||||
break;
|
||||
case SDLK_INSERT:
|
||||
sym = K_INS;
|
||||
break;
|
||||
case SDLK_HOME:
|
||||
sym = K_HOME;
|
||||
break;
|
||||
case SDLK_END:
|
||||
sym = K_END;
|
||||
break;
|
||||
case SDLK_PAGEUP:
|
||||
sym = K_PGUP;
|
||||
break;
|
||||
case SDLK_PAGEDOWN:
|
||||
sym = K_PGDN;
|
||||
break;
|
||||
case SDLK_RSHIFT:
|
||||
case SDLK_LSHIFT:
|
||||
sym = K_SHIFT;
|
||||
break;
|
||||
case SDLK_RCTRL:
|
||||
case SDLK_LCTRL:
|
||||
sym = K_CTRL;
|
||||
break;
|
||||
case SDLK_RALT:
|
||||
case SDLK_LALT:
|
||||
sym = K_ALT;
|
||||
break;
|
||||
case SDLK_CAPSLOCK:
|
||||
sym = K_CAPSLOCK;
|
||||
break;
|
||||
case SDLK_KP0:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_INS;
|
||||
else
|
||||
sym = SDLK_0;
|
||||
break;
|
||||
case SDLK_KP1:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_END;
|
||||
else
|
||||
sym = SDLK_1;
|
||||
break;
|
||||
case SDLK_KP2:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_DOWNARROW;
|
||||
else
|
||||
sym = SDLK_2;
|
||||
break;
|
||||
case SDLK_KP3:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_PGDN;
|
||||
else
|
||||
sym = SDLK_3;
|
||||
break;
|
||||
case SDLK_KP4:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_LEFTARROW;
|
||||
else
|
||||
sym = SDLK_4;
|
||||
break;
|
||||
case SDLK_KP5:
|
||||
sym = SDLK_5;
|
||||
break;
|
||||
case SDLK_KP6:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_RIGHTARROW;
|
||||
else
|
||||
sym = SDLK_6;
|
||||
break;
|
||||
case SDLK_KP7:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_HOME;
|
||||
else
|
||||
sym = SDLK_7;
|
||||
break;
|
||||
case SDLK_KP8:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_UPARROW;
|
||||
else
|
||||
sym = SDLK_8;
|
||||
break;
|
||||
case SDLK_KP9:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_PGUP;
|
||||
else
|
||||
sym = SDLK_9;
|
||||
break;
|
||||
case SDLK_KP_PERIOD:
|
||||
if (modstate & KMOD_NUM)
|
||||
sym = K_DEL;
|
||||
else
|
||||
sym = SDLK_PERIOD;
|
||||
break;
|
||||
case SDLK_KP_DIVIDE:
|
||||
sym = SDLK_SLASH;
|
||||
break;
|
||||
case SDLK_KP_MULTIPLY:
|
||||
sym = SDLK_ASTERISK;
|
||||
break;
|
||||
case SDLK_KP_MINUS:
|
||||
sym = SDLK_MINUS;
|
||||
break;
|
||||
case SDLK_KP_PLUS:
|
||||
sym = SDLK_PLUS;
|
||||
break;
|
||||
case SDLK_KP_ENTER:
|
||||
sym = SDLK_RETURN;
|
||||
break;
|
||||
case SDLK_KP_EQUALS:
|
||||
sym = SDLK_EQUALS;
|
||||
break;
|
||||
}
|
||||
// If we're not directly handled and still above 255
|
||||
// just force it to 0
|
||||
if (sym > 255)
|
||||
sym = 0;
|
||||
Key_Event (sym, -1, state);
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
but = event.button.button;
|
||||
if (but == 2)
|
||||
but = 3;
|
||||
else if (but == 3)
|
||||
but = 2;
|
||||
|
||||
switch (but) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
Key_Event (K_MOUSE1 + but - 1, 0, event.type
|
||||
== SDL_MOUSEBUTTONDOWN);
|
||||
break;
|
||||
case 4:
|
||||
Key_Event (K_MWHEELUP, 0,
|
||||
event.type == SDL_MOUSEBUTTONDOWN);
|
||||
break;
|
||||
case 5:
|
||||
Key_Event (K_MWHEELDOWN, 0,
|
||||
event.type == SDL_MOUSEBUTTONDOWN);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_MOUSEMOTION:
|
||||
if (_windowed_mouse->value) {
|
||||
if ((event.motion.x != (vid.width / 2))
|
||||
|| (event.motion.y != (vid.height / 2))) {
|
||||
// *2 for vid_sdl.c, *10 for vid_sgl.c.
|
||||
mouse_x = event.motion.xrel * 5;
|
||||
mouse_y = event.motion.yrel * 5;
|
||||
if (
|
||||
(event.motion.x <
|
||||
((vid.width / 2) - (vid.width / 4)))
|
||||
|| (event.motion.x >
|
||||
((vid.width / 2) + (vid.width / 4)))
|
||||
|| (event.motion.y <
|
||||
((vid.height / 2) - (vid.height / 4)))
|
||||
|| (event.motion.y >
|
||||
((vid.height / 2) + (vid.height / 4))))
|
||||
SDL_WarpMouse (vid.width / 2, vid.height / 2);
|
||||
}
|
||||
} else {
|
||||
// following are *2 in vid_sdl.c, vid_sgl.c is *10
|
||||
mouse_x = event.motion.xrel * 5;
|
||||
mouse_y = event.motion.yrel * 5;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_QUIT:
|
||||
CL_Disconnect ();
|
||||
Sys_Quit ();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
JOY_Command ();
|
||||
|
||||
if (old_windowed_mouse != _windowed_mouse->value) {
|
||||
old_windowed_mouse = _windowed_mouse->value;
|
||||
if (!_windowed_mouse->value) {
|
||||
// SDL_ShowCursor (0);
|
||||
SDL_WM_GrabInput (SDL_GRAB_OFF);
|
||||
} else {
|
||||
SDL_WM_GrabInput (SDL_GRAB_ON);
|
||||
// SDL_ShowCursor (1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
JOY_Init ();
|
||||
|
||||
if (COM_CheckParm ("-nomouse") && !_windowed_mouse->value)
|
||||
return;
|
||||
|
||||
mouse_x = mouse_y = 0.0;
|
||||
mouse_avail = 1;
|
||||
// SDL_ShowCursor (0);
|
||||
// SDL_WM_GrabInput (SDL_GRAB_ON);
|
||||
// FIXME: disable DGA if in_dgamouse says to.
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
JOY_Init_Cvars ();
|
||||
|
||||
_windowed_mouse = Cvar_Get ("_windowed_mouse", "0", CVAR_ARCHIVE, NULL, "If set to 1, quake will grab the mouse in X");
|
||||
m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE, NULL, "Toggle mouse input filtering");
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
mouse_avail = 0;
|
||||
}
|
||||
|
||||
void
|
||||
IN_Frame (void)
|
||||
{
|
||||
int i;
|
||||
int mouse_buttonstate;
|
||||
|
||||
if (!mouse_avail)
|
||||
return;
|
||||
|
||||
i = SDL_GetMouseState (NULL, NULL);
|
||||
/* Quake swaps the second and third buttons */
|
||||
mouse_buttonstate = (i & ~0x06) | ((i & 0x02) << 1) | ((i & 0x04) >> 1);
|
||||
for (i = 0; i < 3; i++) {
|
||||
if ((mouse_buttonstate & (1 << i))
|
||||
&& !(mouse_oldbuttonstate & (1 << i))) Key_Event (K_MOUSE1 + i, 0,
|
||||
true);
|
||||
|
||||
if (!(mouse_buttonstate & (1 << i))
|
||||
&& (mouse_oldbuttonstate & (1 << i))) Key_Event (K_MOUSE1 + i, 0,
|
||||
false);
|
||||
}
|
||||
mouse_oldbuttonstate = mouse_buttonstate;
|
||||
}
|
||||
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
|
||||
JOY_Move ();
|
||||
|
||||
if (!mouse_avail)
|
||||
return;
|
||||
|
||||
if (m_filter->value) {
|
||||
mouse_x = (mouse_x + old_mouse_x) * 0.5;
|
||||
mouse_y = (mouse_y + old_mouse_y) * 0.5;
|
||||
old_mouse_x = mouse_x;
|
||||
old_mouse_y = mouse_y;
|
||||
}
|
||||
|
||||
mouse_x *= sensitivity->value;
|
||||
mouse_y *= sensitivity->value;
|
||||
|
||||
if ((in_strafe.state & 1) || (lookstrafe->value && (in_mlook.state & 1)))
|
||||
viewdelta.position[0] += mouse_x;
|
||||
else
|
||||
viewdelta.angles[YAW] -= mouse_x;
|
||||
|
||||
if (freelook && !(in_strafe.state & 1)) {
|
||||
viewdelta.angles[PITCH] += mouse_y;
|
||||
} else {
|
||||
if ((in_strafe.state & 1) && noclip_anglehack)
|
||||
viewdelta.position[1] -= mouse_y;
|
||||
else
|
||||
viewdelta.position[2] -= mouse_y;
|
||||
}
|
||||
mouse_x = mouse_y = 0.0;
|
||||
}
|
|
@ -1,402 +0,0 @@
|
|||
/*
|
||||
in_svgalib.c
|
||||
|
||||
(description)
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
Copyright (C) 1999-2000 Marcus Sundberg [mackan@stacken.kth.se]
|
||||
Copyright (C) 1999,2000 contributors of the QuakeForge project
|
||||
Please see the file "AUTHORS" for a list of contributors
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <vga.h>
|
||||
#include <vgakeyboard.h>
|
||||
#include <vgamouse.h>
|
||||
|
||||
#include "cl_input.h"
|
||||
#include "client.h"
|
||||
#include "QF/cmd.h"
|
||||
#include "QF/compat.h"
|
||||
#include "QF/console.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "host.h"
|
||||
#include "QF/input.h"
|
||||
#include "QF/joystick.h"
|
||||
#include "QF/keys.h"
|
||||
#include "QF/qargs.h"
|
||||
#include "QF/sys.h"
|
||||
#include "view.h"
|
||||
|
||||
static int UseKeyboard = 1;
|
||||
static int UseMouse = 1;
|
||||
static int in_svgalib_inited = 0;
|
||||
|
||||
static unsigned char scantokey[128];
|
||||
static int mouse_buttons;
|
||||
static int mouse_buttonstate;
|
||||
static int mouse_oldbuttonstate;
|
||||
static float mouse_x, mouse_y;
|
||||
static float old_mouse_x, old_mouse_y;
|
||||
static int mx, my;
|
||||
|
||||
static void IN_InitKeyboard (void);
|
||||
static void IN_InitMouse (void);
|
||||
|
||||
cvar_t *_windowed_mouse;
|
||||
cvar_t *m_filter;
|
||||
|
||||
static void
|
||||
keyhandler (int scancode, int state)
|
||||
{
|
||||
int sc;
|
||||
|
||||
sc = scancode & 0x7f;
|
||||
#if 0
|
||||
Con_Printf ("scancode=%x (%d%s)\n", scancode, sc,
|
||||
scancode & 0x80 ? "+128" : "");
|
||||
#endif
|
||||
Key_Event (scantokey[sc], -1, state == KEY_EVENTPRESS);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
mousehandler (int buttonstate, int dx, int dy, int dz, int drx, int dry, int drz)
|
||||
{
|
||||
mouse_buttonstate = buttonstate;
|
||||
mx += dx;
|
||||
my += dy;
|
||||
if (drx > 0) {
|
||||
Key_Event (K_MWHEELUP, 0, 1);
|
||||
Key_Event (K_MWHEELUP, 0, 0);
|
||||
} else if (drx < 0) {
|
||||
Key_Event (K_MWHEELDOWN, 0, 1);
|
||||
Key_Event (K_MWHEELDOWN, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Force_CenterView_f (void)
|
||||
{
|
||||
cl.viewangles[PITCH] = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
if (COM_CheckParm ("-nokbd"))
|
||||
UseKeyboard = 0;
|
||||
if (COM_CheckParm ("-nomouse"))
|
||||
UseMouse = 0;
|
||||
|
||||
if (UseKeyboard)
|
||||
IN_InitKeyboard ();
|
||||
if (UseMouse)
|
||||
IN_InitMouse ();
|
||||
|
||||
JOY_Init ();
|
||||
|
||||
in_svgalib_inited = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
JOY_Init_Cvars ();
|
||||
m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE, NULL,
|
||||
"Toggle mouse input filtering.");
|
||||
}
|
||||
|
||||
static void
|
||||
IN_InitKeyboard (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 128; i++) {
|
||||
scantokey[i] = ' ';
|
||||
}
|
||||
|
||||
scantokey[1] = K_ESCAPE;
|
||||
scantokey[2] = '1';
|
||||
scantokey[3] = '2';
|
||||
scantokey[4] = '3';
|
||||
scantokey[5] = '4';
|
||||
scantokey[6] = '5';
|
||||
scantokey[7] = '6';
|
||||
scantokey[8] = '7';
|
||||
scantokey[9] = '8';
|
||||
scantokey[10] = '9';
|
||||
scantokey[11] = '0';
|
||||
scantokey[12] = '-';
|
||||
scantokey[13] = '=';
|
||||
scantokey[14] = K_BACKSPACE;
|
||||
scantokey[15] = K_TAB;
|
||||
scantokey[16] = 'q';
|
||||
scantokey[17] = 'w';
|
||||
scantokey[18] = 'e';
|
||||
scantokey[19] = 'r';
|
||||
scantokey[20] = 't';
|
||||
scantokey[21] = 'y';
|
||||
scantokey[22] = 'u';
|
||||
scantokey[23] = 'i';
|
||||
scantokey[24] = 'o';
|
||||
scantokey[25] = 'p';
|
||||
scantokey[26] = '[';
|
||||
scantokey[27] = ']';
|
||||
scantokey[28] = K_ENTER;
|
||||
scantokey[29] = K_CTRL; /* left */
|
||||
scantokey[30] = 'a';
|
||||
scantokey[31] = 's';
|
||||
scantokey[32] = 'd';
|
||||
scantokey[33] = 'f';
|
||||
scantokey[34] = 'g';
|
||||
scantokey[35] = 'h';
|
||||
scantokey[36] = 'j';
|
||||
scantokey[37] = 'k';
|
||||
scantokey[38] = 'l';
|
||||
scantokey[39] = ';';
|
||||
scantokey[40] = '\'';
|
||||
scantokey[41] = '`';
|
||||
scantokey[42] = K_SHIFT; /* left */
|
||||
scantokey[43] = '\\';
|
||||
scantokey[44] = 'z';
|
||||
scantokey[45] = 'x';
|
||||
scantokey[46] = 'c';
|
||||
scantokey[47] = 'v';
|
||||
scantokey[48] = 'b';
|
||||
scantokey[49] = 'n';
|
||||
scantokey[50] = 'm';
|
||||
scantokey[51] = ',';
|
||||
scantokey[52] = '.';
|
||||
scantokey[53] = '/';
|
||||
scantokey[54] = K_SHIFT; /* right */
|
||||
scantokey[55] = KP_MULTIPLY;
|
||||
scantokey[56] = K_ALT; /* left */
|
||||
scantokey[57] = ' ';
|
||||
scantokey[58] = K_CAPSLOCK;
|
||||
scantokey[59] = K_F1;
|
||||
scantokey[60] = K_F2;
|
||||
scantokey[61] = K_F3;
|
||||
scantokey[62] = K_F4;
|
||||
scantokey[63] = K_F5;
|
||||
scantokey[64] = K_F6;
|
||||
scantokey[65] = K_F7;
|
||||
scantokey[66] = K_F8;
|
||||
scantokey[67] = K_F9;
|
||||
scantokey[68] = K_F10;
|
||||
scantokey[69] = KP_NUMLCK;
|
||||
scantokey[70] = K_SCRLCK;
|
||||
scantokey[71] = KP_HOME;
|
||||
scantokey[72] = KP_UPARROW;
|
||||
scantokey[73] = KP_PGUP;
|
||||
scantokey[74] = KP_MINUS;
|
||||
scantokey[75] = KP_LEFTARROW;
|
||||
scantokey[76] = KP_5;
|
||||
scantokey[77] = KP_RIGHTARROW;
|
||||
scantokey[79] = KP_END;
|
||||
scantokey[78] = KP_PLUS;
|
||||
scantokey[80] = KP_DOWNARROW;
|
||||
scantokey[81] = KP_PGDN;
|
||||
scantokey[82] = KP_INS;
|
||||
scantokey[83] = KP_DEL;
|
||||
/* 84 to 86 not used */
|
||||
scantokey[87] = K_F11;
|
||||
scantokey[88] = K_F12;
|
||||
/* 89 to 95 not used */
|
||||
scantokey[96] = KP_ENTER; /* keypad enter */
|
||||
scantokey[97] = K_CTRL; /* right */
|
||||
scantokey[98] = KP_DIVIDE;
|
||||
scantokey[99] = K_PRNTSCR; /* print screen */
|
||||
scantokey[100] = K_ALT; /* right */
|
||||
|
||||
scantokey[101] = K_PAUSE; /* break */
|
||||
scantokey[102] = K_HOME;
|
||||
scantokey[103] = K_UPARROW;
|
||||
scantokey[104] = K_PGUP;
|
||||
scantokey[105] = K_LEFTARROW;
|
||||
scantokey[106] = K_RIGHTARROW;
|
||||
scantokey[107] = K_END;
|
||||
scantokey[108] = K_DOWNARROW;
|
||||
scantokey[109] = K_PGDN;
|
||||
scantokey[110] = K_INS;
|
||||
scantokey[111] = K_DEL;
|
||||
scantokey[119] = K_PAUSE;
|
||||
|
||||
if (keyboard_init ()) {
|
||||
Sys_Error ("keyboard_init() failed");
|
||||
}
|
||||
keyboard_seteventhandler (keyhandler);
|
||||
}
|
||||
|
||||
static void
|
||||
IN_InitMouse (void)
|
||||
{
|
||||
int mtype;
|
||||
char *mousedev;
|
||||
int mouserate = MOUSE_DEFAULTSAMPLERATE;
|
||||
|
||||
Cmd_AddCommand ("force_centerview", Force_CenterView_f, "Force viewpoint of player to center");
|
||||
|
||||
mouse_buttons = 3;
|
||||
|
||||
mtype = vga_getmousetype ();
|
||||
|
||||
mousedev = "/dev/mouse";
|
||||
if (getenv ("MOUSEDEV"))
|
||||
mousedev = getenv ("MOUSEDEV");
|
||||
if (COM_CheckParm ("-mdev")) {
|
||||
mousedev = com_argv[COM_CheckParm ("-mdev") + 1];
|
||||
}
|
||||
|
||||
if (getenv ("MOUSERATE"))
|
||||
mouserate = atoi (getenv ("MOUSERATE"));
|
||||
if (COM_CheckParm ("-mrate")) {
|
||||
mouserate = atoi (com_argv[COM_CheckParm ("-mrate") + 1]);
|
||||
}
|
||||
#if 0
|
||||
printf ("Mouse: dev=%s,type=%s,speed=%d\n",
|
||||
mousedev, mice[mtype].name, mouserate);
|
||||
#endif
|
||||
if (mouse_init (mousedev, mtype, mouserate)) {
|
||||
Con_Printf ("No mouse found\n");
|
||||
UseMouse = 0;
|
||||
} else {
|
||||
mouse_seteventhandler ((void *) mousehandler);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
JOY_Shutdown ();
|
||||
Con_Printf ("IN_Shutdown\n");
|
||||
|
||||
if (UseMouse)
|
||||
mouse_close ();
|
||||
if (UseKeyboard)
|
||||
keyboard_close ();
|
||||
in_svgalib_inited = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_SendKeyEvents (void)
|
||||
{
|
||||
if (!in_svgalib_inited)
|
||||
return;
|
||||
|
||||
if (UseKeyboard) {
|
||||
while ((keyboard_update ()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
JOY_Command ();
|
||||
if (UseMouse) {
|
||||
/* Poll mouse values */
|
||||
while (mouse_update ());
|
||||
|
||||
/* Perform button actions */
|
||||
if ((mouse_buttonstate & MOUSE_LEFTBUTTON) &&
|
||||
!(mouse_oldbuttonstate & MOUSE_LEFTBUTTON))
|
||||
Key_Event (K_MOUSE1, 0, true);
|
||||
else if (!(mouse_buttonstate & MOUSE_LEFTBUTTON) &&
|
||||
(mouse_oldbuttonstate & MOUSE_LEFTBUTTON))
|
||||
Key_Event (K_MOUSE1, 0, false);
|
||||
|
||||
if ((mouse_buttonstate & MOUSE_RIGHTBUTTON) &&
|
||||
!(mouse_oldbuttonstate & MOUSE_RIGHTBUTTON))
|
||||
Key_Event (K_MOUSE2, 0, true);
|
||||
else if (!(mouse_buttonstate & MOUSE_RIGHTBUTTON) &&
|
||||
(mouse_oldbuttonstate & MOUSE_RIGHTBUTTON))
|
||||
Key_Event (K_MOUSE2, 0, false);
|
||||
|
||||
if ((mouse_buttonstate & MOUSE_MIDDLEBUTTON) &&
|
||||
!(mouse_oldbuttonstate & MOUSE_MIDDLEBUTTON))
|
||||
Key_Event (K_MOUSE3, 0, true);
|
||||
else if (!(mouse_buttonstate & MOUSE_MIDDLEBUTTON) &&
|
||||
(mouse_oldbuttonstate & MOUSE_MIDDLEBUTTON))
|
||||
Key_Event (K_MOUSE3, 0, false);
|
||||
|
||||
mouse_oldbuttonstate = mouse_buttonstate;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
JOY_Move ();
|
||||
|
||||
if (!UseMouse)
|
||||
return;
|
||||
|
||||
/* Poll mouse values */
|
||||
while (mouse_update ());
|
||||
|
||||
if (m_filter->int_val) {
|
||||
mouse_x = (mx + old_mouse_x) * 0.5;
|
||||
mouse_y = (my + old_mouse_y) * 0.5;
|
||||
} else {
|
||||
mouse_x = mx;
|
||||
mouse_y = my;
|
||||
}
|
||||
old_mouse_x = mx;
|
||||
old_mouse_y = my;
|
||||
/* Clear for next update */
|
||||
mx = my = 0;
|
||||
|
||||
mouse_x *= sensitivity->value;
|
||||
mouse_y *= sensitivity->value;
|
||||
|
||||
/* Add mouse X/Y movement to cmd */
|
||||
if ((in_strafe.state & 1) || (lookstrafe->int_val && freelook)) {
|
||||
viewdelta.position[0] += mouse_x;
|
||||
} else {
|
||||
viewdelta.angles[YAW] -= mouse_x;
|
||||
}
|
||||
|
||||
if (freelook && !(in_strafe.state & 1)) {
|
||||
viewdelta.angles[PITCH] += mouse_y;
|
||||
} else {
|
||||
if ((in_strafe.state & 1) && noclip_anglehack) {
|
||||
viewdelta.position[1] -= mouse_y;
|
||||
} else {
|
||||
viewdelta.position[2] -= mouse_y;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,671 +0,0 @@
|
|||
/*
|
||||
in_win.c
|
||||
|
||||
windows 95 mouse stuff
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
// 02/21/97 JCB Added extended DirectInput code to support external controllers.
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "winquake.h"
|
||||
#include <dinput.h>
|
||||
#include "client.h"
|
||||
#include "QF/keys.h"
|
||||
#include "QF/compat.h"
|
||||
#include "QF/console.h"
|
||||
#include "QF/qargs.h"
|
||||
#include "QF/cmd.h"
|
||||
#include "QF/input.h"
|
||||
#include "cl_input.h"
|
||||
#include "view.h"
|
||||
#include "host.h"
|
||||
|
||||
#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 public variables
|
||||
|
||||
float mouse_x, mouse_y;
|
||||
qboolean mouseactive;
|
||||
unsigned int uiWheelMessage;
|
||||
|
||||
// mouse local variables
|
||||
|
||||
static int mouse_buttons;
|
||||
static int mouse_oldbuttonstate;
|
||||
static POINT current_pos;
|
||||
static float old_mouse_x, old_mouse_y, mx_accum, my_accum;
|
||||
static qboolean mouseinitialized;
|
||||
static cvar_t *m_filter;
|
||||
static qboolean restore_spi;
|
||||
static int originalmouseparms[3], newmouseparms[3] = { 0, 0, 1 };
|
||||
static qboolean mouseparmsvalid, mouseactivatetoggle;
|
||||
static qboolean mouseshowtoggle = 1;
|
||||
static qboolean dinput_acquired;
|
||||
static unsigned int mstate_di;
|
||||
|
||||
// misc locals
|
||||
|
||||
static LPDIRECTINPUT g_pdi;
|
||||
static LPDIRECTINPUTDEVICE g_pMouse;
|
||||
|
||||
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, joy
|
||||
|
||||
extern void JOY_Command(void);
|
||||
extern void JOY_Init_Cvars(void);
|
||||
extern void JOY_Init (void);
|
||||
extern void JOY_AdvancedUpdate_f (void);
|
||||
extern void JOY_Move (void);
|
||||
|
||||
/*
|
||||
Force_CenterView_f
|
||||
*/
|
||||
static void
|
||||
Force_CenterView_f (void)
|
||||
{
|
||||
cl.viewangles[PITCH] = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
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_SetQuakeMouseState
|
||||
*/
|
||||
void
|
||||
IN_SetQuakeMouseState (void)
|
||||
{
|
||||
if (mouseactivatetoggle)
|
||||
IN_ActivateMouse ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
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_RestoreOriginalMouseState
|
||||
*/
|
||||
void
|
||||
IN_RestoreOriginalMouseState (void)
|
||||
{
|
||||
if (mouseactivatetoggle) {
|
||||
IN_DeactivateMouse ();
|
||||
mouseactivatetoggle = true;
|
||||
}
|
||||
// try to redraw the cursor so it gets reinitialized, because sometimes it
|
||||
// has garbage after the mode switch
|
||||
ShowCursor (TRUE);
|
||||
ShowCursor (FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_InitDInput
|
||||
*/
|
||||
static 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_Printf ("Couldn't load dinput.dll\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pDirectInputCreate) {
|
||||
pDirectInputCreate =
|
||||
(void *) GetProcAddress (hInstDI, "DirectInputCreateA");
|
||||
|
||||
if (!pDirectInputCreate) {
|
||||
Con_Printf ("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_Printf ("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_Printf ("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_Printf ("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_Printf ("Couldn't set DI buffersize\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_StartupMouse
|
||||
*/
|
||||
static void
|
||||
IN_StartupMouse (void)
|
||||
{
|
||||
// HDC hdc;
|
||||
|
||||
if (COM_CheckParm ("-nomouse"))
|
||||
return;
|
||||
|
||||
mouseinitialized = true;
|
||||
|
||||
if (COM_CheckParm ("-dinput")) {
|
||||
dinput = IN_InitDInput ();
|
||||
|
||||
if (dinput) {
|
||||
Con_Printf ("DirectInput initialized\n");
|
||||
} else {
|
||||
Con_Printf ("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)
|
||||
{
|
||||
Cmd_AddCommand ("force_centerview", Force_CenterView_f, "Force view of player to center");
|
||||
|
||||
uiWheelMessage = RegisterWindowMessage ("MSWHEEL_ROLLMSG");
|
||||
|
||||
|
||||
IN_StartupMouse ();
|
||||
|
||||
JOY_Init ();
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
// mouse variables
|
||||
m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE, NULL,
|
||||
"Toggle mouse input filtering.");
|
||||
_windowed_mouse = Cvar_Get ("_windowed_mouse", "0", CVAR_ARCHIVE, NULL,
|
||||
"Grab the mouse from X while playing quake");
|
||||
|
||||
JOY_Init_Cvars();
|
||||
}
|
||||
|
||||
/*
|
||||
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 < mouse_buttons; i++) {
|
||||
if ((mstate & (1 << i)) && !(mouse_oldbuttonstate & (1 << i))) {
|
||||
Key_Event (K_MOUSE1 + i, -1, true);
|
||||
}
|
||||
|
||||
if (!(mstate & (1 << i)) && (mouse_oldbuttonstate & (1 << i))) {
|
||||
Key_Event (K_MOUSE1 + i, -1, false);
|
||||
}
|
||||
}
|
||||
|
||||
mouse_oldbuttonstate = mstate;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_MouseMove
|
||||
*/
|
||||
void
|
||||
IN_MouseMove (void)
|
||||
{
|
||||
int mx, my;
|
||||
|
||||
// HDC hdc;
|
||||
int i;
|
||||
DIDEVICEOBJECTDATA od;
|
||||
DWORD dwElements;
|
||||
HRESULT hr;
|
||||
|
||||
if (!mouseactive)
|
||||
return;
|
||||
|
||||
if (dinput) {
|
||||
mx = 0;
|
||||
my = 0;
|
||||
|
||||
for (;;) {
|
||||
dwElements = 1;
|
||||
|
||||
hr = IDirectInputDevice_GetDeviceData (g_pMouse,
|
||||
sizeof (DIDEVICEOBJECTDATA),
|
||||
&od, &dwElements, 0);
|
||||
|
||||
if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED)) {
|
||||
dinput_acquired = true;
|
||||
IDirectInputDevice_Acquire (g_pMouse);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Unable to read data or no data available */
|
||||
if (FAILED (hr) || dwElements == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Look at the element to see what happened */
|
||||
|
||||
switch (od.dwOfs) {
|
||||
case DIMOFS_X:
|
||||
mx += od.dwData;
|
||||
break;
|
||||
|
||||
case DIMOFS_Y:
|
||||
my += od.dwData;
|
||||
break;
|
||||
|
||||
case DIMOFS_BUTTON0:
|
||||
if (od.dwData & 0x80)
|
||||
mstate_di |= 1;
|
||||
else
|
||||
mstate_di &= ~1;
|
||||
break;
|
||||
|
||||
case DIMOFS_BUTTON1:
|
||||
if (od.dwData & 0x80)
|
||||
mstate_di |= (1 << 1);
|
||||
else
|
||||
mstate_di &= ~(1 << 1);
|
||||
break;
|
||||
|
||||
case DIMOFS_BUTTON2:
|
||||
if (od.dwData & 0x80)
|
||||
mstate_di |= (1 << 2);
|
||||
else
|
||||
mstate_di &= ~(1 << 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// perform button actions
|
||||
for (i = 0; i < mouse_buttons; i++) {
|
||||
if ((mstate_di & (1 << i)) && !(mouse_oldbuttonstate & (1 << i))) {
|
||||
Key_Event (K_MOUSE1 + i, -1, true);
|
||||
}
|
||||
|
||||
if (!(mstate_di & (1 << i)) && (mouse_oldbuttonstate & (1 << i))) {
|
||||
Key_Event (K_MOUSE1 + i, -1, false);
|
||||
}
|
||||
}
|
||||
|
||||
mouse_oldbuttonstate = mstate_di;
|
||||
} else {
|
||||
GetCursorPos (¤t_pos);
|
||||
mx = current_pos.x - window_center_x + mx_accum;
|
||||
my = current_pos.y - window_center_y + my_accum;
|
||||
mx_accum = 0;
|
||||
my_accum = 0;
|
||||
}
|
||||
|
||||
if (m_filter->value) {
|
||||
mouse_x = (mx + old_mouse_x) * 0.5;
|
||||
mouse_y = (my + old_mouse_y) * 0.5;
|
||||
} else {
|
||||
mouse_x = mx;
|
||||
mouse_y = my;
|
||||
}
|
||||
|
||||
old_mouse_x = mx;
|
||||
old_mouse_y = my;
|
||||
|
||||
mouse_x *= sensitivity->value;
|
||||
mouse_y *= sensitivity->value;
|
||||
|
||||
// add mouse X/Y movement to cmd
|
||||
if ((in_strafe.state & 1) || (lookstrafe->int_val && freelook))
|
||||
viewdelta.position[0] += mouse_x;
|
||||
else
|
||||
viewdelta.angles[YAW] -= mouse_x;
|
||||
|
||||
if (freelook && !(in_strafe.state & 1)) {
|
||||
viewdelta.angles[PITCH] += mouse_y;
|
||||
} else {
|
||||
if ((in_strafe.state & 1) && noclip_anglehack)
|
||||
viewdelta.position[1] -= mouse_y;
|
||||
else
|
||||
viewdelta.position[2] -= mouse_y;
|
||||
}
|
||||
|
||||
// if the mouse has moved, force it to the center, so there's room to move
|
||||
if (mx || my) {
|
||||
SetCursorPos (window_center_x, window_center_y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_Move
|
||||
*/
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
|
||||
if (ActiveApp && !Minimized) {
|
||||
IN_MouseMove ();
|
||||
JOY_Move ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_Accumulate
|
||||
*/
|
||||
void
|
||||
IN_Accumulate (void)
|
||||
{
|
||||
// int mx, my;
|
||||
// HDC hdc;
|
||||
|
||||
// if (dinput) return; // If using dinput we don't probably need this
|
||||
|
||||
if (mouseactive) {
|
||||
GetCursorPos (¤t_pos);
|
||||
|
||||
mx_accum += current_pos.x - window_center_x;
|
||||
my_accum += current_pos.y - window_center_y;
|
||||
|
||||
// force the mouse to the center, so there's room to move
|
||||
SetCursorPos (window_center_x, window_center_y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IN_ClearStates
|
||||
*/
|
||||
void
|
||||
IN_ClearStates (void)
|
||||
{
|
||||
|
||||
if (mouseactive) {
|
||||
mx_accum = 0;
|
||||
my_accum = 0;
|
||||
mouse_oldbuttonstate = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
IN_Commands
|
||||
*/
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
// Joystick
|
||||
JOY_Command();
|
||||
}
|
|
@ -1,558 +0,0 @@
|
|||
/*
|
||||
in_x11.c
|
||||
|
||||
general x11 input driver
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
Copyright (C) 2000 Marcus Sundberg [mackan@stacken.kth.se]
|
||||
Copyright (C) 1999,2000 contributors of the QuakeForge project
|
||||
Please see the file "AUTHORS" for a list of contributors
|
||||
|
||||
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:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifdef HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#endif
|
||||
#ifdef HAVE_STRINGS_H
|
||||
# include <strings.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#define _BSD
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/keysym.h>
|
||||
|
||||
#ifdef HAVE_DGA
|
||||
# include <X11/extensions/XShm.h>
|
||||
# include <X11/extensions/xf86dga.h>
|
||||
#endif
|
||||
|
||||
#include "cl_input.h"
|
||||
#include "client.h"
|
||||
#include "QF/compat.h"
|
||||
#include "QF/console.h"
|
||||
#include "context_x11.h"
|
||||
#include "QF/cmd.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "dga_check.h"
|
||||
#include "host.h"
|
||||
#include "QF/input.h"
|
||||
#include "QF/joystick.h"
|
||||
#include "QF/keys.h"
|
||||
#include "QF/qargs.h"
|
||||
#include "QF/sys.h"
|
||||
#include "view.h"
|
||||
|
||||
cvar_t *_windowed_mouse;
|
||||
cvar_t *m_filter;
|
||||
|
||||
cvar_t *in_dga;
|
||||
cvar_t *in_dga_mouseaccel;
|
||||
|
||||
static qboolean dga_avail;
|
||||
static qboolean dga_active;
|
||||
|
||||
static keydest_t old_key_dest = key_none;
|
||||
|
||||
static qboolean mouse_avail;
|
||||
static float mouse_x, mouse_y;
|
||||
static float old_mouse_x, old_mouse_y;
|
||||
static int p_mouse_x, p_mouse_y;
|
||||
|
||||
#define KEY_MASK (KeyPressMask | KeyReleaseMask)
|
||||
#define MOUSE_MASK (ButtonPressMask | ButtonReleaseMask | PointerMotionMask)
|
||||
#define INPUT_MASK (KEY_MASK | MOUSE_MASK)
|
||||
|
||||
static int
|
||||
XLateKey (XKeyEvent * ev, qboolean modified)
|
||||
{
|
||||
char tmp[2];
|
||||
int key = 0;
|
||||
KeySym keysym;
|
||||
|
||||
if (!modified) {
|
||||
keysym = XLookupKeysym (ev, 0);
|
||||
} else {
|
||||
XLookupString (ev, tmp, 1, &keysym, NULL);
|
||||
}
|
||||
|
||||
switch (keysym) {
|
||||
case XK_KP_Page_Up:
|
||||
key = KP_PGUP;
|
||||
break;
|
||||
case XK_Page_Up:
|
||||
key = K_PGUP;
|
||||
break;
|
||||
|
||||
case XK_KP_Page_Down:
|
||||
key = KP_PGDN;
|
||||
break;
|
||||
case XK_Page_Down:
|
||||
key = K_PGDN;
|
||||
break;
|
||||
|
||||
case XK_KP_Home:
|
||||
key = KP_HOME;
|
||||
break;
|
||||
case XK_Home:
|
||||
key = K_HOME;
|
||||
break;
|
||||
|
||||
case XK_KP_End:
|
||||
key = KP_END;
|
||||
break;
|
||||
case XK_End:
|
||||
key = K_END;
|
||||
break;
|
||||
|
||||
case XK_KP_Left:
|
||||
key = KP_LEFTARROW;
|
||||
break;
|
||||
case XK_Left:
|
||||
key = K_LEFTARROW;
|
||||
break;
|
||||
|
||||
case XK_KP_Right:
|
||||
key = KP_RIGHTARROW;
|
||||
break;
|
||||
case XK_Right:
|
||||
key = K_RIGHTARROW;
|
||||
break;
|
||||
|
||||
case XK_KP_Down:
|
||||
key = KP_DOWNARROW;
|
||||
break;
|
||||
case XK_Down:
|
||||
key = K_DOWNARROW;
|
||||
break;
|
||||
|
||||
case XK_KP_Up:
|
||||
key = KP_UPARROW;
|
||||
break;
|
||||
case XK_Up:
|
||||
key = K_UPARROW;
|
||||
break;
|
||||
|
||||
case XK_Escape:
|
||||
key = K_ESCAPE;
|
||||
break;
|
||||
|
||||
case XK_KP_Enter:
|
||||
key = KP_ENTER;
|
||||
break;
|
||||
case XK_Return:
|
||||
key = K_ENTER;
|
||||
break;
|
||||
|
||||
case XK_Tab:
|
||||
key = K_TAB;
|
||||
break;
|
||||
|
||||
case XK_F1:
|
||||
key = K_F1;
|
||||
break;
|
||||
case XK_F2:
|
||||
key = K_F2;
|
||||
break;
|
||||
case XK_F3:
|
||||
key = K_F3;
|
||||
break;
|
||||
case XK_F4:
|
||||
key = K_F4;
|
||||
break;
|
||||
case XK_F5:
|
||||
key = K_F5;
|
||||
break;
|
||||
case XK_F6:
|
||||
key = K_F6;
|
||||
break;
|
||||
case XK_F7:
|
||||
key = K_F7;
|
||||
break;
|
||||
case XK_F8:
|
||||
key = K_F8;
|
||||
break;
|
||||
case XK_F9:
|
||||
key = K_F9;
|
||||
break;
|
||||
case XK_F10:
|
||||
key = K_F10;
|
||||
break;
|
||||
case XK_F11:
|
||||
key = K_F11;
|
||||
break;
|
||||
case XK_F12:
|
||||
key = K_F12;
|
||||
break;
|
||||
|
||||
case XK_BackSpace:
|
||||
key = K_BACKSPACE;
|
||||
break;
|
||||
|
||||
case XK_KP_Delete:
|
||||
key = KP_DEL;
|
||||
break;
|
||||
case XK_Delete:
|
||||
key = K_DEL;
|
||||
break;
|
||||
|
||||
case XK_Pause:
|
||||
key = K_PAUSE;
|
||||
break;
|
||||
|
||||
case XK_Shift_L:
|
||||
case XK_Shift_R:
|
||||
key = K_SHIFT;
|
||||
break;
|
||||
|
||||
case XK_Execute:
|
||||
case XK_Control_L:
|
||||
case XK_Control_R:
|
||||
key = K_CTRL;
|
||||
break;
|
||||
|
||||
case XK_Mode_switch:
|
||||
case XK_Alt_L:
|
||||
case XK_Meta_L:
|
||||
case XK_Alt_R:
|
||||
case XK_Meta_R:
|
||||
key = K_ALT;
|
||||
break;
|
||||
|
||||
case XK_Caps_Lock:
|
||||
key = K_CAPSLOCK;
|
||||
break;
|
||||
case XK_KP_Begin:
|
||||
key = KP_5;
|
||||
break;
|
||||
|
||||
case XK_Insert:
|
||||
key = K_INS;
|
||||
break;
|
||||
case XK_KP_Insert:
|
||||
key = KP_INS;
|
||||
break;
|
||||
|
||||
case XK_KP_Multiply:
|
||||
key = KP_MULTIPLY;
|
||||
break;
|
||||
case XK_KP_Add:
|
||||
key = KP_PLUS;
|
||||
break;
|
||||
case XK_KP_Subtract:
|
||||
key = KP_MINUS;
|
||||
break;
|
||||
case XK_KP_Divide:
|
||||
key = KP_DIVIDE;
|
||||
break;
|
||||
|
||||
/* For Sun keyboards */
|
||||
case XK_F27:
|
||||
key = K_HOME;
|
||||
break;
|
||||
case XK_F29:
|
||||
key = K_PGUP;
|
||||
break;
|
||||
case XK_F33:
|
||||
key = K_END;
|
||||
break;
|
||||
case XK_F35:
|
||||
key = K_PGDN;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (keysym < 128) {
|
||||
/* ASCII keys */
|
||||
key = keysym;
|
||||
if (!modified && ((key >= 'A') && (key <= 'Z'))) {
|
||||
key = key + ('a' - 'A');
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
event_key (XEvent * event)
|
||||
{
|
||||
if (old_key_dest != key_dest) {
|
||||
old_key_dest = key_dest;
|
||||
if (key_dest == key_game) {
|
||||
XAutoRepeatOff (x_disp);
|
||||
} else {
|
||||
XAutoRepeatOn (x_disp);
|
||||
}
|
||||
}
|
||||
Key_Event (XLateKey (&event->xkey, 0), XLateKey (&event->xkey, 1),
|
||||
event->type == KeyPress);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
event_button (XEvent * event)
|
||||
{
|
||||
int but;
|
||||
|
||||
but = event->xbutton.button;
|
||||
if (but == 2)
|
||||
but = 3;
|
||||
else if (but == 3)
|
||||
but = 2;
|
||||
switch (but) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
Key_Event (K_MOUSE1 + but - 1, 0, event->type == ButtonPress);
|
||||
break;
|
||||
case 4:
|
||||
Key_Event (K_MWHEELUP, 0, event->type == ButtonPress);
|
||||
break;
|
||||
case 5:
|
||||
Key_Event (K_MWHEELDOWN, 0, event->type == ButtonPress);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
center_pointer (void)
|
||||
{
|
||||
XEvent event;
|
||||
|
||||
event.type = MotionNotify;
|
||||
event.xmotion.display = x_disp;
|
||||
event.xmotion.window = x_win;
|
||||
event.xmotion.x = vid.width / 2;
|
||||
event.xmotion.y = vid.height / 2;
|
||||
XSendEvent (x_disp, x_win, False, PointerMotionMask, &event);
|
||||
XWarpPointer (x_disp, None, x_win, 0, 0, 0, 0,
|
||||
vid.width / 2, vid.height / 2);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
event_motion (XEvent * event)
|
||||
{
|
||||
if (dga_active) {
|
||||
mouse_x += event->xmotion.x_root * in_dga_mouseaccel->value;
|
||||
mouse_y += event->xmotion.y_root * in_dga_mouseaccel->value;
|
||||
} else {
|
||||
if (vid_fullscreen->int_val || _windowed_mouse->int_val) {
|
||||
if (!event->xmotion.send_event) {
|
||||
mouse_x += (event->xmotion.x - p_mouse_x);
|
||||
mouse_y += (event->xmotion.y - p_mouse_y);
|
||||
if (abs (vid.width / 2 - event->xmotion.x) > vid.width / 4
|
||||
|| abs (vid.height / 2 - event->xmotion.y) > vid.height / 4) {
|
||||
center_pointer ();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mouse_x += (event->xmotion.x - p_mouse_x);
|
||||
mouse_y += (event->xmotion.y - p_mouse_y);
|
||||
}
|
||||
p_mouse_x = event->xmotion.x;
|
||||
p_mouse_y = event->xmotion.y;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Commands (void)
|
||||
{
|
||||
static int old_windowed_mouse;
|
||||
static int old_in_dga;
|
||||
|
||||
JOY_Command ();
|
||||
|
||||
if ((old_windowed_mouse != _windowed_mouse->int_val)
|
||||
|| (old_in_dga != in_dga->int_val)) {
|
||||
old_windowed_mouse = _windowed_mouse->int_val;
|
||||
old_in_dga = in_dga->int_val;
|
||||
|
||||
if (_windowed_mouse->int_val) { // grab the pointer
|
||||
XGrabPointer (x_disp, x_win, True, MOUSE_MASK, GrabModeAsync,
|
||||
GrabModeAsync, x_win, None, CurrentTime);
|
||||
#ifdef HAVE_DGA
|
||||
if (dga_avail && in_dga->int_val && !dga_active) {
|
||||
XF86DGADirectVideo (x_disp, DefaultScreen (x_disp),
|
||||
XF86DGADirectMouse);
|
||||
dga_active = true;
|
||||
}
|
||||
#endif
|
||||
} else { // ungrab the pointer
|
||||
#ifdef HAVE_DGA
|
||||
if (dga_avail && in_dga->int_val && dga_active) {
|
||||
XF86DGADirectVideo (x_disp, DefaultScreen (x_disp), 0);
|
||||
dga_active = false;
|
||||
}
|
||||
#endif
|
||||
XUngrabPointer (x_disp, CurrentTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_SendKeyEvents (void)
|
||||
{
|
||||
/* Get events from X server. */
|
||||
X11_ProcessEvents ();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
IN_Move (void)
|
||||
{
|
||||
JOY_Move ();
|
||||
|
||||
if (!mouse_avail)
|
||||
return;
|
||||
|
||||
if (m_filter->int_val) {
|
||||
mouse_x = (mouse_x + old_mouse_x) * 0.5;
|
||||
mouse_y = (mouse_y + old_mouse_y) * 0.5;
|
||||
|
||||
old_mouse_x = mouse_x;
|
||||
old_mouse_y = mouse_y;
|
||||
}
|
||||
|
||||
mouse_x *= sensitivity->value;
|
||||
mouse_y *= sensitivity->value;
|
||||
|
||||
if ((in_strafe.state & 1) || (lookstrafe->int_val && freelook))
|
||||
viewdelta.position[0] += mouse_x;
|
||||
else
|
||||
viewdelta.angles[YAW] -= mouse_x;
|
||||
|
||||
if (freelook && !(in_strafe.state & 1)) {
|
||||
viewdelta.angles[PITCH] += mouse_y;
|
||||
} else {
|
||||
if ((in_strafe.state & 1) && noclip_anglehack)
|
||||
viewdelta.position[1] -= mouse_y;
|
||||
else
|
||||
viewdelta.position[2] -= mouse_y;
|
||||
}
|
||||
mouse_x = mouse_y = 0.0;
|
||||
}
|
||||
|
||||
/*
|
||||
Called at shutdown
|
||||
*/
|
||||
void
|
||||
IN_Shutdown (void)
|
||||
{
|
||||
JOY_Shutdown ();
|
||||
|
||||
Con_Printf ("IN_Shutdown\n");
|
||||
mouse_avail = 0;
|
||||
if (x_disp) {
|
||||
XAutoRepeatOn (x_disp);
|
||||
|
||||
#ifdef HAVE_DGA
|
||||
if (dga_avail)
|
||||
XF86DGADirectVideo (x_disp, DefaultScreen (x_disp), 0);
|
||||
#endif
|
||||
}
|
||||
X11_CloseDisplay ();
|
||||
}
|
||||
|
||||
void
|
||||
Force_CenterView_f (void)
|
||||
{
|
||||
cl.viewangles[PITCH] = 0;
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init (void)
|
||||
{
|
||||
// open the display
|
||||
if (!x_disp)
|
||||
Sys_Error ("IN: No display!!\n");
|
||||
if (!x_win)
|
||||
Sys_Error ("IN: No window!!\n");
|
||||
|
||||
X11_OpenDisplay (); // call to increment the reference counter
|
||||
|
||||
{
|
||||
int attribmask = CWEventMask;
|
||||
|
||||
XWindowAttributes attribs_1;
|
||||
XSetWindowAttributes attribs_2;
|
||||
|
||||
XGetWindowAttributes (x_disp, x_win, &attribs_1);
|
||||
|
||||
attribs_2.event_mask = attribs_1.your_event_mask | INPUT_MASK;
|
||||
|
||||
XChangeWindowAttributes (x_disp, x_win, attribmask, &attribs_2);
|
||||
}
|
||||
|
||||
JOY_Init ();
|
||||
|
||||
XAutoRepeatOff (x_disp);
|
||||
|
||||
if (COM_CheckParm ("-nomouse"))
|
||||
return;
|
||||
|
||||
dga_avail = VID_CheckDGA (x_disp, NULL, NULL, NULL);
|
||||
if (vid_fullscreen->int_val) {
|
||||
Cvar_Set (_windowed_mouse, "1");
|
||||
_windowed_mouse->flags |= CVAR_ROM;
|
||||
}
|
||||
|
||||
mouse_x = mouse_y = 0.0;
|
||||
mouse_avail = 1;
|
||||
|
||||
X11_AddEvent (KeyPress, &event_key);
|
||||
X11_AddEvent (KeyRelease, &event_key);
|
||||
X11_AddEvent (ButtonPress, &event_button);
|
||||
X11_AddEvent (ButtonRelease, &event_button);
|
||||
X11_AddEvent (MotionNotify, &event_motion);
|
||||
|
||||
Cmd_AddCommand ("force_centerview", Force_CenterView_f, "Force view of player to center");
|
||||
}
|
||||
|
||||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
JOY_Init_Cvars ();
|
||||
_windowed_mouse = Cvar_Get ("_windowed_mouse", "0", CVAR_ARCHIVE, NULL,
|
||||
"With this set to 1, quake will grab the mouse from X");
|
||||
m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE, NULL,
|
||||
"Toggle mouse input filtering.");
|
||||
in_dga = Cvar_Get ("in_dga", "1", CVAR_ARCHIVE, NULL,
|
||||
"DGA Input support");
|
||||
in_dga_mouseaccel = Cvar_Get ("in_dga_mouseaccel", "1", CVAR_ARCHIVE, NULL,
|
||||
"DGA Mouse accelleration multiplier");
|
||||
}
|
||||
|
Loading…
Reference in a new issue