mirror of
https://github.com/BoredDevNL/BoredOS.git
synced 2026-05-15 10:48:38 +00:00
V1.60
This commit is contained in:
parent
b4cccb0eb3
commit
f6e53fa7c6
30 changed files with 526 additions and 320 deletions
BIN
boredos.iso
BIN
boredos.iso
Binary file not shown.
BIN
build/about.o
BIN
build/about.o
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/cmd.o
BIN
build/cmd.o
Binary file not shown.
Binary file not shown.
BIN
build/editor.o
BIN
build/editor.o
Binary file not shown.
BIN
build/explorer.o
BIN
build/explorer.o
Binary file not shown.
BIN
build/fat32.o
BIN
build/fat32.o
Binary file not shown.
BIN
build/icmp.o
BIN
build/icmp.o
Binary file not shown.
BIN
build/main.o
BIN
build/main.o
Binary file not shown.
BIN
build/markdown.o
BIN
build/markdown.o
Binary file not shown.
Binary file not shown.
BIN
build/notepad.o
BIN
build/notepad.o
Binary file not shown.
BIN
build/paint.o
BIN
build/paint.o
Binary file not shown.
BIN
build/ps2.o
BIN
build/ps2.o
Binary file not shown.
BIN
build/vm.o
BIN
build/vm.o
Binary file not shown.
BIN
build/wm.o
BIN
build/wm.o
Binary file not shown.
Binary file not shown.
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -802,20 +802,35 @@ 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) {
|
||||||
const char *p = filename;
|
full_exec_path[i++] = cmd_state->current_drive;
|
||||||
while (*p && i < 509) {
|
full_exec_path[i++] = ':';
|
||||||
full_exec_path[i++] = *p++;
|
|
||||||
|
// 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++] = '/';
|
||||||
}
|
}
|
||||||
full_exec_path[i] = 0;
|
|
||||||
filename = full_exec_path;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add the relative path argument
|
||||||
|
const char *p = filename;
|
||||||
|
while (*p && i < 509) {
|
||||||
|
full_exec_path[i++] = *p++;
|
||||||
|
}
|
||||||
|
full_exec_path[i] = 0;
|
||||||
|
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"
|
||||||
|
|
|
||||||
|
|
@ -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 settings", COLOR_DKGRAY);
|
||||||
draw_string(offset_x + 60, offset_y + item_y + 35, "Pointer and trackpad", 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;
|
||||||
|
|
|
||||||
|
|
@ -147,18 +147,11 @@ 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;
|
temp_len = 1;
|
||||||
} else {
|
} else {
|
||||||
if (drive != current_drive) {
|
fs_strcpy(temp, current_dir);
|
||||||
temp[0] = '/';
|
temp_len = fs_strlen(temp);
|
||||||
temp[1] = 0;
|
|
||||||
temp_len = 1;
|
|
||||||
} else {
|
|
||||||
fs_strcpy(temp, current_dir);
|
|
||||||
temp_len = fs_strlen(temp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
289
src/kernel/wm.c
289
src/kernel/wm.c
|
|
@ -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,13 +233,13 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
found:
|
found:
|
||||||
if (found_col != -1) {
|
if (found_col != -1) {
|
||||||
desktop_icons[i].x = 20 + found_col * 80;
|
desktop_icons[i].x = 20 + found_col * 80;
|
||||||
desktop_icons[i].y = 20 + found_row * 80;
|
desktop_icons[i].y = 20 + found_row * 80;
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue