[feat] Layers mangaing
This commit is contained in:
+47
-26
@@ -1,6 +1,8 @@
|
||||
#include <efi.h>
|
||||
#include <graphics/context.h>
|
||||
#include <graphics/draw.h>
|
||||
#include <graphics/rect.h>
|
||||
#include <graphics/layer.h>
|
||||
#include <fonts/pixel_font.h>
|
||||
#include <serial.h>
|
||||
#include <common.h>
|
||||
@@ -155,34 +157,53 @@ extern "C" void kernel_main() {
|
||||
// --- Multitasking demo ---
|
||||
serial_write("Sylva: creating tasks...\n");
|
||||
|
||||
// Task A: prints messages — preemption handles time slicing
|
||||
task_create("taskA", []() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
serial_write("[taskA] running iteration ");
|
||||
serial_write_hex(i);
|
||||
serial_write("\n");
|
||||
for (volatile int j = 0; j < 50000000; j++) {}
|
||||
}
|
||||
serial_write("[taskA] done\n");
|
||||
});
|
||||
// Init compositor (allocates back buffer, registers keyboard handler)
|
||||
layer_init();
|
||||
|
||||
// Task B: prints messages
|
||||
task_create("taskB", []() {
|
||||
for (int i = 0; i < 5; i++) {
|
||||
serial_write("[taskB] hello from taskB #");
|
||||
serial_write_hex(i);
|
||||
serial_write("\n");
|
||||
for (volatile int j = 0; j < 50000000; j++) {}
|
||||
}
|
||||
serial_write("[taskB] done\n");
|
||||
});
|
||||
// Create desktop layer (full screen, z=0)
|
||||
layer_t* desktop = layer_create("desktop", LAYER_TYPE_DESKTOP, g_gfx.hr, g_gfx.vr);
|
||||
if (desktop) {
|
||||
layer_set_z(desktop, 0);
|
||||
// Fill with dark blue
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL bg = {180, 80, 40, 0}; // BGRA: dark blue
|
||||
gfx_fill_rect(desktop->buffer, g_gfx.hr, g_gfx.vr, 0, 0, g_gfx.hr, g_gfx.vr, bg);
|
||||
layer_set_pos(desktop, 0, 0);
|
||||
}
|
||||
|
||||
// Task C: short task
|
||||
task_create("taskC", []() {
|
||||
serial_write("[taskC] quick task\n");
|
||||
for (volatile int j = 0; j < 50000000; j++) {}
|
||||
serial_write("[taskC] finished\n");
|
||||
});
|
||||
// Create window 1 (centered)
|
||||
layer_t* win1 = layer_create("window_1", LAYER_TYPE_WINDOW, 300, 200);
|
||||
if (win1) {
|
||||
layer_set_pos(win1, (int)(g_gfx.hr / 2) - 150, (int)(g_gfx.vr / 2) - 100);
|
||||
layer_set_z(win1, 1);
|
||||
// Fill with gray
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL win_color = {200, 200, 200, 0};
|
||||
gfx_fill_rect(win1->buffer, 300, 200, 0, 0, 300, 200, win_color);
|
||||
// White border
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL border = {255, 255, 255, 0};
|
||||
gfx_draw_rect(win1->buffer, 300, 200, 0, 0, 300, 200, border);
|
||||
// Title bar (blue strip at top)
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL title_bar = {180, 100, 30, 0};
|
||||
gfx_fill_rect(win1->buffer, 300, 200, 0, 0, 300, 30, title_bar);
|
||||
}
|
||||
|
||||
// Create window 2 (offset from center)
|
||||
layer_t* win2 = layer_create("window_2", LAYER_TYPE_WINDOW, 250, 180);
|
||||
if (win2) {
|
||||
layer_set_pos(win2, (int)(g_gfx.hr / 2) - 50, (int)(g_gfx.vr / 2) - 40);
|
||||
layer_set_z(win2, 2);
|
||||
// Fill with light green
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL win2_color = {180, 220, 140, 0};
|
||||
gfx_fill_rect(win2->buffer, 250, 180, 0, 0, 250, 180, win2_color);
|
||||
// Dark border
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL border2 = {50, 50, 50, 0};
|
||||
gfx_draw_rect(win2->buffer, 250, 180, 0, 0, 250, 180, border2);
|
||||
// Title bar
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL title2 = {160, 180, 100, 0};
|
||||
gfx_fill_rect(win2->buffer, 250, 180, 0, 0, 250, 28, title2);
|
||||
}
|
||||
|
||||
// Compositor task (replaces the old demo tasks)
|
||||
task_create("compositor", layer_compositor_task);
|
||||
|
||||
serial_write("Sylva: starting preemptive scheduler\n");
|
||||
scheduler_run(); // never returns
|
||||
|
||||
Reference in New Issue
Block a user