Move key-matching functions into x.c
[st.git] / st.c
diff --git a/st.c b/st.c
index d7bd32a..1a8fa1f 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,
@@ -115,24 +110,11 @@ 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 *);
 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 +155,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);
@@ -201,7 +182,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;
@@ -223,10 +203,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};
@@ -237,6 +213,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)
@@ -386,6 +364,13 @@ static const char base64_digits[] = {
        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)
 {
@@ -393,13 +378,13 @@ base64dec(const char *src)
        char *result, *dst;
 
        if (in_len % 4)
-               return NULL;
+               in_len += 4 - (in_len % 4);
        result = dst = xmalloc(in_len / 4 * 3 + 1);
        while (*src) {
-               int a = base64_digits[(unsigned char) *src++];
-               int b = base64_digits[(unsigned char) *src++];
-               int c = base64_digits[(unsigned char) *src++];
-               int d = base64_digits[(unsigned char) *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)
@@ -425,24 +410,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)
 {
@@ -699,7 +666,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);
@@ -931,14 +897,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));
 }
@@ -1986,14 +1952,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);
@@ -2178,10 +2141,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 */
@@ -2521,9 +2481,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));
@@ -2537,7 +2494,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));
        }
@@ -2572,37 +2529,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)
 {
@@ -2616,84 +2542,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);
-}
-
-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);
-}