-/* See LICENSE for licence details. */
-#define _XOPEN_SOURCE
-#include <ctype.h>
-#include <fcntl.h>
-#include <locale.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/select.h>
-#include <sys/stat.h>
-#include <sys/types.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",
-};
+/* See LICENSE for license details. */
/* Arbitrary sizes */
-#define ESCSIZ 256
-#define ESCARG 16
+#define UTF_SIZ 4
+
+/* 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 IS_SET(flag) ((term.mode & (flag)) != 0)
+#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,
+};
-#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 term_mode {
+ MODE_WRAP = 1 << 0,
+ MODE_INSERT = 1 << 1,
+ MODE_APPKEYPAD = 1 << 2,
+ MODE_ALTSCREEN = 1 << 3,
+ MODE_CRLF = 1 << 4,
+ MODE_MOUSEBTN = 1 << 5,
+ MODE_MOUSEMOTION = 1 << 6,
+ MODE_REVERSE = 1 << 7,
+ MODE_KBDLOCK = 1 << 8,
+ MODE_HIDE = 1 << 9,
+ MODE_ECHO = 1 << 10,
+ MODE_APPCURSOR = 1 << 11,
+ MODE_MOUSESGR = 1 << 12,
+ MODE_8BIT = 1 << 13,
+ MODE_BLINK = 1 << 14,
+ MODE_FBLINK = 1 << 15,
+ MODE_FOCUS = 1 << 16,
+ MODE_MOUSEX10 = 1 << 17,
+ MODE_MOUSEMANY = 1 << 18,
+ MODE_BRCKTPASTE = 1 << 19,
+ MODE_PRINT = 1 << 20,
+ MODE_UTF8 = 1 << 21,
+ MODE_SIXEL = 1 << 22,
+ MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\
+ |MODE_MOUSEMANY,
+};
+enum selection_mode {
+ SEL_IDLE = 0,
+ SEL_EMPTY = 1,
+ SEL_READY = 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 }; /* Terminal mode */
-enum { SCupdate, SCredraw }; /* screen draw mode */
+enum selection_type {
+ SEL_REGULAR = 1,
+ SEL_RECTANGULAR = 2
+};
-typedef int Color;
+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;
+
+#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;
+ Glyph attr; /* current char attributes */
int x;
int y;
+ char state;
} TCursor;
-/* 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 */
+ int row; /* nb row */
+ int col; /* nb col */
+ Line *line; /* screen */
+ Line *alt; /* alternate screen */
+ int *dirty; /* dirtyness of lines */
+ TCursor c; /* cursor */
+ 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 numlock; /* lock numbers in keyboard */
+ int *tabs;
} Term;
/* Purely graphic info */
typedef struct {
- Display* dis;
- Window win;
- int scr;
- int w; /* window width */
- int h; /* window height */
+ int tw, th; /* tty width and height */
+ int w, h; /* window width and height */
int ch; /* char height */
int cw; /* char width */
-} XWindow;
+ char state; /* focus, redraw, visible */
+ int cursor; /* cursor style */
+} TermWindow;
+
+typedef struct {
+ uint b;
+ uint mask;
+ char *s;
+} MouseShortcut;
+
+typedef struct {
+ 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;
+
+ char *primary, *clipboard;
+ int alt;
+ struct timespec tclick1;
+ struct timespec tclick2;
+
+ //Atom xtarget;
+} Selection;
+
+typedef union {
+ int i;
+ uint ui;
+ float f;
+ const void *v;
+} Arg;
+
+typedef struct {
+ uint mod;
+ KeySym keysym;
+ void (*func)(const Arg *);
+ const Arg arg;
+} Shortcut;
-/* 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 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);
+ KeySym k;
+ uint mask;
+ char *s;
+ /* three valued logic variables: 0 indifferent, 1 on, -1 off */
+ signed char appkey; /* application keypad */
+ signed char appcursor; /* application cursor */
+ signed char crlf; /* crlf mode */
+} Key;
+
+void die(const char *, ...);
+void redraw(void);
+
+void iso14755(const Arg *);
+void numlock(const Arg *);
+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 tsetdirt(int, int);
+void tsetdirtattr(int);
+void ttynew(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 ttysend(char *, size_t);
+void ttywrite(const char *, size_t);
+
+void resettitle(void);
+
+void selclear(void);
+void selinit(void);
+void selnormalize(void);
+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(char *);
+
+/* Globals */
+extern TermWindow win;
+extern Term term;
+extern Selection sel;
+extern int cmdfd;
+extern pid_t pid;
+extern int oldbutton;
+
+/* config.h globals */
+extern char *shell;
+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;