mirror of
https://github.com/BoredDevNL/BoredOS.git
synced 2026-05-15 10:48:38 +00:00
command history buffer
This commit is contained in:
parent
5ef2297049
commit
16dceee238
9 changed files with 78 additions and 3 deletions
BIN
brewos.iso
BIN
brewos.iso
Binary file not shown.
BIN
build/about.o
BIN
build/about.o
Binary file not shown.
BIN
build/brewos.elf
BIN
build/brewos.elf
Binary file not shown.
Binary file not shown.
BIN
build/cmd.o
BIN
build/cmd.o
Binary file not shown.
|
|
@ -1,4 +1,4 @@
|
|||
# Brew OS 1.10 Alpha
|
||||
# Brew OS 1.12 Alpha
|
||||
|
||||
## Brewkernel is now BrewOS!
|
||||
Brewkernel will from now on be deprecated as it's core became too messy. I have built a less bloated kernel and wrote a DE above it, which is why it is now an OS instead of a kernel (in my opinion).
|
||||
|
|
|
|||
Binary file not shown.
1
limine
Submodule
1
limine
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 5468ab25166aed2f4cce9fe1a71066acf492f5ea
|
||||
|
|
@ -181,6 +181,47 @@ static void itoa(int n, char *buf) {
|
|||
}
|
||||
}
|
||||
|
||||
// --- History ---
|
||||
#define HISTORY_MAX 16
|
||||
static char cmd_history[HISTORY_MAX][CMD_COLS + 1];
|
||||
static int history_head = 0;
|
||||
static int history_len = 0;
|
||||
static int history_pos = -1;
|
||||
static char history_save_buf[CMD_COLS + 1];
|
||||
|
||||
static void cmd_history_add(const char *cmd) {
|
||||
if (!cmd || !*cmd) return;
|
||||
|
||||
// Don't add if same as last command
|
||||
int last_idx = (history_head - 1 + HISTORY_MAX) % HISTORY_MAX;
|
||||
if (history_len > 0 && cmd_strcmp(cmd, cmd_history[last_idx]) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
cmd_strcpy(cmd_history[history_head], cmd);
|
||||
history_head = (history_head + 1) % HISTORY_MAX;
|
||||
if (history_len < HISTORY_MAX) history_len++;
|
||||
}
|
||||
|
||||
static void cmd_clear_line_content(void) {
|
||||
int prompt_len = cmd_strlen(PROMPT);
|
||||
for (int i = prompt_len; i < CMD_COLS; i++) {
|
||||
screen_buffer[cursor_row][i].c = ' ';
|
||||
screen_buffer[cursor_row][i].color = current_color;
|
||||
}
|
||||
cursor_col = prompt_len;
|
||||
}
|
||||
|
||||
static void cmd_set_line_content(const char *str) {
|
||||
cmd_clear_line_content();
|
||||
while (*str && cursor_col < CMD_COLS) {
|
||||
screen_buffer[cursor_row][cursor_col].c = *str;
|
||||
screen_buffer[cursor_row][cursor_col].color = current_color;
|
||||
cursor_col++;
|
||||
str++;
|
||||
}
|
||||
}
|
||||
|
||||
// Manual and license pages are now in the individual command files
|
||||
|
||||
// --- Terminal Emulation ---
|
||||
|
|
@ -770,13 +811,46 @@ static void cmd_key(Window *target, char c) {
|
|||
|
||||
cmd_putchar('\n');
|
||||
|
||||
if (len > 0) cmd_history_add(cmd_buf);
|
||||
history_pos = -1;
|
||||
|
||||
cmd_exec(cmd_buf);
|
||||
|
||||
cmd_write(PROMPT);
|
||||
} else if (c == 17) { // UP
|
||||
// History not implemented
|
||||
} else if (c == 18) { // DOWN
|
||||
if (history_len > 0) {
|
||||
if (history_pos == -1) {
|
||||
// Save current line
|
||||
int len = 0;
|
||||
int prompt_len = cmd_strlen(PROMPT);
|
||||
for (int i = prompt_len; i < CMD_COLS; i++) {
|
||||
char ch = screen_buffer[cursor_row][i].c;
|
||||
if (ch == 0) break;
|
||||
history_save_buf[len++] = ch;
|
||||
}
|
||||
while (len > 0 && history_save_buf[len-1] == ' ') len--;
|
||||
history_save_buf[len] = 0;
|
||||
|
||||
history_pos = (history_head - 1 + HISTORY_MAX) % HISTORY_MAX;
|
||||
} else {
|
||||
int oldest = (history_head - history_len + HISTORY_MAX) % HISTORY_MAX;
|
||||
if (history_pos != oldest) {
|
||||
history_pos = (history_pos - 1 + HISTORY_MAX) % HISTORY_MAX;
|
||||
}
|
||||
}
|
||||
cmd_set_line_content(cmd_history[history_pos]);
|
||||
}
|
||||
} else if (c == 18) { // DOWN
|
||||
if (history_pos != -1) {
|
||||
int newest = (history_head - 1 + HISTORY_MAX) % HISTORY_MAX;
|
||||
if (history_pos == newest) {
|
||||
history_pos = -1;
|
||||
cmd_set_line_content(history_save_buf);
|
||||
} else {
|
||||
history_pos = (history_pos + 1) % HISTORY_MAX;
|
||||
cmd_set_line_content(cmd_history[history_pos]);
|
||||
}
|
||||
}
|
||||
} else if (c == 19) { // LEFT
|
||||
if (cursor_col > (int)cmd_strlen(PROMPT)) {
|
||||
cursor_col--;
|
||||
|
|
|
|||
Loading…
Reference in a new issue