This commit is contained in:
boreddevnl 2026-02-28 22:54:02 +01:00
parent 74bdb89ad3
commit 4c0d9886aa
6 changed files with 73 additions and 21 deletions

Binary file not shown.

Binary file not shown.

View file

@ -417,9 +417,7 @@ void cmd_load_config(void) {
} }
// System Call Helper // System Call Helper
uint64_t cmd_get_config_value(const char *key) { uint32_t cmd_get_config_value(const char *key) {
if (cmd_strcmp(key, "prompt_drive_color") == 0) return shell_config.prompt_drive_color;
if (cmd_strcmp(key, "prompt_colon_color") == 0) return shell_config.prompt_colon_color;
if (cmd_strcmp(key, "prompt_drive_color") == 0) return shell_config.prompt_drive_color; if (cmd_strcmp(key, "prompt_drive_color") == 0) return shell_config.prompt_drive_color;
if (cmd_strcmp(key, "prompt_colon_color") == 0) return shell_config.prompt_colon_color; if (cmd_strcmp(key, "prompt_colon_color") == 0) return shell_config.prompt_colon_color;
if (cmd_strcmp(key, "prompt_dir_color") == 0) return shell_config.prompt_dir_color; if (cmd_strcmp(key, "prompt_dir_color") == 0) return shell_config.prompt_dir_color;
@ -427,8 +425,6 @@ uint64_t cmd_get_config_value(const char *key) {
if (cmd_strcmp(key, "default_text_color") == 0) return shell_config.default_text_color; if (cmd_strcmp(key, "default_text_color") == 0) return shell_config.default_text_color;
if (cmd_strcmp(key, "bg_color") == 0) return shell_config.bg_color; if (cmd_strcmp(key, "bg_color") == 0) return shell_config.bg_color;
if (cmd_strcmp(key, "cursor_color") == 0) return shell_config.cursor_color; if (cmd_strcmp(key, "cursor_color") == 0) return shell_config.cursor_color;
if (cmd_strcmp(key, "show_drive") == 0) return shell_config.show_drive;
if (cmd_strcmp(key, "show_dir") == 0) return shell_config.show_dir;
if (cmd_strcmp(key, "dir_color") == 0) return shell_config.dir_color; if (cmd_strcmp(key, "dir_color") == 0) return shell_config.dir_color;
if (cmd_strcmp(key, "file_color") == 0) return shell_config.file_color; if (cmd_strcmp(key, "file_color") == 0) return shell_config.file_color;
if (cmd_strcmp(key, "size_color") == 0) return shell_config.size_color; if (cmd_strcmp(key, "size_color") == 0) return shell_config.size_color;
@ -436,8 +432,13 @@ uint64_t cmd_get_config_value(const char *key) {
if (cmd_strcmp(key, "success_color") == 0) return shell_config.success_color; if (cmd_strcmp(key, "success_color") == 0) return shell_config.success_color;
if (cmd_strcmp(key, "help_color") == 0) return shell_config.help_color; if (cmd_strcmp(key, "help_color") == 0) return shell_config.help_color;
if (cmd_strcmp(key, "command_color") == 0) return shell_config.command_color; if (cmd_strcmp(key, "command_color") == 0) return shell_config.command_color;
// Return 1 for boolean true values
if (cmd_strcmp(key, "show_drive") == 0) return shell_config.show_drive;
if (cmd_strcmp(key, "show_dir") == 0) return shell_config.show_dir;
if (cmd_strcmp(key, "welcome_msg") == 0) return shell_config.welcome_msg; if (cmd_strcmp(key, "welcome_msg") == 0) return shell_config.welcome_msg;
if (cmd_strcmp(key, "history_save_prompt") == 0) return shell_config.history_save_prompt; if (cmd_strcmp(key, "history_save_prompt") == 0) return shell_config.history_save_prompt;
return 0; return 0;
} }
@ -515,7 +516,6 @@ static void cmd_set_line_content(const char *str) {
} }
} }
// --- Terminal Emulation ---
static void cmd_scroll_up() { static void cmd_scroll_up() {
for (int r = 1; r < CMD_ROWS; r++) { for (int r = 1; r < CMD_ROWS; r++) {
@ -1038,6 +1038,49 @@ static void cmd_exec_single(char *cmd) {
return; return;
} }
char *args_ptr = cmd;
while (*args_ptr && *args_ptr != ' ') {
args_ptr++;
}
char old_char = *args_ptr;
*args_ptr = '\0'; // Temporarily terminate to get just the command
bool is_path = false;
char *p = cmd;
while(*p) {
if (*p == '/' || *p == ':') {
is_path = true;
break;
}
p++;
}
if (is_path) {
FAT32_FileHandle *fh = fat32_open(cmd, "r");
if (fh) {
fat32_close(fh);
*args_ptr = old_char; // Restore command string
// Now properly split command and args
char *args = cmd;
while (*args && *args != ' ') args++;
if (*args) {
*args = 0; // Null terminate cmd
args++; // Point to start of args
}
cmd_is_waiting_for_process = true;
process_t *proc = process_create_elf(cmd, args);
if (proc) {
proc->is_terminal_proc = true;
proc->ui_window = &win_cmd;
}
return;
}
}
*args_ptr = old_char; // Restore command string if not found or not a path
if (cmd[0] == '.' && cmd[1] == '/') { if (cmd[0] == '.' && cmd[1] == '/') {
char *filename = cmd + 2; char *filename = cmd + 2;
@ -1384,9 +1427,8 @@ static void cmd_exec_single(char *cmd) {
cmd_write(cmd); cmd_write(cmd);
cmd_write("\n"); cmd_write("\n");
} }
// Execute command with redirection and pipe support // Execute command with redirection and pipe support
static void cmd_exec(char *cmd) { static void cmd_exec(char *cmd, bool print_prompt) {
// Check for pipe operator first // Check for pipe operator first
const char* pipe_pos = find_pipe(cmd); const char* pipe_pos = find_pipe(cmd);
if (pipe_pos) { if (pipe_pos) {
@ -1606,6 +1648,10 @@ static void cmd_exec(char *cmd) {
cmd_write(output_file); cmd_write(output_file);
cmd_write("\n"); cmd_write("\n");
} }
if (print_prompt) {
cmd_print_prompt();
}
} }
@ -1685,10 +1731,10 @@ static void cmd_key(Window *target, char c) {
if (len > 0) cmd_history_add(cmd_buf); if (len > 0) cmd_history_add(cmd_buf);
history_pos = -1; history_pos = -1;
cmd_exec(cmd_buf); cmd_exec(cmd_buf, true);
if (!cmd_is_waiting_for_process) { if (!cmd_is_waiting_for_process) {
cmd_print_prompt(); // cmd_print_prompt(); // This is now handled by cmd_exec
} }
} else if (c == 17) { // UP } else if (c == 17) { // UP
if (history_len > 0) { if (history_len > 0) {
@ -1756,8 +1802,11 @@ static void cmd_key(Window *target, char c) {
} }
} }
static void cmd_exec(char *cmd, bool print_prompt);
void cmd_reset(void) { void cmd_reset(void) {
// Reset terminal to fresh state // Reset terminal to fresh state
cmd_screen_clear();
cmd_load_config(); cmd_load_config();
cursor_row = 0; cursor_row = 0;
@ -1775,11 +1824,14 @@ void cmd_reset(void) {
} }
if (shell_config.startup_cmd[0]) { if (shell_config.startup_cmd[0]) {
// Run startup command without prompt prefix cmd_exec(shell_config.startup_cmd, false);
cmd_exec(shell_config.startup_cmd);
} }
cmd_print_prompt(); // If a startup command is running, it will print the prompt when it's done.
// Otherwise, we print it now.
if (!cmd_is_waiting_for_process) {
cmd_print_prompt();
}
} }
static void create_ramfs_files(void) { static void create_ramfs_files(void) {

View file

@ -22,7 +22,7 @@ void cmd_screen_clear(void);
void cmd_increment_msg_count(void); void cmd_increment_msg_count(void);
void cmd_reset_msg_count(void); void cmd_reset_msg_count(void);
uint64_t cmd_get_config_value(const char *key); uint32_t cmd_get_config_value(const char *key);
void cmd_set_current_color(uint32_t color); void cmd_set_current_color(uint32_t color);
#endif #endif

View file

@ -6,7 +6,7 @@
int main(int argc, char **argv) { int main(int argc, char **argv) {
(void)argc; (void)argv; (void)argc; (void)argv;
uint32_t help_color = sys_get_shell_config("help_color"); uint64_t help_color = sys_get_shell_config("help_color");
if (help_color != 0) sys_set_text_color(help_color); if (help_color != 0) sys_set_text_color(help_color);
printf("BoredOS CLI Help\n"); printf("BoredOS CLI Help\n");

View file

@ -5,11 +5,11 @@
#include <syscall.h> #include <syscall.h>
int main(int argc, char **argv) { int main(int argc, char **argv) {
uint32_t dir_color = (uint32_t)sys_get_shell_config("dir_color"); uint64_t dir_color = sys_get_shell_config("dir_color");
uint32_t file_color = (uint32_t)sys_get_shell_config("file_color"); uint64_t file_color = sys_get_shell_config("file_color");
uint32_t size_color = (uint32_t)sys_get_shell_config("size_color"); uint64_t size_color = sys_get_shell_config("size_color");
uint32_t error_color = (uint32_t)sys_get_shell_config("error_color"); uint64_t error_color = sys_get_shell_config("error_color");
uint32_t default_color = (uint32_t)sys_get_shell_config("default_text_color"); uint64_t default_color = sys_get_shell_config("default_text_color");
char path[256]; char path[256];
if (argc > 1) { if (argc > 1) {