]> icculus.org git repositories - btb/d2x.git/blob - input/svgalib_mouse.c
RCS headers added/changed
[btb/d2x.git] / input / svgalib_mouse.c
1 /*
2  * $Source: /cvs/cvsroot/d2x/input/svgalib_mouse.c,v $
3  * $Revision: 1.3 $
4  * $Author: bradleyb $
5  * $Date: 2001-01-29 14:03:57 $
6  *
7  * SVGALib mouse support
8  *
9  * $Log: not supported by cvs2svn $
10  * Revision 1.2  2001/01/28 16:09:39  bradleyb
11  * Removed duplicate files, and unified input headers.
12  *
13  */
14
15 #ifdef HAVE_CONFIG_H
16 #include <conf.h>
17 #endif
18
19 #include <string.h>
20 #include <vga.h>
21 #include <vgamouse.h>
22 #include "fix.h"
23 #include "timer.h"
24 #include "event.h"
25 #include "mouse.h"
26
27 #define MOUSE_MAX_BUTTONS       8
28
29 ubyte installed = 0;
30
31 struct mousebutton {
32  ubyte pressed;
33  fix time_went_down;
34  fix time_held_down;
35  uint num_downs;
36  uint num_ups;
37 };
38
39 static struct mouseinfo {
40  struct mousebutton buttons[MOUSE_MAX_BUTTONS];
41 //added on 10/17/98 by Hans de Goede for mouse functionality
42  int min_x, min_y;
43  int max_x, max_y;
44  int delta_x, delta_y;
45  int x,y;
46 //end this section addition - Hans
47 } Mouse;
48
49 void mouse_handler (int vga_button, int dx, int dy, int dz, int drx, int dry, int drz)
50 {
51  int i;
52  int button;
53  int state;
54
55  /* map bit 0,1,2 (R,M,L) to 1,2,0 */
56  button = ((vga_button & 1) << 1) | ((vga_button & 2) << 1) | 
57    ((vga_button & 4) >> 2);
58
59  for (i = 0; i < 8; i++)
60  { 
61   state = button & (1 << i);
62   if (!Mouse.buttons[i].pressed && state)
63     {
64       Mouse.buttons[i].time_went_down = timer_get_fixed_seconds();
65       Mouse.buttons[i].num_downs++;
66     }
67   else if (Mouse.buttons[i].pressed && !state)
68     {
69       Mouse.buttons[i].num_ups++;
70     }
71   
72   Mouse.buttons[i].pressed = state;
73  }
74
75  Mouse.delta_x += dx;
76  Mouse.delta_y += dy;
77  Mouse.x += dx;
78  Mouse.y += dy;
79  if      (Mouse.x > Mouse.max_x) Mouse.x = Mouse.max_x;
80  else if (Mouse.x < Mouse.min_x) Mouse.x = Mouse.min_x;
81  if      (Mouse.y > Mouse.max_y) Mouse.y = Mouse.max_y;
82  else if (Mouse.y < Mouse.min_y) Mouse.y = Mouse.min_y;
83 }
84
85 void d_mouse_close(void)
86 {
87  if (installed)
88         vga_setmousesupport(0);
89  installed = 0;
90 }
91
92 int
93 d_mouse_init(int enable_cyberman)
94 {
95  memset(&Mouse,0,sizeof(Mouse));
96  vga_setmousesupport(1);
97  if (!installed)
98         atexit(d_mouse_close);
99  installed = 1;
100  return 0; /* should return # of buttons... dunno how w/svgalib */
101 }
102
103 void
104 mouse_set_limits( int x1, int y1, int x2, int y2 )
105 {
106  event_poll();
107  Mouse.min_x = x1;
108  Mouse.min_y = y1;
109  Mouse.max_x = x2;
110  Mouse.max_y = y2;
111 }
112
113 void mouse_flush()      // clears all mice events...
114 {
115  int i;
116  fix current_time;
117
118  event_poll();
119
120  current_time = timer_get_fixed_seconds();
121  for (i=0; i<MOUSE_MAX_BUTTONS; i++)
122  {
123    Mouse.buttons[i].pressed=0;
124    Mouse.buttons[i].time_went_down=current_time;
125    Mouse.buttons[i].time_held_down=0;
126    Mouse.buttons[i].num_ups=0;
127    Mouse.buttons[i].num_downs=0;
128  }
129 //added on 10/17/98 by Hans de Goede for mouse functionality 
130  Mouse.delta_x = 0;
131  Mouse.delta_y = 0;
132  Mouse.x = 0;
133  Mouse.y = 0;
134 //end this section addition - Hans
135 }
136
137 //========================================================================
138 void mouse_get_pos( int *x, int *y)
139 {
140   event_poll();
141   *x = Mouse.x;
142   *y = Mouse.y;
143 }
144
145 void mouse_get_delta( int *dx, int *dy )
146 {
147  event_poll();
148  *dx = Mouse.delta_x;
149  *dy = Mouse.delta_y;
150  Mouse.delta_x = 0;
151  Mouse.delta_y = 0;
152 }
153
154 int mouse_get_btns()
155 {
156         int i;
157         uint flag=1;
158         int status = 0;
159
160         event_poll();
161         
162         for (i=0; i<MOUSE_MAX_BUTTONS; i++ )
163         {
164                 if (Mouse.buttons[i].pressed)
165                         status |= flag;
166                 flag <<= 1;
167         }
168         return status;
169 }
170
171 void mouse_set_pos( int x, int y)
172 {
173  event_poll();
174  Mouse.x=x;
175  Mouse.y=y;
176  if      (Mouse.x > Mouse.max_x) Mouse.x = Mouse.max_x;
177  else if (Mouse.x < Mouse.min_x) Mouse.x = Mouse.min_x;
178  if      (Mouse.y > Mouse.max_y) Mouse.y = Mouse.max_y;
179  else if (Mouse.y < Mouse.min_y) Mouse.y = Mouse.min_y;
180 //end this section change - Hans
181 }
182
183 void mouse_get_cyberman_pos( int *x, int *y )
184 {
185  // Shrug...
186  event_poll();
187 }
188
189 // Returns how long this button has been down since last call.
190 fix mouse_button_down_time(int button)
191 {
192  fix time_down, time;
193
194  event_poll();
195
196  if (!Mouse.buttons[button].pressed) {
197    time_down = Mouse.buttons[button].time_held_down;
198    Mouse.buttons[button].time_held_down = 0;
199  } else {
200    time = timer_get_fixed_seconds();
201    time_down = time - Mouse.buttons[button].time_held_down;
202    Mouse.buttons[button].time_held_down = time;
203  }
204  return time_down;
205 }
206
207 // Returns how many times this button has went down since last call
208 int mouse_button_down_count(int button)
209 {
210   int count;
211
212   event_poll();
213
214   count = Mouse.buttons[button].num_downs;
215   Mouse.buttons[button].num_downs = 0;
216
217   return count;
218 }
219
220 // Returns 1 if this button is currently down
221 int mouse_button_state(int button)
222 {
223   event_poll();
224   return Mouse.buttons[button].pressed;
225 }