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