From 0b1c1ccc8814e595036cede41e32700dfdd1608d Mon Sep 17 00:00:00 2001 From: mintsuki Date: Mon, 16 Aug 2021 20:00:37 +0200 Subject: [PATCH] gterm: Add context control logic --- stage23/lib/gterm.c | 77 +++++++++++++++++++++++++++++++++++-------- stage23/lib/gterm.h | 4 +++ stage23/lib/term.c | 4 +++ stage23/lib/term.h | 2 +- stage23/lib/term.s2.c | 2 +- 5 files changed, 73 insertions(+), 16 deletions(-) diff --git a/stage23/lib/gterm.c b/stage23/lib/gterm.c index d11bc6b8..02a17cd2 100644 --- a/stage23/lib/gterm.c +++ b/stage23/lib/gterm.c @@ -35,27 +35,34 @@ static size_t frame_height, frame_width; static struct image *background; -static size_t last_grid_size = 0; -static struct gterm_char *grid = NULL; -static size_t last_front_grid_size = 0; -static struct gterm_char *front_grid = NULL; - static size_t last_bg_canvas_size = 0; static uint32_t *bg_canvas = NULL; -static bool double_buffer_enabled = false; - -static uint32_t text_fg, text_bg; - -static bool cursor_status = true; - -static size_t cursor_x; -static size_t cursor_y; - static size_t rows; static size_t cols; static size_t margin_gradient; +static bool double_buffer_enabled = false; + +static size_t last_grid_size = 0; +static size_t last_front_grid_size = 0; + +static struct gterm_char *grid = NULL; +static struct gterm_char *front_grid = NULL; + +static struct context { + uint32_t text_fg; +#define text_fg context.text_fg + uint32_t text_bg; +#define text_bg context.text_bg + bool cursor_status; +#define cursor_status context.cursor_status + size_t cursor_x; +#define cursor_x context.cursor_x + size_t cursor_y; +#define cursor_y context.cursor_y +} context; + void gterm_swap_palette(void) { uint32_t tmp = text_bg; text_bg = text_fg; @@ -500,6 +507,8 @@ bool gterm_init(size_t *_rows, size_t *_cols, size_t width, size_t height) { if (!fb_init(&fbinfo, width, height, 32)) return false; + cursor_status = true; + // default scheme size_t margin = 64; margin_gradient = 4; @@ -697,3 +706,43 @@ bool gterm_init(size_t *_rows, size_t *_cols, size_t width, size_t height) { return true; } + +uint64_t gterm_context_size(void) { + uint64_t ret = 0; + + ret += sizeof(struct context); + ret += last_grid_size; + ret += last_front_grid_size; + + return ret; +} + +void gterm_context_save(uint64_t ptr) { + memcpy32to64(ptr, (uint64_t)(uintptr_t)&context, sizeof(struct context)); + ptr += sizeof(struct context); + + memcpy32to64(ptr, (uint64_t)(uintptr_t)grid, last_grid_size); + ptr += last_grid_size; + + memcpy32to64(ptr, (uint64_t)(uintptr_t)front_grid, last_front_grid_size); +} + +void gterm_context_restore(uint64_t ptr) { + memcpy32to64((uint64_t)(uintptr_t)&context, ptr, sizeof(struct context)); + ptr += sizeof(struct context); + + memcpy32to64((uint64_t)(uintptr_t)grid, ptr, last_grid_size); + ptr += last_grid_size; + + memcpy32to64((uint64_t)(uintptr_t)front_grid, ptr, last_front_grid_size); + + for (size_t i = 0; i < (size_t)rows * cols; i++) { + size_t x = i % cols; + size_t y = i / cols; + + gterm_plot_char(&grid[i], x * VGA_FONT_WIDTH + frame_width, + y * VGA_FONT_HEIGHT + frame_height); + } + + draw_cursor(); +} diff --git a/stage23/lib/gterm.h b/stage23/lib/gterm.h index 56a6bb5b..3f02c63d 100644 --- a/stage23/lib/gterm.h +++ b/stage23/lib/gterm.h @@ -31,4 +31,8 @@ void gterm_swap_palette(void); void gterm_double_buffer_flush(void); void gterm_double_buffer(bool state); +uint64_t gterm_context_size(void); +void gterm_context_save(uint64_t ptr); +void gterm_context_restore(uint64_t ptr); + #endif diff --git a/stage23/lib/term.c b/stage23/lib/term.c index 2ed68b69..3fde1b56 100644 --- a/stage23/lib/term.c +++ b/stage23/lib/term.c @@ -42,5 +42,9 @@ void term_vbe(size_t width, size_t height) { term_double_buffer = gterm_double_buffer; term_double_buffer_flush = gterm_double_buffer_flush; + term_context_size = gterm_context_size; + term_context_save = gterm_context_save; + term_context_restore = gterm_context_restore; + term_backend = VBE; } diff --git a/stage23/lib/term.h b/stage23/lib/term.h index aac13fbf..f9753105 100644 --- a/stage23/lib/term.h +++ b/stage23/lib/term.h @@ -89,6 +89,6 @@ extern void (*term_context_restore)(uint64_t ptr); #define TERM_CTX_SAVE ((uint64_t)(-2)) #define TERM_CTX_RESTORE ((uint64_t)(-3)) -extern void (*term_callback)(uint64_t type, uint64_t extra, uint64_t esc_val_count, uint64_t esc_values); +extern void (*term_callback)(uint64_t, uint64_t, uint64_t, uint64_t); #endif diff --git a/stage23/lib/term.s2.c b/stage23/lib/term.s2.c index 541caf91..8cb2c9a9 100644 --- a/stage23/lib/term.s2.c +++ b/stage23/lib/term.s2.c @@ -43,7 +43,7 @@ uint64_t (*term_context_size)(void); void (*term_context_save)(uint64_t ptr); void (*term_context_restore)(uint64_t ptr); -void (*term_callback)(uint64_t type, uint64_t extra, uint64_t esc_val_count, uint64_t esc_values) = NULL; +void (*term_callback)(uint64_t, uint64_t, uint64_t, uint64_t) = NULL; struct term_context term_context;