summaryrefslogtreecommitdiff
path: root/src/term.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/term.c')
-rw-r--r--src/term.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/term.c b/src/term.c
new file mode 100644
index 0000000..583bdd8
--- /dev/null
+++ b/src/term.c
@@ -0,0 +1,125 @@
+#include "internal.h"
+#include "screen.h"
+
+_Thread_local char term_thread_anchor;
+
+const char *term_unicode_version(void)
+{
+ return UNICODE_DATA_VERSION;
+}
+
+void term_lock(struct term *t)
+{
+ term_write_begin(t);
+}
+
+void term_unlock(struct term *t)
+{
+ term_write_end(t);
+}
+
+struct term_vector2i term_size(const struct term *t)
+{
+ if (!t)
+ return (struct term_vector2i){ 0 };
+ term_write_begin((struct term *)t);
+ struct term_vector2i size = { .x = t->cols, .y = t->rows };
+ term_write_end((struct term *)t);
+ return size;
+}
+
+struct term_modes term_modes(const struct term *t)
+{
+ if (!t)
+ return (struct term_modes){ 0 };
+ term_write_begin((struct term *)t);
+ struct term_modes m = {
+ .keyboard = t->keyboard[t->alternate].flags,
+ .mouse = (enum term_mouse)t->mouse_mode,
+ .mouse_encoding = (enum term_mouse_encoding)t->mouse_encoding,
+ .grid = { .x = t->cols, .y = t->rows },
+ .app_cursor = t->application_cursor,
+ .app_keypad = t->application_keypad,
+ .backarrow_bs = t->backarrow_sends_bs,
+ .bracketed_paste = t->bracketed_paste,
+ .focus_events = t->focus_events,
+ .alternate = t->alternate,
+ .reverse_video = t->reverse_video,
+ .synchronized = t->synchronized_output,
+ };
+ term_write_end((struct term *)t);
+ return m;
+}
+
+struct term_cursor term_cursor(const struct term *t)
+{
+ if (!t)
+ return (struct term_cursor){ .visible = true };
+ term_write_begin((struct term *)t);
+ struct term_cursor c = {
+ .pos = { .x = t->cursor_x, .y = t->cursor_y },
+ .style = t->cursor_style,
+ .visible = t->cursor_visible,
+ .blink = t->cursor_blink,
+ };
+ term_write_end((struct term *)t);
+ return c;
+}
+
+void term_set_cursor_default(struct term *t, enum term_cursor_style style, bool steady)
+{
+ if (!t)
+ return;
+ term_write_begin(t);
+ if (style > TERM_CURSOR_BAR)
+ style = TERM_CURSOR_BLOCK;
+ if (t->cursor_style != style || t->cursor_blink == steady) {
+ struct srow *cur = term_row(t, t->cursor_y);
+ if (cur) cur->version++;
+ }
+ t->default_cursor_style = t->cursor_style = style;
+ t->default_cursor_blink = t->cursor_blink = !steady;
+ term_write_end(t);
+}
+
+void term_set_theme(struct term *t, const struct term_theme *theme)
+{
+ if (!t)
+ return;
+ term_write_begin(t);
+ struct palette next = { .version = t->palette.version };
+ term_palette_init(&next, theme);
+ if (memcmp(&next.theme, &t->palette.theme, sizeof(next.theme)))
+ t->palette = next;
+ term_write_end(t);
+}
+
+void term_focus(struct term *t, bool focused)
+{
+ if (!t)
+ return;
+ term_write_begin(t);
+ if (t->focus_events)
+ send_response(t, focused ? "\033[I" : "\033[O");
+ term_write_end(t);
+}
+
+size_t term_cwd(const struct term *t, char *buf, size_t cap)
+{
+ if (!t)
+ return term_copy_out(NULL, buf, cap);
+ term_write_begin((struct term *)t);
+ size_t n = term_copy_out(t->cwd, buf, cap);
+ term_write_end((struct term *)t);
+ return n;
+}
+
+size_t term_pointer_shape(const struct term *t, char *buf, size_t cap)
+{
+ if (!t)
+ return term_copy_out(NULL, buf, cap);
+ term_write_begin((struct term *)t);
+ size_t n = term_copy_out(t->pointer_shape, buf, cap);
+ term_write_end((struct term *)t);
+ return n;
+}