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