// Copyright 2024 jack@pngu.org // SPDX-License-Identifier: MIT/X #include #include /* Arbitrary sizes */ #define UTF_SIZ 4 #define ESC_BUF_SIZ (128 * UTF_SIZ) /* macros */ #define MIN(a, b) \ ({ \ __typeof__(a) _a = (a); \ __typeof__(b) _b = (b); \ _a < _b ? _a : _b; \ }) #define MAX(a, b) \ ({ \ __typeof__(a) _a = (a); \ __typeof__(b) _b = (b); \ _a > _b ? _a : _b; \ }) #define CHECK(value) \ (!__builtin_types_compatible_p(typeof((value)), typeof(&(value)[0]))) #define LEN(a) \ (__builtin_choose_expr(CHECK((a)), sizeof((a)) / sizeof((a)[0]), (void)0)) #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 ATTRCMP(a, b) \ ((a).mode != (b).mode || (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)) enum glyph_attribute { ATTR_NULL = 0, ATTR_BOLD = 1 << 0, ATTR_FAINT = 1 << 1, ATTR_ITALIC = 1 << 2, ATTR_UNDERLINE = 1 << 3, ATTR_BLINK = 1 << 4, ATTR_REVERSE = 1 << 5, ATTR_INVISIBLE = 1 << 6, ATTR_STRUCK = 1 << 7, ATTR_WRAP = 1 << 8, ATTR_WIDE = 1 << 9, ATTR_WDUMMY = 1 << 10, ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, }; enum selection_mode { SEL_IDLE = 0, SEL_EMPTY = 1, SEL_READY = 2 }; enum selection_type { SEL_REGULAR = 1, SEL_RECTANGULAR = 2 }; enum selection_snap { SNAP_WORD = 1, SNAP_LINE = 2 }; typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; typedef unsigned short ushort; typedef uint_least32_t Rune; typedef struct { Rune u; /* character code */ ushort mode; /* attribute flags */ uint32_t fg; /* foreground */ uint32_t bg; /* background */ } Glyph; typedef Glyph *Line; typedef union { int i; uint ui; float f; const void *v; } Arg; void die(const char *, ...); void redraw(void); void draw(void); void printscreen(const Arg *); void printsel(const Arg *); void sendbreak(const Arg *); void toggleprinter(const Arg *); int tattrset(int); void tnew(int, int); void tresize(int, int); void tsetdirtattr(int); void ttyhangup(void); int ttynew(const char *, char *, const char *, char **); size_t ttyread(void); void ttyresize(int, int); void ttywrite(const 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); size_t utf8decode(const char *, Rune *, size_t); size_t utf8encode(Rune, char *); void *xmalloc(size_t); void *xrealloc(void *, size_t); char *xstrdup(const char *); /* config.h globals */ extern char *utmp; extern char *stty_args; extern char *vtiden; extern wchar_t *worddelimiters; extern int allowaltscreen; extern char *termname; extern unsigned int tabspaces; extern unsigned int defaultfg; extern unsigned int defaultbg;