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