X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=58f79411839d948b46ccc6e55dfc60e7f99a72f0;hb=69e32a6;hp=df43fac17186b0765a866ecbb3c98f22638071cd;hpb=626b0ae40c71b6c1e02ece79bf033432647381a6;p=st.git diff --git a/st.c b/st.c index df43fac..58f7941 100644 --- a/st.c +++ b/st.c @@ -28,9 +28,6 @@ #include #include -#define Glyph Glyph_ -#define Font Font_ - #include "st.h" #include "win.h" @@ -51,7 +48,6 @@ /* macros */ #define NUMMAXLEN(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) -#define DEFAULT(a, b) (a) = (a) ? (a) : (b) #define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177') #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) @@ -113,16 +109,6 @@ typedef struct { int narg; /* nb of args */ } STREscape; -typedef struct { - 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; - /* function definitions used in config.h */ static void clipcopy(const Arg *); static void clippaste(const Arg *); @@ -137,8 +123,8 @@ static void sendbreak(const Arg *); /* config.h for applying patches and the configuration. */ #include "config.h" -static void execsh(void); -static void stty(void); +static void execsh(char **); +static void stty(char **); static void sigchld(int); static void csidump(void); @@ -168,7 +154,6 @@ static void tnewline(int); static void tputtab(int); static void tputc(Rune); static void treset(void); -static void tresize(int, int); static void tscrollup(int, int); static void tscrolldown(int, int); static void tsetattr(int *, int); @@ -196,7 +181,6 @@ static size_t utf8validate(Rune *, size_t); static char *base64dec(const char *); static ssize_t xwrite(int, const char *, size_t); -static void *xrealloc(void *, size_t); /* Globals */ TermWindow win; @@ -204,24 +188,12 @@ Term term; Selection sel; int cmdfd; pid_t pid; -char **opt_cmd = NULL; -char *opt_class = NULL; -char *opt_embed = NULL; -char *opt_font = NULL; -char *opt_io = NULL; -char *opt_line = NULL; -char *opt_name = NULL; -char *opt_title = NULL; int oldbutton = 3; /* button event on startup: 3 = release */ static CSIEscape csiescseq; static STREscape strescseq; static int iofd = 1; -char *usedfont = NULL; -double usedfontsize = 0; -double defaultfontsize = 0; - static uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; static uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; static Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; @@ -232,6 +204,8 @@ size_t colornamelen = LEN(colorname); size_t mshortcutslen = LEN(mshortcuts); size_t shortcutslen = LEN(shortcuts); size_t selmaskslen = LEN(selmasks); +size_t keyslen = LEN(key); +size_t mappedkeyslen = LEN(mappedkeys); ssize_t xwrite(int fd, const char *s, size_t len) @@ -427,24 +401,6 @@ selinit(void) sel.clipboard = NULL; } -int -x2col(int x) -{ - x -= borderpx; - x /= win.cw; - - return LIMIT(x, 0, term.col-1); -} - -int -y2row(int y) -{ - y -= borderpx; - y /= win.ch; - - return LIMIT(y, 0, term.row-1); -} - int tlinelen(int y) { @@ -669,9 +625,9 @@ die(const char *errstr, ...) } void -execsh(void) +execsh(char **args) { - char **args, *sh, *prog; + char *sh, *prog; const struct passwd *pw; errno = 0; @@ -685,13 +641,13 @@ execsh(void) if ((sh = getenv("SHELL")) == NULL) sh = (pw->pw_shell[0]) ? pw->pw_shell : shell; - if (opt_cmd) - prog = opt_cmd[0]; + if (args) + prog = args[0]; else if (utmp) prog = utmp; else prog = sh; - args = (opt_cmd) ? opt_cmd : (char *[]) {prog, NULL}; + DEFAULT(args, ((char *[]) {prog, NULL})); unsetenv("COLUMNS"); unsetenv("LINES"); @@ -732,7 +688,7 @@ sigchld(int a) void -stty(void) +stty(char **args) { char cmd[_POSIX_ARG_MAX], **p, *q, *s; size_t n, siz; @@ -742,7 +698,7 @@ stty(void) memcpy(cmd, stty_args, n); q = cmd + n; siz = sizeof(cmd) - n; - for (p = opt_cmd; p && (s = *p); ++p) { + for (p = args; p && (s = *p); ++p) { if ((n = strlen(s)) > siz-1) die("stty parameter length too long\n"); *q++ = ' '; @@ -756,26 +712,26 @@ stty(void) } void -ttynew(void) +ttynew(char *line, char *out, char **args) { int m, s; struct winsize w = {term.row, term.col, 0, 0}; - if (opt_io) { + if (out) { term.mode |= MODE_PRINT; - iofd = (!strcmp(opt_io, "-")) ? - 1 : open(opt_io, O_WRONLY | O_CREAT, 0666); + iofd = (!strcmp(out, "-")) ? + 1 : open(out, O_WRONLY | O_CREAT, 0666); if (iofd < 0) { fprintf(stderr, "Error opening %s:%s\n", - opt_io, strerror(errno)); + out, strerror(errno)); } } - if (opt_line) { - if ((cmdfd = open(opt_line, O_RDWR)) < 0) + if (line) { + if ((cmdfd = open(line, O_RDWR)) < 0) die("open line failed: %s\n", strerror(errno)); dup2(cmdfd, 0); - stty(); + stty(args); return; } @@ -797,7 +753,7 @@ ttynew(void) die("ioctl TIOCSCTTY failed: %s\n", strerror(errno)); close(s); close(m); - execsh(); + execsh(args); break; default: close(s); @@ -932,14 +888,14 @@ ttysend(char *s, size_t n) } void -ttyresize(void) +ttyresize(int tw, int th) { struct winsize w; w.ws_row = term.row; w.ws_col = term.col; - w.ws_xpixel = win.tw; - w.ws_ypixel = win.th; + w.ws_xpixel = tw; + w.ws_ypixel = th; if (ioctl(cmdfd, TIOCSWINSZ, &w) < 0) fprintf(stderr, "Couldn't set window size: %s\n", strerror(errno)); } @@ -1977,8 +1933,7 @@ void tprinter(char *s, size_t len) { if (iofd != -1 && xwrite(iofd, s, len) < 0) { - fprintf(stderr, "Error writing in %s:%s\n", - opt_io, strerror(errno)); + perror("Error writing to output file"); close(iofd); iofd = -1; } @@ -2516,9 +2471,6 @@ tresize(int col, int row) free(term.alt[i]); } - /* resize to new width */ - term.specbuf = xrealloc(term.specbuf, col * sizeof(GlyphFontSpec)); - /* resize to new height */ term.line = xrealloc(term.line, row * sizeof(Line)); term.alt = xrealloc(term.alt, row * sizeof(Line)); @@ -2570,7 +2522,7 @@ tresize(int col, int row) void resettitle(void) { - xsettitle(opt_title ? opt_title : "st"); + xsettitle(NULL); } void @@ -2580,71 +2532,8 @@ redraw(void) draw(); } -int -match(uint mask, uint state) -{ - return mask == XK_ANY_MOD || mask == (state & ~ignoremod); -} - void numlock(const Arg *dummy) { term.numlock ^= 1; } - -char* -kmap(KeySym k, uint state) -{ - Key *kp; - int i; - - /* Check for mapped keys out of X11 function keys. */ - for (i = 0; i < LEN(mappedkeys); i++) { - if (mappedkeys[i] == k) - break; - } - if (i == LEN(mappedkeys)) { - if ((k & 0xFFFF) < 0xFD00) - return NULL; - } - - for (kp = key; kp < key + LEN(key); kp++) { - if (kp->k != k) - continue; - - if (!match(kp->mask, state)) - continue; - - if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) - continue; - if (term.numlock && kp->appkey == 2) - continue; - - if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) - continue; - - if (IS_SET(MODE_CRLF) ? kp->crlf < 0 : kp->crlf > 0) - continue; - - return kp->s; - } - - return NULL; -} - -void -cresize(int width, int height) -{ - int col, row; - - if (width != 0) - win.w = width; - if (height != 0) - win.h = height; - - col = (win.w - 2 * borderpx) / win.cw; - row = (win.h - 2 * borderpx) / win.ch; - - tresize(col, row); - xresize(col, row); -}