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