void draw_all(int mouse){ unsigned char *buffer = (unsigned char *)0x1000000; for(int i = 0; i != SCREEN_HEIGHT * SCREEN_WIDTH; ++i){ buffer[i] = CYAN; } render_task(buffer, head_task); render_symbol(buffer + mouse - (SYMBOL_HEIGHT / 2 * SCREEN_WIDTH + SYMBOL_WIDTH / 2), 'X', BLACK); for(int i = 0; i != SCREEN_HEIGHT * SCREEN_WIDTH; ++i){ /* Now we write to real video memory */ *(*(unsigned char *const *)(0x11028) + i) = buffer[i]; } }
void render_content(unsigned char *buffer, const char *content) { /* Frame */ render_rectangle(buffer, TITLE_HEIGHT + 8, 4, LINES * SYMBOL_HEIGHT + 3, COLUMNS * SYMBOL_WIDTH + 2, BLACK); /* Area */ render_rectangle(buffer, CONTENT_TOP, CONTENT_LEFT, LINES * SYMBOL_HEIGHT + 1, COLUMNS * SYMBOL_WIDTH, WHITE); /* Text */ for (int i = 0; i != LINES; ++i) { for (int j = 0; j != COLUMNS; ++j){ render_symbol(buffer + (CONTENT_TOP + i * SYMBOL_HEIGHT) * SCREEN_WIDTH + CONTENT_LEFT + j * SYMBOL_WIDTH, content[i * COLUMNS + j], BLACK); } } }
/* Renders window `task' and all next windows recursively */ void render_task(unsigned char *buffer, struct task_t *task){ if(task != 0){ /* We render front task last */ render_task(buffer, task->next); render_rectangle(buffer + task->begin, 0, 0, task->size / SCREEN_WIDTH + 1, task->size % SCREEN_WIDTH, BLACK); render_rectangle(buffer + task->begin, 1, 1, task->size / SCREEN_WIDTH - 1, task->size % SCREEN_WIDTH - 2, LIGHT_GRAY); render_rectangle(buffer + task->begin, 2, 2, task->size / SCREEN_WIDTH - 2, task->size % SCREEN_WIDTH - 3, DARK_GRAY); render_rectangle(buffer + task->begin, 2, 2, task->size / SCREEN_WIDTH - 3, task->size % SCREEN_WIDTH - 4, GRAY); render_rectangle(buffer + task->begin, 4, 4, TITLE_HEIGHT, task->size % SCREEN_WIDTH - 8, BLUE); for(int i = 0; task->cmdline[i] != 0; ++i){ render_symbol(buffer + task->begin + 5 * SCREEN_WIDTH + 6 + i * SYMBOL_WIDTH, task->cmdline[i], WHITE); } /* Render window content */ (*task->handler)(task, msg_render, (int)buffer); } }