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