Cleanup in elf.c with .bss section clean; adm command mounts cdrom instead of floppy...
[ZeXOS.git] / apps / zde / window.c
blob25e8a3eeef7103912e53ba7caa0551440670c775
1 /*
2 * ZeX/OS
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/>.
21 #include <fcntl.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <stdlib.h>
25 #include <pthread.h>
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>
32 #include "icon.h"
33 #include "dialog.h"
34 #include "window.h"
35 #include "cursor.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));
52 if (!window)
53 return 0;
55 window->x = zde_win_newx += 50;
56 window->y = zde_win_newy += 50;
57 window->sizex = 300;
58 window->sizey = 200;
60 if (zde_win_newx+window->sizex > 800)
61 zde_win_newx = 0;
62 if (zde_win_newy+window->sizey > 600)
63 zde_win_newy = 0;
65 window->name = strdup (name);
66 window->name_len = strlen (name);
68 window->state = 0;
69 window->objectid = 0;
70 window->type = type;
72 /* add into list */
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;
80 return window;
83 unsigned destroy_window (zde_win_t *window)
85 if (!window)
86 return 0;
88 window->next->prev = window->prev;
89 window->prev->next = window->next;
91 window->state |= WINDOW_STATE_CLOSE;
93 return 1;
96 unsigned active_window (zde_win_t *window)
98 if (!window)
99 return 0;
101 window->next->prev = window->prev;
102 window->prev->next = window->next;
104 /* add into list */
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;
112 return 1;
115 zde_win_t *isactive_window ()
117 return zde_win_last;
120 static void draw_bitmap (unsigned short x, unsigned short y)
122 unsigned i = 0;
123 unsigned j = 0;
124 unsigned k = 0;
125 unsigned pix = 0;
127 unsigned short w = bitmap_border[1024+34];
129 for (i = bitmap_coord->x+(bitmap_coord->y*32); i < 32*32; i ++) {
130 if (k >= 32) {
131 j ++;
132 k = 0;
135 pix = (1024-i)+34;
137 if (pix > 2100)
138 continue;
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]);
144 k ++;
148 void draw_rectfill (unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned color)
150 if (x1 > x2) {
151 int temp = x1;
152 x2 = temp;
153 x1 = x2;
155 if (y1 > y2) {
156 int temp = y1;
157 y2 = temp;
158 y1 = y2;
161 int delkax = (signed) x2 - (signed) x1;
162 int delkay = (signed) y2 - (signed) y1;
164 int a = 0;
165 int b = 0;
167 for (a = 0; a <= delkax; a ++)
168 for (b = 0; b <= delkay; b ++) {
169 unsigned c = xpixelget (a+x1, b+y1);
171 if (c > 20)
172 c /= 2000;
174 xpixel (a+x1, b+y1, color - c);
178 int draw_window ()
180 zde_win_t *window;
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) {
184 zde_win_t *curr = 0;
185 zde_win_t *cw;
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)) {
189 curr = cw;
194 /* we cant move with any window */
195 if (!(zde_cursor->flags & CURSOR_FLAG_MOVE))
196 if (curr) {
197 /* exit window */
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);
205 break;
208 /* window header */
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);
218 break;
221 } else {
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 bitmap_coord->x = 0;
255 bitmap_coord->y = 0;
256 bitmap_coord->sizex = 4;
257 bitmap_coord->sizey = 21;
259 /* vrchni roh vlevo */
260 draw_bitmap (window->x, window->y);
262 bitmap_coord->x = 7;
263 bitmap_coord->y = 0;
264 bitmap_coord->sizex = 24;
265 bitmap_coord->sizey = 21;
267 /* vrchni roh vpravo */
268 draw_bitmap (window->x+window->sizex-24, window->y);
270 bitmap_coord->x = 6;
271 bitmap_coord->y = 0;
272 bitmap_coord->sizex = 1;
273 bitmap_coord->sizey = 21;
275 /* vrchni cast */
276 int l;
277 for (l = 0; l < window->sizex-24; l ++)
278 draw_bitmap (window->x+4+l, window->y);
280 bitmap_coord->x = 0;
281 bitmap_coord->y = 8;
282 bitmap_coord->sizex = 4;
283 bitmap_coord->sizey = 1;
285 /* bocni leva cast */
286 for (l = 0; l < window->sizey-24; l ++)
287 draw_bitmap (window->x, window->y+l+21);
289 bitmap_coord->x = 27;
290 bitmap_coord->y = 8;
291 bitmap_coord->sizex = 4;
292 bitmap_coord->sizey = 1;
294 /* bocni prava cast */
295 for (l = 0; l < window->sizey-24; l ++)
296 draw_bitmap (window->x+window->sizex-4, window->y+l+21);
298 bitmap_coord->x = 0;
299 bitmap_coord->y = 25;
300 bitmap_coord->sizex = 5;
301 bitmap_coord->sizey = 4;
303 /* dolni levy roh */
304 draw_bitmap (window->x, window->y+window->sizey-2);
306 bitmap_coord->x = 26;
307 bitmap_coord->y = 25;
308 bitmap_coord->sizex = 5;
309 bitmap_coord->sizey = 4;
311 /* dolni pravy roh */
312 draw_bitmap (window->x+window->sizex-5, window->y+window->sizey-2);
314 bitmap_coord->x = 7;
315 bitmap_coord->y = 25;
316 bitmap_coord->sizex = 1;
317 bitmap_coord->sizey = 4;
319 /* dolni cast */
320 for (l = 0; l < window->sizex-11; l ++)
321 draw_bitmap (window->x+5+l, window->y+window->sizey-2);
323 if (window->name) {
324 if (window->sizex > (window->name_len * 6))
325 xtext_puts (window->x+8, window->y+5, 0, window->name);
329 return 0;
332 int init_window ()
334 zde_win_list.next = &zde_win_list;
335 zde_win_list.prev = &zde_win_list;
337 zde_win_newx = 50;
338 zde_win_newy = 50;
340 bitmap_coord = (bitmap_coord_t *) malloc (sizeof (bitmap_coord_t));
342 if (!bitmap_coord)
343 return -1;
345 /* BORDER bitmap */
346 bitmap_border = (unsigned short *) malloc (2120);
348 if (!bitmap_border)
349 return -1;
351 memset (bitmap_border, 0, 2048+70);
353 int fd = open ("border", O_RDONLY);
355 if (!fd) {
356 puts ("error -> file 'border' not found\n");
357 return -1;
360 if (!read (fd, (unsigned char *) bitmap_border, 2048+70)) {
361 puts ("error -> something was wrong !\n");
362 return -1;
365 return 0;