]> icculus.org git repositories - btb/d2x.git/blob - arch/sdl/mouse.c
remove rcs tags
[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
21 #ifdef _WIN32_WCE
22 # define LANDSCAPE
23 #endif
24
25 #define MOUSE_MAX_BUTTONS       8
26
27 #define Z_SENSITIVITY 100
28
29 struct mousebutton {
30         ubyte pressed;
31         fix time_went_down;
32         fix time_held_down;
33         uint num_downs;
34         uint num_ups;
35 };
36
37 static struct mouseinfo {
38         struct mousebutton buttons[MOUSE_MAX_BUTTONS];
39         int delta_x, delta_y, delta_z;
40         int x,y,z;
41 } Mouse;
42
43 void d_mouse_init(void)
44 {
45         memset(&Mouse,0,sizeof(Mouse));
46 }
47
48 void mouse_button_handler(SDL_MouseButtonEvent *mbe)
49 {
50         // to bad, SDL buttons use a different mapping as descent expects,
51         // this is at least true and tested for the first three buttons 
52         int button_remap[11] = {
53                 MB_LEFT,
54                 MB_MIDDLE,
55                 MB_RIGHT,
56                 MB_Z_UP,
57                 MB_Z_DOWN,
58                 MB_PITCH_BACKWARD,
59                 MB_PITCH_FORWARD,
60                 MB_BANK_LEFT,
61                 MB_BANK_RIGHT,
62                 MB_HEAD_LEFT,
63                 MB_HEAD_RIGHT
64         };
65
66         int button = button_remap[mbe->button - 1]; // -1 since SDL seems to start counting at 1
67
68         if (mbe->state == SDL_PRESSED) {
69                 Mouse.buttons[button].pressed = 1;
70                 Mouse.buttons[button].time_went_down = timer_get_fixed_seconds();
71                 Mouse.buttons[button].num_downs++;
72
73                 if (button == MB_Z_UP) {
74                         Mouse.delta_z += Z_SENSITIVITY;
75                         Mouse.z += Z_SENSITIVITY;
76                 } else if (button == MB_Z_DOWN) {
77                         Mouse.delta_z -= Z_SENSITIVITY;
78                         Mouse.z -= Z_SENSITIVITY;
79                 }
80         } else {
81                 Mouse.buttons[button].pressed = 0;
82                 Mouse.buttons[button].time_held_down += timer_get_fixed_seconds() - Mouse.buttons[button].time_went_down;
83                 Mouse.buttons[button].num_ups++;
84         }
85 }
86
87 void mouse_motion_handler(SDL_MouseMotionEvent *mme)
88 {
89 #ifdef LANDSCAPE
90         Mouse.delta_y += mme->xrel;
91         Mouse.delta_x += mme->yrel;
92         Mouse.y += mme->xrel;
93         Mouse.x += mme->yrel;
94 #else
95         Mouse.delta_x += mme->xrel;
96         Mouse.delta_y += mme->yrel;
97         Mouse.x += mme->xrel;
98         Mouse.y += mme->yrel;
99 #endif
100 }
101
102 void mouse_flush()      // clears all mice events...
103 {
104         int i;
105         fix current_time;
106
107         event_poll();
108
109         current_time = timer_get_fixed_seconds();
110         for (i=0; i<MOUSE_MAX_BUTTONS; i++) {
111                 Mouse.buttons[i].pressed=0;
112                 Mouse.buttons[i].time_went_down=current_time;
113                 Mouse.buttons[i].time_held_down=0;
114                 Mouse.buttons[i].num_ups=0;
115                 Mouse.buttons[i].num_downs=0;
116         }
117         Mouse.delta_x = 0;
118         Mouse.delta_y = 0;
119         Mouse.delta_z = 0;
120         Mouse.x = 0;
121         Mouse.y = 0;
122         Mouse.z = 0;
123         SDL_GetMouseState(&Mouse.x, &Mouse.y); // necessary because polling only gives us the delta.
124 }
125
126 //========================================================================
127 void mouse_get_pos( int *x, int *y )
128 {
129         event_poll();
130 #ifdef _WIN32_WCE // needed here only for touchpens?
131 # ifdef LANDSCAPE
132         SDL_GetMouseState(&Mouse.y, &Mouse.x);
133 # else
134         SDL_GetMouseState(&Mouse.x, &Mouse.y);
135 # endif
136 #endif
137         *x=Mouse.x;
138         *y=Mouse.y;
139 }
140
141 void mouse_get_delta( int *dx, int *dy )
142 {
143         event_poll();
144         *dx = Mouse.delta_x;
145         *dy = Mouse.delta_y;
146         Mouse.delta_x = 0;
147         Mouse.delta_y = 0;
148 }
149
150 void mouse_get_pos_z( int *x, int *y, int *z )
151 {
152         event_poll();
153         *x=Mouse.x;
154         *y=Mouse.y;
155         *z=Mouse.z;
156 }
157
158 void mouse_get_delta_z( int *dx, int *dy, int *dz )
159 {
160         event_poll();
161         *dx = Mouse.delta_x;
162         *dy = Mouse.delta_y;
163         *dz = Mouse.delta_z;
164         Mouse.delta_x = 0;
165         Mouse.delta_y = 0;
166         Mouse.delta_z = 0;
167 }
168
169 int mouse_get_btns()
170 {
171         int i;
172         uint flag=1;
173         int status = 0;
174
175         event_poll();
176
177         for (i=0; i<MOUSE_MAX_BUTTONS; i++ ) {
178                 if (Mouse.buttons[i].pressed)
179                         status |= flag;
180                 flag <<= 1;
181         }
182
183         return status;
184 }
185
186 void mouse_get_cyberman_pos( int *x, int *y )
187 {
188 }
189
190 // Returns how long this button has been down since last call.
191 fix mouse_button_down_time(int button)
192 {
193         fix time_down, time;
194
195         event_poll();
196
197         if (!Mouse.buttons[button].pressed) {
198                 time_down = Mouse.buttons[button].time_held_down;
199                 Mouse.buttons[button].time_held_down = 0;
200         } else {
201                 time = timer_get_fixed_seconds();
202                 time_down = time - Mouse.buttons[button].time_held_down;
203                 Mouse.buttons[button].time_held_down = time;
204         }
205         return time_down;
206 }
207
208 // Returns how many times this button has went down since last call
209 int mouse_button_down_count(int button)
210 {
211         int count;
212
213         event_poll();
214
215         count = Mouse.buttons[button].num_downs;
216         Mouse.buttons[button].num_downs = 0;
217
218         return count;
219 }
220
221 // Returns 1 if this button is currently down
222 int mouse_button_state(int button)
223 {
224         event_poll();
225         return Mouse.buttons[button].pressed;
226 }