This commit is contained in:
Chris 2026-02-24 17:49:54 +01:00
parent b4cccb0eb3
commit f6e53fa7c6
30 changed files with 526 additions and 320 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -14,8 +14,8 @@ static void about_paint(Window *win) {
// Version info // Version info
draw_string(offset_x, offset_y + 105, "BoredOS 'Panda'", COLOR_WHITE); draw_string(offset_x, offset_y + 105, "BoredOS 'Panda'", COLOR_WHITE);
draw_string(offset_x, offset_y + 120, "BoredOS Version 1.51", COLOR_WHITE); draw_string(offset_x, offset_y + 120, "BoredOS Version 1.60", COLOR_WHITE);
draw_string(offset_x, offset_y + 135, "Kernel Version 2.5.0", COLOR_WHITE); draw_string(offset_x, offset_y + 135, "Kernel Version 2.5.1", COLOR_WHITE);
// Copyright // Copyright
draw_string(offset_x, offset_y + 150, "(C) 2026 boreddevnl.", COLOR_WHITE); draw_string(offset_x, offset_y + 150, "(C) 2026 boreddevnl.", COLOR_WHITE);

View file

@ -2,6 +2,6 @@
void cli_cmd_boredver(char *args) { void cli_cmd_boredver(char *args) {
(void)args; (void)args;
cli_write("BrewOS v1.50 Beta\n"); cli_write("BoredOS v1.60\n");
cli_write("BrewOS Kernel V2.4.0 Beta\n"); cli_write("BoredOS Kernel V2.5.1\n");
} }

View file

@ -802,19 +802,34 @@ static void cmd_exec_single(char *cmd) {
if (cmd[0] == '.' && cmd[1] == '/') { if (cmd[0] == '.' && cmd[1] == '/') {
char *filename = cmd + 2; char *filename = cmd + 2;
// Build full path with drive context // Build full path with drive context and current directory
char full_exec_path[512]; char full_exec_path[512];
if (cmd_state && cmd_state->current_drive != 'A') { int i = 0;
full_exec_path[0] = cmd_state->current_drive;
full_exec_path[1] = ':'; // Add drive letter
int i = 2; if (cmd_state) {
full_exec_path[i++] = cmd_state->current_drive;
full_exec_path[i++] = ':';
// Add current directory
const char *dir = cmd_state->current_dir;
while (*dir && i < 509) {
full_exec_path[i++] = *dir++;
}
// Add separator if current dir doesn't end with /
if (i > 2 && full_exec_path[i-1] != '/') {
full_exec_path[i++] = '/';
}
}
// Add the relative path argument
const char *p = filename; const char *p = filename;
while (*p && i < 509) { while (*p && i < 509) {
full_exec_path[i++] = *p++; full_exec_path[i++] = *p++;
} }
full_exec_path[i] = 0; full_exec_path[i] = 0;
filename = full_exec_path; filename = full_exec_path;
}
FAT32_FileHandle *fh = fat32_open(filename, "r"); FAT32_FileHandle *fh = fat32_open(filename, "r");
if (fh) { if (fh) {
@ -930,8 +945,8 @@ static void cmd_exec_single(char *cmd) {
if (args[1] == ':') { if (args[1] == ':') {
// Already has drive letter // Already has drive letter
cmd_strcpy(full_path_arg, args); cmd_strcpy(full_path_arg, args);
} else { } else if (args[0] == '/') {
// Add drive letter // Absolute path, just prepend drive
full_path_arg[0] = cmd_state->current_drive; full_path_arg[0] = cmd_state->current_drive;
full_path_arg[1] = ':'; full_path_arg[1] = ':';
int i = 2; int i = 2;
@ -940,6 +955,29 @@ static void cmd_exec_single(char *cmd) {
full_path_arg[i++] = args[j++]; full_path_arg[i++] = args[j++];
} }
full_path_arg[i] = 0; full_path_arg[i] = 0;
} else {
// Relative path - need to build from current directory
int i = 0;
full_path_arg[i++] = cmd_state->current_drive;
full_path_arg[i++] = ':';
// Add current directory
const char *dir = cmd_state->current_dir;
while (*dir && i < 509) {
full_path_arg[i++] = *dir++;
}
// Add separator if current dir doesn't end with /
if (i > 2 && full_path_arg[i-1] != '/') {
full_path_arg[i++] = '/';
}
// Add the relative path argument
int j = 0;
while (args[j] && i < 509) {
full_path_arg[i++] = args[j++];
}
full_path_arg[i] = 0;
} }
args = full_path_arg; args = full_path_arg;
} else if (is_cd_command) { } else if (is_cd_command) {
@ -1439,20 +1477,9 @@ static void create_test_files(void) {
if (!fat32_exists("Desktop")) fat32_mkdir("Desktop"); if (!fat32_exists("Desktop")) fat32_mkdir("Desktop");
if (!fat32_exists("RecycleBin")) fat32_mkdir("RecycleBin"); if (!fat32_exists("RecycleBin")) fat32_mkdir("RecycleBin");
// Create Desktop Shortcuts
FAT32_FileHandle *fh;
fh = fat32_open("Desktop/Explorer.shortcut", "w"); if(fh) fat32_close(fh);
fh = fat32_open("Desktop/Notepad.shortcut", "w"); if(fh) fat32_close(fh);
fh = fat32_open("Desktop/Calculator.shortcut", "w"); if(fh) fat32_close(fh);
fh = fat32_open("Desktop/Minesweeper.shortcut", "w"); if(fh) fat32_close(fh);
fh = fat32_open("Desktop/Control Panel.shortcut", "w"); if(fh) fat32_close(fh);
fh = fat32_open("Desktop/Terminal.shortcut", "w"); if(fh) fat32_close(fh);
fh = fat32_open("Desktop/About.shortcut", "w"); if(fh) fat32_close(fh);
fh = fat32_open("Desktop/Recycle Bin.shortcut", "w"); if(fh) fat32_close(fh);
fh = fat32_open("Desktop/Paint.shortcut", "w"); if(fh) fat32_close(fh);
// Always try to write README to ensure content exists // Always try to write README to ensure content exists
fh = fat32_open("README.md", "w"); FAT32_FileHandle *fh = fat32_open("README.md", "w");
if (fh) { if (fh) {
const char *content = const char *content =
"# Bored OS 1.50\n\n" "# Bored OS 1.50\n\n"

View file

@ -152,11 +152,8 @@ static void control_panel_paint_main(Window *win) {
int offset_x = win->x + 8; int offset_x = win->x + 8;
int offset_y = win->y + 30; int offset_y = win->y + 30;
// Background
draw_rect(win->x, win->y + 30, win->w, win->h - 30, COLOR_DARK_BG);
// Draw settings items with rounded boxes // Draw settings items with rounded boxes
int item_y = 30 + 15; int item_y = 15;
int item_h = 60; int item_h = 60;
int item_spacing = 10; int item_spacing = 10;
@ -168,7 +165,7 @@ static void control_panel_paint_main(Window *win) {
draw_rect(offset_x + 24, offset_y + item_y + 22, 3, 6, 0xFF654321); // Tree trunk draw_rect(offset_x + 24, offset_y + item_y + 22, 3, 6, 0xFF654321); // Tree trunk
draw_rect(offset_x + 21, offset_y + item_y + 18, 9, 8, 0xFF228B22); // Tree leaves draw_rect(offset_x + 21, offset_y + item_y + 18, 9, 8, 0xFF228B22); // Tree leaves
draw_string(offset_x + 60, offset_y + item_y + 15, "Wallpaper", COLOR_DARK_TEXT); draw_string(offset_x + 60, offset_y + item_y + 15, "Wallpaper", COLOR_DARK_TEXT);
draw_string(offset_x + 60, offset_y + item_y + 35, "Choose background design", COLOR_DKGRAY); draw_string(offset_x + 60, offset_y + item_y + 35, "Choose wallpaper", COLOR_DKGRAY);
// Network Settings // Network Settings
item_y += item_h + item_spacing; item_y += item_h + item_spacing;
@ -187,150 +184,135 @@ static void control_panel_paint_main(Window *win) {
draw_rect(offset_x + 12, offset_y + item_y + 10, 36, 8, 0xFFE0C060); draw_rect(offset_x + 12, offset_y + item_y + 10, 36, 8, 0xFFE0C060);
draw_rect(offset_x + 12, offset_y + item_y + 18, 36, 22, 0xFFD4A574); draw_rect(offset_x + 12, offset_y + item_y + 18, 36, 22, 0xFFD4A574);
draw_string(offset_x + 60, offset_y + item_y + 15, "Desktop", COLOR_DARK_TEXT); draw_string(offset_x + 60, offset_y + item_y + 15, "Desktop", COLOR_DARK_TEXT);
draw_string(offset_x + 60, offset_y + item_y + 35, "Desktop appearance&icons", COLOR_DKGRAY); draw_string(offset_x + 60, offset_y + item_y + 35, "Desktop alignment", COLOR_DKGRAY);
} }
// Mouse Settings // Mouse Settings
item_y += item_h + item_spacing; item_y += item_h + item_spacing;
if (offset_y + item_y + item_h < win->y + win->h) {
draw_rounded_rect_filled(offset_x, offset_y + item_y, win->w - 16, item_h, 8, COLOR_DARK_PANEL); draw_rounded_rect_filled(offset_x, offset_y + item_y, win->w - 16, item_h, 8, COLOR_DARK_PANEL);
// Mouse icon // Mouse icon
draw_rect(offset_x + 18, offset_y + item_y + 8, 20, 28, 0xFFD3D3D3); draw_rect(offset_x + 18, offset_y + item_y + 8, 20, 28, 0xFFD3D3D3);
draw_rect(offset_x + 20, offset_y + item_y + 10, 16, 10, 0xFFB0B0B0); draw_rect(offset_x + 20, offset_y + item_y + 10, 16, 10, 0xFFB0B0B0);
draw_string(offset_x + 60, offset_y + item_y + 15, "Mouse", COLOR_DARK_TEXT); draw_string(offset_x + 60, offset_y + item_y + 15, "Mouse", COLOR_DARK_TEXT);
draw_string(offset_x + 60, offset_y + item_y + 35, "Pointer and trackpad", COLOR_DKGRAY); draw_string(offset_x + 60, offset_y + item_y + 35, "Pointer settings", COLOR_DKGRAY);
}
} }
static void control_panel_paint_wallpaper(Window *win) { static void control_panel_paint_wallpaper(Window *win) {
int offset_x = win->x + 8; int offset_x = win->x + 8;
int offset_y = win->y + 30; int offset_y = win->y + 30;
// Back button // Back button (rounded) - padded lower to avoid title bar
draw_string(offset_x, offset_y, "< Back", 0xFF000080); draw_rounded_rect_filled(offset_x, offset_y + 5, 80, 25, 6, COLOR_DARK_PANEL);
draw_string(offset_x + 10, offset_y + 13, "< Back", COLOR_DARK_TEXT);
draw_string(offset_x, offset_y + 25, "Presets:", 0xFF000000); draw_string(offset_x, offset_y + 40, "Presets:", COLOR_DARK_TEXT);
// Color buttons // Color buttons (rounded) - 30% wider
int button_y = offset_y + 45; int button_y = offset_y + 65;
int button_x = offset_x; int button_x = offset_x;
// Coffee button // Coffee button
draw_button(button_x, button_y, 60, 20, "Coffee", false); draw_rounded_rect_filled(button_x, button_y, 91, 25, 6, COLOR_DARK_PANEL);
draw_rect(button_x + 65, button_y + 5, 20, 10, COLOR_COFFEE); draw_rect(button_x + 8, button_y + 6, 18, 13, COLOR_COFFEE);
draw_string(button_x + 35, button_y + 8, "Coffee", COLOR_DARK_TEXT);
// Teal button // Teal button
draw_button(button_x + 100, button_y, 60, 20, "Teal", false); draw_rounded_rect_filled(button_x + 100, button_y, 91, 25, 6, COLOR_DARK_PANEL);
draw_rect(button_x + 165, button_y + 5, 20, 10, COLOR_TEAL); draw_rect(button_x + 108, button_y + 6, 18, 13, COLOR_TEAL);
draw_string(button_x + 135, button_y + 8, "Teal", COLOR_DARK_TEXT);
// Green button // Green button
draw_button(button_x + 200, button_y, 60, 20, "Green", false); draw_rounded_rect_filled(button_x + 200, button_y, 91, 25, 6, COLOR_DARK_PANEL);
draw_rect(button_x + 265, button_y + 5, 20, 10, COLOR_GREEN); draw_rect(button_x + 208, button_y + 6, 18, 13, COLOR_GREEN);
draw_string(button_x + 235, button_y + 8, "Green", COLOR_DARK_TEXT);
// Blue button // Blue button
button_y += 30; button_y += 35;
draw_button(button_x, button_y, 60, 20, "Blue", false); draw_rounded_rect_filled(button_x, button_y, 91, 25, 6, COLOR_DARK_PANEL);
draw_rect(button_x + 65, button_y + 5, 20, 10, COLOR_BLUE_BG); draw_rect(button_x + 8, button_y + 6, 18, 13, COLOR_BLUE_BG);
draw_string(button_x + 35, button_y + 8, "Blue", COLOR_DARK_TEXT);
// Purple button // Purple button
draw_button(button_x + 100, button_y, 60, 20, "Purple", false); draw_rounded_rect_filled(button_x + 100, button_y, 91, 25, 6, COLOR_DARK_PANEL);
draw_rect(button_x + 165, button_y + 5, 20, 10, COLOR_PURPLE); draw_rect(button_x + 108, button_y + 6, 18, 13, COLOR_PURPLE);
draw_string(button_x + 132, button_y + 8, "Purple", COLOR_DARK_TEXT);
// Grey button // Grey button
draw_button(button_x + 200, button_y, 60, 20, "Grey", false); draw_rounded_rect_filled(button_x + 200, button_y, 91, 25, 6, COLOR_DARK_PANEL);
draw_rect(button_x + 265, button_y + 5, 20, 10, COLOR_GREY); draw_rect(button_x + 208, button_y + 6, 18, 13, COLOR_GREY);
draw_string(button_x + 235, button_y + 8, "Grey", COLOR_DARK_TEXT);
// Pattern section // Pattern section
button_y += 40; button_y += 40;
draw_string(offset_x, button_y, "Patterns:", 0xFF000000); draw_string(offset_x, button_y, "Patterns:", COLOR_DARK_TEXT);
button_y += 20; button_y += 20;
// Lumberjack pattern button // Lumberjack pattern button - 20% wider
draw_button(button_x, button_y, 100, 20, "Lumberjack", false); draw_rounded_rect_filled(button_x, button_y, 132, 25, 6, COLOR_DARK_PANEL);
// Draw small pattern preview (3x3 repeating) // Draw small pattern preview (3x3 repeating)
for (int py = 0; py < 12; py++) { for (int py = 0; py < 10; py++) {
for (int px = 0; px < 18; px++) { for (int px = 0; px < 12; px++) {
int cell_x = px % 3; int cell_x = px % 3;
int cell_y = py % 3; int cell_y = py % 3;
uint32_t color; uint32_t color = (cell_x == 1 && cell_y == 1) ? 0xFF000000 :
(cell_x == 1 || cell_y == 1) ? 0xFF404040 : 0xFFDC143C;
if (cell_x == 1 && cell_y == 1) { draw_rect(button_x + 8 + px, button_y + 7 + py, 1, 1, color);
color = 0xFF000000; // Black center
} else if (cell_x == 1 || cell_y == 1) {
color = 0xFF404040; // Dark grey cross
} else {
color = 0xFFDC143C; // Red corners
}
draw_rect(button_x + 110 + px, button_y + 4 + py, 1, 1, color);
} }
} }
draw_string(button_x + 28, button_y + 8, "Lumberjack", COLOR_DARK_TEXT);
// Blue Diamond pattern button // Blue Diamond pattern button - 20% wider
draw_button(button_x + 145, button_y, 115, 20, "Blue Diamond", false); draw_rounded_rect_filled(button_x + 145, button_y, 132, 25, 6, COLOR_DARK_PANEL);
// Draw small diamond preview // Draw small diamond preview
for (int py = 0; py < 10; py++) { for (int py = 0; py < 8; py++) {
for (int px = 0; px < 20; px++) { for (int px = 0; px < 10; px++) {
int cx = px - 10; int cx = px - 5;
int cy = py - 5; int cy = py - 4;
int abs_cx = cx < 0 ? -cx : cx; int abs_cx = cx < 0 ? -cx : cx;
int abs_cy = cy < 0 ? -cy : cy; int abs_cy = cy < 0 ? -cy : cy;
uint32_t color = (abs_cx + abs_cy <= 5) ? 0xFF0000CD : 0xFFADD8E6; uint32_t color = (abs_cx + abs_cy <= 3) ? 0xFF0000CD : 0xFFADD8E6;
draw_rect(button_x + 270 + px, button_y + 5 + py, 1, 1, color); draw_rect(button_x + 153 + px, button_y + 8 + py, 1, 1, color);
} }
} }
draw_string(button_x + 165, button_y + 8, "Blue Diamond", COLOR_DARK_TEXT);
// Custom color section // Custom color section
button_y += 40; button_y += 40;
draw_string(offset_x, button_y, "Or something custom", 0xFF000000); draw_string(offset_x, button_y, "Custom color:", COLOR_DARK_TEXT);
button_y += 20; button_y += 20;
// R input box // R input box (dark mode)
draw_string(button_x, button_y, "R:", 0xFF000000); draw_string(button_x, button_y + 4, "R:", COLOR_DARK_TEXT);
draw_rect(button_x + 25, button_y, 50, 15, 0xFFFFFFFF); draw_rounded_rect_filled(button_x + 25, button_y, 50, 18, 4, COLOR_DARK_PANEL);
draw_rect(button_x + 25, button_y, 50, 1, COLOR_BLACK); draw_string(button_x + 30, button_y + 4, rgb_r, (focused_field == 0) ? 0xFFFF6B6B : COLOR_DARK_TEXT);
draw_rect(button_x + 25, button_y, 1, 15, COLOR_BLACK);
draw_rect(button_x + 74, button_y, 1, 15, COLOR_BLACK);
draw_rect(button_x + 25, button_y + 14, 50, 1, COLOR_BLACK);
draw_string(button_x + 30, button_y + 3, rgb_r, (focused_field == 0) ? 0xFFFF0000 : COLOR_BLACK);
if (focused_field == 0) { if (focused_field == 0) {
// Draw cursor
int cursor_x = button_x + 30 + input_cursor * 8; int cursor_x = button_x + 30 + input_cursor * 8;
draw_rect(cursor_x, button_y + 3, 1, 9, 0xFFFF0000); draw_rect(cursor_x, button_y + 4, 1, 9, 0xFFFF6B6B);
} }
// G input box // G input box (dark mode)
draw_string(button_x + 90, button_y, "G:", 0xFF000000); draw_string(button_x + 90, button_y + 4, "G:", COLOR_DARK_TEXT);
draw_rect(button_x + 115, button_y, 50, 15, 0xFFFFFFFF); draw_rounded_rect_filled(button_x + 115, button_y, 50, 18, 4, COLOR_DARK_PANEL);
draw_rect(button_x + 115, button_y, 50, 1, COLOR_BLACK); draw_string(button_x + 120, button_y + 4, rgb_g, (focused_field == 1) ? 0xFF90EE90 : COLOR_DARK_TEXT);
draw_rect(button_x + 115, button_y, 1, 15, COLOR_BLACK);
draw_rect(button_x + 164, button_y, 1, 15, COLOR_BLACK);
draw_rect(button_x + 115, button_y + 14, 50, 1, COLOR_BLACK);
draw_string(button_x + 120, button_y + 3, rgb_g, (focused_field == 1) ? 0xFF00AA00 : COLOR_BLACK);
if (focused_field == 1) { if (focused_field == 1) {
// Draw cursor
int cursor_x = button_x + 120 + input_cursor * 8; int cursor_x = button_x + 120 + input_cursor * 8;
draw_rect(cursor_x, button_y + 3, 1, 9, 0xFF00AA00); draw_rect(cursor_x, button_y + 4, 1, 9, 0xFF90EE90);
} }
// B input box // B input box (dark mode)
draw_string(button_x + 180, button_y, "B:", 0xFF000000); draw_string(button_x + 180, button_y + 4, "B:", COLOR_DARK_TEXT);
draw_rect(button_x + 205, button_y, 50, 15, 0xFFFFFFFF); draw_rounded_rect_filled(button_x + 205, button_y, 50, 18, 4, COLOR_DARK_PANEL);
draw_rect(button_x + 205, button_y, 50, 1, COLOR_BLACK); draw_string(button_x + 210, button_y + 4, rgb_b, (focused_field == 2) ? 0xFF87CEEB : COLOR_DARK_TEXT);
draw_rect(button_x + 205, button_y, 1, 15, COLOR_BLACK);
draw_rect(button_x + 254, button_y, 1, 15, COLOR_BLACK);
draw_rect(button_x + 205, button_y + 14, 50, 1, COLOR_BLACK);
draw_string(button_x + 210, button_y + 3, rgb_b, (focused_field == 2) ? 0xFF0000FF : COLOR_BLACK);
if (focused_field == 2) { if (focused_field == 2) {
// Draw cursor
int cursor_x = button_x + 210 + input_cursor * 8; int cursor_x = button_x + 210 + input_cursor * 8;
draw_rect(cursor_x, button_y + 3, 1, 9, 0xFF0000FF); draw_rect(cursor_x, button_y + 4, 1, 9, 0xFF87CEEB);
} }
// Apply button // Apply button (rounded)
draw_button(button_x, button_y + 25, 70, 20, "Apply", false); draw_rounded_rect_filled(button_x, button_y + 25, 70, 25, 6, COLOR_DARK_PANEL);
draw_string(button_x + 18, button_y + 33, "Apply", COLOR_DARK_TEXT);
} }
static void draw_input_box(int x, int y, int width, const char *text, bool focused, int cursor_pos) { static void draw_input_box(int x, int y, int width, const char *text, bool focused, int cursor_pos) {
@ -356,132 +338,172 @@ static void control_panel_paint_network(Window *win) {
int offset_x = win->x + 8; int offset_x = win->x + 8;
int offset_y = win->y + 30; int offset_y = win->y + 30;
// Back button // Back button (rounded) - padded lower to avoid title bar
draw_string(offset_x, offset_y, "< Back", 0xFF000080); draw_rounded_rect_filled(offset_x, offset_y + 5, 80, 25, 6, COLOR_DARK_PANEL);
draw_string(offset_x + 10, offset_y + 13, "< Back", COLOR_DARK_TEXT);
// Network Init Button // Network Init Button
draw_string(offset_x, offset_y + 25, "Network:", 0xFF000000); draw_string(offset_x, offset_y + 40, "Network:", COLOR_DARK_TEXT);
draw_button(offset_x, offset_y + 45, 100, 22, "Init Network", false); draw_rounded_rect_filled(offset_x, offset_y + 55, 140, 25, 6, COLOR_DARK_PANEL);
draw_string(offset_x + 30, offset_y + 63, "Init Network", COLOR_DARK_TEXT);
// Status message // Status message
if (net_status[0] != '\0') { if (net_status[0] != '\0') {
draw_string(offset_x + 110, offset_y + 50, net_status, 0xFF008000); draw_string(offset_x + 150, offset_y + 63, net_status, 0xFF90EE90);
} }
// Set IP Section // Set IP Section
int section_y = offset_y + 80; int section_y = offset_y + 85;
draw_string(offset_x, section_y, "Set Static IP:", 0xFF000000); draw_string(offset_x, section_y, "Set Static IP:", COLOR_DARK_TEXT);
section_y += 20; section_y += 20;
// IP input boxes (4 octets) // IP input boxes (4 octets, dark mode rounded) - with cursor indicators
draw_input_box(offset_x, section_y, 40, ip_1, focused_field == 0, input_cursor); uint32_t ip1_color = (focused_field == 0) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_string(offset_x + 42, section_y + 4, ".", COLOR_BLACK); draw_rounded_rect_filled(offset_x, section_y, 35, 20, 4, COLOR_DARK_PANEL);
draw_input_box(offset_x + 50, section_y, 40, ip_2, focused_field == 1, input_cursor); draw_string(offset_x + 5, section_y + 4, ip_1, ip1_color);
draw_string(offset_x + 92, section_y + 4, ".", COLOR_BLACK); if (focused_field == 0) draw_rect(offset_x + 5 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
draw_input_box(offset_x + 100, section_y, 40, ip_3, focused_field == 2, input_cursor); draw_string(offset_x + 40, section_y + 4, ".", COLOR_DARK_TEXT);
draw_string(offset_x + 142, section_y + 4, ".", COLOR_BLACK);
draw_input_box(offset_x + 150, section_y, 40, ip_4, focused_field == 3, input_cursor);
// Apply IP button uint32_t ip2_color = (focused_field == 1) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_button(offset_x + 200, section_y, 70, 18, "Apply", false); draw_rounded_rect_filled(offset_x + 50, section_y, 35, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 55, section_y + 4, ip_2, ip2_color);
if (focused_field == 1) draw_rect(offset_x + 55 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
draw_string(offset_x + 90, section_y + 4, ".", COLOR_DARK_TEXT);
uint32_t ip3_color = (focused_field == 2) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_rounded_rect_filled(offset_x + 100, section_y, 35, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 105, section_y + 4, ip_3, ip3_color);
if (focused_field == 2) draw_rect(offset_x + 105 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
draw_string(offset_x + 140, section_y + 4, ".", COLOR_DARK_TEXT);
uint32_t ip4_color = (focused_field == 3) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_rounded_rect_filled(offset_x + 150, section_y, 35, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 155, section_y + 4, ip_4, ip4_color);
if (focused_field == 3) draw_rect(offset_x + 155 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
// Apply IP button (rounded)
draw_rounded_rect_filled(offset_x + 200, section_y, 70, 20, 6, COLOR_DARK_PANEL);
draw_string(offset_x + 218, section_y + 4, "Apply", COLOR_DARK_TEXT);
// Send UDP Section // Send UDP Section
section_y += 35; section_y += 30;
draw_string(offset_x, section_y, "Send UDP Message:", 0xFF000000); draw_string(offset_x, section_y, "Send UDP Message:", COLOR_DARK_TEXT);
section_y += 20; section_y += 20;
draw_string(offset_x, section_y + 4, "IP:", COLOR_BLACK); draw_string(offset_x, section_y + 4, "IP:", COLOR_DARK_TEXT);
draw_input_box(offset_x + 25, section_y, 40, dest_ip_1, focused_field == 4, input_cursor); uint32_t dip1_color = (focused_field == 4) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_string(offset_x + 67, section_y + 4, ".", COLOR_BLACK); draw_rounded_rect_filled(offset_x + 25, section_y, 35, 20, 4, COLOR_DARK_PANEL);
draw_input_box(offset_x + 75, section_y, 40, dest_ip_2, focused_field == 5, input_cursor); draw_string(offset_x + 30, section_y + 4, dest_ip_1, dip1_color);
draw_string(offset_x + 117, section_y + 4, ".", COLOR_BLACK); if (focused_field == 4) draw_rect(offset_x + 30 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
draw_input_box(offset_x + 125, section_y, 40, dest_ip_3, focused_field == 6, input_cursor); draw_string(offset_x + 65, section_y + 4, ".", COLOR_DARK_TEXT);
draw_string(offset_x + 167, section_y + 4, ".", COLOR_BLACK);
draw_input_box(offset_x + 175, section_y, 40, dest_ip_4, focused_field == 7, input_cursor); uint32_t dip2_color = (focused_field == 5) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_rounded_rect_filled(offset_x + 70, section_y, 35, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 75, section_y + 4, dest_ip_2, dip2_color);
if (focused_field == 5) draw_rect(offset_x + 75 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
draw_string(offset_x + 110, section_y + 4, ".", COLOR_DARK_TEXT);
uint32_t dip3_color = (focused_field == 6) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_rounded_rect_filled(offset_x + 115, section_y, 35, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 120, section_y + 4, dest_ip_3, dip3_color);
if (focused_field == 6) draw_rect(offset_x + 120 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
draw_string(offset_x + 155, section_y + 4, ".", COLOR_DARK_TEXT);
uint32_t dip4_color = (focused_field == 7) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_rounded_rect_filled(offset_x + 160, section_y, 35, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 165, section_y + 4, dest_ip_4, dip4_color);
if (focused_field == 7) draw_rect(offset_x + 165 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
section_y += 25; section_y += 25;
draw_string(offset_x, section_y + 4, "Port:", COLOR_BLACK); draw_string(offset_x, section_y + 4, "Port:", COLOR_DARK_TEXT);
draw_input_box(offset_x + 40, section_y, 60, udp_port, focused_field == 8, input_cursor); uint32_t port_color = (focused_field == 8) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_rounded_rect_filled(offset_x + 40, section_y, 60, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 45, section_y + 4, udp_port, port_color);
if (focused_field == 8) draw_rect(offset_x + 45 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
section_y += 25; section_y += 25;
draw_string(offset_x, section_y + 4, "Msg:", COLOR_BLACK); draw_string(offset_x, section_y + 4, "Msg:", COLOR_DARK_TEXT);
draw_input_box(offset_x + 40, section_y, 260, udp_message, focused_field == 9, input_cursor); uint32_t msg_color = (focused_field == 9) ? 0xFF4A90E2 : COLOR_DARK_TEXT;
draw_rounded_rect_filled(offset_x + 40, section_y, 180, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 45, section_y + 4, udp_message, msg_color);
if (focused_field == 9) draw_rect(offset_x + 45 + input_cursor * 8, section_y + 4, 1, 9, 0xFF4A90E2);
// Send button // Send button (rounded)
section_y += 25; section_y += 25;
draw_button(offset_x, section_y, 80, 22, "Send", false); draw_rounded_rect_filled(offset_x, section_y, 80, 25, 6, COLOR_DARK_PANEL);
draw_string(offset_x + 22, section_y + 7, "Send", COLOR_DARK_TEXT);
} }
static void control_panel_paint_desktop(Window *win) { static void control_panel_paint_desktop(Window *win) {
int offset_x = win->x + 8; int offset_x = win->x + 8;
int offset_y = win->y + 30; int offset_y = win->y + 30;
// Back button // Back button (rounded) - padded lower to avoid title bar
draw_string(offset_x, offset_y, "< Back", 0xFF000080); draw_rounded_rect_filled(offset_x, offset_y + 5, 80, 25, 6, COLOR_DARK_PANEL);
draw_string(offset_x, offset_y + 25, "Desktop Settings:", 0xFF000000); draw_string(offset_x + 10, offset_y + 13, "< Back", COLOR_DARK_TEXT);
draw_string(offset_x, offset_y + 40, "Desktop Settings:", COLOR_DARK_TEXT);
int section_y = offset_y + 50; int section_y = offset_y + 65;
// Snap to Grid // Snap to Grid checkbox (rounded)
draw_rect(offset_x, section_y, 15, 15, 0xFFFFFFFF); draw_rounded_rect_filled(offset_x, section_y, 16, 16, 3, COLOR_DARK_PANEL);
draw_rect(offset_x, section_y, 15, 1, COLOR_BLACK); if (desktop_snap_to_grid) draw_string(offset_x + 3, section_y + 1, "", 0xFF90EE90);
draw_rect(offset_x, section_y, 1, 15, COLOR_BLACK); draw_string(offset_x + 25, section_y + 3, "Snap to Grid", COLOR_DARK_TEXT);
draw_rect(offset_x + 14, section_y, 1, 15, COLOR_BLACK);
draw_rect(offset_x, section_y + 14, 15, 1, COLOR_BLACK);
if (desktop_snap_to_grid) draw_string(offset_x + 3, section_y + 3, "X", COLOR_BLACK);
draw_string(offset_x + 25, section_y + 3, "Snap to Grid", COLOR_BLACK);
// Auto Align // Auto Align checkbox (rounded)
section_y += 25; section_y += 25;
draw_rect(offset_x, section_y, 15, 15, 0xFFFFFFFF); draw_rounded_rect_filled(offset_x, section_y, 16, 16, 3, COLOR_DARK_PANEL);
draw_rect(offset_x, section_y, 15, 1, COLOR_BLACK); if (desktop_auto_align) draw_string(offset_x + 3, section_y + 1, "", 0xFF90EE90);
draw_rect(offset_x, section_y, 1, 15, COLOR_BLACK); draw_string(offset_x + 25, section_y + 3, "Auto Align Icons", COLOR_DARK_TEXT);
draw_rect(offset_x + 14, section_y, 1, 15, COLOR_BLACK);
draw_rect(offset_x, section_y + 14, 15, 1, COLOR_BLACK);
if (desktop_auto_align) draw_string(offset_x + 3, section_y + 3, "X", COLOR_BLACK);
draw_string(offset_x + 25, section_y + 3, "Auto Align Icons", COLOR_BLACK);
// Max Rows // Max Rows
section_y += 25; section_y += 30;
draw_string(offset_x, section_y + 3, "Apps per column:", COLOR_BLACK); draw_string(offset_x, section_y + 3, "Apps per column:", COLOR_DARK_TEXT);
draw_button(offset_x + 130, section_y, 20, 20, "-", false); draw_rounded_rect_filled(offset_x + 130, section_y, 20, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 135, section_y + 4, "-", COLOR_DARK_TEXT);
char num[4]; num[0] = '0' + (desktop_max_rows_per_col / 10); num[1] = '0' + (desktop_max_rows_per_col % 10); num[2] = 0; char num[4]; num[0] = '0' + (desktop_max_rows_per_col / 10); num[1] = '0' + (desktop_max_rows_per_col % 10); num[2] = 0;
if (num[0] == '0') { num[0] = num[1]; num[1] = 0; } if (num[0] == '0') { num[0] = num[1]; num[1] = 0; }
draw_string(offset_x + 160, section_y + 5, num, COLOR_BLACK); draw_string(offset_x + 160, section_y + 5, num, COLOR_DARK_TEXT);
draw_button(offset_x + 180, section_y, 20, 20, "+", false); draw_rounded_rect_filled(offset_x + 180, section_y, 20, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 186, section_y + 4, "+", COLOR_DARK_TEXT);
// Max Cols // Max Cols
section_y += 25; section_y += 30;
draw_string(offset_x, section_y + 3, "Columns:", COLOR_BLACK); draw_string(offset_x, section_y + 3, "Columns:", COLOR_DARK_TEXT);
draw_button(offset_x + 130, section_y, 20, 20, "-", false); draw_rounded_rect_filled(offset_x + 130, section_y, 20, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 135, section_y + 4, "-", COLOR_DARK_TEXT);
char num_c[4]; num_c[0] = '0' + (desktop_max_cols / 10); num_c[1] = '0' + (desktop_max_cols % 10); num_c[2] = 0; char num_c[4]; num_c[0] = '0' + (desktop_max_cols / 10); num_c[1] = '0' + (desktop_max_cols % 10); num_c[2] = 0;
if (num_c[0] == '0') { num_c[0] = num_c[1]; num_c[1] = 0; } if (num_c[0] == '0') { num_c[0] = num_c[1]; num_c[1] = 0; }
draw_string(offset_x + 160, section_y + 5, num_c, COLOR_BLACK); draw_string(offset_x + 160, section_y + 5, num_c, COLOR_DARK_TEXT);
draw_button(offset_x + 180, section_y, 20, 20, "+", false); draw_rounded_rect_filled(offset_x + 180, section_y, 20, 20, 4, COLOR_DARK_PANEL);
draw_string(offset_x + 186, section_y + 4, "+", COLOR_DARK_TEXT);
} }
static void control_panel_paint_mouse(Window *win) { static void control_panel_paint_mouse(Window *win) {
int offset_x = win->x + 8; int offset_x = win->x + 8;
int offset_y = win->y + 30; int offset_y = win->y + 30;
// Back button // Back button (rounded) - padded lower to avoid title bar
draw_string(offset_x, offset_y, "< Back", 0xFF000080); draw_rounded_rect_filled(offset_x, offset_y + 5, 80, 25, 6, COLOR_DARK_PANEL);
draw_string(offset_x, offset_y + 25, "Mouse Settings:", 0xFF000000); draw_string(offset_x + 10, offset_y + 13, "< Back", COLOR_DARK_TEXT);
draw_string(offset_x, offset_y + 40, "Mouse Settings:", COLOR_DARK_TEXT);
int section_y = offset_y + 60; int section_y = offset_y + 65;
draw_string(offset_x, section_y, "Speed:", COLOR_BLACK); draw_string(offset_x, section_y, "Speed:", COLOR_DARK_TEXT);
// Slider track // Slider track (rounded background)
draw_rect(offset_x + 60, section_y + 8, 200, 2, COLOR_DKGRAY); draw_rounded_rect_filled(offset_x + 60, section_y + 8, 200, 8, 4, COLOR_DARK_PANEL);
// Slider knob (range 1-50, default 10) // Slider knob (range 1-50, default 10) - rounded with blue color
int knob_x = offset_x + 60 + (mouse_speed - 1) * 190 / 49; int knob_x = offset_x + 60 + (mouse_speed - 1) * 190 / 49;
draw_button(knob_x, section_y, 10, 18, "", false); draw_rounded_rect_filled(knob_x, section_y + 2, 10, 14, 3, 0xFF4A90E2);
draw_string(offset_x + 270, section_y + 4, "x", COLOR_BLACK); draw_string(offset_x + 270, section_y + 4, "x", COLOR_DARK_TEXT);
char speed_str[4]; char speed_str[4];
cli_itoa(mouse_speed, speed_str); cli_itoa(mouse_speed, speed_str);
draw_string(offset_x + 280, section_y + 4, speed_str, COLOR_BLACK); draw_string(offset_x + 280, section_y + 4, speed_str, COLOR_DARK_TEXT);
} }
static void control_panel_paint(Window *win) { static void control_panel_paint(Window *win) {
@ -534,57 +556,64 @@ static void control_panel_handle_click(Window *win, int x, int y) {
// Check mouse button // Check mouse button
item_y += item_h + item_spacing; item_y += item_h + item_spacing;
if (x >= offset_x && x < win->w - 8 && if (offset_y + item_y + item_h < win->y + win->h &&
x >= offset_x && x < win->w - 8 &&
y >= item_y && y < item_y + item_h) { y >= item_y && y < item_y + item_h) {
current_view = VIEW_MOUSE; current_view = VIEW_MOUSE;
} }
} else if (current_view == VIEW_WALLPAPER) { } else if (current_view == VIEW_WALLPAPER) {
int offset_x = 8; int offset_x = 8;
int offset_y = 30; int offset_y = 30;
int button_y = offset_y + 45; int button_y = offset_y + 65;
int button_x = offset_x; int button_x = offset_x;
// Back button // Back button
if (x >= offset_x && x < offset_x + 40 && if (x >= offset_x && x < offset_x + 80 &&
y >= offset_y && y < offset_y + 15) { y >= offset_y + 5 && y < offset_y + 30) {
current_view = VIEW_MAIN; current_view = VIEW_MAIN;
return; return;
} }
// Check Coffee button // Check Coffee button (91px wide)
if (x >= button_x && x < button_x + 60 && y >= button_y && y < button_y + 20) { if (x >= button_x && x < button_x + 91 && y >= button_y && y < button_y + 25) {
graphics_set_bg_color(COLOR_COFFEE); graphics_set_bg_color(COLOR_COFFEE);
wm_refresh();
return; return;
} }
// Check Teal button // Check Teal button
if (x >= button_x + 100 && x < button_x + 160 && y >= button_y && y < button_y + 20) { if (x >= button_x + 100 && x < button_x + 191 && y >= button_y && y < button_y + 25) {
graphics_set_bg_color(COLOR_TEAL); graphics_set_bg_color(COLOR_TEAL);
wm_refresh();
return; return;
} }
// Check Green button // Check Green button
if (x >= button_x + 200 && x < button_x + 260 && y >= button_y && y < button_y + 20) { if (x >= button_x + 200 && x < button_x + 291 && y >= button_y && y < button_y + 25) {
graphics_set_bg_color(COLOR_GREEN); graphics_set_bg_color(COLOR_GREEN);
wm_refresh();
return; return;
} }
// Check Blue button // Check Blue button
button_y += 30; button_y += 35;
if (x >= button_x && x < button_x + 60 && y >= button_y && y < button_y + 20) { if (x >= button_x && x < button_x + 91 && y >= button_y && y < button_y + 25) {
graphics_set_bg_color(COLOR_BLUE_BG); graphics_set_bg_color(COLOR_BLUE_BG);
wm_refresh();
return; return;
} }
// Check Purple button // Check Purple button
if (x >= button_x + 100 && x < button_x + 160 && y >= button_y && y < button_y + 20) { if (x >= button_x + 100 && x < button_x + 191 && y >= button_y && y < button_y + 25) {
graphics_set_bg_color(COLOR_PURPLE); graphics_set_bg_color(COLOR_PURPLE);
wm_refresh();
return; return;
} }
// Check Grey button // Check Grey button
if (x >= button_x + 200 && x < button_x + 260 && y >= button_y && y < button_y + 20) { if (x >= button_x + 200 && x < button_x + 291 && y >= button_y && y < button_y + 25) {
graphics_set_bg_color(COLOR_GREY); graphics_set_bg_color(COLOR_GREY);
wm_refresh();
return; return;
} }
@ -592,15 +621,17 @@ static void control_panel_handle_click(Window *win, int x, int y) {
button_y += 40; button_y += 40;
button_y += 20; button_y += 20;
// Check Lumberjack pattern button // Check Lumberjack pattern button (132px wide)
if (x >= button_x && x < button_x + 100 && y >= button_y && y < button_y + 20) { if (x >= button_x && x < button_x + 132 && y >= button_y && y < button_y + 25) {
graphics_set_bg_pattern(pattern_lumberjack); graphics_set_bg_pattern(pattern_lumberjack);
wm_refresh();
return; return;
} }
// Check Blue Diamond pattern button // Check Blue Diamond pattern button (132px wide)
if (x >= button_x + 145 && x < button_x + 260 && y >= button_y && y < button_y + 20) { if (x >= button_x + 145 && x < button_x + 277 && y >= button_y && y < button_y + 25) {
graphics_set_bg_pattern(pattern_blue_diamond); graphics_set_bg_pattern(pattern_blue_diamond);
wm_refresh();
return; return;
} }
@ -609,7 +640,7 @@ static void control_panel_handle_click(Window *win, int x, int y) {
button_y += 20; button_y += 20;
// Check R input box click // Check R input box click
if (x >= button_x + 25 && x < button_x + 75 && y >= button_y && y < button_y + 15) { if (x >= button_x + 25 && x < button_x + 75 && y >= button_y && y < button_y + 18) {
if (focused_field != 0) { if (focused_field != 0) {
rgb_r[0] = '\0'; // Clear when first focused rgb_r[0] = '\0'; // Clear when first focused
} }
@ -619,7 +650,7 @@ static void control_panel_handle_click(Window *win, int x, int y) {
} }
// Check G input box click // Check G input box click
if (x >= button_x + 115 && x < button_x + 165 && y >= button_y && y < button_y + 15) { if (x >= button_x + 115 && x < button_x + 165 && y >= button_y && y < button_y + 18) {
if (focused_field != 1) { if (focused_field != 1) {
rgb_g[0] = '\0'; // Clear when first focused rgb_g[0] = '\0'; // Clear when first focused
} }
@ -629,7 +660,7 @@ static void control_panel_handle_click(Window *win, int x, int y) {
} }
// Check B input box click // Check B input box click
if (x >= button_x + 205 && x < button_x + 255 && y >= button_y && y < button_y + 15) { if (x >= button_x + 205 && x < button_x + 255 && y >= button_y && y < button_y + 18) {
if (focused_field != 2) { if (focused_field != 2) {
rgb_b[0] = '\0'; // Clear when first focused rgb_b[0] = '\0'; // Clear when first focused
} }
@ -639,8 +670,9 @@ static void control_panel_handle_click(Window *win, int x, int y) {
} }
// Check Apply button // Check Apply button
if (x >= button_x && x < button_x + 70 && y >= button_y + 25 && y < button_y + 45) { if (x >= button_x && x < button_x + 70 && y >= button_y + 25 && y < button_y + 50) {
graphics_set_bg_color(parse_rgb_separate(rgb_r, rgb_g, rgb_b)); graphics_set_bg_color(parse_rgb_separate(rgb_r, rgb_g, rgb_b));
wm_refresh();
return; return;
} }
} else if (current_view == VIEW_NETWORK) { } else if (current_view == VIEW_NETWORK) {
@ -648,14 +680,14 @@ static void control_panel_handle_click(Window *win, int x, int y) {
int offset_y = 30; int offset_y = 30;
// Back button // Back button
if (x >= offset_x && x < offset_x + 40 && y >= offset_y && y < offset_y + 15) { if (x >= offset_x && x < offset_x + 80 && y >= offset_y + 5 && y < offset_y + 30) {
current_view = VIEW_MAIN; current_view = VIEW_MAIN;
focused_field = -1; focused_field = -1;
return; return;
} }
// Init Network button // Init Network button (140px wide now)
if (x >= offset_x && x < offset_x + 100 && y >= offset_y + 45 && y < offset_y + 67) { if (x >= offset_x && x < offset_x + 140 && y >= offset_y + 55 && y < offset_y + 80) {
int result = network_init(); int result = network_init();
if (result == 0) { if (result == 0) {
net_status[0] = 'I'; net_status[1] = 'n'; net_status[2] = 'i'; net_status[0] = 'I'; net_status[1] = 'n'; net_status[2] = 'i';
@ -669,35 +701,35 @@ static void control_panel_handle_click(Window *win, int x, int y) {
return; return;
} }
int section_y = offset_y + 80 + 20; int section_y = offset_y + 85 + 20;
// IP octet 1 // IP octet 1
if (x >= offset_x && x < offset_x + 40 && y >= section_y && y < section_y + 18) { if (x >= offset_x && x < offset_x + 35 && y >= section_y && y < section_y + 20) {
focused_field = 0; focused_field = 0;
input_cursor = 0; input_cursor = 0;
return; return;
} }
// IP octet 2 // IP octet 2
if (x >= offset_x + 50 && x < offset_x + 90 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 50 && x < offset_x + 85 && y >= section_y && y < section_y + 20) {
focused_field = 1; focused_field = 1;
input_cursor = 0; input_cursor = 0;
return; return;
} }
// IP octet 3 // IP octet 3
if (x >= offset_x + 100 && x < offset_x + 140 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 100 && x < offset_x + 135 && y >= section_y && y < section_y + 20) {
focused_field = 2; focused_field = 2;
input_cursor = 0; input_cursor = 0;
return; return;
} }
// IP octet 4 // IP octet 4
if (x >= offset_x + 150 && x < offset_x + 190 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 150 && x < offset_x + 185 && y >= section_y && y < section_y + 20) {
focused_field = 3; focused_field = 3;
input_cursor = 0; input_cursor = 0;
return; return;
} }
// Apply IP button // Apply IP button
if (x >= offset_x + 200 && x < offset_x + 270 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 200 && x < offset_x + 270 && y >= section_y && y < section_y + 20) {
ipv4_address_t ip; ipv4_address_t ip;
ip.bytes[0] = 0; ip.bytes[1] = 0; ip.bytes[2] = 0; ip.bytes[3] = 0; ip.bytes[0] = 0; ip.bytes[1] = 0; ip.bytes[2] = 0; ip.bytes[3] = 0;
@ -730,25 +762,25 @@ static void control_panel_handle_click(Window *win, int x, int y) {
return; return;
} }
section_y += 35 + 20; section_y += 30;
// Dest IP octets // Dest IP octets
if (x >= offset_x + 25 && x < offset_x + 65 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 25 && x < offset_x + 60 && y >= section_y && y < section_y + 20) {
focused_field = 4; focused_field = 4;
input_cursor = 0; input_cursor = 0;
return; return;
} }
if (x >= offset_x + 75 && x < offset_x + 115 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 70 && x < offset_x + 105 && y >= section_y && y < section_y + 20) {
focused_field = 5; focused_field = 5;
input_cursor = 0; input_cursor = 0;
return; return;
} }
if (x >= offset_x + 125 && x < offset_x + 165 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 115 && x < offset_x + 150 && y >= section_y && y < section_y + 20) {
focused_field = 6; focused_field = 6;
input_cursor = 0; input_cursor = 0;
return; return;
} }
if (x >= offset_x + 175 && x < offset_x + 215 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 160 && x < offset_x + 195 && y >= section_y && y < section_y + 20) {
focused_field = 7; focused_field = 7;
input_cursor = 0; input_cursor = 0;
return; return;
@ -757,7 +789,7 @@ static void control_panel_handle_click(Window *win, int x, int y) {
section_y += 25; section_y += 25;
// Port field // Port field
if (x >= offset_x + 40 && x < offset_x + 100 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 40 && x < offset_x + 100 && y >= section_y && y < section_y + 20) {
focused_field = 8; focused_field = 8;
input_cursor = 0; input_cursor = 0;
return; return;
@ -766,7 +798,7 @@ static void control_panel_handle_click(Window *win, int x, int y) {
section_y += 25; section_y += 25;
// Message field // Message field
if (x >= offset_x + 40 && x < offset_x + 300 && y >= section_y && y < section_y + 18) { if (x >= offset_x + 40 && x < offset_x + 220 && y >= section_y && y < section_y + 20) {
focused_field = 9; focused_field = 9;
input_cursor = 0; input_cursor = 0;
return; return;
@ -775,7 +807,7 @@ static void control_panel_handle_click(Window *win, int x, int y) {
section_y += 25; section_y += 25;
// Send button // Send button
if (x >= offset_x && x < offset_x + 80 && y >= section_y && y < section_y + 22) { if (x >= offset_x && x < offset_x + 80 && y >= section_y && y < section_y + 25) {
ipv4_address_t dest_ip; ipv4_address_t dest_ip;
dest_ip.bytes[0] = 0; dest_ip.bytes[1] = 0; dest_ip.bytes[2] = 0; dest_ip.bytes[3] = 0; dest_ip.bytes[0] = 0; dest_ip.bytes[1] = 0; dest_ip.bytes[2] = 0; dest_ip.bytes[3] = 0;
@ -830,14 +862,14 @@ static void control_panel_handle_click(Window *win, int x, int y) {
int offset_y = 30; int offset_y = 30;
// Back button // Back button
if (x >= offset_x && x < offset_x + 40 && y >= offset_y && y < offset_y + 15) { if (x >= offset_x && x < offset_x + 80 && y >= offset_y + 5 && y < offset_y + 30) {
current_view = VIEW_MAIN; current_view = VIEW_MAIN;
return; return;
} }
int section_y = offset_y + 50; int section_y = offset_y + 65;
// Snap toggle // Snap toggle - click on checkbox only
if (x >= offset_x && x < offset_x + 150 && y >= section_y && y < section_y + 20) { if (x >= offset_x && x < offset_x + 16 && y >= section_y && y < section_y + 16) {
desktop_snap_to_grid = !desktop_snap_to_grid; desktop_snap_to_grid = !desktop_snap_to_grid;
// If Snap is turned OFF, Auto Align must be OFF // If Snap is turned OFF, Auto Align must be OFF
if (!desktop_snap_to_grid) { if (!desktop_snap_to_grid) {
@ -847,9 +879,9 @@ static void control_panel_handle_click(Window *win, int x, int y) {
return; return;
} }
// Auto Align toggle // Auto Align toggle - click on checkbox only
section_y += 25; section_y += 25;
if (x >= offset_x && x < offset_x + 150 && y >= section_y && y < section_y + 20) { if (x >= offset_x && x < offset_x + 16 && y >= section_y && y < section_y + 16) {
desktop_auto_align = !desktop_auto_align; desktop_auto_align = !desktop_auto_align;
// If Auto Align is turned ON, Snap must be ON // If Auto Align is turned ON, Snap must be ON
if (desktop_auto_align) { if (desktop_auto_align) {
@ -897,12 +929,12 @@ static void control_panel_handle_click(Window *win, int x, int y) {
int offset_y = 30; int offset_y = 30;
// Back button // Back button
if (x >= offset_x && x < offset_x + 40 && y >= offset_y && y < offset_y + 15) { if (x >= offset_x && x < offset_x + 80 && y >= offset_y + 5 && y < offset_y + 30) {
current_view = VIEW_MAIN; current_view = VIEW_MAIN;
return; return;
} }
int section_y = offset_y + 60; int section_y = offset_y + 65;
// Slider interaction // Slider interaction
if (x >= offset_x + 60 && x <= offset_x + 260 && y >= section_y && y <= section_y + 20) { if (x >= offset_x + 60 && x <= offset_x + 260 && y >= section_y && y <= section_y + 20) {
int new_speed = 1 + (x - (offset_x + 60)) * 49 / 200; int new_speed = 1 + (x - (offset_x + 60)) * 49 / 200;
@ -1009,7 +1041,7 @@ void control_panel_init(void) {
win_control_panel.x = 200; win_control_panel.x = 200;
win_control_panel.y = 150; win_control_panel.y = 150;
win_control_panel.w = 350; win_control_panel.w = 350;
win_control_panel.h = 300; win_control_panel.h = 320;
win_control_panel.visible = false; win_control_panel.visible = false;
win_control_panel.focused = false; win_control_panel.focused = false;
win_control_panel.z_index = 0; win_control_panel.z_index = 0;

View file

@ -147,19 +147,12 @@ void fat32_normalize_path(const char *path, char *normalized) {
// Initialize with current directory or root // Initialize with current directory or root
// If drive changed, we assume root of that drive // If drive changed, we assume root of that drive
if (p[0] == '/') { if (p[0] == '/') {
temp[0] = '/'; fs_strcpy(temp, "/");
temp[1] = 0;
temp_len = 1;
} else {
if (drive != current_drive) {
temp[0] = '/';
temp[1] = 0;
temp_len = 1; temp_len = 1;
} else { } else {
fs_strcpy(temp, current_dir); fs_strcpy(temp, current_dir);
temp_len = fs_strlen(temp); temp_len = fs_strlen(temp);
} }
}
int i = 0; int i = 0;
while (p[i]) { while (p[i]) {

View file

@ -25,7 +25,7 @@ static void notepad_ensure_cursor_visible(Window *win) {
static void notepad_paint(Window *win) { static void notepad_paint(Window *win) {
// Dark mode background for text // Dark mode background for text
draw_rect(win->x + 4, win->y + 30, win->w - 8, win->h - 34, COLOR_DARK_BG); draw_rect(win->x + 4, win->y + 30, win->w - 8, win->h - 34, COLOR_NOTEPAD_BG);
int visual_line = 0; int visual_line = 0;
int current_x = win->x + 8; int current_x = win->x + 8;
@ -69,7 +69,7 @@ static void notepad_paint(Window *win) {
} }
char ch[2] = {win->buffer[i], 0}; char ch[2] = {win->buffer[i], 0};
draw_string(current_x, current_y, ch, COLOR_DARK_TEXT); draw_string(current_x, current_y, ch, COLOR_BLACK);
current_x += 8; current_x += 8;
} }
} }
@ -98,7 +98,7 @@ static void notepad_paint(Window *win) {
if (visual_line >= notepad_scroll_line && if (visual_line >= notepad_scroll_line &&
visual_line < notepad_scroll_line + (win->h - 40) / 10) { visual_line < notepad_scroll_line + (win->h - 40) / 10) {
draw_rect(cx, cy, 2, 8, COLOR_DARK_TEXT); draw_rect(cx, cy, 2, 8, COLOR_BLACK);
} }
} }
} }

View file

@ -124,7 +124,7 @@ static int str_eq(const char *s1, const char *s2) {
static void refresh_desktop_icons(void) { static void refresh_desktop_icons(void) {
// Update limit in FS // Update limit in FS
fat32_set_desktop_limit(desktop_max_cols * (desktop_max_rows_per_col > 1 ? desktop_max_rows_per_col - 1 : 0)); fat32_set_desktop_limit(desktop_max_cols * desktop_max_rows_per_col);
FAT32_FileInfo *files = (FAT32_FileInfo*)kmalloc(MAX_DESKTOP_ICONS * sizeof(FAT32_FileInfo)); FAT32_FileInfo *files = (FAT32_FileInfo*)kmalloc(MAX_DESKTOP_ICONS * sizeof(FAT32_FileInfo));
if (!files) return; if (!files) return;
@ -184,8 +184,8 @@ static void refresh_desktop_icons(void) {
// 3. Layout Icons // 3. Layout Icons
if (desktop_auto_align) { if (desktop_auto_align) {
int start_x = 20; // Starting X position for icons int start_x = 20;
int start_y = 20 + DESKTOP_TOP_DEADSPACE_HEIGHT; // Starting Y position for icons, offset by dead space int start_y = 50;
int grid_x = 0; int grid_x = 0;
int grid_y = 0; int grid_y = 0;
@ -200,8 +200,8 @@ static void refresh_desktop_icons(void) {
// Place Recycle Bin at bottom-right of grid // Place Recycle Bin at bottom-right of grid
if (recycle_idx != -1) { if (recycle_idx != -1) {
desktop_icons[recycle_idx].x = start_x + (desktop_max_cols - 1) * 80; // Align to the last column desktop_icons[recycle_idx].x = start_x + (desktop_max_cols - 1) * 80;
desktop_icons[recycle_idx].y = start_y + (desktop_max_rows_per_col - 2) * 80; // Align to the second to last row (since one is dead space) desktop_icons[recycle_idx].y = start_y + (desktop_max_rows_per_col - 1) * 80;
} }
for (int i = 0; i < desktop_icon_count; i++) { for (int i = 0; i < desktop_icon_count; i++) {
@ -210,7 +210,7 @@ static void refresh_desktop_icons(void) {
desktop_icons[i].x = start_x + (grid_x * 80); desktop_icons[i].x = start_x + (grid_x * 80);
desktop_icons[i].y = start_y + (grid_y * 80); desktop_icons[i].y = start_y + (grid_y * 80);
grid_y++; // Increment grid_y for the next icon grid_y++;
if (grid_y >= desktop_max_rows_per_col) { if (grid_y >= desktop_max_rows_per_col) {
grid_y = 0; grid_y = 0;
grid_x++; grid_x++;
@ -224,7 +224,7 @@ static void refresh_desktop_icons(void) {
if (desktop_icons[i].x != -1) { if (desktop_icons[i].x != -1) {
int col = (desktop_icons[i].x - 20) / 80; int col = (desktop_icons[i].x - 20) / 80;
int row = (desktop_icons[i].y - 20) / 80; int row = (desktop_icons[i].y - 20) / 80;
if (col >= 0 && col < 16 && row >= 0 && row < 16) occupied[col][row] = true; // Mark occupied cells if (col >= 0 && col < 16 && row >= 0 && row < 16) occupied[col][row] = true;
} }
} }
@ -233,7 +233,7 @@ static void refresh_desktop_icons(void) {
int found_col = -1, found_row = -1; int found_col = -1, found_row = -1;
for (int c = 0; c < 16; c++) { for (int c = 0; c < 16; c++) {
for (int r = 0; r < desktop_max_rows_per_col; r++) { for (int r = 0; r < desktop_max_rows_per_col; r++) {
if (!occupied[c][r] && r > 0) { // Ensure not in the dead space row if (!occupied[c][r]) {
found_col = c; found_row = r; found_col = c; found_row = r;
goto found; goto found;
} }
@ -564,16 +564,12 @@ void draw_paint_icon(int x, int y, const char *label) {
} }
// New macOS-style drawing functions // New macOS-style drawing functions
static void draw_filled_circle(int cx, int cy, int r, uint32_t color);
// Draw traffic light (close button - red) // Draw traffic light (close button - red)
void draw_traffic_light(int x, int y) { void draw_traffic_light(int x, int y) {
// Red close button draw_filled_circle(x + 6, y + 6, 6, COLOR_TRAFFIC_RED);
draw_rounded_rect_filled(x, y, 12, 12, 3, COLOR_TRAFFIC_RED); draw_filled_circle(x + 6, y + 6, 2, COLOR_WHITE);
// X mark
draw_rect(x + 4, y + 4, 1, 4, COLOR_WHITE); // Vertical
draw_rect(x + 5, y + 5, 1, 1, COLOR_WHITE);
draw_rect(x + 5, y + 6, 1, 1, COLOR_WHITE);
draw_rect(x + 6, y + 5, 1, 2, COLOR_WHITE);
} }
// Draw a squircle-style app icon // Draw a squircle-style app icon
@ -600,6 +596,181 @@ void draw_settings_icon(int x, int y, const char *label) {
draw_rect(cx - 2, cy - 2, 4, 4, COLOR_WHITE); // Center draw_rect(cx - 2, cy - 2, 4, 4, COLOR_WHITE); // Center
} }
static int isqrt_local(int n) {
if (n <= 0) return 0;
int x = n;
int y = (x + 1) / 2;
while (y < x) {
x = y;
y = (x + n / x) / 2;
}
return x;
}
static void draw_filled_circle(int cx, int cy, int r, uint32_t color) {
for (int dy = -r; dy <= r; dy++) {
int dx = isqrt_local(r * r - dy * dy);
draw_rect(cx - dx, cy + dy, dx * 2 + 1, 1, color);
}
}
static void draw_dock_files(int x, int y) {
draw_rounded_rect_filled(x, y, 48, 48, 10, 0xFF1D5FAA);
draw_rounded_rect_filled(x + 1, y + 1, 46, 28, 9, 0xFF4A90E2);
draw_rounded_rect_filled(x + 1, y + 24, 46, 23, 9, 0xFF2E72C9);
draw_rounded_rect_filled(x + 7, y + 13, 15, 7, 3, 0xFF62A8F5);
draw_rounded_rect_filled(x + 8, y + 12, 13, 5, 3, 0xFF7DB8F8);
draw_rounded_rect_filled(x + 5, y + 17, 38, 23, 5, 0xFFCDE4FA);
draw_rounded_rect_filled(x + 7, y + 19, 34, 19, 4, 0xFFEAF5FF);
draw_rect(x + 12, y + 23, 24, 2, 0xFF88B8D8);
draw_rect(x + 12, y + 27, 17, 2, 0xFF88B8D8);
draw_rect(x + 12, y + 31, 21, 2, 0xFF88B8D8);
}
static void draw_dock_settings(int x, int y) {
draw_rounded_rect_filled(x, y, 48, 48, 10, 0xFF3A3A3A);
draw_rounded_rect_filled(x + 1, y + 1, 46, 28, 9, 0xFF6E6E6E);
draw_rounded_rect_filled(x + 1, y + 24, 46, 23, 9, 0xFF4A4A4A);
int cx = x + 24, cy = y + 25;
draw_rounded_rect_filled(cx - 4, cy - 18, 8, 7, 2, 0xFFCCCCCC);
draw_rounded_rect_filled(cx - 4, cy + 11, 8, 7, 2, 0xFFCCCCCC);
draw_rounded_rect_filled(cx - 18, cy - 4, 7, 8, 2, 0xFFCCCCCC);
draw_rounded_rect_filled(cx + 11, cy - 4, 7, 8, 2, 0xFFCCCCCC);
draw_rounded_rect_filled(cx - 14, cy - 14, 6, 6, 2, 0xFFCCCCCC);
draw_rounded_rect_filled(cx + 8, cy - 14, 6, 6, 2, 0xFFCCCCCC);
draw_rounded_rect_filled(cx - 14, cy + 8, 6, 6, 2, 0xFFCCCCCC);
draw_rounded_rect_filled(cx + 8, cy + 8, 6, 6, 2, 0xFFCCCCCC);
draw_filled_circle(cx, cy, 13, 0xFFCCCCCC);
draw_filled_circle(cx, cy, 6, 0xFF4A4A4A);
draw_filled_circle(cx, cy, 4, 0xFF3A3A3A);
}
static void draw_dock_notepad(int x, int y) {
draw_rounded_rect_filled(x, y, 48, 48, 10, 0xFFCC9A00);
draw_rounded_rect_filled(x + 1, y + 1, 46, 28, 9, 0xFFFFD700);
draw_rounded_rect_filled(x + 1, y + 24, 46, 23, 9, 0xFFE8BC00);
draw_rounded_rect_filled(x + 7, y + 9, 34, 32, 3, 0xFFFFFDE7);
draw_rounded_rect_filled(x + 7, y + 9, 34, 8, 3, 0xFFFFCA28);
draw_rect(x + 7, y + 13, 34, 4, 0xFFFFCA28);
draw_rect(x + 11, y + 21, 18, 2, 0xFFBBAA70);
draw_rect(x + 11, y + 25, 26, 1, 0xFFCCBB88);
draw_rect(x + 11, y + 28, 22, 1, 0xFFCCBB88);
draw_rect(x + 11, y + 31, 24, 1, 0xFFCCBB88);
draw_rect(x + 11, y + 34, 18, 1, 0xFFCCBB88);
draw_rect(x + 32, y + 11, 3, 13, 0xFFF5DEB3);
draw_rect(x + 32, y + 9, 3, 4, 0xFFFF9800);
draw_rect(x + 33, y + 24, 1, 2, 0xFF555555);
}
static void draw_dock_calculator(int x, int y) {
draw_rounded_rect_filled(x, y, 48, 48, 10, 0xFF111111);
draw_rounded_rect_filled(x + 1, y + 1, 46, 28, 9, 0xFF222222);
draw_rounded_rect_filled(x + 1, y + 24, 46, 23, 9, 0xFF151515);
draw_rounded_rect_filled(x + 6, y + 6, 36, 11, 3, 0xFF1A3A2A);
draw_rect(x + 25, y + 9, 14, 5, 0xFF33FF88);
// 3x3 button grid
uint32_t btn_clr[3][3] = {
{0xFF555555, 0xFF555555, 0xFF555555},
{0xFF444444, 0xFF444444, 0xFF444444},
{0xFF444444, 0xFF444444, 0xFFFF9500},
};
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
draw_rounded_rect_filled(x + 10 + col * 9, y + 22 + row * 6, 7, 5, 2, btn_clr[row][col]);
}
}
}
static void draw_dock_terminal(int x, int y) {
draw_rounded_rect_filled(x, y, 48, 48, 10, 0xFF0A0A0A);
draw_rounded_rect_filled(x + 1, y + 1, 46, 28, 9, 0xFF161616);
draw_rounded_rect_filled(x + 1, y + 24, 46, 23, 9, 0xFF0D0D0D);
int px = x + 12;
int py = y + 24;
for (int i = 0; i < 6; i++) {
draw_rect(px + i, py - 4 + i, 2, 1, 0xFF33DD33);
}
for (int i = 0; i < 6; i++) {
draw_rect(px + i, py + 4 - i, 2, 1, 0xFF33DD33);
}
draw_rect(px + 10, py + 7, 8, 1, 0xFF33DD33);
}
static void draw_dock_minesweeper(int x, int y) {
draw_rounded_rect_filled(x, y, 48, 48, 10, 0xFF1B5E20);
draw_rounded_rect_filled(x + 1, y + 1, 46, 28, 9, 0xFF4CAF50);
draw_rounded_rect_filled(x + 1, y + 24, 46, 23, 9, 0xFF388E3C);
for (int row = 0; row < 5; row++) {
for (int col = 0; col < 5; col++) {
int bx = x + 6 + col * 8, by = y + 7 + row * 8;
if ((row == 2 && col == 2)) {
draw_rounded_rect_filled(bx, by, 6, 6, 1, 0xFFC8E6C9);
} else if ((row + col) % 2 == 0) {
draw_rounded_rect_filled(bx, by, 6, 6, 1, 0xFF81C784);
draw_rect(bx, by, 6, 1, 0xFFA5D6A7);
draw_rect(bx, by, 1, 6, 0xFFA5D6A7);
draw_rect(bx + 5, by + 1, 1, 5, 0xFF2E7D32);
draw_rect(bx + 1, by + 5, 5, 1, 0xFF2E7D32);
} else {
draw_rounded_rect_filled(bx, by, 6, 6, 1, 0xFF66BB6A);
draw_rect(bx, by, 6, 1, 0xFF81C784);
draw_rect(bx, by, 1, 6, 0xFF81C784);
}
}
}
int mx = x + 6 + 2 * 8 + 3, my = y + 7 + 2 * 8 + 3;
draw_filled_circle(mx, my, 4, 0xFF111111);
draw_rect(mx - 5, my - 1, 11, 2, 0xFF111111);
draw_rect(mx - 1, my - 5, 2, 11, 0xFF111111);
draw_rect(mx - 3, my - 3, 2, 2, 0xFF111111);
draw_rect(mx + 1, my - 3, 2, 2, 0xFF111111);
draw_rect(mx - 3, my + 1, 2, 2, 0xFF111111);
draw_rect(mx + 1, my + 1, 2, 2, 0xFF111111);
draw_rect(mx - 1, my - 2, 2, 2, 0xFFFFFFFF);
draw_rect(x + 7, y + 40, 1, 6, 0xFF333333);
draw_rect(x + 8, y + 40, 4, 3, 0xFFFF3333);
}
static void draw_dock_paint(int x, int y) {
draw_rounded_rect_filled(x, y, 48, 48, 10, 0xFFBBBBBB);
draw_rounded_rect_filled(x + 1, y + 1, 46, 28, 9, 0xFFFFFFFF);
draw_rounded_rect_filled(x + 1, y + 24, 46, 23, 9, 0xFFEEEEEE);
draw_rounded_rect_filled(x + 6, y + 9, 36, 30, 10, 0xFFEEDDB0);
draw_rounded_rect_filled(x + 8, y + 11, 32, 26, 8, 0xFFF5E8C0);
draw_filled_circle(x + 35, y + 32, 5, 0xFFEEDDB0);
draw_filled_circle(x + 35, y + 32, 3, 0xFFFFFFFF);
draw_filled_circle(x + 15, y + 18, 5, 0xFFFF3333);
draw_filled_circle(x + 23, y + 14, 5, 0xFF3399FF);
draw_filled_circle(x + 31, y + 18, 5, 0xFFFFCC00);
draw_filled_circle(x + 28, y + 27, 5, 0xFF33CC33);
draw_filled_circle(x + 16, y + 27, 5, 0xFFFF6600);
draw_rect(x + 30, y + 30, 3, 14, 0xFF8B6914);
draw_rounded_rect_filled(x + 29, y + 27, 5, 5, 2, 0xFFBBBBBB);
draw_rounded_rect_filled(x + 30, y + 22, 3, 7, 1, 0xFF1A1A1A);
}
static void draw_dock_editor(int x, int y) {
draw_rounded_rect_filled(x, y, 48, 48, 10, 0xFF0A1628);
draw_rounded_rect_filled(x + 1, y + 1, 46, 28, 9, 0xFF1565C0);
draw_rounded_rect_filled(x + 1, y + 24, 46, 23, 9, 0xFF0D47A1);
draw_rect(x + 5, y + 8, 9, 32, 0xFF1A237E);
draw_filled_circle(x + 10, y + 14, 2, 0xFF7986CB);
draw_filled_circle(x + 10, y + 22, 2, 0xFF7986CB);
draw_filled_circle(x + 10, y + 30, 2, 0xFF7986CB);
draw_rect(x + 15, y + 8, 28, 32, 0xFF1B2B3C);
draw_rect(x + 15, y + 8, 14, 5, 0xFF1B2B3C);
draw_rect(x + 15, y + 8, 14, 1, 0xFF569CD6);
draw_rect(x + 18, y + 13, 9, 2, 0xFF569CD6);
draw_rect(x + 29, y + 13, 8, 2, 0xFF4EC9B0);
draw_rect(x + 18, y + 18, 5, 2, 0xFFCE9178);
draw_rect(x + 25, y + 18, 7, 2, 0xFFCE9178);
draw_rect(x + 21, y + 23, 7, 2, 0xFF9CDCFE);
draw_rect(x + 30, y + 23, 5, 2, 0xFFD4D4D4);
draw_rect(x + 18, y + 28, 16, 2, 0xFF6A9955);
draw_rect(x + 18, y + 33, 10, 2, 0xFFD4D4D4);
draw_rect(x + 30, y + 33, 6, 2, 0xFF569CD6);
}
void draw_window(Window *win) { void draw_window(Window *win) {
if (!win->visible) return; if (!win->visible) return;
@ -607,18 +778,20 @@ void draw_window(Window *win) {
// Border/Shadow effect // Border/Shadow effect
draw_rounded_rect_filled(win->x - 1, win->y - 1, win->w + 2, win->h + 2, 8, 0xFF000000); draw_rounded_rect_filled(win->x - 1, win->y - 1, win->w + 2, win->h + 2, 8, 0xFF000000);
// Main window body // Main window body (fully rounded)
draw_rounded_rect_filled(win->x, win->y, win->w, win->h, 8, COLOR_DARK_PANEL); draw_rounded_rect_filled(win->x, win->y, win->w, win->h, 8, COLOR_DARK_PANEL);
// Title Bar // Title Bar (rounded at top only - overdraw bottom to hide rounding)
draw_rounded_rect_filled(win->x, win->y, win->w, 22, 8, COLOR_DARK_TITLEBAR); draw_rounded_rect_filled(win->x, win->y, win->w, 20, 8, COLOR_DARK_TITLEBAR);
draw_string(win->x + 28, win->y + 7, win->title, COLOR_DARK_TEXT); draw_rect(win->x, win->y + 12, win->w, 8, COLOR_DARK_TITLEBAR); // Cover bottom rounded corners
draw_string(win->x + 28, win->y + 5, win->title, COLOR_DARK_TEXT);
// Traffic Light (close button - red) // Traffic Light (close button - red)
draw_traffic_light(win->x + 8, win->y + 5); draw_traffic_light(win->x + 8, win->y + 2);
// Client Area with dark background (no rounding) // Client Area with dark background, rounded only at bottom
draw_rect(win->x, win->y + 22, win->w, win->h - 22, COLOR_DARK_BG); draw_rounded_rect_filled(win->x, win->y + 20, win->w, win->h - 20, 8, COLOR_DARK_BG);
draw_rect(win->x, win->y + 20, win->w, 8, COLOR_DARK_BG);
if (win->paint) { if (win->paint) {
win->paint(win); win->paint(win);
@ -720,8 +893,8 @@ void wm_paint(void) {
graphics_clear_clipping(); graphics_clear_clipping();
} }
// 1. Desktop Background (dark mode) // 1. Desktop Background (respects wallpaper color/pattern)
draw_rect(0, 0, sw, sh, COLOR_DARK_BG); draw_desktop_background();
// Draw Desktop Icons // Draw Desktop Icons
for (int i = 0; i < desktop_icon_count; i++) { for (int i = 0; i < desktop_icon_count; i++) {
@ -747,10 +920,10 @@ void wm_paint(void) {
else if (str_starts_with(icon->name, "Calculator")) draw_calculator_icon(icon->x, icon->y, label); else if (str_starts_with(icon->name, "Calculator")) draw_calculator_icon(icon->x, icon->y, label);
else if (str_starts_with(icon->name, "Terminal")) draw_terminal_icon(icon->x, icon->y, label); else if (str_starts_with(icon->name, "Terminal")) draw_terminal_icon(icon->x, icon->y, label);
else if (str_starts_with(icon->name, "Minesweeper")) draw_minesweeper_icon(icon->x, icon->y, label); else if (str_starts_with(icon->name, "Minesweeper")) draw_minesweeper_icon(icon->x, icon->y, label);
else if (str_starts_with(icon->name, "Settings")) draw_settings_icon(icon->x, icon->y, label); else if (str_starts_with(icon->name, "Settings")) draw_control_panel_icon(icon->x, icon->y, label);
else if (str_starts_with(icon->name, "About")) draw_about_icon(icon->x, icon->y, label); else if (str_starts_with(icon->name, "About")) draw_about_icon(icon->x, icon->y, label);
else if (str_starts_with(icon->name, "Recycle Bin")) draw_recycle_bin_icon(icon->x, icon->y, label); else if (str_starts_with(icon->name, "Recycle Bin")) draw_recycle_bin_icon(icon->x, icon->y, label);
else if (str_starts_with(icon->name, "Files")) draw_files_icon(icon->x, icon->y, label); else if (str_starts_with(icon->name, "Files")) draw_folder_icon(icon->x, icon->y, label);
else if (str_starts_with(icon->name, "Paint")) draw_paint_icon(icon->x, icon->y, label); else if (str_starts_with(icon->name, "Paint")) draw_paint_icon(icon->x, icon->y, label);
else draw_icon(icon->x, icon->y, label); else draw_icon(icon->x, icon->y, label);
} else { } else {
@ -796,8 +969,8 @@ void wm_paint(void) {
draw_window(win); draw_window(win);
} }
// 4. Top Menu Bar (macOS style) // 4. Top Menu Bar
draw_rect(0, 0, sw, 40, COLOR_TOPBAR_BG); draw_rect(0, 0, sw, 30, COLOR_TOPBAR_BG);
// Logo dropdown (top-left) // Logo dropdown (top-left)
draw_boredos_logo(8, 8, 1); draw_boredos_logo(8, 8, 1);
@ -807,7 +980,7 @@ void wm_paint(void) {
// Top menu dropdown (if logo clicked) // Top menu dropdown (if logo clicked)
if (start_menu_open) { if (start_menu_open) {
int menu_h = 100; int menu_h = 85;
draw_rounded_rect_filled(8, 40, 160, menu_h, 8, COLOR_DARK_PANEL); draw_rounded_rect_filled(8, 40, 160, menu_h, 8, COLOR_DARK_PANEL);
draw_string(20, 48, "About BoredOS", COLOR_DARK_TEXT); draw_string(20, 48, "About BoredOS", COLOR_DARK_TEXT);
draw_string(20, 68, "Settings", COLOR_DARK_TEXT); draw_string(20, 68, "Settings", COLOR_DARK_TEXT);
@ -820,7 +993,7 @@ void wm_paint(void) {
int dock_y = sh - dock_h - 6; // Float above bottom int dock_y = sh - dock_h - 6; // Float above bottom
int dock_item_size = 48; int dock_item_size = 48;
int dock_spacing = 10; int dock_spacing = 10;
int total_dock_width = 8 * (dock_item_size + dock_spacing); int total_dock_width = 7 * (dock_item_size + dock_spacing);
int dock_bg_x = (sw - total_dock_width) / 2 - 12; // Rounded background extends beyond icons int dock_bg_x = (sw - total_dock_width) / 2 - 12; // Rounded background extends beyond icons
int dock_bg_w = total_dock_width + 24; int dock_bg_w = total_dock_width + 24;
draw_rounded_rect_filled(dock_bg_x, dock_y, dock_bg_w, dock_h, 18, COLOR_DOCK_BG); draw_rounded_rect_filled(dock_bg_x, dock_y, dock_bg_w, dock_h, 18, COLOR_DOCK_BG);
@ -829,36 +1002,20 @@ void wm_paint(void) {
int dock_x = (sw - total_dock_width) / 2; int dock_x = (sw - total_dock_width) / 2;
int dock_item_y = dock_y + 6; int dock_item_y = dock_y + 6;
// Files app draw_dock_files(dock_x, dock_item_y);
draw_rounded_rect_filled(dock_x, dock_item_y, dock_item_size, dock_item_size, 10, 0xFF4A90E2);
dock_x += dock_item_size + dock_spacing; dock_x += dock_item_size + dock_spacing;
draw_dock_settings(dock_x, dock_item_y);
// Settings app
draw_rounded_rect_filled(dock_x, dock_item_y, dock_item_size, dock_item_size, 10, 0xFF888888);
dock_x += dock_item_size + dock_spacing; dock_x += dock_item_size + dock_spacing;
draw_dock_notepad(dock_x, dock_item_y);
// Notepad
draw_rounded_rect_filled(dock_x, dock_item_y, dock_item_size, dock_item_size, 10, 0xFFFFD700);
dock_x += dock_item_size + dock_spacing; dock_x += dock_item_size + dock_spacing;
draw_dock_calculator(dock_x, dock_item_y);
// Calculator
draw_rounded_rect_filled(dock_x, dock_item_y, dock_item_size, dock_item_size, 10, 0xFFFF6B6B);
dock_x += dock_item_size + dock_spacing; dock_x += dock_item_size + dock_spacing;
draw_dock_terminal(dock_x, dock_item_y);
// Terminal
draw_rounded_rect_filled(dock_x, dock_item_y, dock_item_size, dock_item_size, 10, 0xFF000000);
dock_x += dock_item_size + dock_spacing; dock_x += dock_item_size + dock_spacing;
draw_dock_minesweeper(dock_x, dock_item_y);
// Minesweeper
draw_rounded_rect_filled(dock_x, dock_item_y, dock_item_size, dock_item_size, 10, 0xFF808080);
dock_x += dock_item_size + dock_spacing; dock_x += dock_item_size + dock_spacing;
draw_dock_paint(dock_x, dock_item_y);
// Paint // Editor removed from dock
draw_rounded_rect_filled(dock_x, dock_item_y, dock_item_size, dock_item_size, 10, 0xFF4CAF50);
dock_x += dock_item_size + dock_spacing;
// Editor
draw_rounded_rect_filled(dock_x, dock_item_y, dock_item_size, dock_item_size, 10, 0xFF2196F3);
// Desktop Context Menu (with rounded corners) // Desktop Context Menu (with rounded corners)
if (desktop_menu_visible) { if (desktop_menu_visible) {
@ -1091,7 +1248,7 @@ void wm_handle_click(int x, int y) {
} }
} else if (desktop_dialog_state == 1 || desktop_dialog_state == 2) { // Create File/Folder } else if (desktop_dialog_state == 1 || desktop_dialog_state == 2) { // Create File/Folder
if (desktop_icon_count >= desktop_max_cols * desktop_max_rows_per_col) { if (desktop_icon_count >= desktop_max_cols * desktop_max_rows_per_col) {
wm_show_message("Error", "Desktop is full!"); // This message is now based on the adjusted limit wm_show_message("Error", "Desktop is full!");
} else if (desktop_dialog_input[0] != 0) { } else if (desktop_dialog_input[0] != 0) {
char path[128] = "/Desktop/"; char path[128] = "/Desktop/";
int p=9; int n=0; while(desktop_dialog_input[n]) path[p++] = desktop_dialog_input[n++]; path[p]=0; int p=9; int n=0; while(desktop_dialog_input[n]) path[p++] = desktop_dialog_input[n++]; path[p]=0;
@ -1170,7 +1327,7 @@ void wm_handle_click(int x, int y) {
wm_bring_to_front(topmost); wm_bring_to_front(topmost);
// Check traffic light close button (now at top-left) // Check traffic light close button (now at top-left)
if (rect_contains(topmost->x + 8, topmost->y + 9, 12, 12, x, y)) { if (rect_contains(topmost->x + 8, topmost->y + 2, 12, 12, x, y)) {
topmost->visible = false; topmost->visible = false;
// Reset window state on close // Reset window state on close
if (topmost == &win_explorer) { if (topmost == &win_explorer) {
@ -1308,7 +1465,7 @@ void wm_handle_right_click(int x, int y) {
int dock_y = sh - dock_h - 6; // Float above bottom int dock_y = sh - dock_h - 6; // Float above bottom
int dock_item_size = 48; int dock_item_size = 48;
int dock_spacing = 10; int dock_spacing = 10;
int total_dock_width = 8 * (dock_item_size + dock_spacing); int total_dock_width = 7 * (dock_item_size + dock_spacing);
int dock_bg_x = (sw - total_dock_width) / 2 - 12; int dock_bg_x = (sw - total_dock_width) / 2 - 12;
int dock_bg_w = total_dock_width + 24; int dock_bg_w = total_dock_width + 24;
@ -1326,7 +1483,6 @@ void wm_handle_right_click(int x, int y) {
else if (item == 4) start_menu_pending_app = "Terminal"; else if (item == 4) start_menu_pending_app = "Terminal";
else if (item == 5) start_menu_pending_app = "Minesweeper"; else if (item == 5) start_menu_pending_app = "Minesweeper";
else if (item == 6) start_menu_pending_app = "Paint"; else if (item == 6) start_menu_pending_app = "Paint";
else if (item == 7) start_menu_pending_app = "Editor";
} }
} else { } else {
wm_handle_click(mx, my); wm_handle_click(mx, my);
@ -1416,8 +1572,7 @@ void wm_handle_right_click(int x, int y) {
if (start_menu_pending_app) { if (start_menu_pending_app) {
// Launch App // Launch App
if (str_starts_with(start_menu_pending_app, "Files")) { if (str_starts_with(start_menu_pending_app, "Files")) {
explorer_reset(); explorer_open_directory("/");
wm_bring_to_front(&win_explorer);
} else if (str_starts_with(start_menu_pending_app, "Notepad")) { } else if (str_starts_with(start_menu_pending_app, "Notepad")) {
notepad_reset(); notepad_reset();
wm_bring_to_front(&win_notepad); wm_bring_to_front(&win_notepad);
@ -1465,9 +1620,8 @@ void wm_handle_right_click(int x, int y) {
wm_bring_to_front(&win_cmd); handled = true; wm_bring_to_front(&win_cmd); handled = true;
} else if (str_ends_with(icon->name, "About.shortcut")) { } else if (str_ends_with(icon->name, "About.shortcut")) {
wm_bring_to_front(&win_about); handled = true; wm_bring_to_front(&win_about); handled = true;
} else if (str_ends_with(icon->name, "Explorer.shortcut")) { // Files } else if (str_ends_with(icon->name, "Files.shortcut")) {
explorer_reset(); explorer_open_directory("/"); handled = true;
wm_bring_to_front(&win_explorer);
} else if (str_ends_with(icon->name, "Recycle Bin.shortcut")) { } else if (str_ends_with(icon->name, "Recycle Bin.shortcut")) {
explorer_open_directory("/RecycleBin"); handled = true; explorer_open_directory("/RecycleBin"); handled = true;
} else if (str_ends_with(icon->name, "Paint.shortcut")) { } else if (str_ends_with(icon->name, "Paint.shortcut")) {
@ -1593,7 +1747,7 @@ void wm_handle_right_click(int x, int y) {
if (!dropped_on_target && !from_desktop) { if (!dropped_on_target && !from_desktop) {
// Dragged from Explorer to Desktop // Dragged from Explorer to Desktop
// Check limit first // Check limit first
if (desktop_icon_count >= desktop_max_cols * (desktop_max_rows_per_col > 1 ? desktop_max_rows_per_col - 1 : 0)) { if (desktop_icon_count >= desktop_max_cols * desktop_max_rows_per_col) {
wm_show_message("Error", "Desktop is full!"); wm_show_message("Error", "Desktop is full!");
} else { } else {
explorer_import_file_to(&win_explorer, drag_file_path, "/Desktop"); explorer_import_file_to(&win_explorer, drag_file_path, "/Desktop");
@ -1937,9 +2091,8 @@ void wm_timer_tick(void) {
if (current_sec != last_second) { if (current_sec != last_second) {
last_second = current_sec; last_second = current_sec;
int sw = get_screen_width(); int sw = get_screen_width();
int sh = get_screen_height(); // Mark clock area in the top menu bar (around draw_clock at sw - 80, y=12)
// Mark clock area + a bit of buffer wm_mark_dirty(sw - 110, 6, 110, 24);
wm_mark_dirty(sw - 90, sh - 30, 90, 20);
} }
// If force_redraw is set, do a full redraw // If force_redraw is set, do a full redraw

View file

@ -23,7 +23,8 @@
#define COLOR_APPLE_INDIGO 0xFF4B0082 #define COLOR_APPLE_INDIGO 0xFF4B0082
#define COLOR_APPLE_VIOLET 0xFF9400D3 #define COLOR_APPLE_VIOLET 0xFF9400D3
// --- Dark Mode Colors (macOS Style) --- // --- Dark Mode Colors ---
#define COLOR_NOTEPAD_BG 0xFFF5F5DC
#define COLOR_DARK_BG 0xFF1E1E1E // Main dark background #define COLOR_DARK_BG 0xFF1E1E1E // Main dark background
#define COLOR_DARK_PANEL 0xFF2D2D2D // Slightly lighter panel background #define COLOR_DARK_PANEL 0xFF2D2D2D // Slightly lighter panel background
#define COLOR_DARK_TITLEBAR 0xFF282828 // Darker for title bar #define COLOR_DARK_TITLEBAR 0xFF282828 // Darker for title bar