Mercurial > sdl-ios-xcode
annotate src/joystick/win32/SDL_mmjoystick.c @ 1795:398ac0f88e4d
Fixed bug #220
The AltiVec blitters don't compile, since they require __VEC__ to be enabled in
order for the compiler to understand "vector" and friends (i.e. do AltiVec)
But you don't want to turn AltiVec on globally, since then the code would only
run on a G4 (there are already runtime tests, before using the AltiVec
variants)
The solution here is to enable AltiVec locally, for the actual AltiVec code.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 09 May 2006 15:09:47 +0000 |
parents | 5e86e34453d4 |
children | 782fd950bd46 c121d94672cb 36f155ec8133 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1135
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1135
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1135
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1135
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1135
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1135
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1135
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
165
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
1635
92947e3a18db
Make sure code is only compiled if the appropriate subsystem is enabled
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
24 #ifdef SDL_JOYSTICK_WINMM |
92947e3a18db
Make sure code is only compiled if the appropriate subsystem is enabled
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
25 |
0 | 26 /* Win32 MultiMedia Joystick driver, contributed by Andrei de A. Formiga */ |
27 | |
1433
bb6839704ed6
SDL_windows.h is no longer necessary
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
28 #define WIN32_LEAN_AND_MEAN |
bb6839704ed6
SDL_windows.h is no longer necessary
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
29 #include <windows.h> |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
30 #include <mmsystem.h> |
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
31 #include <regstr.h> |
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
32 |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
33 #include "SDL_events.h" |
0 | 34 #include "SDL_joystick.h" |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
35 #include "../SDL_sysjoystick.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
36 #include "../SDL_joystick_c.h" |
0 | 37 |
531
8450e66651ea
Fixed joystick detection problem on Windows XP (thanks Maciej!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
38 #define MAX_JOYSTICKS 16 |
0 | 39 #define MAX_AXES 6 /* each joystick can have up to 6 axes */ |
40 #define MAX_BUTTONS 32 /* and 32 buttons */ | |
41 #define AXIS_MIN -32768 /* minimum value for axis coordinate */ | |
42 #define AXIS_MAX 32767 /* maximum value for axis coordinate */ | |
834
d37179d10ccc
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
43 /* limit axis to 256 possible positions to filter out noise */ |
d37179d10ccc
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
44 #define JOY_AXIS_THRESHOLD (((AXIS_MAX)-(AXIS_MIN))/256) |
0 | 45 #define JOY_BUTTON_FLAG(n) (1<<n) |
46 | |
47 | |
48 /* array to hold joystick ID values */ | |
49 static UINT SYS_JoystickID[MAX_JOYSTICKS]; | |
50 static JOYCAPS SYS_Joystick[MAX_JOYSTICKS]; | |
938
fa2ce068b0b6
Hmm, this should work a little better. :)
Sam Lantinga <slouken@libsdl.org>
parents:
937
diff
changeset
|
51 static char *SYS_JoystickName[MAX_JOYSTICKS]; |
0 | 52 |
53 /* The private structure used to keep track of a joystick */ | |
54 struct joystick_hwdata | |
55 { | |
56 /* joystick ID */ | |
57 UINT id; | |
58 | |
59 /* values used to translate device-specific coordinates into | |
60 SDL-standard ranges */ | |
61 struct _transaxis { | |
62 int offset; | |
63 float scale; | |
64 } transaxis[6]; | |
65 }; | |
66 | |
67 /* Convert a win32 Multimedia API return code to a text message */ | |
68 static void SetMMerror(char *function, int code); | |
69 | |
70 | |
938
fa2ce068b0b6
Hmm, this should work a little better. :)
Sam Lantinga <slouken@libsdl.org>
parents:
937
diff
changeset
|
71 static char *GetJoystickName(int index, const char *szRegKey) |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
72 { |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
73 /* added 7/24/2004 by Eckhard Stolberg */ |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
74 /* |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
75 see if there is a joystick for the current |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
76 index (1-16) listed in the registry |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
77 */ |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
78 char *name = NULL; |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
79 HKEY hKey; |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
80 DWORD regsize; |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
81 LONG regresult; |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
82 unsigned char regkey[256]; |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
83 unsigned char regvalue[256]; |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
84 unsigned char regname[256]; |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
85 |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
86 SDL_snprintf((char *) regkey, SDL_arraysize(regkey), "%s\\%s\\%s", |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
87 REGSTR_PATH_JOYCONFIG, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
88 szRegKey, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
89 REGSTR_KEY_JOYCURR); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
90 regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
91 (LPTSTR) ®key, 0, KEY_READ, &hKey); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
92 if (regresult == ERROR_SUCCESS) |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
93 { |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
94 /* |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
95 find the registry key name for the |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
96 joystick's properties |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
97 */ |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
98 regsize = sizeof(regname); |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
99 SDL_snprintf((char *) regvalue, SDL_arraysize(regvalue), |
938
fa2ce068b0b6
Hmm, this should work a little better. :)
Sam Lantinga <slouken@libsdl.org>
parents:
937
diff
changeset
|
100 "Joystick%d%s", index+1, |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
101 REGSTR_VAL_JOYOEMNAME); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
102 regresult = RegQueryValueExA(hKey, |
1135
cf6133247d34
Mac Classic and CodeWarrior patches.
Ryan C. Gordon <icculus@icculus.org>
parents:
938
diff
changeset
|
103 (char *) regvalue, 0, 0, (LPBYTE) ®name, |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
104 (LPDWORD) ®size); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
105 RegCloseKey(hKey); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
106 if (regresult == ERROR_SUCCESS) |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
107 { |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
108 /* open that registry key */ |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
109 SDL_snprintf((char *) regkey, SDL_arraysize(regkey), "%s\\%s", |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
110 REGSTR_PATH_JOYOEM, regname); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
111 regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE, |
1135
cf6133247d34
Mac Classic and CodeWarrior patches.
Ryan C. Gordon <icculus@icculus.org>
parents:
938
diff
changeset
|
112 (char *) regkey, 0, KEY_READ, &hKey); |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
113 if (regresult == ERROR_SUCCESS) |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
114 { |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
115 /* find the size for the OEM name text */ |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
116 regsize = sizeof(regvalue); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
117 regresult = |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
118 RegQueryValueExA(hKey, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
119 REGSTR_VAL_JOYOEMNAME, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
120 0, 0, NULL, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
121 (LPDWORD) ®size); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
122 if (regresult == ERROR_SUCCESS) |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
123 { |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
124 /* |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
125 allocate enough memory |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
126 for the OEM name text ... |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
127 */ |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
128 name = (char *) SDL_malloc(regsize); |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
129 /* ... and read it from the registry */ |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
130 regresult = |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
131 RegQueryValueExA(hKey, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
132 REGSTR_VAL_JOYOEMNAME, 0, 0, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
133 (LPBYTE) name, |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
134 (LPDWORD) ®size); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
135 RegCloseKey(hKey); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
136 } |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
137 } |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
138 } |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
139 } |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
140 return(name); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
141 } |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
142 |
0 | 143 /* Function to scan the system for joysticks. |
144 * This function should set SDL_numjoysticks to the number of available | |
145 * joysticks. Joystick 0 should be the system default joystick. | |
146 * It should return 0, or -1 on an unrecoverable fatal error. | |
147 */ | |
148 int SDL_SYS_JoystickInit(void) | |
149 { | |
150 int i; | |
151 int maxdevs; | |
152 int numdevs; | |
153 JOYINFOEX joyinfo; | |
154 JOYCAPS joycaps; | |
155 MMRESULT result; | |
156 | |
1748
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
157 /* Reset the joystick ID & name mapping tables */ |
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
158 for ( i = 0; i < MAX_JOYSTICKS; ++i ) { |
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
159 SYS_JoystickID[i] = 0; |
938
fa2ce068b0b6
Hmm, this should work a little better. :)
Sam Lantinga <slouken@libsdl.org>
parents:
937
diff
changeset
|
160 SYS_JoystickName[i] = NULL; |
531
8450e66651ea
Fixed joystick detection problem on Windows XP (thanks Maciej!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
161 } |
8450e66651ea
Fixed joystick detection problem on Windows XP (thanks Maciej!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
162 |
1748
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
163 /* Loop over all potential joystick devices */ |
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
164 numdevs = 0; |
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
165 maxdevs = joyGetNumDevs(); |
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
166 for ( i = JOYSTICKID1; i < maxdevs && numdevs < MAX_JOYSTICKS; ++i ) { |
165
6a4e09bbbbc0
Joystick initialization fix submitted by Vitaliy Mikitchenko
Sam Lantinga <slouken@libsdl.org>
parents:
49
diff
changeset
|
167 |
6a4e09bbbbc0
Joystick initialization fix submitted by Vitaliy Mikitchenko
Sam Lantinga <slouken@libsdl.org>
parents:
49
diff
changeset
|
168 joyinfo.dwSize = sizeof(joyinfo); |
6a4e09bbbbc0
Joystick initialization fix submitted by Vitaliy Mikitchenko
Sam Lantinga <slouken@libsdl.org>
parents:
49
diff
changeset
|
169 joyinfo.dwFlags = JOY_RETURNALL; |
0 | 170 result = joyGetPosEx(SYS_JoystickID[i], &joyinfo); |
171 if ( result == JOYERR_NOERROR ) { | |
1748
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
172 result = joyGetDevCaps(i, &joycaps, sizeof(joycaps)); |
0 | 173 if ( result == JOYERR_NOERROR ) { |
1748
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
174 SYS_JoystickID[numdevs] = i; |
0 | 175 SYS_Joystick[numdevs] = joycaps; |
1748
5e86e34453d4
------- Comment #1 From Max Horn 2006-04-17 03:08 [reply] -------
Sam Lantinga <slouken@libsdl.org>
parents:
1635
diff
changeset
|
176 SYS_JoystickName[numdevs] = GetJoystickName(i, joycaps.szRegKey); |
0 | 177 numdevs++; |
178 } | |
179 } | |
180 } | |
181 return(numdevs); | |
182 } | |
183 | |
184 /* Function to get the device-dependent name of a joystick */ | |
185 const char *SDL_SYS_JoystickName(int index) | |
186 { | |
938
fa2ce068b0b6
Hmm, this should work a little better. :)
Sam Lantinga <slouken@libsdl.org>
parents:
937
diff
changeset
|
187 if ( SYS_JoystickName[index] != NULL ) { |
fa2ce068b0b6
Hmm, this should work a little better. :)
Sam Lantinga <slouken@libsdl.org>
parents:
937
diff
changeset
|
188 return(SYS_JoystickName[index]); |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
189 } else { |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
190 return(SYS_Joystick[index].szPname); |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
191 } |
0 | 192 } |
193 | |
194 /* Function to open a joystick for use. | |
195 The joystick to open is specified by the index field of the joystick. | |
196 This should fill the nbuttons and naxes fields of the joystick structure. | |
197 It returns 0, or -1 if there is an error. | |
198 */ | |
199 int SDL_SYS_JoystickOpen(SDL_Joystick *joystick) | |
200 { | |
201 int index, i; | |
202 int caps_flags[MAX_AXES-2] = | |
203 { JOYCAPS_HASZ, JOYCAPS_HASR, JOYCAPS_HASU, JOYCAPS_HASV }; | |
204 int axis_min[MAX_AXES], axis_max[MAX_AXES]; | |
205 | |
206 | |
207 /* shortcut */ | |
208 index = joystick->index; | |
209 axis_min[0] = SYS_Joystick[index].wXmin; | |
210 axis_max[0] = SYS_Joystick[index].wXmax; | |
211 axis_min[1] = SYS_Joystick[index].wYmin; | |
212 axis_max[1] = SYS_Joystick[index].wYmax; | |
213 axis_min[2] = SYS_Joystick[index].wZmin; | |
214 axis_max[2] = SYS_Joystick[index].wZmax; | |
215 axis_min[3] = SYS_Joystick[index].wRmin; | |
216 axis_max[3] = SYS_Joystick[index].wRmax; | |
217 axis_min[4] = SYS_Joystick[index].wUmin; | |
218 axis_max[4] = SYS_Joystick[index].wUmax; | |
219 axis_min[5] = SYS_Joystick[index].wVmin; | |
220 axis_max[5] = SYS_Joystick[index].wVmax; | |
221 | |
222 /* allocate memory for system specific hardware data */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
223 joystick->hwdata = (struct joystick_hwdata *) SDL_malloc(sizeof(*joystick->hwdata)); |
0 | 224 if (joystick->hwdata == NULL) |
225 { | |
226 SDL_OutOfMemory(); | |
227 return(-1); | |
228 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
229 SDL_memset(joystick->hwdata, 0, sizeof(*joystick->hwdata)); |
0 | 230 |
231 /* set hardware data */ | |
232 joystick->hwdata->id = SYS_JoystickID[index]; | |
233 for ( i = 0; i < MAX_AXES; ++i ) { | |
234 if ( (i<2) || (SYS_Joystick[index].wCaps & caps_flags[i-2]) ) { | |
235 joystick->hwdata->transaxis[i].offset = | |
236 AXIS_MIN - axis_min[i]; | |
237 joystick->hwdata->transaxis[i].scale = | |
238 (float)(AXIS_MAX - AXIS_MIN) / (axis_max[i] - axis_min[i]); | |
239 } else { | |
240 joystick->hwdata->transaxis[i].offset = 0; | |
241 joystick->hwdata->transaxis[i].scale = 1.0; /* Just in case */ | |
242 } | |
243 } | |
244 | |
245 /* fill nbuttons, naxes, and nhats fields */ | |
246 joystick->nbuttons = SYS_Joystick[index].wNumButtons; | |
247 joystick->naxes = SYS_Joystick[index].wNumAxes; | |
248 if ( SYS_Joystick[index].wCaps & JOYCAPS_HASPOV ) { | |
249 joystick->nhats = 1; | |
250 } else { | |
251 joystick->nhats = 0; | |
252 } | |
253 return(0); | |
254 } | |
255 | |
256 static Uint8 TranslatePOV(DWORD value) | |
257 { | |
258 Uint8 pos; | |
259 | |
260 pos = SDL_HAT_CENTERED; | |
261 if ( value != JOY_POVCENTERED ) { | |
262 if ( (value > JOY_POVLEFT) || (value < JOY_POVRIGHT) ) { | |
263 pos |= SDL_HAT_UP; | |
264 } | |
265 if ( (value > JOY_POVFORWARD) && (value < JOY_POVBACKWARD) ) { | |
266 pos |= SDL_HAT_RIGHT; | |
267 } | |
268 if ( (value > JOY_POVRIGHT) && (value < JOY_POVLEFT) ) { | |
269 pos |= SDL_HAT_DOWN; | |
270 } | |
271 if ( value > JOY_POVBACKWARD ) { | |
272 pos |= SDL_HAT_LEFT; | |
273 } | |
274 } | |
275 return(pos); | |
276 } | |
277 | |
278 /* Function to update the state of a joystick - called as a device poll. | |
279 * This function shouldn't update the joystick structure directly, | |
280 * but instead should call SDL_PrivateJoystick*() to deliver events | |
281 * and update joystick device state. | |
282 */ | |
283 void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick) | |
284 { | |
285 MMRESULT result; | |
286 int i; | |
287 DWORD flags[MAX_AXES] = { JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ, | |
288 JOY_RETURNR, JOY_RETURNU, JOY_RETURNV }; | |
289 DWORD pos[MAX_AXES]; | |
290 struct _transaxis *transaxis; | |
291 int value, change; | |
292 JOYINFOEX joyinfo; | |
293 | |
294 joyinfo.dwSize = sizeof(joyinfo); | |
295 joyinfo.dwFlags = JOY_RETURNALL|JOY_RETURNPOVCTS; | |
296 if ( ! joystick->hats ) { | |
297 joyinfo.dwFlags &= ~(JOY_RETURNPOV|JOY_RETURNPOVCTS); | |
298 } | |
299 result = joyGetPosEx(joystick->hwdata->id, &joyinfo); | |
300 if ( result != JOYERR_NOERROR ) { | |
301 SetMMerror("joyGetPosEx", result); | |
302 return; | |
303 } | |
304 | |
305 /* joystick motion events */ | |
306 pos[0] = joyinfo.dwXpos; | |
307 pos[1] = joyinfo.dwYpos; | |
308 pos[2] = joyinfo.dwZpos; | |
309 pos[3] = joyinfo.dwRpos; | |
310 pos[4] = joyinfo.dwUpos; | |
311 pos[5] = joyinfo.dwVpos; | |
312 | |
313 transaxis = joystick->hwdata->transaxis; | |
314 for (i = 0; i < joystick->naxes; i++) { | |
315 if (joyinfo.dwFlags & flags[i]) { | |
49
6f3c474f9abd
Fixed bug in joystick motion, thanks to Alexandre Duret-Lutz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
316 value = (int)(((float)pos[i] + transaxis[i].offset) * transaxis[i].scale); |
0 | 317 change = (value - joystick->axes[i]); |
318 if ( (change < -JOY_AXIS_THRESHOLD) || (change > JOY_AXIS_THRESHOLD) ) { | |
319 SDL_PrivateJoystickAxis(joystick, (Uint8)i, (Sint16)value); | |
320 } | |
321 } | |
322 } | |
323 | |
324 /* joystick button events */ | |
325 if ( joyinfo.dwFlags & JOY_RETURNBUTTONS ) { | |
326 for ( i = 0; i < joystick->nbuttons; ++i ) { | |
327 if ( joyinfo.dwButtons & JOY_BUTTON_FLAG(i) ) { | |
328 if ( ! joystick->buttons[i] ) { | |
329 SDL_PrivateJoystickButton(joystick, (Uint8)i, SDL_PRESSED); | |
330 } | |
331 } else { | |
332 if ( joystick->buttons[i] ) { | |
333 SDL_PrivateJoystickButton(joystick, (Uint8)i, SDL_RELEASED); | |
334 } | |
335 } | |
336 } | |
337 } | |
338 | |
339 /* joystick hat events */ | |
340 if ( joyinfo.dwFlags & JOY_RETURNPOV ) { | |
341 Uint8 pos; | |
342 | |
343 pos = TranslatePOV(joyinfo.dwPOV); | |
344 if ( pos != joystick->hats[0] ) { | |
345 SDL_PrivateJoystickHat(joystick, 0, pos); | |
346 } | |
347 } | |
348 } | |
349 | |
350 /* Function to close a joystick after use */ | |
351 void SDL_SYS_JoystickClose(SDL_Joystick *joystick) | |
352 { | |
353 if (joystick->hwdata != NULL) { | |
354 /* free system specific hardware data */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
355 SDL_free(joystick->hwdata); |
0 | 356 } |
357 } | |
358 | |
359 /* Function to perform any system-specific joystick related cleanup */ | |
360 void SDL_SYS_JoystickQuit(void) | |
361 { | |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
362 int i; |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
363 for (i = 0; i < MAX_JOYSTICKS; i++) { |
938
fa2ce068b0b6
Hmm, this should work a little better. :)
Sam Lantinga <slouken@libsdl.org>
parents:
937
diff
changeset
|
364 if ( SYS_JoystickName[i] != NULL ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
365 SDL_free(SYS_JoystickName[i]); |
937
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
366 } |
1e6366bde299
Date: Tue, 27 Jul 2004 17:14:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
834
diff
changeset
|
367 } |
0 | 368 } |
369 | |
370 | |
371 /* implementation functions */ | |
372 void SetMMerror(char *function, int code) | |
373 { | |
374 static char *error; | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
375 static char errbuf[1024]; |
0 | 376 |
377 errbuf[0] = 0; | |
378 switch (code) | |
379 { | |
380 case MMSYSERR_NODRIVER: | |
381 error = "Joystick driver not present"; | |
382 break; | |
383 | |
384 case MMSYSERR_INVALPARAM: | |
385 case JOYERR_PARMS: | |
386 error = "Invalid parameter(s)"; | |
387 break; | |
388 | |
389 case MMSYSERR_BADDEVICEID: | |
390 error = "Bad device ID"; | |
391 break; | |
392 | |
393 case JOYERR_UNPLUGGED: | |
394 error = "Joystick not attached"; | |
395 break; | |
396 | |
397 case JOYERR_NOCANDO: | |
398 error = "Can't capture joystick input"; | |
399 break; | |
400 | |
401 default: | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
402 SDL_snprintf(errbuf, SDL_arraysize(errbuf), |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
403 "%s: Unknown Multimedia system error: 0x%x", |
0 | 404 function, code); |
405 break; | |
406 } | |
407 | |
408 if ( ! errbuf[0] ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
409 SDL_snprintf(errbuf, SDL_arraysize(errbuf), "%s: %s", function, error); |
0 | 410 } |
411 SDL_SetError("%s", errbuf); | |
412 } | |
1635
92947e3a18db
Make sure code is only compiled if the appropriate subsystem is enabled
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
413 |
92947e3a18db
Make sure code is only compiled if the appropriate subsystem is enabled
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
414 #endif /* SDL_JOYSTICK_WINMM */ |