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