X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=baea2bc6f82e979156b8fe37cdc12cd3f6a8edce;hb=970d44a60db7b64279e1c14d8750253580feecaa;hp=627e5666012db9769a693d592ab61e20e890e1e7;hpb=33558ca042357ee7387b7c0ba9574af1106c4037;p=st.git diff --git a/st.c b/st.c index 627e566..baea2bc 100644 --- a/st.c +++ b/st.c @@ -66,30 +66,75 @@ #define X2COL(x) (((x) - BORDER)/xw.cw) #define Y2ROW(y) (((y) - BORDER)/xw.ch) -/* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */ -enum { ATTR_NULL=0 , ATTR_REVERSE=1 , ATTR_UNDERLINE=2, ATTR_BOLD=4, ATTR_GFX=8 }; -enum { CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT, - CURSOR_SAVE, CURSOR_LOAD }; -enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; -enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; -enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8, - MODE_CRLF=16, MODE_MOUSEBTN=32, MODE_MOUSEMOTION=64, MODE_MOUSE=32|64, MODE_REVERSE=128 }; -enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; -enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; +enum glyph_attribute { + ATTR_NULL = 0, + ATTR_REVERSE = 1, + ATTR_UNDERLINE = 2, + ATTR_BOLD = 4, + ATTR_GFX = 8, +}; + +enum cursor_movement { + CURSOR_UP, + CURSOR_DOWN, + CURSOR_LEFT, + CURSOR_RIGHT, + CURSOR_SAVE, + CURSOR_LOAD +}; + +enum cursor_state { + CURSOR_DEFAULT = 0, + CURSOR_HIDE = 1, + CURSOR_WRAPNEXT = 2 +}; + +enum glyph_state { + GLYPH_SET = 1, + GLYPH_DIRTY = 2 +}; + +enum term_mode { + MODE_WRAP = 1, + MODE_INSERT = 2, + MODE_APPKEYPAD = 4, + MODE_ALTSCREEN = 8, + MODE_CRLF = 16, + MODE_MOUSEBTN = 32, + MODE_MOUSEMOTION = 64, + MODE_MOUSE = 32|64, + MODE_REVERSE = 128 +}; +enum escape_state { + ESC_START = 1, + ESC_CSI = 2, + ESC_OSC = 4, + ESC_TITLE = 8, + ESC_ALTCHARSET = 16 +}; + +enum window_state { + WIN_VISIBLE = 1, + WIN_REDRAW = 2, + WIN_FOCUSED = 4 +}; + +/* bit macro */ #undef B0 enum { B0=1, B1=2, B2=4, B3=8, B4=16, B5=32, B6=64, B7=128 }; typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; +typedef unsigned short ushort; typedef struct { char c[UTF_SIZ]; /* character code */ uchar mode; /* attribute flags */ - uchar fg; /* foreground */ - uchar bg; /* background */ - uchar state; /* state flags */ + ushort fg; /* foreground */ + ushort bg; /* background */ + uchar state; /* state flags */ } Glyph; typedef Glyph* Line; @@ -154,18 +199,6 @@ typedef struct { char s[ESC_BUF_SIZ]; } Key; -/* Drawing Context */ -typedef struct { - ulong col[256]; - GC gc; - struct { - int ascent; - int descent; - short lbearing; - short rbearing; - XFontSet set; - } font, bfont; -} DC; /* TODO: use better name for vars... */ typedef struct { @@ -181,6 +214,19 @@ typedef struct { #include "config.h" +/* Drawing Context */ +typedef struct { + ulong col[LEN(colorname) < 256 ? 256 : LEN(colorname)]; + GC gc; + struct { + int ascent; + int descent; + short lbearing; + short rbearing; + XFontSet set; + } font, bfont; +} DC; + static void die(const char*, ...); static void draw(void); static void drawregion(int, int, int, int); @@ -1341,8 +1387,17 @@ csihandle(void) { void csidump(void) { - fwrite("\033[", 1, 2, stdout); - fwrite(escseq.buf, 1, escseq.len, stdout); + int i; + printf("ESC["); + for(i = 0; i < escseq.len; i++) { + uint c = escseq.buf[i] & 0xff; + if(isprint(c)) putchar(c); + else if(c == '\n') printf("(\\n)"); + else if(c == '\r') printf("(\\r)"); + else if(c == 0x1b) printf("(\\e)"); + else printf("(%02x)", c); + } + putchar('\n'); } void @@ -1583,16 +1638,19 @@ xloadcols(void) { XColor color; ulong white = WhitePixel(xw.dpy, xw.scr); + /* load colors [0-15] colors and [256-LEN(colorname)[ (config.h) */ for(i = 0; i < LEN(colorname); i++) { + if(!colorname[i]) + continue; if(!XAllocNamedColor(xw.dpy, xw.cmap, colorname[i], &color, &color)) { dc.col[i] = white; fprintf(stderr, "Could not allocate color '%s'\n", colorname[i]); } else dc.col[i] = color.pixel; } - - /* same colors as xterm */ - for(r = 0; r < 6; r++) + + /* load colors [16-255] ; same colors as xterm */ + for(i = 16, r = 0; r < 6; r++) for(g = 0; g < 6; g++) for(b = 0; b < 6; b++) { color.red = r == 0 ? 0 : 0x3737 + 0x2828 * r; @@ -1826,10 +1884,14 @@ xdrawcursor(void) { xcopy(oldx, oldy, 1, 1); /* draw the new one */ - if(!(term.c.state & CURSOR_HIDE) && (xw.state & WIN_FOCUSED)) { - sl = utf8size(g.c); + if(!(term.c.state & CURSOR_HIDE)) { + if(!(xw.state & WIN_FOCUSED)) + g.bg = DefaultUCS; + if(IS_SET(MODE_REVERSE)) g.mode |= ATTR_REVERSE, g.fg = DefaultCS, g.bg = DefaultFG; + + sl = utf8size(g.c); xdraws(g.c, g, term.c.x, term.c.y, 1, sl); oldx = term.c.x, oldy = term.c.y; }