]> icculus.org git repositories - btb/d2x.git/blob - arch/ggi/mouse.c
remove rcs tags
[btb/d2x.git] / arch / ggi / mouse.c
1 /*
2  *
3  * GGI mouse support
4  *
5  *
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include <conf.h>
10 #endif
11
12 #include <stdio.h>
13 #include <string.h>
14 #include <ggi/gii.h>
15 #include "fix.h"
16 #include "timer.h"
17 #include "event.h"
18 #include "mouse.h"
19
20 struct mousebutton {
21  ubyte pressed;
22  fix time_went_down;
23  fix time_held_down;
24  uint num_downs;
25  uint num_ups;
26 };
27
28 #define MOUSE_MAX_BUTTONS 3
29
30 static struct mouseinfo {
31  struct mousebutton buttons[MOUSE_MAX_BUTTONS];
32 //added on 10/17/98 by Hans de Goede for mouse functionality
33  int min_x, min_y;
34  int max_x, max_y;
35  int delta_x, delta_y;
36  int x,y;
37 } Mouse;
38
39 void mouse_correct()
40 {
41         if (Mouse.x < Mouse.min_x)
42                 Mouse.x = Mouse.min_x;
43         else if (Mouse.x > Mouse.max_x)
44                 Mouse.x = Mouse.max_x;
45         if (Mouse.y < Mouse.min_y)
46                 Mouse.y = Mouse.min_y;
47         else if (Mouse.y > Mouse.max_y)
48                 Mouse.y = Mouse.max_y;
49 }
50
51 void mouse_handler_absolute(int x, int y)
52 {
53         Mouse.delta_x += (x - Mouse.x);
54         Mouse.delta_y += (y - Mouse.y);
55         Mouse.x = x;
56         Mouse.y = y;
57 //      mouse_correct();
58 }
59
60 void mouse_handler_relative(int x, int y)
61 {
62         Mouse.delta_x += x;
63         Mouse.delta_y += y;
64         Mouse.x += x;
65         Mouse.y += y;
66 //      mouse_correct();
67 }       
68
69 void mouse_handler_button(int button, ubyte state)
70 {
71         if (!Mouse.buttons[button].pressed && state)
72         {
73                 Mouse.buttons[button].time_went_down = timer_get_fixed_seconds();
74                 Mouse.buttons[button].num_downs++;
75         }
76         else if (Mouse.buttons[button].pressed && !state)
77         {
78                 Mouse.buttons[button].num_ups++;
79         }
80                         
81         Mouse.buttons[button].pressed = state;
82 }
83
84 void Mouse_close(void)
85 {
86 }
87
88 void Mouse_init(void)
89 {
90         memset(&Mouse, 0, sizeof(Mouse));
91 }
92
93 void
94 mouse_set_limits( int x1, int y1, int x2, int y2 )
95 {
96         Mouse.min_x = x1;
97         Mouse.max_x = x2;
98         Mouse.min_y = y1;
99         Mouse.max_y = y2;
100 }
101
102 void mouse_flush()      // clears all mice events...
103 {
104         Mouse.x = 0;
105         Mouse.y = 0;
106         Mouse.delta_x = 0;
107         Mouse.delta_y = 0;
108 }
109
110 //========================================================================
111 void mouse_get_pos( int *x, int *y)
112 {
113         event_poll();
114         *x = Mouse.x;
115         *y = Mouse.y;
116 }
117
118 void mouse_get_delta( int *dx, int *dy )
119 {
120         event_poll();
121         *dx = Mouse.delta_x;
122         *dy = Mouse.delta_y;
123         Mouse.delta_x = 0;
124         Mouse.delta_y = 0;
125 }
126
127 int mouse_get_btns()
128 {
129         ubyte buttons = 0;
130         int i;
131         event_poll();
132         for (i = 0; i < MOUSE_MAX_BUTTONS; i++)
133                 buttons |= (Mouse.buttons[i].pressed << i);
134         return buttons;
135 }
136
137 void mouse_set_pos( int x, int y)
138 {
139         Mouse.x = x;
140         Mouse.y = y;
141 }
142
143 void mouse_get_cyberman_pos( int *x, int *y )
144 {
145 }
146
147 // Returns how long this button has been down since last call.
148 fix mouse_button_down_time(int button)
149 {
150         if (Mouse.buttons[button].pressed)
151                 return (timer_get_fixed_seconds() - Mouse.buttons[button].time_went_down);
152         else
153                 return 0;
154 }
155
156 // Returns how many times this button has went down since last call
157 int mouse_button_down_count(int button)
158 {
159         int count = Mouse.buttons[button].num_downs;
160         Mouse.buttons[button].num_downs = 0;
161         return count;   
162 }
163
164 // Returns 1 if this button is currently down
165 int mouse_button_state(int button)
166 {
167         return Mouse.buttons[button].pressed;
168 }