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