3 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include <libx/base.h>
27 #include <libx/object.h>
28 #include <libx/image.h>
29 #include <libx/cursor.h>
30 #include <libx/text.h>
37 unsigned short *bitmap_border
;
39 zde_win_t zde_win_list
;
40 zde_win_t
*zde_win_last
;
41 unsigned short zde_win_newx
;
42 unsigned short zde_win_newy
;
44 bitmap_coord_t
*bitmap_coord
;
46 extern zde_cursor_t
*zde_cursor
;
48 zde_win_t
*create_window (char *name
, unsigned char type
)
50 zde_win_t
*window
= (zde_win_t
*) malloc (sizeof (zde_win_t
));
55 window
->x
= zde_win_newx
+= 50;
56 window
->y
= zde_win_newy
+= 50;
60 if (zde_win_newx
+window
->sizex
> 800)
62 if (zde_win_newy
+window
->sizey
> 600)
65 window
->name
= strdup (name
);
66 window
->name_len
= strlen (name
);
73 window
->next
= &zde_win_list
;
74 window
->prev
= zde_win_list
.prev
;
75 window
->prev
->next
= window
;
76 window
->next
->prev
= window
;
78 zde_win_last
= window
;
83 unsigned destroy_window (zde_win_t
*window
)
88 window
->next
->prev
= window
->prev
;
89 window
->prev
->next
= window
->next
;
91 window
->state
|= WINDOW_STATE_CLOSE
;
96 unsigned active_window (zde_win_t
*window
)
101 window
->next
->prev
= window
->prev
;
102 window
->prev
->next
= window
->next
;
105 window
->next
= &zde_win_list
;
106 window
->prev
= zde_win_list
.prev
;
107 window
->prev
->next
= window
;
108 window
->next
->prev
= window
;
110 zde_win_last
= window
;
115 zde_win_t
*isactive_window ()
120 static void draw_bitmap (unsigned short x
, unsigned short y
)
127 unsigned short w
= bitmap_border
[1024+34];
129 for (i
= bitmap_coord
->x
+(bitmap_coord
->y
*32); i
< 32*32; i
++) {
140 if (bitmap_border
[pix
] != w
)
141 if (k
<= bitmap_coord
->sizex
&& j
<= bitmap_coord
->sizey
)
142 xpixel ((unsigned) x
+k
, (unsigned) y
+j
, (unsigned) bitmap_border
[pix
]);
148 void draw_rectfill (unsigned x1
, unsigned y1
, unsigned x2
, unsigned y2
, unsigned color
)
161 int delkax
= (signed) x2
- (signed) x1
;
162 int delkay
= (signed) y2
- (signed) y1
;
167 for (a
= 0; a
<= delkax
; a
++)
168 for (b
= 0; b
<= delkay
; b
++) {
169 unsigned c
= xpixelget (a
+x1
, b
+y1
);
174 xpixel (a
+x1
, b
+y1
, color
- c
);
181 for (window
= zde_win_list
.next
; window
!= &zde_win_list
; window
= window
->next
) {
182 /* we click on left button */
183 if (zde_cursor
->state
== XCURSOR_STATE_LBUTTON
) {
186 for (cw
= zde_win_list
.next
; cw
!= &zde_win_list
; cw
= cw
->next
) {
187 if (zde_cursor
->x
>= cw
->x
&& zde_cursor
->x
<= (cw
->x
+cw
->sizex
))
188 if (zde_cursor
->y
>= cw
->y
&& zde_cursor
->y
<= (cw
->y
+cw
->sizey
)) {
194 /* we cant move with any window */
195 if (!(zde_cursor
->flags
& CURSOR_FLAG_MOVE
))
198 if (zde_cursor
->x
>= (curr
->x
+curr
->sizex
-18) && zde_cursor
->x
<= (curr
->x
+curr
->sizex
-6))
199 if (zde_cursor
->y
>= curr
->y
+3 && zde_cursor
->y
<= curr
->y
+17) {
200 zde_cursor
->state
= 0;
202 destroy_window (curr
);
203 destroy_icon_window (curr
);
204 destroy_dialog_object (curr
);
209 if (zde_cursor
->x
>= curr
->x
&& zde_cursor
->x
<= (curr
->x
+curr
->sizex
))
210 if (zde_cursor
->y
>= curr
->y
&& zde_cursor
->y
<= (int) (curr
->y
+22)) {
211 curr
->state
|= WINDOW_STATE_MOVE
;
212 zde_cursor
->flags
|= CURSOR_FLAG_MOVE
;
215 /* make active window (front of screen) */
216 if (curr
!= zde_win_last
) {
217 active_window (curr
);
222 window
->state
&= ~WINDOW_STATE_MOVE
;
223 zde_cursor
->flags
&= ~CURSOR_FLAG_MOVE
;
226 /* when some window is moving, we need update postitions of it */
227 if (window
->state
& WINDOW_STATE_MOVE
) {
228 window
->x
= zde_cursor
->x
;
229 window
->y
= zde_cursor
->y
;
232 /* it's classical window */
233 if (window
->type
== 0) {
234 unsigned x
= window
->x
+window
->sizex
-4;
235 unsigned y
= window
->y
+window
->sizey
-3;
237 /* window background */
238 draw_rectfill (window
->x
+4, window
->y
+21, x
, y
, ~0);
239 //xrectfill (window->x+4, window->y+21, window->x+window->sizex-4, window->y+window->sizey-3, ~0-0xf);
240 /* vykreslime vsechny ikony naseho okna */
241 draw_icon_window (window
);
242 /* it's dialog window */
243 } else if (window
->type
== 1) {
244 unsigned x
= window
->x
+window
->sizex
-4;
245 unsigned y
= window
->y
+window
->sizey
-3;
247 /* window background */
248 draw_rectfill (window
->x
+4, window
->y
+21, x
, y
, ~0-0x1);
250 /* let's draw all objects of this window */
251 draw_dialog_object (window
);
254 /* draw window's buttons */
255 draw_button_window (window
);
259 bitmap_coord
->sizex
= 4;
260 bitmap_coord
->sizey
= 21;
262 /* vrchni roh vlevo */
263 draw_bitmap (window
->x
, window
->y
);
267 bitmap_coord
->sizex
= 24;
268 bitmap_coord
->sizey
= 21;
270 /* vrchni roh vpravo */
271 draw_bitmap (window
->x
+window
->sizex
-24, window
->y
);
275 bitmap_coord
->sizex
= 1;
276 bitmap_coord
->sizey
= 21;
280 for (l
= 0; l
< window
->sizex
-24; l
++)
281 draw_bitmap (window
->x
+4+l
, window
->y
);
285 bitmap_coord
->sizex
= 4;
286 bitmap_coord
->sizey
= 1;
288 /* bocni leva cast */
289 for (l
= 0; l
< window
->sizey
-24; l
++)
290 draw_bitmap (window
->x
, window
->y
+l
+21);
292 bitmap_coord
->x
= 27;
294 bitmap_coord
->sizex
= 4;
295 bitmap_coord
->sizey
= 1;
297 /* bocni prava cast */
298 for (l
= 0; l
< window
->sizey
-24; l
++)
299 draw_bitmap (window
->x
+window
->sizex
-4, window
->y
+l
+21);
302 bitmap_coord
->y
= 25;
303 bitmap_coord
->sizex
= 5;
304 bitmap_coord
->sizey
= 4;
307 draw_bitmap (window
->x
, window
->y
+window
->sizey
-2);
309 bitmap_coord
->x
= 26;
310 bitmap_coord
->y
= 25;
311 bitmap_coord
->sizex
= 5;
312 bitmap_coord
->sizey
= 4;
314 /* dolni pravy roh */
315 draw_bitmap (window
->x
+window
->sizex
-5, window
->y
+window
->sizey
-2);
318 bitmap_coord
->y
= 25;
319 bitmap_coord
->sizex
= 1;
320 bitmap_coord
->sizey
= 4;
323 for (l
= 0; l
< window
->sizex
-11; l
++)
324 draw_bitmap (window
->x
+5+l
, window
->y
+window
->sizey
-2);
327 if (window
->sizex
> (window
->name_len
* 6))
328 xtext_puts (window
->x
+8, window
->y
+5, 0, window
->name
);
337 zde_win_list
.next
= &zde_win_list
;
338 zde_win_list
.prev
= &zde_win_list
;
343 bitmap_coord
= (bitmap_coord_t
*) malloc (sizeof (bitmap_coord_t
));
349 bitmap_border
= (unsigned short *) malloc (2120);
354 memset (bitmap_border
, 0, 2048+70);
356 int fd
= open ("border", O_RDONLY
);
359 puts ("error -> file 'border' not found\n");
363 if (!read (fd
, (unsigned char *) bitmap_border
, 2048+70)) {
364 puts ("error -> something was wrong !\n");