foot/terminal.h
Daniel Eklöf b0a2c54fe8
vt: wip: implement scrolling region
This is largely untested, but existing scrolling code has been
converted to using a terminal-global scrolling region that is defined
as start-end of the scrollable region.

This is compared to the old code where the scrolling region where
defined in terms of marginals, counted in lines from top and from
bottom.
2019-06-23 18:02:49 +02:00

146 lines
2.6 KiB
C

#pragma once
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <threads.h>
#include <xkbcommon/xkbcommon.h>
#include <xkbcommon/xkbcommon-keysyms.h>
#include "tllist.h"
struct attributes {
bool bold;
bool italic;
bool underline;
bool strikethrough;
bool blink;
bool conceal;
bool reverse;
uint32_t foreground;
uint32_t background;
};
struct cell {
char c[5];
struct attributes attrs;
};
enum damage_type {DAMAGE_UPDATE, DAMAGE_ERASE, DAMAGE_SCROLL, DAMAGE_SCROLL_REVERSE};
struct damage {
enum damage_type type;
union {
/* DAMAGE_UPDATE, DAMAGE_ERASE */
struct {
int start;
int length;
} range;
/* DAMAGE_SCROLL, DAMAGE_SCROLL_REVERSE */
struct {
int lines;
} scroll;
};
};
struct grid {
int cols;
int rows;
int cell_width;
int cell_height;
/* Scrolling region - counted as lines excluded from scrolling,
* from top and from bottom */
struct {
int start;
int end;
} scrolling_region;
int linear_cursor;
struct {
int row;
int col;
} cursor;
bool print_needs_wrap;
struct cell *cells;
struct cell *normal_grid;
struct cell *alt_grid;
struct {
int row;
int col;
} alt_saved_cursor;
uint32_t foreground;
uint32_t background;
tll(struct damage) damage;
};
struct vt_subparams {
unsigned value[16];
size_t idx;
};
struct vt_param {
unsigned value;
struct vt_subparams sub;
};
struct vt {
int state; /* enum state */
struct {
struct vt_param v[16];
size_t idx;
} params;
struct {
uint8_t data[2];
size_t idx;
} intermediates;
struct {
uint8_t data[1024];
size_t idx;
} osc;
struct {
uint8_t data[4];
size_t idx;
size_t left;
} utf8;
struct attributes attrs;
bool dim;
};
struct kbd {
struct xkb_context *xkb;
struct xkb_keymap *xkb_keymap;
struct xkb_state *xkb_state;
struct {
mtx_t mutex;
cnd_t cond;
int trigger;
int pipe_read_fd;
int pipe_write_fd;
enum {REPEAT_STOP, REPEAT_START, REPEAT_EXIT} cmd;
bool dont_re_repeat;
int32_t delay;
int32_t rate;
uint32_t key;
} repeat;
};
enum decckm { DECCKM_CSI, DECCKM_SS3 };
enum keypad_mode { KEYPAD_NUMERICAL, KEYPAD_APPLICATION };
struct terminal {
pid_t slave;
int ptmx;
enum decckm decckm;
enum keypad_mode keypad_mode;
bool bracketed_paste;
struct vt vt;
struct grid grid;
struct kbd kbd;
};