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