mirror of
https://github.com/systemd/systemd.git
synced 2024-11-08 11:27:32 +03:00
2bb4c7e384
Originally we only supported ucs2, so move the ucs4 version from libsystemd-terminal to shared and use that everywhere.
184 lines
6.3 KiB
C
184 lines
6.3 KiB
C
/*-*- 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 */
|
|
};
|
|
|
|
void term_attr_to_argb32(const term_attr *attr, uint32_t *fg, uint32_t *bg, const uint8_t *palette);
|
|
|
|
/*
|
|
* 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_decode(term_utf8 *p, uint32_t **out_buf, 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
|
|
*/
|
|
|
|
enum {
|
|
TERM_KBDMOD_IDX_SHIFT,
|
|
TERM_KBDMOD_IDX_CTRL,
|
|
TERM_KBDMOD_IDX_ALT,
|
|
TERM_KBDMOD_IDX_LINUX,
|
|
TERM_KBDMOD_IDX_CAPS,
|
|
TERM_KBDMOD_CNT,
|
|
|
|
TERM_KBDMOD_SHIFT = 1 << TERM_KBDMOD_IDX_SHIFT,
|
|
TERM_KBDMOD_CTRL = 1 << TERM_KBDMOD_IDX_CTRL,
|
|
TERM_KBDMOD_ALT = 1 << TERM_KBDMOD_IDX_ALT,
|
|
TERM_KBDMOD_LINUX = 1 << TERM_KBDMOD_IDX_LINUX,
|
|
TERM_KBDMOD_CAPS = 1 << TERM_KBDMOD_IDX_CAPS,
|
|
};
|
|
|
|
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);
|
|
|
|
unsigned int term_screen_get_width(term_screen *screen);
|
|
unsigned int term_screen_get_height(term_screen *screen);
|
|
uint64_t term_screen_get_age(term_screen *screen);
|
|
|
|
int term_screen_feed_text(term_screen *screen, const uint8_t *in, size_t size);
|
|
int term_screen_feed_keyboard(term_screen *screen,
|
|
const uint32_t *keysyms,
|
|
size_t n_syms,
|
|
uint32_t ascii,
|
|
const 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);
|
|
|
|
int term_screen_draw(term_screen *screen,
|
|
int (*draw_fn) (term_screen *screen,
|
|
void *userdata,
|
|
unsigned int x,
|
|
unsigned int y,
|
|
const term_attr *attr,
|
|
const uint32_t *ch,
|
|
size_t n_ch,
|
|
unsigned int ch_width),
|
|
void *userdata,
|
|
uint64_t *fb_age);
|