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