X-Git-Url: https://git.xinqibao.xyz/st.git/blobdiff_plain/ad39f000be87ec16e74c05bdc3fa81ef307b5477..e85b6b64660214121164ea97fb098eaa4935f7db:/st.h diff --git a/st.h b/st.h index 0bd2c4e..38c61c4 100644 --- a/st.h +++ b/st.h @@ -1,178 +1,122 @@ -/* See LICENSE for licence details. */ -#define _XOPEN_SOURCE -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <locale.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <signal.h> -#include <sys/ioctl.h> -#include <sys/select.h> -#include <sys/stat.h> +/* See LICENSE for license details. */ + +#include <stdint.h> #include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> -#include <X11/Xlib.h> -#include <X11/keysym.h> -#include <X11/Xutil.h> - -/* special keys */ -#define KEYDELETE "\033[3~" -#define KEYHOME "\033[1~" -#define KEYEND "\033[4~" -#define KEYPREV "\033[5~" -#define KEYNEXT "\033[6~" - -#define TNAME "st" -#define SHELL "/bin/bash" -#define TAB 8 - -#define FONT "fixed" -#define BORDER 3 -#define LINESPACE 1 /* additional pixel between each line */ - -/* Default colors */ -#define DefaultFG 7 -#define DefaultBG 0 -#define DefaultCS 1 -#define BellCol DefaultFG /* visual bell color */ - -static char* colorname[] = { - "black", - "red", - "green", - "yellow", - "blue", - "magenta", - "cyan", - "white", + +/* macros */ +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) < (b) ? (b) : (a)) +#define LEN(a) (sizeof(a) / sizeof(a)[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, }; -/* Arbitrary sizes */ -#define ESCSIZ 256 -#define ESCARG 16 +enum selection_mode { + SEL_IDLE = 0, + SEL_EMPTY = 1, + SEL_READY = 2 +}; -#define SERRNO strerror(errno) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MAX(a, b) ((a) < (b) ? (b) : (a)) -#define LEN(a) (sizeof(a) / sizeof(a[0])) -#define DEFAULT(a, b) (a) = (a) ? (a) : (b) -#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) -#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) +enum selection_type { + SEL_REGULAR = 1, + SEL_RECTANGULAR = 2 +}; +enum selection_snap { + SNAP_WORD = 1, + SNAP_LINE = 2 +}; -enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 }; /* Attribute */ -enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload }; /* Cursor */ -enum { CRset=1 , CRupdate=2 }; /* Character state */ -enum { TMwrap=1 , TMinsert=2, TMaltcharset }; /* Terminal mode */ -enum { SCupdate, SCredraw }; /* screen draw mode */ +typedef unsigned char uchar; +typedef unsigned int uint; +typedef unsigned long ulong; +typedef unsigned short ushort; -typedef int Color; +typedef uint_least32_t Rune; +#define Glyph Glyph_ typedef struct { - char c; /* character code */ - char mode; /* attribute flags */ - Color fg; /* foreground */ - Color bg; /* background */ - char state; /* state flag */ + Rune u; /* character code */ + ushort mode; /* attribute flags */ + uint32_t fg; /* foreground */ + uint32_t bg; /* background */ } Glyph; -typedef Glyph* Line; +typedef Glyph *Line; -typedef struct { - Glyph attr; /* current char attributes */ - char hidden; - int x; - int y; -} TCursor; +typedef union { + int i; + uint ui; + float f; + const void *v; +} Arg; -/* Escape sequence structs */ -typedef struct { - char buf[ESCSIZ+1]; /* raw string */ - int len; /* raw string length */ - /* ESC <pre> [[ [<priv>] <arg> [;]] <mode>] */ - char pre; - char priv; - int arg[ESCARG+1]; - int narg; /* nb of args */ - char mode; -} Escseq; - -/* Internal representation of the screen */ -typedef struct { - int row; /* nb row */ - int col; /* nb col */ - Line* line; /* screen */ - TCursor c; /* cursor */ - int top; /* top scroll limit */ - int bot; /* bottom scroll limit */ - int mode; /* terminal mode */ -} Term; - -/* Purely graphic info */ -typedef struct { - Display* dis; - Window win; - int scr; - int w; /* window width */ - int h; /* window height */ - int ch; /* char height */ - int cw; /* char width */ -} XWindow; - -/* Drawing Context */ -typedef struct { - unsigned long col[LEN(colorname)]; - XFontStruct* font; - GC gc; -} DC; - - -void die(const char *errstr, ...); -void draw(int); -void execsh(void); -void sigchld(int); -void kpress(XKeyEvent *); -void resize(XEvent *); -void run(void); - -int escaddc(char); -int escfinal(char); -void escdump(void); -void eschandle(void); -void escparse(void); -void escreset(void); - -void tclearregion(int, int, int, int); -void tcpos(int); -void tcursor(int); -void tdeletechar(int); -void tdeleteline(int); -void tdump(void); -void tinsertblank(int); -void tinsertblankline(int); -void tmoveto(int, int); +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 tnewline(void); -void tputc(char); -void tputs(char*, int); void tresize(int, int); -void tscroll(void); -void tsetattr(int*, int); -void tsetchar(char); -void tsetscroll(int, int); - -void ttynew(void); -void ttyread(void); +void tsetdirtattr(int); +void ttyhangup(void); +int ttynew(char *, char *, char *, char **); +size_t ttyread(void); void ttyresize(int, int); -void ttywrite(char *, size_t); - -unsigned long xgetcol(const char *); -void xclear(int, int, int, int); -void xcursor(int); -void xdrawc(int, int, Glyph); -void xinit(void); -void xscroll(void); +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 utf8encode(Rune, char *); + +void *xmalloc(size_t); +void *xrealloc(void *, size_t); +char *xstrdup(char *); + +/* config.h globals */ +extern char *utmp; +extern char *stty_args; +extern char *vtiden; +extern char *worddelimiters; +extern int allowaltscreen; +extern char *termname; +extern unsigned int tabspaces; +extern unsigned int defaultfg; +extern unsigned int defaultbg;