summaryrefslogtreecommitdiff
path: root/src/libsystemd-terminal/term.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsystemd-terminal/term.h')
-rw-r--r--src/libsystemd-terminal/term.h146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/libsystemd-terminal/term.h b/src/libsystemd-terminal/term.h
new file mode 100644
index 0000000000..2f2bb479cb
--- /dev/null
+++ b/src/libsystemd-terminal/term.h
@@ -0,0 +1,146 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+ This file is part of systemd.
+
+ Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include "util.h"
+
+typedef struct term_color term_color;
+typedef struct term_attr term_attr;
+
+typedef struct term_utf8 term_utf8;
+typedef struct term_seq term_seq;
+typedef struct term_parser term_parser;
+
+typedef struct term_screen term_screen;
+
+/*
+ * Ageing
+ */
+
+typedef uint64_t term_age_t;
+
+#define TERM_AGE_NULL 0
+
+/*
+ * Attributes
+ */
+
+enum {
+ /* special color-codes */
+ TERM_CCODE_DEFAULT, /* default foreground/background color */
+ TERM_CCODE_256, /* 256color code */
+ TERM_CCODE_RGB, /* color is specified as RGB */
+
+ /* dark color-codes */
+ TERM_CCODE_BLACK,
+ TERM_CCODE_RED,
+ TERM_CCODE_GREEN,
+ TERM_CCODE_YELLOW,
+ TERM_CCODE_BLUE,
+ TERM_CCODE_MAGENTA,
+ TERM_CCODE_CYAN,
+ TERM_CCODE_WHITE, /* technically: light grey */
+
+ /* light color-codes */
+ TERM_CCODE_LIGHT_BLACK = TERM_CCODE_BLACK + 8, /* technically: dark grey */
+ TERM_CCODE_LIGHT_RED = TERM_CCODE_RED + 8,
+ TERM_CCODE_LIGHT_GREEN = TERM_CCODE_GREEN + 8,
+ TERM_CCODE_LIGHT_YELLOW = TERM_CCODE_YELLOW + 8,
+ TERM_CCODE_LIGHT_BLUE = TERM_CCODE_BLUE + 8,
+ TERM_CCODE_LIGHT_MAGENTA = TERM_CCODE_MAGENTA + 8,
+ TERM_CCODE_LIGHT_CYAN = TERM_CCODE_CYAN + 8,
+ TERM_CCODE_LIGHT_WHITE = TERM_CCODE_WHITE + 8,
+
+ TERM_CCODE_CNT,
+};
+
+struct term_color {
+ uint8_t ccode;
+ uint8_t c256;
+ uint8_t red;
+ uint8_t green;
+ uint8_t blue;
+};
+
+struct term_attr {
+ term_color fg; /* foreground color */
+ term_color bg; /* background color */
+
+ unsigned int bold : 1; /* bold font */
+ unsigned int italic : 1; /* italic font */
+ unsigned int underline : 1; /* underline text */
+ unsigned int inverse : 1; /* inverse fg/bg */
+ unsigned int protect : 1; /* protect from erase */
+ unsigned int blink : 1; /* blink text */
+ unsigned int hidden : 1; /* hidden */
+};
+
+/*
+ * UTF-8
+ */
+
+struct term_utf8 {
+ uint32_t chars[5];
+ uint32_t ucs4;
+
+ unsigned int i_bytes : 3;
+ unsigned int n_bytes : 3;
+ unsigned int valid : 1;
+};
+
+size_t term_utf8_encode(char *out_utf8, uint32_t g);
+const uint32_t *term_utf8_decode(term_utf8 *p, size_t *out_len, char c);
+
+/*
+ * Parsers
+ */
+
+int term_parser_new(term_parser **out, bool host);
+term_parser *term_parser_free(term_parser *parser);
+int term_parser_feed(term_parser *parser, const term_seq **seq_out, uint32_t raw);
+
+#define _term_parser_free_ _cleanup_(term_parser_freep)
+DEFINE_TRIVIAL_CLEANUP_FUNC(term_parser*, term_parser_free);
+
+/*
+ * Screens
+ */
+
+typedef int (*term_screen_write_fn) (term_screen *screen, void *userdata, const void *buf, size_t size);
+typedef int (*term_screen_cmd_fn) (term_screen *screen, void *userdata, unsigned int cmd, const term_seq *seq);
+
+int term_screen_new(term_screen **out, term_screen_write_fn write_fn, void *write_fn_data, term_screen_cmd_fn cmd_fn, void *cmd_fn_data);
+term_screen *term_screen_ref(term_screen *screen);
+term_screen *term_screen_unref(term_screen *screen);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(term_screen*, term_screen_unref);
+
+int term_screen_feed_text(term_screen *screen, const uint8_t *in, size_t size);
+int term_screen_feed_keyboard(term_screen *screen, uint32_t keysym, uint32_t ascii, uint32_t ucs4, unsigned int mods);
+int term_screen_resize(term_screen *screen, unsigned int width, unsigned int height);
+void term_screen_soft_reset(term_screen *screen);
+void term_screen_hard_reset(term_screen *screen);
+
+int term_screen_set_answerback(term_screen *screen, const char *answerback);