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