diff --git a/README.md b/README.md index f14cf2d..b36715f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Refer to [https://dwm.suckless.org/](https://st.suckless.org/) for details on th ### Changelog: -2019-09-16 - Added alpha, anysize, bold-is-not-bright, clipboard, copyurl, disable-fonts, fixime, hidecursor, newterm, open-copied-url, vertcenter, scrollback and xresources patches +2019-09-16 - Added alpha, anysize, bold-is-not-bright, clipboard, copyurl, disable-fonts, externalpipe, fixime, hidecursor, newterm, open-copied-url, vertcenter, scrollback, spoiler, themed cursor and xresources patches ### Patches included: @@ -36,6 +36,9 @@ Refer to [https://dwm.suckless.org/](https://st.suckless.org/) for details on th - [disable-fonts](https://st.suckless.org/patches/disable_bold_italic_fonts/) - this patch adds the option of disabling bold/italic/roman fonts globally + - [externalpipe](https://st.suckless.org/patches/externalpipe/) + - this patch allows for eading and writing st's screen through a pipe, e.g. to pass info to dmenu + - [fixime](https://st.suckless.org/patches/fix_ime/) - adds better Input Method Editor (IME) support @@ -52,6 +55,12 @@ Refer to [https://dwm.suckless.org/](https://st.suckless.org/) for details on th - [scrollback](https://st.suckless.org/patches/scrollback/) - allows you scroll back through terminal output using keyboard shortcuts or mousewheel + - [spoiler](https://st.suckless.org/patches/spoiler/) + - use inverted defaultbg/fg for selection when bg/fg are the same + + - [themed-cursor](https://st.suckless.org/patches/themed_cursor/) + - instead of a default X cursor, use the xterm cursor from your cursor theme + - [vertcenter](https://st.suckless.org/patches/vertcenter/) - vertically center lines in the space available if you have set a larger chscale in config.h diff --git a/config.def.h b/config.def.h index 04f80e0..82c5adc 100644 --- a/config.def.h +++ b/config.def.h @@ -149,12 +149,19 @@ static unsigned int cursorshape = 2; static unsigned int cols = 80; static unsigned int rows = 24; +#if THEMED_CURSOR_PATCH +/* + * Default shape of the mouse cursor + */ +static char* mouseshape = "xterm"; +#else /* * Default colour and shape of the mouse cursor */ static unsigned int mouseshape = XC_xterm; static unsigned int mousefg = 7; static unsigned int mousebg = 0; +#endif // THEMED_CURSOR_PATCH /* * Color used to display font attributes when fontconfig selected a font which @@ -232,6 +239,12 @@ MouseKey mkeys[] = { #define MODKEY Mod1Mask #define TERMMOD (ControlMask|ShiftMask) +#if EXTERNALPIPE_PATCH // example command +static char *openurlcmd[] = { "/bin/sh", "-c", + "xurls | dmenu -l 10 -w $WINDOWID | xargs -r open", + "externalpipe", NULL }; +#endif // EXTERNALPIPE_PATCH + static Shortcut shortcuts[] = { /* mask keysym function argument */ { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, @@ -264,6 +277,9 @@ static Shortcut shortcuts[] = { #if NEWTERM_PATCH { TERMMOD, XK_Return, newterm, {.i = 0} }, #endif // NEWTERM_PATCH + #if EXTERNALPIPE_PATCH + { TERMMOD, XK_U, externalpipe, { .v = openurlcmd } }, + #endif // EXTERNALPIPE_PATCH }; /* diff --git a/config.mk b/config.mk index 1d2f0e2..09ad849 100644 --- a/config.mk +++ b/config.mk @@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config INCS = -I$(X11INC) \ `$(PKG_CONFIG) --cflags fontconfig` \ `$(PKG_CONFIG) --cflags freetype2` -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\ +LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender -lXcursor\ `$(PKG_CONFIG) --libs fontconfig` \ `$(PKG_CONFIG) --libs freetype2` diff --git a/patch/externalpipe.c b/patch/externalpipe.c new file mode 100644 index 0000000..a131f68 --- /dev/null +++ b/patch/externalpipe.c @@ -0,0 +1,52 @@ +void +externalpipe(const Arg *arg) +{ + int to[2]; + char buf[UTF_SIZ]; + void (*oldsigpipe)(int); + Glyph *bp, *end; + int lastpos, n, newline; + + if (pipe(to) == -1) + return; + + switch (fork()) { + case -1: + close(to[0]); + close(to[1]); + return; + case 0: + dup2(to[0], STDIN_FILENO); + close(to[0]); + close(to[1]); + execvp(((char **)arg->v)[0], (char **)arg->v); + fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]); + perror("failed"); + exit(0); + } + + close(to[0]); + /* ignore sigpipe for now, in case child exists early */ + oldsigpipe = signal(SIGPIPE, SIG_IGN); + newline = 0; + for (n = 0; n < term.row; n++) { + bp = term.line[n]; + lastpos = MIN(tlinelen(n) + 1, term.col) - 1; + if (lastpos < 0) + break; + end = &bp[lastpos + 1]; + for (; bp < end; ++bp) + if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0) + break; + if ((newline = term.line[n][lastpos].mode & ATTR_WRAP)) + continue; + if (xwrite(to[1], "\n", 1) < 0) + break; + newline = 0; + } + if (newline) + (void)xwrite(to[1], "\n", 1); + close(to[1]); + /* restore */ + signal(SIGPIPE, oldsigpipe); +} \ No newline at end of file diff --git a/patch/externalpipe.h b/patch/externalpipe.h new file mode 100644 index 0000000..5ec9f68 --- /dev/null +++ b/patch/externalpipe.h @@ -0,0 +1 @@ +void externalpipe(const Arg *); \ No newline at end of file diff --git a/patch/st_include.c b/patch/st_include.c index 2a706d9..09b2a92 100644 --- a/patch/st_include.c +++ b/patch/st_include.c @@ -4,6 +4,10 @@ #include "copyurl.c" #endif +#if EXTERNALPIPE_PATCH +#include "externalpipe.c" +#endif + #if NEWTERM_PATCH #include "newterm.c" #endif diff --git a/patch/st_include.h b/patch/st_include.h index 2d4c182..e5423ec 100644 --- a/patch/st_include.h +++ b/patch/st_include.h @@ -4,6 +4,10 @@ #include "copyurl.h" #endif +#if EXTERNALPIPE_PATCH +#include "externalpipe.h" +#endif + #if FIXIME_PATCH void xximspot(int, int); #endif diff --git a/patches.h b/patches.h index 1172e01..e4cfc76 100644 --- a/patches.h +++ b/patches.h @@ -58,6 +58,11 @@ */ #define DISABLE_ROMAN_FONTS_PATCH 1 +/* Reading and writing st's screen through a pipe, e.g. pass info to dmenu. + * https://st.suckless.org/patches/externalpipe/ + */ +#define EXTERNALPIPE_PATCH 1 + /* This patch adds better Input Method Editor (IME) support. * https://st.suckless.org/patches/fix_ime/ */ @@ -97,6 +102,16 @@ */ #define SCROLLBACK_MOUSE_ALTSCREEN_PATCH 1 +/* Use inverted defaultbg/fg for selection when bg/fg are the same. + * https://st.suckless.org/patches/spoiler/ + */ +#define SPOILER_PATCH 1 + +/* Instead of a default X cursor, use the xterm cursor from your cursor theme. + * https://st.suckless.org/patches/themed_cursor/ + */ +#define THEMED_CURSOR_PATCH 1 + /* * Vertically center lines in the space available if you have set a larger chscale in config.h * https://st.suckless.org/patches/vertcenter/ diff --git a/x.c b/x.c index cc699ae..2d19b12 100644 --- a/x.c +++ b/x.c @@ -20,6 +20,10 @@ static char *argv0; #include "st.h" #include "win.h" +#if THEMED_CURSOR_PATCH +#include +#endif // THEMED_CURSOR_PATCH + /* types used in config.h */ typedef struct { uint mod; @@ -1233,13 +1237,21 @@ xinit(int cols, int rows) /* white cursor, black outline */ #if HIDECURSOR_PATCH xw.pointerisvisible = 1; + #if THEMED_CURSOR_PATCH + xw.vpointer = XcursorLibraryLoadCursor(xw.dpy, mouseshape); + #else xw.vpointer = XCreateFontCursor(xw.dpy, mouseshape); + #endif // THEMED_CURSOR_PATCH XDefineCursor(xw.dpy, xw.win, xw.vpointer); + #elif THEMED_CURSOR_PATCH + cursor = XcursorLibraryLoadCursor(xw.dpy, mouseshape); + XDefineCursor(xw.dpy, xw.win, cursor); #else cursor = XCreateFontCursor(xw.dpy, mouseshape); XDefineCursor(xw.dpy, xw.win, cursor); #endif // HIDECURSOR_PATCH + #if !THEMED_CURSOR_PATCH if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) { xmousefg.red = 0xffff; xmousefg.green = 0xffff; @@ -1251,13 +1263,16 @@ xinit(int cols, int rows) xmousebg.green = 0x0000; xmousebg.blue = 0x0000; } + #endif // THEMED_CURSOR_PATCH #if HIDECURSOR_PATCH + #if !THEMED_CURSOR_PATCH XRecolorCursor(xw.dpy, xw.vpointer, &xmousefg, &xmousebg); + #endif // THEMED_CURSOR_PATCH blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1); xw.bpointer = XCreatePixmapCursor(xw.dpy, blankpm, blankpm, &xmousefg, &xmousebg, 0, 0); - #else + #elif !THEMED_CURSOR_PATCH XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg); #endif // HIDECURSOR_PATCH @@ -1520,9 +1535,20 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i } if (base.mode & ATTR_REVERSE) { + #if SPOILER_PATCH + if (bg == fg) { + bg = &dc.col[defaultfg]; + fg = &dc.col[defaultbg]; + } else { + temp = fg; + fg = bg; + bg = temp; + } + #else temp = fg; fg = bg; bg = temp; + #endif // SPOILER_PATCH } if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK)