X-Git-Url: https://git.xinqibao.xyz/st.git/blobdiff_plain/2752018e27420947a034d50f1ce165bbb76ae1a8..7efa4514d104d51793c4dd01ddedd4976080be07:/st.c diff --git a/st.c b/st.c index b4dc591..1ac7fde 100644 --- a/st.c +++ b/st.c @@ -197,7 +197,7 @@ typedef struct { Colormap cmap; Window win; XdbeBackBuffer buf; - Atom xembed; + Atom xembed, wmdeletewin; XIM xim; XIC xic; XftDraw *xft_draw; @@ -850,12 +850,15 @@ execsh(void) { void sigchld(int a) { int stat = 0; + if(waitpid(pid, &stat, 0) < 0) die("Waiting for pid %hd failed: %s\n", pid, SERRNO); - if(WIFEXITED(stat)) + + if(WIFEXITED(stat)) { exit(WEXITSTATUS(stat)); - else + } else { exit(EXIT_FAILURE); + } } void @@ -2173,6 +2176,8 @@ xinit(void) { &(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000}); xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); + xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); + XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1); xresettitle(); XMapWindow(xw.dpy, xw.win); @@ -2192,10 +2197,27 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { if(base.mode & ATTR_REVERSE) temp = fg, fg = bg, bg = temp; + if(base.mode & ATTR_BOLD) { - fg = &dc.xft_col[base.fg + 8]; + if(BETWEEN(base.fg, 0, 7)) { + /* basic system colors */ + fg = &dc.xft_col[base.fg + 8]; + } else if(BETWEEN(base.fg, 16, 195)) { + /* 256 colors */ + fg = &dc.xft_col[base.fg + 36]; + } else if(BETWEEN(base.fg, 232, 251)) { + /* greyscale */ + fg = &dc.xft_col[base.fg + 4]; + } + /* + * Those ranges will not be brightened: + * 8 - 15 – bright system colors + * 196 - 231 – highest 256 color cube + * 252 - 255 – brightest colors in grescale + */ font = &dc.bfont; } + if(base.mode & ATTR_ITALIC) font = &dc.ifont; if(base.mode & (ATTR_ITALIC|ATTR_ITALIC)) @@ -2234,7 +2256,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { winy + font->ascent, (FcChar8 *)s, bytelen); if(base.mode & ATTR_UNDERLINE) { - XftDrawRect(xw.xft_draw, fg, winx, winy+1, + XftDrawRect(xw.xft_draw, fg, winx, winy + font->ascent + 1, width, 1); } } @@ -2458,6 +2480,10 @@ cmessage(XEvent *e) { } else if(e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { xw.state &= ~WIN_FOCUSED; } + } else if(e->xclient.data.l[0] == xw.wmdeletewin) { + /* Send SIGHUP to shell */ + kill(pid, SIGHUP); + exit(EXIT_SUCCESS); } }