Cleanup in elf.c with .bss section clean; adm command mounts cdrom instead of floppy...
[ZeXOS.git] / apps / wm / dialog.c
blobdd62a310a567864964cf93ed3703f45c2716f89a
1 /*
2 * ZeX/OS
3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <unistd.h>
24 #include <libx/base.h>
25 #include <libx/object.h>
26 #include <libx/image.h>
27 #include <libx/cursor.h>
28 #include <libx/text.h>
29 #include "dialog.h"
30 #include "cursor.h"
32 wmdialog wmdialog_list;
34 xbitmap *dialog_img;
36 extern wmcursor *cursor;
38 wmdialog *dialog_create (unsigned x, unsigned y, unsigned size_x, unsigned size_y, const char *caption)
40 wmdialog *dialog = (wmdialog *) malloc (sizeof (wmdialog));
42 if (!dialog)
43 return 0;
45 dialog->x = x;
46 dialog->y = y;
47 dialog->size_x = size_x;
48 dialog->size_y = size_y;
49 dialog->active = 1;
51 unsigned l = strlen (caption);
52 if (l) {
53 dialog->caption = (char *) malloc (sizeof (char) * l + 1);
54 memcpy (dialog->caption, caption, l);
55 dialog->caption[l] = '\0';
56 } else
57 dialog->caption = 0;
59 /* add into list */
60 dialog->next = &wmdialog_list;
61 dialog->prev = wmdialog_list.prev;
62 dialog->prev->next = dialog;
63 dialog->next->prev = dialog;
65 return dialog;
68 unsigned dialog_delete (wmdialog *dialog)
70 if (!dialog)
71 return 0;
73 dialog->active = 0;
75 if (dialog->caption)
76 free (dialog->caption);
78 /* delete from list */
79 dialog->next->prev = dialog->prev;
80 dialog->prev->next = dialog->next;
82 free (dialog);
84 return 1;
87 unsigned dialog_draw (wmdialog *dialog)
89 if (!dialog)
90 return 0;
92 /* 50 - zluta
93 60 - cervena
94 70 - cerna
95 30 - vybledle zluta
96 35 - seda
97 40 - ruzova
98 45 - fialova
99 55 - jasne zluta
100 15 - jasne modra
101 18 - jasne razici zelena
102 1 - modra
103 3 - trochu tmavsi seda
104 4 - tmavsi cervena
105 5 - fialova
106 6 - zluto-hneda
107 7 - jasne seda
108 8 - tmave modra
109 9 - pekna modra
110 27 - biele-modra
114 xrect (dialog->x, dialog->y, dialog->x+dialog->size_x, dialog->y+dialog->size_y, 0xd3d3d3);
116 if (dialog->active) {
117 xline (dialog->x+1, dialog->y+1, dialog->x+dialog->size_x-1, dialog->y+1, 190*256);
118 xline (dialog->x+1, dialog->y+2, dialog->x+dialog->size_x-1, dialog->y+2, 190*256+4);
119 xline (dialog->x+1, dialog->y+3, dialog->x+dialog->size_x-1, dialog->y+3, 190*256+8);
120 xline (dialog->x+1, dialog->y+4, dialog->x+dialog->size_x-1, dialog->y+4, 190*256+12);
121 xline (dialog->x+1, dialog->y+5, dialog->x+dialog->size_x-1, dialog->y+5, 190*256+15);
122 xline (dialog->x+1, dialog->y+6, dialog->x+dialog->size_x-1, dialog->y+6, 190*256+17);
123 xline (dialog->x+1, dialog->y+7, dialog->x+dialog->size_x-1, dialog->y+7, 190*256+20);
124 xline (dialog->x+1, dialog->y+8, dialog->x+dialog->size_x-1, dialog->y+8, 190*256+23);
125 xline (dialog->x+1, dialog->y+9, dialog->x+dialog->size_x-1, dialog->y+9, 190*256+26);
126 xline (dialog->x+1, dialog->y+10, dialog->x+dialog->size_x-1, dialog->y+10, 190*256+28);
127 } else
128 xrectfill (dialog->x+1, dialog->y+1, dialog->x+dialog->size_x-1, dialog->y+10, 1*256);
130 xrectfill (dialog->x+1, dialog->y+11, dialog->x+dialog->size_x-1, dialog->y+dialog->size_y-1, 0x00AEF8);
132 if (dialog->caption)
133 xtext_puts (dialog->x+5, dialog->y+2, 0, dialog->caption);
135 return 1;
138 unsigned dialog_draw_all ()
140 wmdialog *dialog;
141 for (dialog = wmdialog_list.next; dialog != &wmdialog_list; dialog = dialog->next) {
142 if (!dialog)
143 continue;
145 if (cursor->action)
146 if (cursor->state != XCURSOR_STATE_LBUTTON) {
147 if (dialog->flags & DIALOG_FLAG_DRAG) {
148 dialog->flags &= ~DIALOG_FLAG_DRAG;
149 cursor->action = 0;
153 /* mame mys na zahlavi okna ? */
154 if (cursor->x > (signed) dialog->x && cursor->x < (signed) dialog->x+(signed) dialog->size_x &&
155 cursor->y > (signed) dialog->y && cursor->y <= (signed) dialog->y+11) {
157 if (!cursor->action)
158 if (cursor->state == XCURSOR_STATE_LBUTTON) {
160 if (!(dialog->flags & DIALOG_FLAG_DRAG)) {
161 dialog->flags |= DIALOG_FLAG_DRAG;
162 cursor->action = 1;
166 if (cursor->state == XCURSOR_STATE_RBUTTON) {
167 if (dialog_delete (dialog))
168 return 1;
172 if (dialog->flags & DIALOG_FLAG_DRAG) {
173 dialog->x = cursor->x;
174 dialog->y = cursor->y;
177 dialog_draw (dialog);
180 return 1;
183 unsigned init_dialog ()
185 wmdialog_list.next = &wmdialog_list;
186 wmdialog_list.prev = &wmdialog_list;
188 return 1;