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