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