1 /* Emacs style mode select -*- C++ -*-
2 *-----------------------------------------------------------------------------
3 *
4 *
5 * PrBoom: a Doom port merged with LxDoom and LSDLDoom
6 * based on BOOM, a modified and improved DOOM engine
7 * Copyright (C) 1999 by
8 * id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman
9 * Copyright (C) 1999-2000 by
10 * Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze
11 * Copyright 2005, 2006 by
12 * Florian Schulze, Colin Phipps, Neil Stevens, Andrey Budko
13 *
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 * 02111-1307, USA.
28 *
29 * DESCRIPTION:
30 * Joystick handling for Linux
31 *
32 *-----------------------------------------------------------------------------
33 */
34
35 #ifndef lint
36 #endif /* lint */
37
38 #include <stdlib.h>
39
40 #include "SDL.h"
41 #include "doomdef.h"
42 #include "doomtype.h"
43 #include "m_argv.h"
44 #include "d_event.h"
45 #include "d_main.h"
46 #include "i_joy.h"
47 #include "lprintf.h"
48
49 int joyleft;
50 int joyright;
51 int joyup;
52 int joydown;
53
54 int usejoystick;
55
56 #ifdef HAVE_SDL_JOYSTICKGETAXIS
57 static SDL_Joystick *joystick;
58 #endif
59
I_EndJoystick(void)60 static void I_EndJoystick(void)
61 {
62 lprintf(LO_DEBUG, "I_EndJoystick : closing joystick\n");
63 }
64
I_PollJoystick(void)65 void I_PollJoystick(void)
66 {
67 #ifdef HAVE_SDL_JOYSTICKGETAXIS
68 event_t ev;
69 Sint16 axis_value;
70
71 if (!usejoystick || (!joystick)) return;
72 ev.type = ev_joystick;
73 ev.data1 =
74 (SDL_JoystickGetButton(joystick, 0)<<0) |
75 (SDL_JoystickGetButton(joystick, 1)<<1) |
76 (SDL_JoystickGetButton(joystick, 2)<<2) |
77 (SDL_JoystickGetButton(joystick, 3)<<3);
78 axis_value = SDL_JoystickGetAxis(joystick, 0) / 3000;
79 if (abs(axis_value)<10) axis_value=0;
80 ev.data2 = axis_value;
81 axis_value = SDL_JoystickGetAxis(joystick, 1) / 3000;
82 if (abs(axis_value)<10) axis_value=0;
83 ev.data3 = axis_value;
84
85 D_PostEvent(&ev);
86 #endif
87 }
88
I_InitJoystick(void)89 void I_InitJoystick(void)
90 {
91 #ifdef HAVE_SDL_JOYSTICKGETAXIS
92 const char* fname = "I_InitJoystick : ";
93 int num_joysticks;
94
95 if (!usejoystick) return;
96 SDL_InitSubSystem(SDL_INIT_JOYSTICK);
97 num_joysticks=SDL_NumJoysticks();
98 if (M_CheckParm("-nojoy") || (usejoystick>num_joysticks) || (usejoystick<0)) {
99 if ((usejoystick > num_joysticks) || (usejoystick < 0))
100 lprintf(LO_WARN, "%sinvalid joystick %d\n", fname, usejoystick);
101 else
102 lprintf(LO_INFO, "%suser disabled\n", fname);
103 return;
104 }
105 joystick=SDL_JoystickOpen(usejoystick-1);
106 if (!joystick)
107 lprintf(LO_ERROR, "%serror opening joystick %s\n", fname, SDL_JoystickName(usejoystick-1));
108 else {
109 atexit(I_EndJoystick);
110 lprintf(LO_INFO, "%sopened %s\n", fname, SDL_JoystickName(usejoystick-1));
111 joyup = 32767;
112 joydown = -32768;
113 joyright = 32767;
114 joyleft = -32768;
115 }
116 #endif
117 }
118