]> icculus.org git repositories - btb/d2x.git/blob - ui/mouse.c
remove rcs tags
[btb/d2x.git] / ui / mouse.c
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14 #ifdef HAVE_CONFIG_H
15 #include "conf.h"
16 #endif
17
18 #include <stdlib.h>
19
20 #include "u_mem.h"
21 #include "fix.h"
22 #include "pstypes.h"
23 #include "gr.h"
24 #include "mouse.h"
25 #include "timer.h"
26
27 #include "ui.h"
28
29 // 16x16
30
31 #define PTR_W 11
32 #define PTR_H 19
33
34 unsigned char ui_converted_mouse_pointer[PTR_W*PTR_H];
35 #if 0
36 char ui_mouse_pointer[] =  \
37 "1111100000000000"\
38 "1111111111000000"\
39 "1144411111111111"\
40 "1144444444111111"\
41 "1144444444444110"\
42 "0114444444441100"\
43 "0114444444411000"\
44 "0114444444411000"\
45 "0114444444441100"\
46 "0114444444444110"\
47 "0011444444444411"\
48 "0011444444444411"\
49 "0011411144444411"\
50 "0011111111444111"\
51 "0011100011111110"\
52 "0011000000111100";
53 #else
54
55 char ui_mouse_pointer[] =  \
56 "10000000000"\
57 "11000000000"\
58 "14100000000"\
59 "14410000000"\
60 "14441000000"\
61 "14444100000"\
62 "14444410000"\
63 "14444441000"\
64 "14444444100"\
65 "14444444410"\
66 "14444411111"\
67 "14114410000"\
68 "11014410000"\
69 "10001441000"\
70 "00001441000"\
71 "00001441000"\
72 "00000144100"\
73 "00000144100"\
74 "00000111100";
75 #endif
76
77 static grs_bitmap * default_pointer;
78
79
80 UI_MOUSE Mouse;
81
82
83 /*
84 int ui_mouse_find_gadget(short n)
85 {
86         int i;
87
88         for (i=1; i<=Window[n].NumItems; i++ )  {
89                 if ((Mouse.x >= (Window[n].Item[i].x1+Window[n].x)) &&
90                         (Mouse.x <= (Window[n].Item[i].x2+Window[n].x)) &&
91                         (Mouse.y >= (Window[n].Item[i].y1+Window[n].y)) &&
92                         (Mouse.y <= (Window[n].Item[i].y2+Window[n].y)) )
93                         return i;
94         }
95         return 0;
96 }
97 */
98
99 void ui_mouse_show()
100 {
101         if (Mouse.hidden==1 )   {
102                 Mouse.hidden = 0;
103                 // Save the background under new pointer
104                 Mouse.bg_saved=1;
105                 Mouse.bg_x = Mouse.x; Mouse.bg_y = Mouse.y;
106                 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 );
107                 // Draw the new pointer
108                 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)   );
109         }
110 }
111
112 void ui_mouse_hide()
113 {
114         if (Mouse.hidden==0 )   {
115                 Mouse.hidden = 1;
116                 if (Mouse.bg_saved==1)  {
117                         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) );
118                         Mouse.bg_saved = 0;
119                 }
120         }
121 }
122
123 void ui_mouse_process()
124 {   int buttons,w,h;
125
126         //if (Mouse.hidden==0)
127         //    mouse_get_pos( &Mouse.x, &Mouse.y );
128         //else
129         //    mouse_set_pos( Mouse.x, Mouse.y );
130
131
132         Mouse.dx = Mouse.new_dx;
133         Mouse.dy = Mouse.new_dy;
134         buttons = Mouse.new_buttons;
135
136         Mouse.x += Mouse.dx;
137         Mouse.y += Mouse.dy;
138
139         w = grd_curscreen->sc_w;
140         h = grd_curscreen->sc_h;
141
142         if (Mouse.x < 0 ) Mouse.x = 0;
143         if (Mouse.y < 0 ) Mouse.y = 0;
144 //      if (Mouse.x > w-Mouse.pointer->bm_w ) Mouse.x = w - Mouse.pointer->bm_w;
145 //      if (Mouse.y > h-Mouse.pointer->bm_h ) Mouse.y = h - Mouse.pointer->bm_h;
146
147         if (Mouse.x > w-3 ) Mouse.x = w - 3;
148         if (Mouse.y > h-3 ) Mouse.y = h - 3;
149
150         if ( (Mouse.bg_x!=Mouse.x) || (Mouse.bg_y!=Mouse.y) )
151                 Mouse.moved = 1;
152
153         if ( (Mouse.bg_x!=Mouse.x) || (Mouse.bg_y!=Mouse.y) || (Mouse.bg_saved==0) )
154         {
155                 // Restore the background under old pointer
156                 if (Mouse.bg_saved==1)  {
157                         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)   );
158                 }
159                 Mouse.bg_saved = 0;
160
161                 if (!Mouse.hidden)
162                 {
163                         // Save the background under new pointer
164                         Mouse.bg_saved=1;
165                         Mouse.bg_x = Mouse.x; Mouse.bg_y = Mouse.y;
166
167                         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   );
168
169                         // Draw the new pointer
170                         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)   );
171                 }
172         }
173
174         Mouse.b1_last_status = Mouse.b1_status;
175         Mouse.b2_last_status = Mouse.b2_status;
176
177         if ( Mouse.backwards== 0 )
178         {
179                 if (buttons & MOUSE_LBTN )
180                         Mouse.b1_status = BUTTON_PRESSED;
181                 else
182                         Mouse.b1_status = BUTTON_RELEASED;
183                 if (buttons & MOUSE_RBTN )
184                         Mouse.b2_status = BUTTON_PRESSED;
185                 else
186                         Mouse.b2_status = BUTTON_RELEASED;
187         } else {
188                 if (buttons & MOUSE_LBTN )
189                         Mouse.b2_status = BUTTON_PRESSED;
190                 else
191                         Mouse.b2_status = BUTTON_RELEASED;
192                 if (buttons & MOUSE_RBTN )
193                         Mouse.b1_status = BUTTON_PRESSED;
194                 else
195                         Mouse.b1_status = BUTTON_RELEASED;
196         }
197
198         if ((Mouse.b1_status & BUTTON_PRESSED) && (Mouse.b1_last_status & BUTTON_RELEASED) )
199         {
200                 if ((timer_get_fixed_seconds() <= Mouse.time_lastpressed + F1_0/5))  //&& (Mouse.moved==0)
201                         Mouse.b1_status |= BUTTON_DOUBLE_CLICKED;
202
203                 Mouse.moved = 0;
204                 Mouse.time_lastpressed = timer_get_fixed_seconds();
205                 Mouse.b1_status |= BUTTON_JUST_PRESSED;
206
207         }
208         else if ((Mouse.b1_status & BUTTON_RELEASED) && (Mouse.b1_last_status & BUTTON_PRESSED) )
209                 Mouse.b1_status |= BUTTON_JUST_RELEASED;
210
211         if ((Mouse.b2_status & BUTTON_PRESSED) && (Mouse.b2_last_status & BUTTON_RELEASED) )
212                 Mouse.b2_status |= BUTTON_JUST_PRESSED;
213         else if ((Mouse.b2_status & BUTTON_RELEASED) && (Mouse.b2_last_status & BUTTON_PRESSED) )
214                 Mouse.b2_status |= BUTTON_JUST_RELEASED;
215 }
216
217 void ui_mouse_flip_buttons()
218 {   short x;
219
220         x = Mouse.b1_status;
221         Mouse.b1_status = Mouse.b2_status;
222         Mouse.b2_status = x;
223
224         x = Mouse.b1_last_status;
225         Mouse.b1_last_status = Mouse.b2_last_status;
226         Mouse.b2_last_status = x;
227
228         Mouse.backwards ^= 1;
229
230 }
231
232
233 void ui_mouse_init()
234 {
235         int i, w,h;
236
237         //mouse_init();
238
239         w = grd_curscreen->sc_w;
240         h = grd_curscreen->sc_h;
241
242         //mouse_set_limits(0, 0, w - 1, h - 1);
243
244         Mouse.x = w/2;
245         Mouse.y = h/2;
246
247         //mouse_set_pos( w/2, h/2 );
248
249         for (i=0; i < PTR_W*PTR_H; i++ )   {
250                 switch (ui_mouse_pointer[i]) {
251                 case '0':
252                         ui_converted_mouse_pointer[i]=255;
253                         break;
254                 case '1':
255                         ui_converted_mouse_pointer[i]=CBLACK;
256                         break;
257                 case '2':
258                         ui_converted_mouse_pointer[i]=CGREY;
259                         break;
260                 case '3':
261                         ui_converted_mouse_pointer[i]=CWHITE;
262                         break;
263                 case '4':
264                         ui_converted_mouse_pointer[i]=CBRIGHT;
265                         break;
266                 case '5':
267                         ui_converted_mouse_pointer[i]=CRED;
268                         break;
269                 }
270         }
271
272         default_pointer = gr_create_bitmap_raw( PTR_W, PTR_H, ui_converted_mouse_pointer );
273         Mouse.x = Mouse.y = 0;
274         Mouse.backwards = 0;
275         Mouse.hidden = 1;
276         Mouse.b1_status = Mouse.b1_last_status = BUTTON_RELEASED;
277         Mouse.b2_status = Mouse.b2_last_status = BUTTON_RELEASED;
278         Mouse.b3_status = Mouse.b3_last_status = BUTTON_RELEASED;
279         Mouse.bg_x = Mouse.bg_y = 0;
280         Mouse.bg_saved = 0;
281         Mouse.pointer = default_pointer;
282         Mouse.background = gr_create_bitmap( Mouse.pointer->bm_w, Mouse.pointer->bm_h );
283         Mouse.time_lastpressed = 0;
284         Mouse.moved = 0;
285
286 }
287
288 grs_bitmap * ui_mouse_set_pointer( grs_bitmap * new )
289 {
290         grs_bitmap * temp = Mouse.pointer;
291
292         gr_free_bitmap( Mouse.background );
293
294         if (new == NULL ) {
295                 Mouse.pointer = default_pointer;
296         } else {
297                 Mouse.pointer = new;
298         }
299         Mouse.background = gr_create_bitmap( Mouse.pointer->bm_w, Mouse.pointer->bm_h );
300
301         return temp;
302
303 }
304
305 void ui_mouse_close()
306 {
307         gr_free_sub_bitmap(default_pointer);
308
309         gr_free_bitmap(Mouse.background);
310
311 }
312