// Desktop Environment & Compositor for SUB-OS #include #include #include #include #include #include #include #include #include #include #include #include #include #include static bool g_start_menu_open = false; static bool g_desktop_running = false; static bool g_prev_left = false; void gui_desktop_init(void) { const fb_info_t* fb = fb_get_info(); uint32_t* fb_addr = fb ? fb->address : NULL; int w = fb ? fb->width : 320; int h = fb ? fb->height : 200; gui_gfx_init(fb_addr, w, h); gui_cursor_init(); gui_wm_init(); mouse_set_bounds(w, h); g_start_menu_open = false; } void gui_desktop_render_background(void) { int sw = gui_gfx_get_width(); int sh = gui_gfx_get_height(); // Dark Cyberpunk / Navy Vertical Gradient Wallpaper gui_gfx_draw_gradient_v(0, 0, sw, sh - GUI_TASKBAR_HEIGHT, 0xFF0B132B, 0xFF1C2541); // Subtle Grid Pattern for (int y = 0; y < sh - GUI_TASKBAR_HEIGHT; y += 20) { gui_gfx_draw_line(0, y, sw - 1, y, 0xFF141F36); } for (int x = 0; x < sw; x += 20) { gui_gfx_draw_line(x, 0, x, sh - GUI_TASKBAR_HEIGHT - 1, 0xFF141F36); } // Centered Desktop Brand Text Watermark gui_gfx_draw_string_shadow(sw / 2 - 40, sh / 2 - 20, "SUB-OS DESKTOP", 0xFF3A506B, 0xFF050811); gui_gfx_draw_string(sw / 2 - 28, sh / 2 - 8, "v0.2.0-LTS", 0xFF2A3C54); } void gui_desktop_render_taskbar(void) { int sw = gui_gfx_get_width(); int sh = gui_gfx_get_height(); int ty = sh - GUI_TASKBAR_HEIGHT; // Taskbar Bar Surface gui_gfx_fill_rect(0, ty, sw, GUI_TASKBAR_HEIGHT, GUI_THEME_TASKBAR_BG); gui_gfx_draw_line(0, ty, sw - 1, ty, GUI_THEME_BORDER); // Start Button uint32_t start_bg = g_start_menu_open ? GUI_THEME_PRIMARY_DARK : GUI_THEME_PRIMARY; gui_gfx_fill_rect(2, ty + 2, 54, 16, start_bg); gui_gfx_draw_rect(2, ty + 2, 54, 16, GUI_THEME_PRIMARY_DARK); gui_gfx_draw_string(6, ty + 6, "# SUB-OS", GUI_COLOR_WHITE); // Window Tabs in Taskbar int tab_x = 60; int win_count = gui_wm_get_window_count(); for (int i = 0; i < win_count && tab_x < sw - 80; i++) { gui_window_t* win = gui_wm_get_window(i + 1); if (!win || !win->visible) continue; uint32_t tab_bg = win->active ? GUI_THEME_BG_ELEVATED : GUI_THEME_BG_SURFACE; gui_gfx_fill_rect(tab_x, ty + 2, 50, 16, tab_bg); gui_gfx_draw_rect(tab_x, ty + 2, 50, 16, win->active ? GUI_THEME_PRIMARY : GUI_THEME_BORDER); char short_title[6]; strncpy(short_title, win->title, 5); short_title[5] = '\0'; gui_gfx_draw_string(tab_x + 4, ty + 6, short_title, win->active ? GUI_THEME_TEXT_MAIN : GUI_THEME_TEXT_MUTED); tab_x += 54; } // System Tray (Clock & Telemetry) rtc_time_t time; rtc_get_time(&time); char time_str[10]; snprintf(time_str, sizeof(time_str), "%02u:%02u:%02u", time.hour, time.minute, time.second); gui_gfx_draw_string_bg(sw - 50, ty + 6, time_str, GUI_THEME_PRIMARY, GUI_THEME_TASKBAR_BG); gui_gfx_fill_rect(sw - 68, ty + 5, 12, 10, GUI_THEME_SUCCESS); gui_gfx_draw_string(sw - 66, ty + 6, "24M", GUI_COLOR_WHITE); } void gui_desktop_render_start_menu(void) { if (!g_start_menu_open) return; int sh = gui_gfx_get_height(); int menu_w = 95; int menu_h = 100; int mx = 2; int my = sh - GUI_TASKBAR_HEIGHT - menu_h - 2; gui_gfx_draw_shadow(mx, my, menu_w, menu_h, 3); gui_gfx_fill_rect(mx, my, menu_w, menu_h, GUI_THEME_BG_SURFACE); gui_gfx_draw_rect(mx, my, menu_w, menu_h, GUI_THEME_PRIMARY); const char* items[] = { ">_ Terminal", "[#] System Monitor", "[F] File Explorer", "[=] Calculator", "[*] Paint Studio", "[i] About SUB-OS", "[X] Exit GUI" }; for (int i = 0; i < 7; i++) { int iy = my + 4 + i * 13; uint32_t fg = (i == 6) ? GUI_THEME_DANGER : GUI_THEME_TEXT_MAIN; gui_gfx_draw_string(mx + 6, iy, items[i], fg); } } void gui_desktop_toggle_start_menu(void) { g_start_menu_open = !g_start_menu_open; } bool gui_desktop_is_start_menu_open(void) { return g_start_menu_open; } void gui_desktop_handle_taskbar_click(int mx, int my) { int sw = gui_gfx_get_width(); int sh = gui_gfx_get_height(); int ty = sh - GUI_TASKBAR_HEIGHT; // Check Start Button if (mx >= 2 && mx <= 56 && my >= ty + 2 && my <= ty + 18) { gui_desktop_toggle_start_menu(); return; } // Check Start Menu Click if open if (g_start_menu_open) { int menu_w = 95; int menu_h = 100; int smx = 2; int smy = sh - GUI_TASKBAR_HEIGHT - menu_h - 2; if (mx >= smx && mx <= smx + menu_w && my >= smy && my <= smy + menu_h) { int item_idx = (my - (smy + 4)) / 13; g_start_menu_open = false; switch (item_idx) { case 0: gui_app_terminal_launch(20, 20, 160, 100); break; case 1: gui_app_sysmon_launch(140, 20, 150, 115); break; case 2: gui_app_fileman_launch(40, 40, 140, 95); break; case 3: gui_app_calc_launch(60, 30, 110, 85); break; case 4: gui_app_paint_launch(80, 20, 130, 90); break; case 5: gui_app_about_launch(90, 50, 150, 75); break; case 6: g_desktop_running = false; break; // Exit GUI default: break; } return; } else { g_start_menu_open = false; } } // Check Window Tabs int tab_x = 60; int win_count = gui_wm_get_window_count(); for (int i = 0; i < win_count && tab_x < sw - 80; i++) { if (mx >= tab_x && mx <= tab_x + 50 && my >= ty + 2 && my <= ty + 18) { gui_wm_focus_window(i + 1); return; } tab_x += 54; } } int gui_desktop_run(void) { gui_desktop_init(); // Open initial standard desktop windows gui_app_sysmon_launch(150, 10, 150, 115); gui_app_terminal_launch(10, 15, 130, 95); g_desktop_running = true; printk(KERN_INFO "GUI: Desktop Environment session started (Press ESC to return to TTY)\n"); int frame_limit = 0; while (g_desktop_running) { // 1. Process Mouse Input const mouse_state_t* ms = mouse_get_state(); int mx = ms ? ms->x : 160; int my = ms ? ms->y : 100; bool left = ms ? ms->left_btn : false; bool right = ms ? ms->right_btn : false; gui_cursor_set_pos(mx, my); if (left && !g_prev_left) { int sh = gui_gfx_get_height(); if (my >= sh - GUI_TASKBAR_HEIGHT || g_start_menu_open) { gui_desktop_handle_taskbar_click(mx, my); } else { gui_wm_handle_mouse(mx, my, left, right); } } else { gui_wm_handle_mouse(mx, my, left, right); } g_prev_left = left; // 2. Process Keyboard Input uint16_t key = keyboard_get_key(); if (key != 0) { char c = (char)(key & 0xFF); if (c == 27) { // Escape key g_desktop_running = false; break; } gui_wm_handle_key(key); } // 3. Render Complete Desktop Scene gui_desktop_render_background(); gui_wm_render(); gui_desktop_render_taskbar(); gui_desktop_render_start_menu(); gui_cursor_draw(); // 4. Present Framebuffer to Display gui_gfx_present(); } printk(KERN_INFO "GUI: Desktop session ended, restored TTY console\n"); return 0; }