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