1 #include "desktop/window.h"
2 #include "desktop/render.h"
5 #include "../lib/libvector/include/vector.h"
7 size_t window_global_id = 0;
8 size_t window_count = 0;
15 win->id = window_global_id++;
21 win->state = NOT_INITIALIZED;
23 win->minimizable =
true;
24 win->with_title_bar =
true;
25 win->canvas_bgcolor = WINDOW_CANVAS_COLOR;
26 win->widgets = vector_new();
28 qemu_log(
"Bare window create ok");
37 size_t get_window_count() {
42 qemu_log(
"Widget count start: %d", window->widgets->size);
44 vector_push_back(window->widgets, (
size_t) widget);
46 qemu_log(
"Widget count end: %d", window->widgets->size);
47 qemu_log(
"Added widget %x to window %x", widget, window);
51 for (
size_t i = 0; i < window->widgets->size; i++) {
52 if(window->widgets->data[i]) {
53 if((
Widget_t*)window->widgets->data[i] == widget) {
54 vector_erase_nth(window->widgets, i);
60 void _window_add_to_list(
Window_t* window) {
62 qemu_log(
"First time creating windows array!!!");
63 windows = vector_new();
66 qemu_log(
"Expanding windows array to %d elements", window_count + 1);
67 vector_push_back(windows, (
size_t) window);
72 void _window_remove_from_list(
Window_t* window) {
73 qemu_log(
"Window count: %d", window_count);
74 qemu_log(
"Removing window with id: %d; Address: %x", window->id, window);
75 for (
size_t i = 0; i < window_count; i++) {
77 if(WINDOW(i)->
id == window->id) {
78 qemu_log(
"Found that window at index: %d.", i);
79 qemu_log(
"Total widgets in window: %d", window->widgets->size);
80 for (
size_t j = 0; j < window->widgets->size; j++) {
81 qemu_log(
"|- Removing widget: %x", window->widgets[j]);
82 qemu_log(
"|--- Destroyer at: %x", ((
Widget_t *)(window->widgets->data[j]))->destroyer);
83 destroy_widget((
Widget_t *) window->widgets->data[j]);
85 vector_destroy(window->widgets);
88 qemu_log(
"Now, %d windows in the system", window_count);
90 vector_erase_nth(windows, i);
92 if(window_count == 0) {
93 qemu_log(
"ZEROING WINDOWS ARRAY");
94 vector_destroy(windows);
105 Window_t* instance = _window_new(title);
106 instance->state = HIDDEN;
108 qemu_log(
"Created bare window");
109 _window_add_to_list(instance);
115 bool window_is_in_list(
Window_t* win) {
116 for(
size_t i = 0; i < windows->size; i++) {
117 if (WINDOW(i) == win) {
125 void window_destroy(
Window_t* win) {
126 qemu_log(
" ========> Reached window_destroy()");
128 qemu_err(
"No array!");
132 qemu_log(
"Window address is 0, not destroying it");
136 if(!window_is_in_list(win)) {
137 qemu_warn(
"Window not in window list so, please destroy it manually!");
141 if(win->state != NOT_INITIALIZED) {
145 _window_remove_from_list(win);
147 qemu_warn(
"Window is not initialized, not destroying it");
150 qemu_log(
"Freeing all its data at: %x", win);
157 void destroy_all_windows() {
158 qemu_warn(
"DESTROYING ALL WINDOWS KNOWN TO WINDOW MANAGER!!!");
159 while(window_count > 0) {
160 qemu_log(
"%d windows remaining...", window_count);
161 window_destroy(WINDOW(window_count - 1));
165 qemu_log(
"DESTROYED ALL WINDOWS!");
168 void window_send_signal(
Window_t* window, WindowSignal_t signal,
void* data) {
169 qemu_log(
"Got signal on window (id %d): %s (data at %x)", window->id,
170 (signal == WINDOW_CLOSE ?
172 (signal == WINDOW_CLICK ?
174 (signal == WINDOW_MINIMIZE ?
175 "WINDOW_MINIMIZE":
"UNKNOWN"
181 if(signal == WINDOW_CLICK) {
184 coords->x -= window->x;
185 coords->y -= window->y;
187 qemu_log(
"Click on: X: %d; Y: %d", coords->x, coords->y);
188 qemu_log(
"Widget count: %d", window->widgets->size);
190 for (
size_t i = 0; i < window->widgets->size; i++) {
195 if(wgt && point_in_rect(
203 widget_notify(window, wgt, WIDGET_CLICK, coords);
204 qemu_log(
"Notified for click");
210 qemu_log(
"Func end");
214 void log_window_manager_state() {
215 qemu_log(
"===============[WINDOW MANAGER STATE]===================");
216 qemu_log(
"Window next global ID to be specified to next window: %d", window_global_id);
217 qemu_log(
"Window count: %d", window_count);
218 qemu_log(
"Address of windows array: %x", windows);
220 for(
size_t i = 0; i < window_count; i++) {
221 qemu_log(
"Window #%d (%x): ID: %d", i, windows[i], WINDOW(i)->
id);
223 qemu_log(
"Widgets:");
224 for (
size_t j = 0; j < WINDOW(i)->widgets->size; j++) {
225 qemu_log(
"|- Widget #%d: at %x", j, WINDOW(i)->widgets[j]);
231 qemu_log(
"========================================================");