]> icculus.org git repositories - btb/d2x.git/blob - ui/mouse.c
use the orientation parameter of g3_draw_bitmap
[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         int x, y;
126
127         //if (Mouse.hidden==0)
128         //    mouse_get_pos( &Mouse.x, &Mouse.y );
129         //else
130         //    mouse_set_pos( Mouse.x, Mouse.y );
131
132
133         Mouse.dx = Mouse.new_dx;
134         Mouse.dy = Mouse.new_dy;
135         buttons = Mouse.new_buttons;
136
137         mouse_get_pos(&x, &y);
138         Mouse.x = x;
139         Mouse.y = y;
140
141         //Mouse.x += Mouse.dx;
142         //Mouse.y += Mouse.dy;
143
144         w = grd_curscreen->sc_w;
145         h = grd_curscreen->sc_h;
146
147         if (Mouse.x < 0 ) Mouse.x = 0;
148         if (Mouse.y < 0 ) Mouse.y = 0;
149 //      if (Mouse.x > w-Mouse.pointer->bm_w ) Mouse.x = w - Mouse.pointer->bm_w;
150 //      if (Mouse.y > h-Mouse.pointer->bm_h ) Mouse.y = h - Mouse.pointer->bm_h;
151
152         if (Mouse.x > w-3 ) Mouse.x = w - 3;
153         if (Mouse.y > h-3 ) Mouse.y = h - 3;
154
155         if ( (Mouse.bg_x!=Mouse.x) || (Mouse.bg_y!=Mouse.y) )
156                 Mouse.moved = 1;
157
158         if ( (Mouse.bg_x!=Mouse.x) || (Mouse.bg_y!=Mouse.y) || (Mouse.bg_saved==0) )
159         {
160                 // Restore the background under old pointer
161                 if (Mouse.bg_saved==1)  {
162                         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)   );
163                 }
164                 Mouse.bg_saved = 0;
165
166                 if (!Mouse.hidden)
167                 {
168                         // Save the background under new pointer
169                         Mouse.bg_saved=1;
170                         Mouse.bg_x = Mouse.x; Mouse.bg_y = Mouse.y;
171
172                         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   );
173
174                         // Draw the new pointer
175                         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                 }
177         }
178
179         Mouse.b1_last_status = Mouse.b1_status;
180         Mouse.b2_last_status = Mouse.b2_status;
181
182         if ( Mouse.backwards== 0 )
183         {
184                 if (buttons & MOUSE_LBTN )
185                         Mouse.b1_status = BUTTON_PRESSED;
186                 else
187                         Mouse.b1_status = BUTTON_RELEASED;
188                 if (buttons & MOUSE_RBTN )
189                         Mouse.b2_status = BUTTON_PRESSED;
190                 else
191                         Mouse.b2_status = BUTTON_RELEASED;
192         } else {
193                 if (buttons & MOUSE_LBTN )
194                         Mouse.b2_status = BUTTON_PRESSED;
195                 else
196                         Mouse.b2_status = BUTTON_RELEASED;
197                 if (buttons & MOUSE_RBTN )
198                         Mouse.b1_status = BUTTON_PRESSED;
199                 else
200                         Mouse.b1_status = BUTTON_RELEASED;
201         }
202
203         if ((Mouse.b1_status & BUTTON_PRESSED) && (Mouse.b1_last_status & BUTTON_RELEASED) )
204         {
205                 if ((timer_get_fixed_seconds() <= Mouse.time_lastpressed + F1_0/5))  //&& (Mouse.moved==0)
206                         Mouse.b1_status |= BUTTON_DOUBLE_CLICKED;
207
208                 Mouse.moved = 0;
209                 Mouse.time_lastpressed = timer_get_fixed_seconds();
210                 Mouse.b1_status |= BUTTON_JUST_PRESSED;
211
212         }
213         else if ((Mouse.b1_status & BUTTON_RELEASED) && (Mouse.b1_last_status & BUTTON_PRESSED) )
214                 Mouse.b1_status |= BUTTON_JUST_RELEASED;
215
216         if ((Mouse.b2_status & BUTTON_PRESSED) && (Mouse.b2_last_status & BUTTON_RELEASED) )
217                 Mouse.b2_status |= BUTTON_JUST_PRESSED;
218         else if ((Mouse.b2_status & BUTTON_RELEASED) && (Mouse.b2_last_status & BUTTON_PRESSED) )
219                 Mouse.b2_status |= BUTTON_JUST_RELEASED;
220 }
221
222 void ui_mouse_flip_buttons()
223 {   short x;
224
225         x = Mouse.b1_status;
226         Mouse.b1_status = Mouse.b2_status;
227         Mouse.b2_status = x;
228
229         x = Mouse.b1_last_status;
230         Mouse.b1_last_status = Mouse.b2_last_status;
231         Mouse.b2_last_status = x;
232
233         Mouse.backwards ^= 1;
234
235 }
236
237
238 void ui_mouse_init()
239 {
240         int i, w,h;
241
242         //mouse_init();
243
244         w = grd_curscreen->sc_w;
245         h = grd_curscreen->sc_h;
246
247         //mouse_set_limits(0, 0, w - 1, h - 1);
248
249         Mouse.x = w/2;
250         Mouse.y = h/2;
251
252         //mouse_set_pos( w/2, h/2 );
253
254         for (i=0; i < PTR_W*PTR_H; i++ )   {
255                 switch (ui_mouse_pointer[i]) {
256                 case '0':
257                         ui_converted_mouse_pointer[i]=255;
258                         break;
259                 case '1':
260                         ui_converted_mouse_pointer[i]=CBLACK;
261                         break;
262                 case '2':
263                         ui_converted_mouse_pointer[i]=CGREY;
264                         break;
265                 case '3':
266                         ui_converted_mouse_pointer[i]=CWHITE;
267                         break;
268                 case '4':
269                         ui_converted_mouse_pointer[i]=CBRIGHT;
270                         break;
271                 case '5':
272                         ui_converted_mouse_pointer[i]=CRED;
273                         break;
274                 }
275         }
276
277         default_pointer = gr_create_bitmap_raw( PTR_W, PTR_H, ui_converted_mouse_pointer );
278         Mouse.x = Mouse.y = 0;
279         Mouse.backwards = 0;
280         Mouse.hidden = 1;
281         Mouse.b1_status = Mouse.b1_last_status = BUTTON_RELEASED;
282         Mouse.b2_status = Mouse.b2_last_status = BUTTON_RELEASED;
283         Mouse.b3_status = Mouse.b3_last_status = BUTTON_RELEASED;
284         Mouse.bg_x = Mouse.bg_y = 0;
285         Mouse.bg_saved = 0;
286         Mouse.pointer = default_pointer;
287         Mouse.background = gr_create_bitmap( Mouse.pointer->bm_w, Mouse.pointer->bm_h );
288         Mouse.time_lastpressed = 0;
289         Mouse.moved = 0;
290
291 }
292
293 grs_bitmap * ui_mouse_set_pointer( grs_bitmap * new )
294 {
295         grs_bitmap * temp = Mouse.pointer;
296
297         gr_free_bitmap( Mouse.background );
298
299         if (new == NULL ) {
300                 Mouse.pointer = default_pointer;
301         } else {
302                 Mouse.pointer = new;
303         }
304         Mouse.background = gr_create_bitmap( Mouse.pointer->bm_w, Mouse.pointer->bm_h );
305
306         return temp;
307
308 }
309
310 void ui_mouse_close()
311 {
312         gr_free_sub_bitmap(default_pointer);
313
314         gr_free_bitmap(Mouse.background);
315
316 }
317