:: commit 0b1c1ccc8814e595036cede41e32700dfdd1608d

mintsuki <mintsuki@protonmail.com> — 2021-08-16 18:00

parents: a3f3f95bd7

gterm: Add context control logic

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,26 +35,33 @@ 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 size_t rows;
+static size_t cols;
+static size_t margin_gradient;
 
-static uint32_t text_fg, text_bg;
+static bool double_buffer_enabled = false;
 
-static bool cursor_status = true;
+static size_t last_grid_size = 0;
+static size_t last_front_grid_size = 0;
 
-static size_t cursor_x;
-static size_t cursor_y;
+static struct gterm_char *grid = NULL;
+static struct gterm_char *front_grid = NULL;
 
-static size_t rows;
-static size_t cols;
-static size_t margin_gradient;
+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;
@@ -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;
 
tab: 248 wrap: offon