]> icculus.org git repositories - btb/d2x.git/blob - arch/sdl/mouse.c
cvars for axis mapping
[btb/d2x.git] / arch / sdl / mouse.c
1 /*
2  *
3  * SDL mouse driver.
4  *
5  *
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include <conf.h>
10 #endif
11
12 #include <string.h>
13
14 #include <SDL.h>
15
16 #include "fix.h"
17 #include "timer.h"
18 #include "event.h"
19 #include "mouse.h"
20 #include "key.h"
21
22 #ifdef _WIN32_WCE
23 # define LANDSCAPE
24 #endif
25
26 #define Z_SENSITIVITY 100
27
28 static struct mouseinfo {
29         int delta_x, delta_y, delta_z;
30         int x,y,z;
31 } Mouse;
32
33
34 cvar_t mouse_axes[3] = {
35         { "mouse_axisx", "4", 1 },
36         { "mouse_axisy", "2", 1 },
37         { "mouse_axisz", "0", 1 },
38 };
39
40
41 void d_mouse_init(void)
42 {
43         int i;
44
45         memset(&Mouse,0,sizeof(Mouse));
46
47         for (i = 0; i < 3; i++)
48                 cvar_registervariable(&mouse_axes[i]);
49 }
50
51 void mouse_button_handler(SDL_MouseButtonEvent *mbe)
52 {
53         // to bad, SDL buttons use a different mapping as descent expects,
54         // this is at least true and tested for the first three buttons 
55         int button_remap[11] = {
56                 MB_LEFT,
57                 MB_MIDDLE,
58                 MB_RIGHT,
59                 MB_Z_UP,
60                 MB_Z_DOWN,
61                 MB_PITCH_BACKWARD,
62                 MB_PITCH_FORWARD,
63                 MB_BANK_LEFT,
64                 MB_BANK_RIGHT,
65                 MB_HEAD_LEFT,
66                 MB_HEAD_RIGHT
67         };
68
69         int button = button_remap[mbe->button - 1]; // -1 since SDL seems to start counting at 1
70
71         vkey_handler(KEY_MB1 + button, mbe->state == SDL_PRESSED);
72
73         if (mbe->state == SDL_PRESSED) {
74                 if (button == MB_Z_UP) {
75                         Mouse.delta_z += Z_SENSITIVITY;
76                         Mouse.z += Z_SENSITIVITY;
77                 } else if (button == MB_Z_DOWN) {
78                         Mouse.delta_z -= Z_SENSITIVITY;
79                         Mouse.z -= Z_SENSITIVITY;
80                 }
81         }
82 }
83
84 void mouse_motion_handler(SDL_MouseMotionEvent *mme)
85 {
86 #ifdef LANDSCAPE
87         Mouse.delta_y += mme->xrel;
88         Mouse.delta_x += mme->yrel;
89         Mouse.y += mme->xrel;
90         Mouse.x += mme->yrel;
91 #else
92         Mouse.delta_x += mme->xrel;
93         Mouse.delta_y += mme->yrel;
94         Mouse.x += mme->xrel;
95         Mouse.y += mme->yrel;
96 #endif
97 }
98
99 void mouse_flush()      // clears all mice events...
100 {
101         event_poll();
102
103         Mouse.delta_x = 0;
104         Mouse.delta_y = 0;
105         Mouse.delta_z = 0;
106         Mouse.x = 0;
107         Mouse.y = 0;
108         Mouse.z = 0;
109         SDL_GetMouseState(&Mouse.x, &Mouse.y); // necessary because polling only gives us the delta.
110 }
111
112 //========================================================================
113 void mouse_get_pos( int *x, int *y )
114 {
115         event_poll();
116 #ifdef _WIN32_WCE // needed here only for touchpens?
117 # ifdef LANDSCAPE
118         SDL_GetMouseState(&Mouse.y, &Mouse.x);
119 # else
120         SDL_GetMouseState(&Mouse.x, &Mouse.y);
121 # endif
122 #endif
123         *x=Mouse.x;
124         *y=Mouse.y;
125 }
126
127 void mouse_get_delta( int *dx, int *dy )
128 {
129         event_poll();
130         *dx = Mouse.delta_x;
131         *dy = Mouse.delta_y;
132         Mouse.delta_x = 0;
133         Mouse.delta_y = 0;
134 }
135
136 void mouse_get_pos_z( int *x, int *y, int *z )
137 {
138         event_poll();
139         *x=Mouse.x;
140         *y=Mouse.y;
141         *z=Mouse.z;
142 }
143
144 void mouse_get_delta_z( int *dx, int *dy, int *dz )
145 {
146         event_poll();
147         *dx = Mouse.delta_x;
148         *dy = Mouse.delta_y;
149         *dz = Mouse.delta_z;
150         Mouse.delta_x = 0;
151         Mouse.delta_y = 0;
152         Mouse.delta_z = 0;
153 }
154
155 int mouse_get_btns()
156 {
157         int i;
158         uint flag=1;
159         int status = 0;
160
161         event_poll();
162
163         for (i=0; i<MOUSE_MAX_BUTTONS; i++ ) {
164                 if (keyd_pressed[KEY_MB1 + i])
165                         status |= flag;
166                 flag <<= 1;
167         }
168
169         return status;
170 }
171
172 void mouse_get_cyberman_pos( int *x, int *y )
173 {
174 }
175
176
177 // Returns 1 if this button is currently down
178 int mouse_button_state(int button)
179 {
180         event_poll();
181         return keyd_pressed[KEY_MB1 + button];
182 }