1 /* $Id: mouse.c,v 1.4 2005-01-24 22:19:10 schaffner Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
16 static char rcsid[] = "$Id: mouse.c,v 1.4 2005-01-24 22:19:10 schaffner Exp $";
38 char ui_converted_mouse_pointer[PTR_W*PTR_H];
39 char ui_mouse_pointer[] = \
77 static grs_bitmap * default_pointer;
83 #define TICKER (*(volatile int *)0x46C)
86 int ui_mouse_find_gadget(short n)
90 for (i=1; i<=Window[n].NumItems; i++ ) {
91 if ((Mouse.x >= (Window[n].Item[i].x1+Window[n].x)) &&
92 (Mouse.x <= (Window[n].Item[i].x2+Window[n].x)) &&
93 (Mouse.y >= (Window[n].Item[i].y1+Window[n].y)) &&
94 (Mouse.y <= (Window[n].Item[i].y2+Window[n].y)) )
103 if (Mouse.hidden==1 ) {
105 // Save the background under new pointer
107 Mouse.bg_x = Mouse.x; Mouse.bg_y = Mouse.y;
108 gr_bm_ubitblt( Mouse.background->bm_w, Mouse.background->bm_h, 0, 0, Mouse.bg_x, Mouse.bg_y, &(grd_curscreen->sc_canvas.cv_bitmap),Mouse.background );
109 // Draw the new pointer
110 gr_bm_ubitbltm( Mouse.pointer->bm_w, Mouse.pointer->bm_h, Mouse.x, Mouse.y, 0, 0, Mouse.pointer, &(grd_curscreen->sc_canvas.cv_bitmap) );
116 if (Mouse.hidden==0 ) {
118 if (Mouse.bg_saved==1) {
119 gr_bm_ubitblt( Mouse.background->bm_w, Mouse.background->bm_h, Mouse.bg_x, Mouse.bg_y, 0, 0, Mouse.background,&(grd_curscreen->sc_canvas.cv_bitmap) );
125 void ui_mouse_process()
128 //if (Mouse.hidden==0)
129 // mouse_get_pos( &Mouse.x, &Mouse.y );
131 // mouse_set_pos( Mouse.x, Mouse.y );
134 Mouse.dx = Mouse.new_dx;
135 Mouse.dy = Mouse.new_dy;
136 buttons = Mouse.new_buttons;
141 w = grd_curscreen->sc_w;
142 h = grd_curscreen->sc_h;
144 if (Mouse.x < 0 ) Mouse.x = 0;
145 if (Mouse.y < 0 ) Mouse.y = 0;
146 // if (Mouse.x > w-Mouse.pointer->bm_w ) Mouse.x = w - Mouse.pointer->bm_w;
147 // if (Mouse.y > h-Mouse.pointer->bm_h ) Mouse.y = h - Mouse.pointer->bm_h;
149 if (Mouse.x > w-3 ) Mouse.x = w - 3;
150 if (Mouse.y > h-3 ) Mouse.y = h - 3;
152 if ( (Mouse.bg_x!=Mouse.x) || (Mouse.bg_y!=Mouse.y) )
155 if ( (Mouse.bg_x!=Mouse.x) || (Mouse.bg_y!=Mouse.y) || (Mouse.bg_saved==0) )
157 // Restore the background under old pointer
158 if (Mouse.bg_saved==1) {
159 gr_bm_ubitblt( Mouse.background->bm_w, Mouse.background->bm_h, Mouse.bg_x, Mouse.bg_y, 0, 0, Mouse.background, &(grd_curscreen->sc_canvas.cv_bitmap) );
165 // Save the background under new pointer
167 Mouse.bg_x = Mouse.x; Mouse.bg_y = Mouse.y;
169 gr_bm_ubitblt( Mouse.background->bm_w, Mouse.background->bm_h, 0, 0, Mouse.bg_x, Mouse.bg_y, &(grd_curscreen->sc_canvas.cv_bitmap),Mouse.background );
171 // Draw the new pointer
172 gr_bm_ubitbltm( Mouse.pointer->bm_w, Mouse.pointer->bm_h, Mouse.x, Mouse.y, 0, 0, Mouse.pointer, &(grd_curscreen->sc_canvas.cv_bitmap) );
176 Mouse.b1_last_status = Mouse.b1_status;
177 Mouse.b2_last_status = Mouse.b2_status;
179 if ( Mouse.backwards== 0 )
181 if (buttons & MOUSE_LBTN )
182 Mouse.b1_status = BUTTON_PRESSED;
184 Mouse.b1_status = BUTTON_RELEASED;
185 if (buttons & MOUSE_RBTN )
186 Mouse.b2_status = BUTTON_PRESSED;
188 Mouse.b2_status = BUTTON_RELEASED;
190 if (buttons & MOUSE_LBTN )
191 Mouse.b2_status = BUTTON_PRESSED;
193 Mouse.b2_status = BUTTON_RELEASED;
194 if (buttons & MOUSE_RBTN )
195 Mouse.b1_status = BUTTON_PRESSED;
197 Mouse.b1_status = BUTTON_RELEASED;
200 if ((Mouse.b1_status & BUTTON_PRESSED) && (Mouse.b1_last_status & BUTTON_RELEASED) )
202 if ( (TICKER <= Mouse.time_lastpressed+5) ) //&& (Mouse.moved==0)
203 Mouse.b1_status |= BUTTON_DOUBLE_CLICKED;
206 Mouse.time_lastpressed = TICKER;
207 Mouse.b1_status |= BUTTON_JUST_PRESSED;
210 else if ((Mouse.b1_status & BUTTON_RELEASED) && (Mouse.b1_last_status & BUTTON_PRESSED) )
211 Mouse.b1_status |= BUTTON_JUST_RELEASED;
213 if ((Mouse.b2_status & BUTTON_PRESSED) && (Mouse.b2_last_status & BUTTON_RELEASED) )
214 Mouse.b2_status |= BUTTON_JUST_PRESSED;
215 else if ((Mouse.b2_status & BUTTON_RELEASED) && (Mouse.b2_last_status & BUTTON_PRESSED) )
216 Mouse.b2_status |= BUTTON_JUST_RELEASED;
219 void ui_mouse_flip_buttons()
223 Mouse.b1_status = Mouse.b2_status;
226 x = Mouse.b1_last_status;
227 Mouse.b1_last_status = Mouse.b2_last_status;
228 Mouse.b2_last_status = x;
230 Mouse.backwards ^= 1;
241 w = grd_curscreen->sc_w;
242 h = grd_curscreen->sc_h;
244 mouse_set_limits( 0,0, w-1, h-1 );
249 //mouse_set_pos( w/2, h/2 );
251 for (i=0; i < PTR_W*PTR_H; i++ ) {
252 switch (ui_mouse_pointer[i]) {
254 ui_converted_mouse_pointer[i]=255;
257 ui_converted_mouse_pointer[i]=CBLACK;
260 ui_converted_mouse_pointer[i]=CGREY;
263 ui_converted_mouse_pointer[i]=CWHITE;
266 ui_converted_mouse_pointer[i]=CBRIGHT;
269 ui_converted_mouse_pointer[i]=CRED;
274 default_pointer = gr_create_bitmap_raw( PTR_W, PTR_H, ui_converted_mouse_pointer );
275 Mouse.x = Mouse.y = 0;
278 Mouse.b1_status = Mouse.b1_last_status = BUTTON_RELEASED;
279 Mouse.b2_status = Mouse.b2_last_status = BUTTON_RELEASED;
280 Mouse.b3_status = Mouse.b3_last_status = BUTTON_RELEASED;
281 Mouse.bg_x = Mouse.bg_y = 0;
283 Mouse.pointer = default_pointer;
284 Mouse.background = gr_create_bitmap( Mouse.pointer->bm_w, Mouse.pointer->bm_h );
285 Mouse.time_lastpressed = 0;
290 grs_bitmap * ui_mouse_set_pointer( grs_bitmap * new )
292 grs_bitmap * temp = Mouse.pointer;
294 gr_free_bitmap( Mouse.background );
297 Mouse.pointer = default_pointer;
301 Mouse.background = gr_create_bitmap( Mouse.pointer->bm_w, Mouse.pointer->bm_h );
307 void ui_mouse_close()
309 gr_free_sub_bitmap(default_pointer);
311 gr_free_bitmap(Mouse.background);