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