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