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