]> icculus.org git repositories - btb/d2x.git/blob - input/sdl_mouse.c
Removed duplicate files, and unified input headers.
[btb/d2x.git] / input / sdl_mouse.c
1 // SDL mouse driver.
2
3 #include <conf.h>
4
5 #ifdef SDL_INPUT
6 #include <string.h>
7 #include <SDL/SDL.h>
8 #include "fix.h"
9 #include "timer.h"
10 #include "event.h"
11 #include "mouse.h"
12
13 #define MOUSE_MAX_BUTTONS       8
14
15 struct mousebutton {
16  ubyte pressed;
17  fix time_went_down;
18  fix time_held_down;
19  uint num_downs;
20  uint num_ups;
21 };
22
23 static struct mouseinfo {
24  struct mousebutton buttons[MOUSE_MAX_BUTTONS];
25 //added on 10/17/98 by Hans de Goede for mouse functionality
26  int min_x, min_y;
27  int max_x, max_y;
28  int delta_x, delta_y;
29  int x,y;
30 //end this section addition - Hans
31 } Mouse;
32
33 //added on 10/17/98 by Hans de Goede for mouse functionality
34 void d_mouse_init(void)
35 {
36  memset(&Mouse,0,sizeof(Mouse));
37 }
38
39 //added/changed on 10/17/98 by Hans de Goede for mouse functionality
40 //void mouse_handler(SDL_MouseButtonEvent *mbe)
41 void mouse_button_handler(SDL_MouseButtonEvent *mbe)
42 {
43  // to bad, SDL buttons use a different mapping as descent expects,
44  // this is atleast true and tested for the first three buttons 
45  int button_remap[11] = {
46     MB_LEFT,
47     MB_MIDDLE,
48     MB_RIGHT,
49     MB_Z_UP,
50     MB_Z_DOWN,
51     MB_PITCH_BACKWARD,
52     MB_PITCH_FORWARD,
53     MB_BANK_LEFT,
54     MB_BANK_RIGHT,
55     MB_HEAD_LEFT,
56     MB_HEAD_RIGHT };
57
58  int button = button_remap[mbe->button - 1]; // -1 since SDL seems to start counting at 1
59
60  if (mbe->state == SDL_PRESSED) {
61 //   Mouse.buttons[mbe->button].pressed = 1;
62 //   Mouse.buttons[mbe->button].time_went_down = timer_get_fixed_seconds();
63 //   Mouse.buttons[mbe->button].num_downs++;
64   Mouse.buttons[button].pressed = 1;
65   Mouse.buttons[button].time_went_down = timer_get_fixed_seconds();
66   Mouse.buttons[button].num_downs++;
67  } else {
68 //   Mouse.buttons[mbe->button].pressed = 0;
69 //   Mouse.buttons[mbe->button].time_held_down += timer_get_fixed_seconds() - Mouse.buttons[mbe->button].time_went_down;
70 //   Mouse.buttons[mbe->button].num_ups++;
71    Mouse.buttons[button].pressed = 0;
72    Mouse.buttons[button].time_held_down += timer_get_fixed_seconds() - Mouse.buttons[mbe->button].time_went_down;
73    Mouse.buttons[button].num_ups++;
74 //end this section addition/change - Hans
75  }
76 }
77
78 //added on 10/17/98 by Hans de Goede for mouse functionality
79 void mouse_motion_handler(SDL_MouseMotionEvent *mme)
80 {
81   Mouse.delta_x += mme->xrel;
82   Mouse.delta_y += mme->yrel;
83   Mouse.x += mme->xrel;
84   Mouse.y += mme->yrel;
85   if      (Mouse.x > Mouse.max_x) Mouse.x = Mouse.max_x;
86   else if (Mouse.x < Mouse.min_x) Mouse.x = Mouse.min_x;
87   if      (Mouse.y > Mouse.max_y) Mouse.y = Mouse.max_y;
88   else if (Mouse.y < Mouse.min_y) Mouse.y = Mouse.min_y;
89 }
90 //end this section addition - Hans
91
92 void
93 mouse_set_limits( int x1, int y1, int x2, int y2 )
94 {
95 //added on 10/17/98 by Hans de Goede for mouse functionality
96 //-killed- // Shrug...
97 //-killed- event_poll();
98  Mouse.min_x = x1;
99  Mouse.min_y = y1;
100  Mouse.max_x = x2;
101  Mouse.max_y = y2;
102 //end this section addition - Hans
103 }
104
105 void mouse_flush()      // clears all mice events...
106 {
107  int i;
108  fix current_time;
109
110  event_poll();
111
112  current_time = timer_get_fixed_seconds();
113  for (i=0; i<MOUSE_MAX_BUTTONS; i++)
114  {
115    Mouse.buttons[i].pressed=0;
116    Mouse.buttons[i].time_went_down=current_time;
117    Mouse.buttons[i].time_held_down=0;
118    Mouse.buttons[i].num_ups=0;
119    Mouse.buttons[i].num_downs=0;
120  }
121 //added on 10/17/98 by Hans de Goede for mouse functionality 
122  Mouse.delta_x = 0;
123  Mouse.delta_y = 0;
124  Mouse.x = 0;
125  Mouse.y = 0;
126 //end this section addition - Hans
127 }
128
129 //========================================================================
130 void mouse_get_pos( int *x, int *y)
131 {
132 //added/changed on 10/17/98 by Hans de Goede for mouse functionality
133 //-killed-  Uint16 lx,ly;
134   event_poll();
135 //-killed-  SDL_GetMouseState(&lx,&ly);
136 //-killed-  *x=(int)lx;
137 //-killed-  *y=(int)ly;
138     *x=Mouse.x;
139     *y=Mouse.y;
140 //end this section change - Hans
141 }
142
143 void mouse_get_delta( int *dx, int *dy )
144 {
145 //added/changed on 10/17/98 by Hans de Goede for mouse functionality
146 //-killed- static int lastx, lasty;
147 //-killed- int x,y;
148
149  event_poll();
150 //-killed- mouse_get_pos(&x,&y);
151 //-killed- *dx = x - lastx;
152 //-killed- *dy = y - lasty;
153 //-killed- lastx = x;
154 //-killed- lasty = y;
155  *dx = Mouse.delta_x;
156  *dy = Mouse.delta_y;
157  Mouse.delta_x = 0;
158  Mouse.delta_y = 0;
159 //end this section change - Hans
160 }
161
162 int mouse_get_btns()
163 {
164         int i;
165         uint flag=1;
166         int status = 0;
167
168         event_poll();
169         
170         for (i=0; i<MOUSE_MAX_BUTTONS; i++ )
171         {
172                 if (Mouse.buttons[i].pressed)
173                         status |= flag;
174                 flag <<= 1;
175         }
176         return status;
177 }
178
179 void mouse_set_pos( int x, int y)
180 {
181  event_poll();
182 //added/changed on 10/17/98 by Hans de Goede for mouse functionality
183 //-killed- SDL_WarpMouse(x,y);
184  Mouse.x=x;
185  Mouse.y=y;
186  if      (Mouse.x > Mouse.max_x) Mouse.x = Mouse.max_x;
187  else if (Mouse.x < Mouse.min_x) Mouse.x = Mouse.min_x;
188  if      (Mouse.y > Mouse.max_y) Mouse.y = Mouse.max_y;
189  else if (Mouse.y < Mouse.min_y) Mouse.y = Mouse.min_y;
190 //end this section change - Hans
191 }
192
193 void mouse_get_cyberman_pos( int *x, int *y )
194 {
195  // Shrug...
196  event_poll();
197 }
198
199 // Returns how long this button has been down since last call.
200 fix mouse_button_down_time(int button)
201 {
202  fix time_down, time;
203
204  event_poll();
205
206  if (!Mouse.buttons[button].pressed) {
207    time_down = Mouse.buttons[button].time_held_down;
208    Mouse.buttons[button].time_held_down = 0;
209  } else {
210    time = timer_get_fixed_seconds();
211    time_down = time - Mouse.buttons[button].time_held_down;
212    Mouse.buttons[button].time_held_down = time;
213  }
214  return time_down;
215 }
216
217 // Returns how many times this button has went down since last call
218 int mouse_button_down_count(int button)
219 {
220   int count;
221
222   event_poll();
223
224   count = Mouse.buttons[button].num_downs;
225   Mouse.buttons[button].num_downs = 0;
226
227   return count;
228 }
229
230 // Returns 1 if this button is currently down
231 int mouse_button_state(int button)
232 {
233   event_poll();
234   return Mouse.buttons[button].pressed;
235 }
236
237
238
239 #endif // SDL_INPUT