Pass new dimensions into ttyresize
[st.git] / st.c
diff --git a/st.c b/st.c
index 1e4196e..839dc94 100644 (file)
--- a/st.c
+++ b/st.c
 #include <X11/cursorfont.h>
 #include <X11/Xft/Xft.h>
 
-char *argv0;
-
-#define Glyph Glyph_
-#define Font Font_
-
-#include "win.h"
 #include "st.h"
+#include "win.h"
 
 #if   defined(__linux)
  #include <pty.h>
@@ -60,7 +55,7 @@ char *argv0;
 #define ISDELIM(u)             (utf8strchr(worddelimiters, u) != NULL)
 
 /* constants */
-#define ISO14755CMD            "dmenu -w %lu -p codepoint: </dev/null"
+#define ISO14755CMD            "dmenu -w \"$WINDOWID\" -p codepoint: </dev/null"
 
 enum cursor_movement {
        CURSOR_SAVE,
@@ -130,9 +125,6 @@ static void clipcopy(const Arg *);
 static void clippaste(const Arg *);
 static void numlock(const Arg *);
 static void selpaste(const Arg *);
-static void zoom(const Arg *);
-static void zoomabs(const Arg *);
-static void zoomreset(const Arg *);
 static void printsel(const Arg *);
 static void printscreen(const Arg *) ;
 static void iso14755(const Arg *);
@@ -173,7 +165,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);
@@ -198,8 +189,9 @@ static char utf8encodebyte(Rune, size_t);
 static char *utf8strchr(char *s, Rune u);
 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;
@@ -221,10 +213,6 @@ 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};
@@ -369,6 +357,55 @@ utf8validate(Rune *u, size_t i)
        return i;
 }
 
+static const char base64_digits[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0,
+       63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, -1, 0, 0, 0, 0, 1,
+       2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+       22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+       35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+char
+base64dec_getc(const char **src)
+{
+       while (**src && !isprint(**src)) (*src)++;
+       return *((*src)++);
+}
+
+char *
+base64dec(const char *src)
+{
+       size_t in_len = strlen(src);
+       char *result, *dst;
+
+       if (in_len % 4)
+               in_len += 4 - (in_len % 4);
+       result = dst = xmalloc(in_len / 4 * 3 + 1);
+       while (*src) {
+               int a = base64_digits[(unsigned char) base64dec_getc(&src)];
+               int b = base64_digits[(unsigned char) base64dec_getc(&src)];
+               int c = base64_digits[(unsigned char) base64dec_getc(&src)];
+               int d = base64_digits[(unsigned char) base64dec_getc(&src)];
+
+               *dst++ = (a << 2) | ((b & 0x30) >> 4);
+               if (c == -1)
+                       break;
+               *dst++ = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2);
+               if (d == -1)
+                       break;
+               *dst++ = ((c & 0x03) << 6) | d;
+       }
+       *dst = '\0';
+       return result;
+}
+
 void
 selinit(void)
 {
@@ -381,24 +418,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)
 {
@@ -655,7 +674,6 @@ execsh(void)
        setenv("SHELL", sh, 1);
        setenv("HOME", pw->pw_dir, 1);
        setenv("TERM", termname, 1);
-       xsetenv();
 
        signal(SIGCHLD, SIG_DFL);
        signal(SIGHUP, SIG_DFL);
@@ -887,14 +905,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));
 }
@@ -1820,6 +1838,19 @@ strhandle(void)
                        if (narg > 1)
                                xsettitle(strescseq.args[1]);
                        return;
+               case 52:
+                       if (narg > 2) {
+                               char *dec;
+
+                               dec = base64dec(strescseq.args[2]);
+                               if (dec) {
+                                       xsetsel(dec, CurrentTime);
+                                       clipcopy(NULL);
+                               } else {
+                                       fprintf(stderr, "erresc: invalid base64\n");
+                               }
+                       }
+                       return;
                case 4: /* color set */
                        if (narg < 3)
                                break;
@@ -1929,14 +1960,11 @@ tprinter(char *s, size_t len)
 void
 iso14755(const Arg *arg)
 {
-       unsigned long id = xwinid();
-       char cmd[sizeof(ISO14755CMD) + NUMMAXLEN(id)];
        FILE *p;
        char *us, *e, codepoint[9], uc[UTF_SIZ];
        unsigned long utf32;
 
-       snprintf(cmd, sizeof(cmd), ISO14755CMD, id);
-       if (!(p = popen(cmd, "r")))
+       if (!(p = popen(ISO14755CMD, "r")))
                return;
 
        us = fgets(codepoint, sizeof(codepoint), p);
@@ -2121,10 +2149,7 @@ tcontrolcode(uchar ascii)
                        /* backwards compatibility to xterm */
                        strhandle();
                } else {
-                       if (!(win.state & WIN_FOCUSED))
-                               xseturgency(1);
-                       if (bellvolume)
-                               xbell(bellvolume);
+                       xbell();
                }
                break;
        case '\033': /* ESC */
@@ -2464,9 +2489,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));
@@ -2480,7 +2502,7 @@ tresize(int col, int row)
        }
 
        /* allocate any new rows */
-       for (/* i == minrow */; i < row; i++) {
+       for (/* i = minrow */; i < row; i++) {
                term.line[i] = xmalloc(col * sizeof(Glyph));
                term.alt[i] = xmalloc(col * sizeof(Glyph));
        }
@@ -2515,37 +2537,6 @@ tresize(int col, int row)
        term.c = c;
 }
 
-void
-zoom(const Arg *arg)
-{
-       Arg larg;
-
-       larg.f = usedfontsize + arg->f;
-       zoomabs(&larg);
-}
-
-void
-zoomabs(const Arg *arg)
-{
-       xunloadfonts();
-       xloadfonts(usedfont, arg->f);
-       cresize(0, 0);
-       ttyresize();
-       redraw();
-       xhints();
-}
-
-void
-zoomreset(const Arg *arg)
-{
-       Arg larg;
-
-       if (defaultfontsize > 0) {
-               larg.f = defaultfontsize;
-               zoomabs(&larg);
-       }
-}
-
 void
 resettitle(void)
 {
@@ -2610,33 +2601,3 @@ kmap(KeySym k, uint state)
 
        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);
-}
-
-void
-usage(void)
-{
-       die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]"
-           " [-n name] [-o file]\n"
-           "          [-T title] [-t title] [-w windowid]"
-           " [[-e] command [args ...]]\n"
-           "       %s [-aiv] [-c class] [-f font] [-g geometry]"
-           " [-n name] [-o file]\n"
-           "          [-T title] [-t title] [-w windowid] -l line"
-           " [stty_args ...]\n", argv0, argv0);
-}