From ce05175372a9ddca1a225db0765ace1127a39293 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Fri, 12 Nov 2021 09:22:01 -0800 Subject: chore: simplified organizational structure --- src/cmd/term/term.h | 316 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 316 insertions(+) create mode 100644 src/cmd/term/term.h (limited to 'src/cmd/term/term.h') diff --git a/src/cmd/term/term.h b/src/cmd/term/term.h new file mode 100644 index 0000000..6784974 --- /dev/null +++ b/src/cmd/term/term.h @@ -0,0 +1,316 @@ +/* See LICENSE for license details. */ +#pragma once + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +// ----------------------------------------------------------------------- +// macros + +#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) +#define DIVCEIL(n, d) (((n) + ((d) - 1)) / (d)) +#define DEFAULT(a, b) (a) = (a) ? (a) : (b) +#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) +#define GLYPHCMP(a, b) (((a).mode & (~Gwrap) & (~Gliga)) != ((b).mode & (~Gwrap) & (~Gliga)) || \ + (a).fg != (b).fg || (a).bg != (b).bg) +#define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + (t1.tv_nsec-t2.tv_nsec)/1E6) +#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) +#define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b)) +#define IS_TRUECOL(x) (1 << 24 & (x)) + +#define iota(x) 1 << (x) + +/* arbitrary sizes */ +#define ESC_BUF_SIZ (128*UTFmax) +#define ESC_ARG_SIZ 16 +#define STR_BUF_SIZ ESC_BUF_SIZ +#define STR_ARG_SIZ ESC_ARG_SIZ + +// ----------------------------------------------------------------------- +// constants + +enum { + Gnil, + Gbold = iota(0), + Gfaint = iota(1), + Gitalic = iota(2), + Gunline = iota(3), + Gblink = iota(4), + Greverse = iota(5), + Ginvisible = iota(6), + Gstruck = iota(7), + Gwrap = iota(8), + Gwide = iota(9), + Gwdummy = iota(10), + Gliga = iota(11), + Gboldfaint = Gbold | Gfaint, +}; + +enum { + SelIdle = 0, + SelEmpty = 1, + SelReady = 2 +}; + +enum { + SelRegular = 1, + SelRectangular = 2 +}; + +enum { + SnapWord = 1, + SnapLine = 2 +}; + +/* cursor state */ +enum { + CursorSave, + CursorLoad +}; + +/* cursor mode */ +enum { + CursorDefault = 0, + CursorWrap = 1, + CursorOrigin = 2 +}; + +/* character set */ +enum { + CSgfx0, + CSgfx1, + CSuk, + CSusa, + CSmulti, + CSger, + CSfin, +}; + +/* escape sequences */ +enum { + Xstart = 1, + Xcsi = 2, + Xstr = 4, /* OSC, PM, APC */ + Xaltcs = 8, + Xstrend = 16, /* a final string was encountered */ + Xtest = 32, /* Enter in test mode */ + Xutf8 = 64, + Xdcs =128, +}; + +/* terminal mode */ +enum { + Twrap = iota(0), + Tinsert = iota(1), + Taltscreen = iota(2), + Tcrlf = iota(3), + Techo = iota(4), + Tprint = iota(5), + Tutf8 = iota(6), + Tsixel = iota(7), +}; + +/* window mode */ +enum { + Wvisible = iota(0), + Wfocused = iota(1), + Wappkeypad = iota(2), + Wmousebtn = iota(3), + Wmousemotion = iota(4), + Wreverse = iota(5), + Wkbdblock = iota(6), + Whide = iota(7), + Wappcursor = iota(8), + Wmousesgr = iota(9), + W8bit = iota(10), + Wblink = iota(11), + Wbflink = iota(12), + Wfocus = iota(13), + Wmousex10 = iota(14), + Wmousemany = iota(15), + Wbrcktpaste = iota(16), + Wnumlock = iota(17), + Wmouse = Wmousebtn|Wmousemotion|Wmousex10|Wmousemany, +}; + + +// ----------------------------------------------------------------------- +// types + +/* term.c */ +typedef struct Letter Letter; +typedef struct Dot Dot; +typedef struct Selection Selection; +typedef struct Terminal Terminal; + +typedef union Arg Arg; + +struct Letter { + rune u; /* character code */ + ushort mode; /* attribute flags */ + uint32 fg; /* foreground */ + uint32 bg; /* background */ +}; + +struct Dot { + Letter attr; /* current char attributes */ + int x; + int y; + char state; +}; + +struct Selection { + int mode; + int type; + int snap; + /* + * Selection variables: + * nb – normalized coordinates of the beginning of the selection + * ne – normalized coordinates of the end of the selection + * ob – original coordinates of the beginning of the selection + * oe – original coordinates of the end of the selection + */ + struct { + int x, y; + } nb, ne, ob, oe; + + int alt; +}; + +/* Internal representation of the screen */ +struct Terminal { + int row; /* nb row */ + int col; /* nb col */ + Letter **line; /* screen */ + Letter **alt; /* alternate screen */ + int *dirty; /* dirtyness of lines */ + Dot c; /* cursor */ + int ocx; /* old cursor col */ + int ocy; /* old cursor row */ + int top; /* top scroll limit */ + int bot; /* bottom scroll limit */ + int mode; /* terminal mode flags */ + int esc; /* escape state flags */ + char trantbl[4];/* charset table translation */ + int charset; /* current charset */ + int icharset; /* selected charset for sequence */ + int *tabs; + rune lastc; /* last printed char outside of sequence, 0 if control */ +}; + +/* CSI Escape sequence structs */ +/* ESC '[' [[ [] [;]] []] */ +typedef struct { + char buf[ESC_BUF_SIZ]; /* raw string */ + ulong len; /* raw string length */ + char priv; + int arg[ESC_ARG_SIZ]; + int narg; /* nb of args */ + char mode[2]; +} CSIEscape; + +/* STR Escape sequence structs */ +/* ESC type [[ [] [;]] ] ESC '\' */ +typedef struct { + char type; /* ESC type ... */ + char *buf; /* allocated raw string */ + size_t siz; /* allocation size */ + size_t len; /* raw string length */ + char *args[STR_ARG_SIZ]; + int narg; /* nb of args */ +} STREscape; + +/* x.c */ +typedef struct TermWindow TermWindow; + +struct TermWindow { + int tw, th; /* tty width and height */ + int w, h; /* window width and height */ + int hb, vb; /* horizontal and vertical border (in pix) */ + int ch; /* char height */ + int cw; /* char width */ + int mode; /* window state/mode flags */ + int cursor; /* cursor style */ +}; + +/* used for user hooks */ +union Arg { + int i; + uint ui; + float f; + void *v; + char *s; +}; + +// ----------------------------------------------------------------------- +// x.c (backend functions) + +void xbell(void); +void xclipcopy(void); +void xdrawcursor(int, int, Letter, int, int, Letter, Letter*, int); +void xdrawline(Letter*, int, int, int); +void xfinishdraw(void); +void xloadcols(void); +int xsetcolorname(int, char *); +void xsettitle(char *); +int xsetcursor(int); +void xsetmode(int, uint); +void xsetpointermotion(int); +void xsetsel(char *); +int xstartdraw(void); +void xximspot(int, int); + +void fatal( char *, ...); +void redraw(void); +void draw(void); + +void printscreen(Arg *); +void printsel(Arg *); +void sendbreak(Arg *); +void toggleprinter(Arg *); + +int tattrset(int); +void tnew(int, int); +void tresize(int, int); +void tsetdirtattr(int); +void ttyhangup(void); +int ttynew(char *, char *, char *, char **); +ulong ttyread(void); +void ttyresize(int, int); +void ttywrite( char *, size_t, int); + +void resettitle(void); + +void selclear(void); +void selinit(void); +void selstart(int, int, int); +void selextend(int, int, int, int); +int selected(int, int); +char *getsel(void); + +void *xmalloc(size_t); +void *xrealloc(void *, size_t); +char *xstrdup(char *); + +/* config.h globals */ +extern char *utmp; +extern char *scroll; +extern char *stty_args; +extern char *vtiden; +extern wchar *worddelimiters; +extern int allowaltscreen; +extern int allowwindowops; +extern char *termname; +extern uint tabspaces; +extern uint defaultfg; +extern uint defaultbg; +extern float alpha; -- cgit v1.2.1