Revert "Revert "fixed STLDFLAG order in broken st Makefile""
[st.git] / st.h
diff --git a/st.h b/st.h
index 87db5c2..44d4938 100644 (file)
--- a/st.h
+++ b/st.h
-/* 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 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,
+};
+
+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
+};
 
-#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 window_state {
+       WIN_VISIBLE = 1,
+       WIN_FOCUSED = 2
+};
 
+typedef unsigned char uchar;
+typedef unsigned int uint;
+typedef unsigned long ulong;
+typedef unsigned short ushort;
 
-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 */
+typedef uint_least32_t Rune;
 
 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 GlyphLine;
+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 */
+       GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
+       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;
 
-/* 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);
-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);
+       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;
+
+void die(const char *, ...);
+void redraw(void);
+
+int tattrset(int);
+void tnew(int, int);
+void tsetdirt(int, int);
+void tsetdirtattr(int);
+int match(uint, uint);
 void ttynew(void);
-void 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);
+size_t ttyread(void);
+void ttyresize(void);
+void ttysend(char *, size_t);
+void ttywrite(const char *, size_t);
+
+void resettitle(void);
+
+char *kmap(KeySym, uint);
+void cresize(int, int);
+void selclear(void);
+
+void selinit(void);
+void selnormalize(void);
+int selected(int, int);
+char *getsel(void);
+int x2col(int);
+int y2row(int);
+
+size_t utf8decode(char *, Rune *, size_t);
+size_t utf8encode(Rune, char *);
+
+void *xmalloc(size_t);
+char *xstrdup(char *);
+
+void usage(void);
+
+/* Globals */
+extern TermWindow win;
+extern Term term;
+extern Selection sel;
+extern int cmdfd;
+extern pid_t pid;
+extern char **opt_cmd;
+extern char *opt_class;
+extern char *opt_embed;
+extern char *opt_font;
+extern char *opt_io;
+extern char *opt_line;
+extern char *opt_name;
+extern char *opt_title;
+extern int oldbutton;
+
+extern char *usedfont;
+extern double usedfontsize;
+extern double defaultfontsize;
+
+/* config.h globals */
+extern char font[];
+extern int borderpx;
+extern float cwscale;
+extern float chscale;
+extern unsigned int doubleclicktimeout;
+extern unsigned int tripleclicktimeout;
+extern int allowaltscreen;
+extern unsigned int xfps;
+extern unsigned int actionfps;
+extern unsigned int cursorthickness;
+extern unsigned int blinktimeout;
+extern char termname[];
+extern const char *colorname[];
+extern size_t colornamelen;
+extern unsigned int defaultfg;
+extern unsigned int defaultbg;
+extern unsigned int defaultcs;
+extern unsigned int defaultrcs;
+extern unsigned int cursorshape;
+extern unsigned int cols;
+extern unsigned int rows;
+extern unsigned int mouseshape;
+extern unsigned int mousefg;
+extern unsigned int mousebg;
+extern unsigned int defaultattr;
+extern MouseShortcut mshortcuts[];
+extern size_t mshortcutslen;
+extern Shortcut shortcuts[];
+extern size_t shortcutslen;
+extern uint forceselmod;
+extern uint selmasks[];
+extern size_t selmaskslen;
+extern char ascii_printable[];