增加光标闪烁

This commit is contained in:
2026-04-11 18:32:52 +08:00
parent 32637ee60b
commit 3bcff3c829
3 changed files with 51 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ void clks_tty_init(void);
void clks_tty_write(const char *text);
void clks_tty_write_char(char ch);
void clks_tty_switch(u32 tty_index);
void clks_tty_tick(u64 tick);
u32 clks_tty_active(void);
u32 clks_tty_count(void);
clks_bool clks_tty_ready(void);

View File

@@ -65,6 +65,7 @@ static void clks_task_kelfd(u64 tick) {
static void clks_task_usrd(u64 tick) {
clks_service_heartbeat(CLKS_SERVICE_USER, tick);
clks_userland_tick(tick);
clks_tty_tick(tick);
clks_shell_tick(tick);
}

View File

@@ -9,6 +9,8 @@
#define CLKS_TTY_FG 0x00E6E6E6U
#define CLKS_TTY_BG 0x00101010U
#define CLKS_TTY_CURSOR_BLINK_INTERVAL_TICKS 5ULL
#define CLKS_TTY_BLINK_TICK_UNSET 0xFFFFFFFFFFFFFFFFULL
static char clks_tty_cells[CLKS_TTY_COUNT][CLKS_TTY_MAX_ROWS][CLKS_TTY_MAX_COLS];
static u32 clks_tty_cursor_row[CLKS_TTY_COUNT];
@@ -21,6 +23,8 @@ static u32 clks_tty_cell_width = 8U;
static u32 clks_tty_cell_height = 8U;
static clks_bool clks_tty_is_ready = CLKS_FALSE;
static clks_bool clks_tty_cursor_visible = CLKS_FALSE;
static clks_bool clks_tty_blink_enabled = CLKS_TRUE;
static u64 clks_tty_blink_last_tick = CLKS_TTY_BLINK_TICK_UNSET;
static void clks_tty_fill_row(u32 tty_index, u32 row, char ch) {
u32 col;
@@ -38,6 +42,10 @@ static void clks_tty_draw_cell(u32 row, u32 col, char ch) {
clks_tty_draw_cell_with_colors(row, col, ch, CLKS_TTY_FG, CLKS_TTY_BG);
}
static void clks_tty_reset_blink_timer(void) {
clks_tty_blink_last_tick = CLKS_TTY_BLINK_TICK_UNSET;
}
static void clks_tty_hide_cursor(void) {
u32 row;
u32 col;
@@ -181,6 +189,8 @@ void clks_tty_init(void) {
clks_tty_active_index = 0;
clks_tty_is_ready = CLKS_TRUE;
clks_tty_cursor_visible = CLKS_FALSE;
clks_tty_blink_enabled = CLKS_TRUE;
clks_tty_reset_blink_timer();
clks_tty_redraw_active();
}
@@ -202,6 +212,7 @@ void clks_tty_write_char(char ch) {
if (ch == '\r') {
clks_tty_cursor_col[tty_index] = 0;
clks_tty_draw_cursor();
clks_tty_reset_blink_timer();
return;
}
@@ -215,12 +226,14 @@ void clks_tty_write_char(char ch) {
}
clks_tty_draw_cursor();
clks_tty_reset_blink_timer();
return;
}
if (ch == '\b') {
if (col == 0U && row == 0U) {
clks_tty_draw_cursor();
clks_tty_reset_blink_timer();
return;
}
@@ -235,6 +248,7 @@ void clks_tty_write_char(char ch) {
clks_tty_cursor_row[tty_index] = row;
clks_tty_cursor_col[tty_index] = col;
clks_tty_draw_cursor();
clks_tty_reset_blink_timer();
return;
}
@@ -260,6 +274,7 @@ void clks_tty_write_char(char ch) {
}
clks_tty_draw_cursor();
clks_tty_reset_blink_timer();
}
void clks_tty_write(const char *text) {
@@ -288,6 +303,40 @@ void clks_tty_switch(u32 tty_index) {
clks_tty_active_index = tty_index;
clks_tty_cursor_visible = CLKS_FALSE;
clks_tty_redraw_active();
clks_tty_reset_blink_timer();
}
void clks_tty_tick(u64 tick) {
if (clks_tty_is_ready == CLKS_FALSE || clks_tty_blink_enabled == CLKS_FALSE) {
return;
}
if (clks_tty_blink_last_tick == CLKS_TTY_BLINK_TICK_UNSET) {
clks_tty_blink_last_tick = tick;
if (clks_tty_cursor_visible == CLKS_FALSE) {
clks_tty_draw_cursor();
}
return;
}
if (tick < clks_tty_blink_last_tick) {
clks_tty_blink_last_tick = tick;
return;
}
if ((tick - clks_tty_blink_last_tick) < CLKS_TTY_CURSOR_BLINK_INTERVAL_TICKS) {
return;
}
clks_tty_blink_last_tick = tick;
if (clks_tty_cursor_visible == CLKS_TRUE) {
clks_tty_hide_cursor();
} else {
clks_tty_draw_cursor();
}
}
u32 clks_tty_active(void) {