diff --git a/.gitignore b/.gitignore index 0438df2..9a45eef 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ patches/ .gitignore *.o st -*.orig diff --git a/LICENSE b/LICENSE index 3cbf420..d80eb47 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT/X Consortium License -© 2014-2022 Hiltjo Posthuma +© 2014-2020 Hiltjo Posthuma © 2018 Devin J. Pohly © 2014-2017 Quentin Rameau © 2009-2012 Aurélien APTEL diff --git a/Makefile b/Makefile index 02045f0..0e9d2d9 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,8 @@ dist: clean rm -rf st-$(VERSION) install: st + git submodule init + git submodule update mkdir -p $(DESTDIR)$(PREFIX)/bin cp -f st $(DESTDIR)$(PREFIX)/bin cp -f st-copyout $(DESTDIR)$(PREFIX)/bin diff --git a/PKGBUILD b/PKGBUILD index 66dd05e..03d6f9f 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -13,7 +13,7 @@ options=('zipman') depends=('libxft') makedepends=('ncurses' 'libxext' 'git') optdepends=('dmenu: feed urls to dmenu') -source=(git+https://github.com/LukeSmithxyz/st) +source=('git://github.com/LukeSmithxyz/st') sha1sums=('SKIP') provides=("${_pkgname}") diff --git a/README.md b/README.md index a233146..c410e4b 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ features that make it literally the best terminal emulator ever: + Boxdraw + Ligatures + font2 -+ updated to latest version 0.8.5 ++ updated to latest version 0.8.4 ## Installation for newbs @@ -83,6 +83,16 @@ To be clear about the color settings: Note that when you run `wal`, it will negate the transparency of existing windows, but new windows will continue with the previously defined transparency. +## Notes on Emojis and Special Characters + +If st crashes when viewing emojis, install +[libxft-bgra](https://aur.archlinux.org/packages/libxft-bgra/) from the AUR. + +Note that some special characters may appear truncated if too wide. You might +want to manually set your prefered emoji/special character font to a lower size +in the `config.h` file to avoid this. By default, JoyPixels is used at a +smaller size than the usual text. + ## Contact - Luke Smith diff --git a/config.h b/config.h index 5d67380..d6eeade 100644 --- a/config.h +++ b/config.h @@ -5,8 +5,8 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "monospace:pixelsize=32:antialias=true:autohint=true"; -static char *font2[] = { "monospace:pixelsize=32:antialias=true:autohint=true" }; +static char *font = "mono:pixelsize=12:antialias=true:autohint=true"; +static char *font2[] = { "JoyPixels:pixelsize=10:antialias=true:autohint=true" }; static int borderpx = 2; /* @@ -245,8 +245,6 @@ static MouseShortcut mshortcuts[] = { static char *openurlcmd[] = { "/bin/sh", "-c", "st-urlhandler -o", "externalpipe", NULL }; static char *copyurlcmd[] = { "/bin/sh", "-c", "st-urlhandler -c", "externalpipe", NULL }; static char *copyoutput[] = { "/bin/sh", "-c", "st-copyout", "externalpipe", NULL }; -static char *copyemailcmd[] = { "/bin/sh", "-c", "st-emailhandler", "externalpipe", NULL }; -static char *weechat[] = { "/bin/sh", "-c", "st-weechatlinks", "externalpipe", NULL }; static Shortcut shortcuts[] = { @@ -283,11 +281,9 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_J, zoom, {.f = -1} }, { TERMMOD, XK_U, zoom, {.f = +2} }, { TERMMOD, XK_D, zoom, {.f = -2} }, - { MODKEY, XK_Return, newterm, {.i = 0} }, { MODKEY, XK_l, externalpipe, {.v = openurlcmd } }, { MODKEY, XK_y, externalpipe, {.v = copyurlcmd } }, { MODKEY, XK_o, externalpipe, {.v = copyoutput } }, - { MODKEY, XK_x, externalpipe, {.v = weechat} }, }; /* @@ -559,4 +555,3 @@ static char ascii_printable[] = " !\"#$%&'()*+,-./0123456789:;<=>?" "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" "`abcdefghijklmnopqrstuvwxyz{|}~"; - diff --git a/config.mk b/config.mk index ef6de39..1741840 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # st version -VERSION = 0.8.5 +VERSION = 0.8.4 # Customize below to fit your system diff --git a/hb.c b/hb.c index 8000afa..467bcac 100644 --- a/hb.c +++ b/hb.c @@ -2,25 +2,11 @@ #include #include #include -#include #include #include #include "st.h" -#define FEATURE(c1,c2,c3,c4) { .tag = HB_TAG(c1,c2,c3,c4), .value = 1, .start = HB_FEATURE_GLOBAL_START, .end = HB_FEATURE_GLOBAL_END } - -/* - * Replace 0 with a list of font features, wrapped in FEATURE macro, e.g. - * FEATURE('c', 'a', 'l', 't'), FEATURE('d', 'l', 'i', 'g') - * - * Uncomment either one of the 2 lines below. Uncomment the prior to disable (any) font features. Uncomment the - * latter to enable the (selected) font features. - */ - -hb_feature_t features[] = { 0 }; -//hb_feature_t features[] = { FEATURE('s','s','0','1'), FEATURE('s','s','0','2'), FEATURE('s','s','0','3'), FEATURE('s','s','0','5'), FEATURE('s','s','0','6'), FEATURE('s','s','0','7'), FEATURE('s','s','0','8'), FEATURE('z','e','r','o') }; - void hbtransformsegment(XftFont *xfont, const Glyph *string, hb_codepoint_t *codepoints, int start, int length); hb_font_t *hbfindfont(XftFont *match); @@ -73,7 +59,7 @@ void hbtransform(XftGlyphFontSpec *specs, const Glyph *glyphs, size_t len, int x, int y) { int start = 0, length = 1, gstart = 0; - hb_codepoint_t *codepoints = calloc((unsigned int)len, sizeof(hb_codepoint_t)); + hb_codepoint_t *codepoints = calloc(len, sizeof(hb_codepoint_t)); for (int idx = 1, specidx = 1; idx < len; idx++) { if (glyphs[idx].mode & ATTR_WDUMMY) { @@ -138,7 +124,7 @@ hbtransformsegment(XftFont *xfont, const Glyph *string, hb_codepoint_t *codepoin } /* Shape the segment. */ - hb_shape(font, buffer, features, sizeof(features)); + hb_shape(font, buffer, NULL, 0); /* Get new glyph info. */ hb_glyph_info_t *info = hb_buffer_get_glyph_infos(buffer, NULL); diff --git a/st-urlhandler b/st-urlhandler index 0eb4586..e2a62f4 100755 --- a/st-urlhandler +++ b/st-urlhandler @@ -1,6 +1,6 @@ #!/bin/sh -urlregex="(((http|https|gopher|gemini|ftp|ftps|git)://|www\\.)[a-zA-Z0-9.]*[:;a-zA-Z0-9./+@$&%?$\#=_~-]*)|((magnet:\\?xt=urn:btih:)[a-zA-Z0-9]*)" +urlregex="(((http|https|gopher|gemini|ftp|ftps|git)://|www\\.)[a-zA-Z0-9.]*[:]?[a-zA-Z0-9./@$&%?$\#=_~-]*)|((magnet:\\?xt=urn:btih:)[a-zA-Z0-9]*)" urls="$(sed 's/.*│//g' | tr -d '\n' | # First remove linebreaks and mutt sidebars: grep -aEo "$urlregex" | # grep only urls as defined above. diff --git a/st.c b/st.c index 6887d9a..f9f8068 100644 --- a/st.c +++ b/st.c @@ -20,8 +20,6 @@ #include "st.h" #include "win.h" -extern char *argv0; - #if defined(__linux) #include #elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) @@ -120,7 +118,6 @@ typedef struct { typedef struct { int row; /* nb row */ int col; /* nb col */ - int maxcol; Line *line; /* screen */ Line *alt; /* alternate screen */ Line hist[HISTSIZE]; /* history buffer */ @@ -164,7 +161,6 @@ typedef struct { } STREscape; static void execsh(char *, char **); -static int chdir_by_pid(pid_t pid); static void stty(char **); static void sigchld(int); static void ttywriteraw(const char *, size_t); @@ -173,7 +169,6 @@ static void csidump(void); static void csihandle(void); static void csiparse(void); static void csireset(void); -static void osc_color_response(int, int, int); static int eschandle(uchar); static void strdump(void); static void strhandle(void); @@ -199,17 +194,17 @@ static void tputc(Rune); static void treset(void); static void tscrollup(int, int, int); static void tscrolldown(int, int, int); -static void tsetattr(const int *, int); -static void tsetchar(Rune, const Glyph *, int, int); +static void tsetattr(int *, int); +static void tsetchar(Rune, Glyph *, int, int); static void tsetdirt(int, int); static void tsetscroll(int, int); static void tswapscreen(void); -static void tsetmode(int, int, const int *, int); +static void tsetmode(int, int, int *, int); static int twrite(const char *, int, int); static void tcontrolcode(uchar ); static void tdectest(char ); static void tdefutf8(char); -static int32_t tdefcolor(const int *, int *, int); +static int32_t tdefcolor(int *, int *, int); static void tdeftran(char); static void tstrsequence(uchar); @@ -238,10 +233,10 @@ static int iofd = 1; static int cmdfd; static pid_t pid; -static const uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; +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}; +static Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; ssize_t xwrite(int fd, const char *s, size_t len) @@ -281,16 +276,12 @@ xrealloc(void *p, size_t len) } char * -xstrdup(const char *s) +xstrdup(char *s) { if ((s = strdup(s)) == NULL) die("strdup: %s\n", strerror(errno)); - char *p; - if ((p = strdup(s)) == NULL) - die("strdup: %s\n", strerror(errno)); - - return p; + return s; } size_t @@ -363,10 +354,25 @@ 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((unsigned char)**src)) + while (**src && !isprint(**src)) (*src)++; return **src ? *((*src)++) : '='; /* emulate padding if string ends */ } @@ -376,13 +382,6 @@ base64dec(const char *src) { size_t in_len = strlen(src); char *result, *dst; - static const char base64_digits[256] = { - [43] = 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 - }; if (in_len % 4) in_len += 4 - (in_len % 4); @@ -491,7 +490,6 @@ selextend(int col, int row, int type, int done) sel.mode = done ? SEL_IDLE : SEL_READY; } - void selnormalize(void) { @@ -541,7 +539,7 @@ selsnap(int *x, int *y, int direction) { int newx, newy, xt, yt; int delim, prevdelim; - const Glyph *gp, *prevgp; + Glyph *gp, *prevgp; switch (sel.snap) { case SNAP_WORD: @@ -614,7 +612,7 @@ getsel(void) { char *str, *ptr; int y, bufsize, lastx, linelen; - const Glyph *gp, *last; + Glyph *gp, *last; if (sel.ob.x == -1) return NULL; @@ -781,7 +779,7 @@ stty(char **args) } int -ttynew(const char *line, char *cmd, const char *out, char **args) +ttynew(char *line, char *cmd, char *out, char **args) { int m, s; @@ -814,15 +812,14 @@ ttynew(const char *line, char *cmd, const char *out, char **args) break; case 0: close(iofd); - close(m); setsid(); /* create a new process group */ dup2(s, 0); dup2(s, 1); dup2(s, 2); if (ioctl(s, TIOCSCTTY, NULL) < 0) die("ioctl TIOCSCTTY failed: %s\n", strerror(errno)); - if (s > 2) - close(s); + close(s); + close(m); #ifdef __OpenBSD__ if (pledge("stdio getpw proc exec", NULL) == -1) die("pledge\n"); @@ -834,7 +831,6 @@ ttynew(const char *line, char *cmd, const char *out, char **args) if (pledge("stdio rpath tty proc", NULL) == -1) die("pledge\n"); #endif - fcntl(m, F_SETFD, FD_CLOEXEC); close(s); cmdfd = m; signal(SIGCHLD, sigchld); @@ -971,7 +967,7 @@ ttyresize(int tw, int th) } void -ttyhangup(void) +ttyhangup() { /* Send SIGHUP to shell */ kill(pid, SIGHUP); @@ -1086,38 +1082,6 @@ tswapscreen(void) tfulldirt(); } -void -newterm(const Arg* a) -{ - int res; - switch (fork()) { - case -1: - die("fork failed: %s\n", strerror(errno)); - break; - case 0: - switch (fork()) { - case -1: - die("fork failed: %s\n", strerror(errno)); - break; - case 0: - chdir_by_pid(pid); - execlp("/proc/self/exe", argv0, NULL); - exit(1); - break; - default: - exit(0); - } - default: - wait(NULL); - } -} - -static int chdir_by_pid(pid_t pid) { - char buf[32]; - snprintf(buf, sizeof buf, "/proc/%ld/cwd", (long)pid); - return chdir(buf); -} - void kscrolldown(const Arg* a) { @@ -1298,9 +1262,9 @@ tmoveto(int x, int y) } void -tsetchar(Rune u, const Glyph *attr, int x, int y) +tsetchar(Rune u, Glyph *attr, int x, int y) { - static const char *vt100_0[62] = { /* 0x41 - 0x7e */ + static char *vt100_0[62] = { /* 0x41 - 0x7e */ "↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */ 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ 0, 0, 0, 0, 0, 0, 0, 0, /* P - W */ @@ -1347,8 +1311,8 @@ tclearregion(int x1, int y1, int x2, int y2) if (y1 > y2) temp = y1, y1 = y2, y2 = temp; - LIMIT(x1, 0, term.maxcol-1); - LIMIT(x2, 0, term.maxcol-1); + LIMIT(x1, 0, term.col-1); + LIMIT(x2, 0, term.col-1); LIMIT(y1, 0, term.row-1); LIMIT(y2, 0, term.row-1); @@ -1415,7 +1379,7 @@ tdeleteline(int n) } int32_t -tdefcolor(const int *attr, int *npar, int l) +tdefcolor(int *attr, int *npar, int l) { int32_t idx = -1; uint r, g, b; @@ -1465,7 +1429,7 @@ tdefcolor(const int *attr, int *npar, int l) } void -tsetattr(const int *attr, int l) +tsetattr(int *attr, int l) { int i; int32_t idx; @@ -1583,9 +1547,9 @@ tsetscroll(int t, int b) } void -tsetmode(int priv, int set, const int *args, int narg) +tsetmode(int priv, int set, int *args, int narg) { - int alt; const int *lim; + int alt, *lim; for (lim = args + narg; args < lim; ++args) { if (priv) { @@ -1954,41 +1918,11 @@ csireset(void) memset(&csiescseq, 0, sizeof(csiescseq)); } -void -osc_color_response(int num, int index, int is_osc4) -{ - int n; - char buf[32]; - unsigned char r, g, b; - - if (xgetcolor(is_osc4 ? num : index, &r, &g, &b)) { - fprintf(stderr, "erresc: failed to fetch %s color %d\n", - is_osc4 ? "osc4" : "osc", - is_osc4 ? num : index); - return; - } - - n = snprintf(buf, sizeof buf, "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02x\007", - is_osc4 ? "4;" : "", num, r, r, g, g, b, b); - if (n < 0 || n >= sizeof(buf)) { - fprintf(stderr, "error: %s while printing %s response\n", - n < 0 ? "snprintf failed" : "truncation occurred", - is_osc4 ? "osc4" : "osc"); - } else { - ttywrite(buf, n, 1); - } -} - void strhandle(void) { char *p = NULL, *dec; int j, narg, par; - const struct { int idx; char *str; } osc_table[] = { - { defaultfg, "foreground" }, - { defaultbg, "background" }, - { defaultcs, "cursor" } - }; term.esc &= ~(ESC_STR_END|ESC_STR); strparse(); @@ -2022,35 +1956,14 @@ strhandle(void) } } return; - case 10: - case 11: - case 12: - if (narg < 2) - break; - p = strescseq.args[1]; - if ((j = par - 10) < 0 || j >= LEN(osc_table)) - break; /* shouldn't be possible */ - - if (!strcmp(p, "?")) { - osc_color_response(par, osc_table[j].idx, 0); - } else if (xsetcolorname(osc_table[j].idx, p)) { - fprintf(stderr, "erresc: invalid %s color: %s\n", - osc_table[j].str, p); - } else { - tfulldirt(); - } - return; case 4: /* color set */ if (narg < 3) break; p = strescseq.args[2]; /* FALLTHROUGH */ - case 104: /* color reset */ + case 104: /* color reset, here p = NULL */ j = (narg > 1) ? atoi(strescseq.args[1]) : -1; - - if (p && !strcmp(p, "?")) { - osc_color_response(j, 0, 1); - } else if (xsetcolorname(j, p)) { + if (xsetcolorname(j, p)) { if (par == 104 && narg <= 1) return; /* color reset without parameter */ fprintf(stderr, "erresc: invalid color j=%d, p=%s\n", @@ -2060,7 +1973,7 @@ strhandle(void) * TODO if defaultbg color is changed, borders * are dirty */ - tfulldirt(); + redraw(); } return; } @@ -2241,7 +2154,7 @@ void tdumpline(int n) { char buf[UTF_SIZ]; - const Glyph *bp, *end; + Glyph *bp, *end; bp = &term.line[n][0]; end = &bp[MIN(tlinelen(n), term.col) - 1]; @@ -2647,10 +2560,6 @@ check_control_code: if (width == 2) { gp->mode |= ATTR_WIDE; if (term.c.x+1 < term.col) { - if (gp[1].mode == ATTR_WIDE && term.c.x+2 < term.col) { - gp[2].u = ' '; - gp[2].mode &= ~ATTR_WDUMMY; - } gp[1].u = '\0'; gp[1].mode = ATTR_WDUMMY; } @@ -2698,18 +2607,11 @@ void tresize(int col, int row) { int i, j; - int tmp; - int minrow, mincol; + int minrow = MIN(row, term.row); + int mincol = MIN(col, term.col); int *bp; TCursor c; - tmp = col; - if (!term.maxcol) - term.maxcol = term.col; - col = MAX(col, term.maxcol); - minrow = MIN(row, term.row); - mincol = MIN(col, term.maxcol); - if (col < 1 || row < 1) { fprintf(stderr, "tresize: error resizing to %dx%d\n", col, row); @@ -2760,18 +2662,17 @@ tresize(int col, int row) term.line[i] = xmalloc(col * sizeof(Glyph)); term.alt[i] = xmalloc(col * sizeof(Glyph)); } - if (col > term.maxcol) { - bp = term.tabs + term.maxcol; + if (col > term.col) { + bp = term.tabs + term.col; - memset(bp, 0, sizeof(*term.tabs) * (col - term.maxcol)); + memset(bp, 0, sizeof(*term.tabs) * (col - term.col)); while (--bp > term.tabs && !*bp) /* nothing */ ; for (bp += tabspaces; bp < term.tabs + col; bp += tabspaces) *bp = 1; } /* update terminal size */ - term.col = tmp; - term.maxcol = col; + term.col = col; term.row = row; /* reset scrolling region */ tsetscroll(0, row-1); @@ -2849,4 +2750,3 @@ redraw(void) tfulldirt(); draw(); } - diff --git a/st.h b/st.h index 507b862..3ddfadd 100644 --- a/st.h +++ b/st.h @@ -88,8 +88,6 @@ void draw(void); void externalpipe(const Arg *); void kscrolldown(const Arg *); void kscrollup(const Arg *); - -void newterm(const Arg *); void printscreen(const Arg *); void printsel(const Arg *); void sendbreak(const Arg *); @@ -100,7 +98,7 @@ void tnew(int, int); void tresize(int, int); void tsetdirtattr(int); void ttyhangup(void); -int ttynew(const char *, char *, const char *, char **); +int ttynew(char *, char *, char *, char **); size_t ttyread(void); void ttyresize(int, int); void ttywrite(const char *, size_t, int); @@ -118,7 +116,7 @@ size_t utf8encode(Rune, char *); void *xmalloc(size_t); void *xrealloc(void *, size_t); -char *xstrdup(const char *); +char *xstrdup(char *); int isboxdraw(Rune); ushort boxdrawindex(const Glyph *); @@ -143,5 +141,3 @@ extern unsigned int defaultbg; extern float alpha; extern float alphaUnfocus; extern const int boxdraw, boxdraw_bold, boxdraw_braille; -extern unsigned int defaultcs; - diff --git a/win.h b/win.h index 8839e31..8b5b618 100644 --- a/win.h +++ b/win.h @@ -30,7 +30,6 @@ void xdrawline(Line, int, int, int); void xfinishdraw(void); void xloadcols(void); int xsetcolorname(int, const char *); -int xgetcolor(int, unsigned char *, unsigned char *, unsigned char *); void xseticontitle(char *); void xsettitle(char *); int xsetcursor(int); @@ -39,4 +38,3 @@ void xsetpointermotion(int); void xsetsel(char *); int xstartdraw(void); void xximspot(int, int); - diff --git a/x.c b/x.c index 4678729..2580d2a 100644 --- a/x.c +++ b/x.c @@ -63,7 +63,7 @@ typedef struct { /* X modifiers */ #define XK_ANY_MOD UINT_MAX #define XK_NO_MOD 0 -#define XK_SWITCH_MOD (1<<13|1<<14) +#define XK_SWITCH_MOD (1<<13) /* function definitions used in config.h */ static void clipcopy(const Arg *); @@ -97,7 +97,6 @@ typedef XftGlyphFontSpec GlyphFontSpec; typedef struct { int tw, th; /* tty width and height */ int w, h; /* window width and height */ - int hborderpx, vborderpx; int ch; /* char height */ int cw; /* char width */ int mode; /* window state/mode flags */ @@ -174,9 +173,9 @@ static void xresize(int, int); static void xhints(void); static int xloadcolor(int, const char *, Color *); static int xloadfont(Font *, FcPattern *); +static void xloadfonts(char *, double); static int xloadsparefont(FcPattern *, int); static void xloadsparefonts(void); -static void xloadfonts(const char *, double); static void xunloadfont(Font *); static void xunloadfonts(void); static void xsetenv(void); @@ -277,7 +276,6 @@ static char *opt_title = NULL; static int focused = 0; static int oldbutton = 3; /* button event on startup: 3 = release */ -static uint buttons; /* bit field of pressed buttons */ void clipcopy(const Arg *dummy) @@ -369,7 +367,7 @@ ttysend(const Arg *arg) int evcol(XEvent *e) { - int x = e->xbutton.x - win.hborderpx; + int x = e->xbutton.x - borderpx; LIMIT(x, 0, win.tw - 1); return x / win.cw; } @@ -377,7 +375,7 @@ evcol(XEvent *e) int evrow(XEvent *e) { - int y = e->xbutton.y - win.vborderpx; + int y = e->xbutton.y - borderpx; LIMIT(y, 0, win.th - 1); return y / win.ch; } @@ -460,7 +458,7 @@ mousereport(XEvent *e) if (IS_SET(MODE_MOUSESGR)) { len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c", button, x+1, y+1, - e->type == ButtonRelease ? 'm' : 'M'); + e->xbutton.type == ButtonRelease ? 'm' : 'M'); } else if (x < 223 && y < 223) { len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", 32+button, 32+x+1, 32+y+1); @@ -506,13 +504,9 @@ mouseaction(XEvent *e, uint release) void bpress(XEvent *e) { - int btn = e->xbutton.button; struct timespec now; int snap; - if (1 <= btn && btn <= 11) - buttons |= 1 << (btn-1); - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { mousereport(e); return; @@ -521,7 +515,7 @@ bpress(XEvent *e) if (mouseaction(e, 0)) return; - if (btn == Button1) { + if (e->xbutton.button == Button1) { /* * If the user clicks below predefined timeouts specific * snapping behaviour is exposed. @@ -735,11 +729,6 @@ xsetsel(char *str) void brelease(XEvent *e) { - int btn = e->xbutton.button; - - if (1 <= btn && btn <= 11) - buttons &= ~(1 << (btn-1)); - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { mousereport(e); return; @@ -747,7 +736,7 @@ brelease(XEvent *e) if (mouseaction(e, 1)) return; - if (btn == Button1) + if (e->xbutton.button == Button1) mousesel(e, 1); } @@ -777,9 +766,6 @@ cresize(int width, int height) col = MAX(1, col); row = MAX(1, row); - win.hborderpx = (win.w - col * win.cw) / 2; - win.vborderpx = (win.h - row * win.ch) / 2; - tresize(col, row); xresize(col, row); ttyresize(win.tw, win.th); @@ -834,7 +820,7 @@ xloadcolor(int i, const char *name, Color *ncolor) void xloadalpha(void) { - float const usedAlpha = alpha; + float const usedAlpha = focused ? alpha : alphaUnfocus; if (opt_alpha) alpha = strtof(opt_alpha, NULL); dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * usedAlpha); dc.col[defaultbg].pixel &= 0x00FFFFFF; @@ -868,19 +854,6 @@ xloadcols(void) loaded = 1; } -int -xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) -{ - if (!BETWEEN(x, 0, dc.collen)) - return 1; - - *r = dc.col[x].color.red >> 8; - *g = dc.col[x].color.green >> 8; - *b = dc.col[x].color.blue >> 8; - - return 0; -} - int xsetcolorname(int x, const char *name) { @@ -922,8 +895,8 @@ xhints(void) sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; sizeh->height = win.h; sizeh->width = win.w; - sizeh->height_inc = 1; - sizeh->width_inc = 1; + sizeh->height_inc = win.ch; + sizeh->width_inc = win.cw; sizeh->base_height = 2 * borderpx; sizeh->base_width = 2 * borderpx; sizeh->min_height = win.ch + 2 * borderpx; @@ -1034,7 +1007,7 @@ xloadfont(Font *f, FcPattern *pattern) } void -xloadfonts(const char *fontstr, double fontsize) +xloadfonts(char *fontstr, double fontsize) { FcPattern *pattern; double fontval; @@ -1042,7 +1015,7 @@ xloadfonts(const char *fontstr, double fontsize) if (fontstr[0] == '-') pattern = XftXlfdParse(fontstr, False, False); else - pattern = FcNameParse((const FcChar8 *)fontstr); + pattern = FcNameParse((FcChar8 *)fontstr); if (!pattern) die("can't open font %s\n", fontstr); @@ -1316,8 +1289,8 @@ xinit(int cols, int rows) xloadcols(); /* adjust fixed window geometry */ - win.w = 2 * win.hborderpx + 2 * borderpx + cols * win.cw; - win.h = 2 * win.vborderpx + 2 * borderpx + rows * win.ch; + win.w = 2 * borderpx + cols * win.cw; + win.h = 2 * borderpx + rows * win.ch; if (xw.gm & XNegative) xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; if (xw.gm & YNegative) @@ -1404,7 +1377,7 @@ xinit(int cols, int rows) int xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) { - float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp; + float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; ushort mode, prevmode = USHRT_MAX; Font *font = &dc.font; int frcflags = FRC_NORMAL; @@ -1545,7 +1518,7 @@ void xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) { int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); - int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, + int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, width = charlen * win.cw; Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; XRenderColor colfg, colbg; @@ -1635,17 +1608,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i /* Intelligent cleaning up of the borders. */ if (x == 0) { - xclear(0, (y == 0)? 0 : winy, win.hborderpx, + xclear(0, (y == 0)? 0 : winy, borderpx, winy + win.ch + - ((winy + win.ch >= win.vborderpx + win.th)? win.h : 0)); + ((winy + win.ch >= borderpx + win.th)? win.h : 0)); } - if (winx + width >= win.hborderpx + win.tw) { + if (winx + width >= borderpx + win.tw) { xclear(winx + width, (y == 0)? 0 : winy, win.w, - ((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch))); + ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); } if (y == 0) - xclear(winx, 0, winx + width, win.vborderpx); - if (winy + win.ch >= win.vborderpx + win.th) + xclear(winx, 0, winx + width, borderpx); + if (winy + win.ch >= borderpx + win.th) xclear(winx, winy + win.ch, winx + width, win.h); /* Clean up the region we want to draw to. */ @@ -1668,11 +1641,11 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i /* Render underline and strikethrough. */ if (base.mode & ATTR_UNDERLINE) { XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, - width, 1); + width, 1); } if (base.mode & ATTR_STRUCK) { - XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3, + XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, width, 1); } @@ -1746,35 +1719,35 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int le case 3: /* Blinking Underline */ case 4: /* Steady Underline */ XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + (cy + 1) * win.ch - \ + borderpx + cx * win.cw, + borderpx + (cy + 1) * win.ch - \ cursorthickness, win.cw, cursorthickness); break; case 5: /* Blinking bar */ case 6: /* Steady bar */ XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, + borderpx + cx * win.cw, + borderpx + cy * win.ch, cursorthickness, win.ch); break; } } else { XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, + borderpx + cx * win.cw, + borderpx + cy * win.ch, win.cw - 1, 1); XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, + borderpx + cx * win.cw, + borderpx + cy * win.ch, 1, win.ch - 1); XftDrawRect(xw.draw, &drawcol, - win.hborderpx + (cx + 1) * win.cw - 1, - win.vborderpx + cy * win.ch, + borderpx + (cx + 1) * win.cw - 1, + borderpx + cy * win.ch, 1, win.ch - 1); XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + (cy + 1) * win.ch - 1, + borderpx + cx * win.cw, + borderpx + (cy + 1) * win.ch - 1, win.cw, 1); } } @@ -1794,9 +1767,8 @@ xseticontitle(char *p) XTextProperty prop; DEFAULT(p, opt_title); - if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, - &prop) != Success) - return; + Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, + &prop); XSetWMIconName(xw.dpy, xw.win, &prop); XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname); XFree(prop.value); @@ -1808,9 +1780,8 @@ xsettitle(char *p) XTextProperty prop; DEFAULT(p, opt_title); - if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, - &prop) != Success) - return; + Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, + &prop); XSetWMName(xw.dpy, xw.win, &prop); XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname); XFree(prop.value); @@ -2021,10 +1992,8 @@ kpress(XEvent *ev) { XKeyEvent *e = &ev->xkey; KeySym ksym; - char *buf = NULL, *customkey; - int len = 0; - int buf_size = 64; - int critical = - 1; + char buf[64], *customkey; + int len; Rune c; Status status; Shortcut *bp; @@ -2032,44 +2001,27 @@ kpress(XEvent *ev) if (IS_SET(MODE_KBDLOCK)) return; -reallocbuf: - if (critical > 0) - goto cleanup; - if (buf) - free(buf); - - buf = xmalloc((buf_size) * sizeof(char)); - critical += 1; - - if (xw.ime.xic) { - len = XmbLookupString(xw.ime.xic, e, buf, buf_size, &ksym, &status); - if (status == XBufferOverflow) { - buf_size = len; - goto reallocbuf; - } - } else { - // Not sure how to fix this and if it is fixable - // but at least it does write something into the buffer - // so it is not as critical - len = XLookupString(e, buf, buf_size, &ksym, NULL); - } + if (xw.ime.xic) + len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); + else + len = XLookupString(e, buf, sizeof buf, &ksym, NULL); /* 1. shortcuts */ for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { if (ksym == bp->keysym && match(bp->mod, e->state)) { bp->func(&(bp->arg)); - goto cleanup; + return; } } /* 2. custom keys from config.h */ if ((customkey = kmap(ksym, e->state))) { ttywrite(customkey, strlen(customkey), 1); - goto cleanup; + return; } /* 3. composed string from input method */ if (len == 0) - goto cleanup; + return; if (len == 1 && e->state & Mod1Mask) { if (IS_SET(MODE_8BIT)) { if (*buf < 0177) { @@ -2082,11 +2034,7 @@ reallocbuf: len = 2; } } - if (len <= buf_size) - ttywrite(buf, len, 1); -cleanup: - if (buf) - free(buf); + ttywrite(buf, len, 1); } void @@ -2367,4 +2315,3 @@ run: return 0; } -