commit db32474a7ffef52986f490e9d892b6844b4fb10a
parent d52c5e4ce8fb443780936046dae6182ae0e45379
Author: bakkeby <bakkeby@gmail.com>
Date: Tue, 17 Sep 2019 01:18:44 +0200
Adding spoiler, external pipe and themed cursor patches
Diffstat:
9 files changed, 132 insertions(+), 3 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -20,6 +20,10 @@ static char *argv0;
#include "st.h"
#include "win.h"
+#if THEMED_CURSOR_PATCH
+#include <X11/Xcursor/Xcursor.h>
+#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)