Adding spoiler, external pipe and themed cursor patches
This commit is contained in:
parent
d52c5e4ce8
commit
db32474a7f
11
README.md
11
README.md
|
@ -11,7 +11,7 @@ Refer to [https://dwm.suckless.org/](https://st.suckless.org/) for details on th
|
||||||
|
|
||||||
### Changelog:
|
### 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:
|
### 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/)
|
- [disable-fonts](https://st.suckless.org/patches/disable_bold_italic_fonts/)
|
||||||
- this patch adds the option of disabling bold/italic/roman fonts globally
|
- 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/)
|
- [fixime](https://st.suckless.org/patches/fix_ime/)
|
||||||
- adds better Input Method Editor (IME) support
|
- 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/)
|
- [scrollback](https://st.suckless.org/patches/scrollback/)
|
||||||
- allows you scroll back through terminal output using keyboard shortcuts or mousewheel
|
- 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/)
|
- [vertcenter](https://st.suckless.org/patches/vertcenter/)
|
||||||
- vertically center lines in the space available if you have set a larger chscale in config.h
|
- vertically center lines in the space available if you have set a larger chscale in config.h
|
||||||
|
|
||||||
|
|
16
config.def.h
16
config.def.h
|
@ -149,12 +149,19 @@ static unsigned int cursorshape = 2;
|
||||||
static unsigned int cols = 80;
|
static unsigned int cols = 80;
|
||||||
static unsigned int rows = 24;
|
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
|
* Default colour and shape of the mouse cursor
|
||||||
*/
|
*/
|
||||||
static unsigned int mouseshape = XC_xterm;
|
static unsigned int mouseshape = XC_xterm;
|
||||||
static unsigned int mousefg = 7;
|
static unsigned int mousefg = 7;
|
||||||
static unsigned int mousebg = 0;
|
static unsigned int mousebg = 0;
|
||||||
|
#endif // THEMED_CURSOR_PATCH
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Color used to display font attributes when fontconfig selected a font which
|
* Color used to display font attributes when fontconfig selected a font which
|
||||||
|
@ -232,6 +239,12 @@ MouseKey mkeys[] = {
|
||||||
#define MODKEY Mod1Mask
|
#define MODKEY Mod1Mask
|
||||||
#define TERMMOD (ControlMask|ShiftMask)
|
#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[] = {
|
static Shortcut shortcuts[] = {
|
||||||
/* mask keysym function argument */
|
/* mask keysym function argument */
|
||||||
{ XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} },
|
{ XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} },
|
||||||
|
@ -264,6 +277,9 @@ static Shortcut shortcuts[] = {
|
||||||
#if NEWTERM_PATCH
|
#if NEWTERM_PATCH
|
||||||
{ TERMMOD, XK_Return, newterm, {.i = 0} },
|
{ TERMMOD, XK_Return, newterm, {.i = 0} },
|
||||||
#endif // NEWTERM_PATCH
|
#endif // NEWTERM_PATCH
|
||||||
|
#if EXTERNALPIPE_PATCH
|
||||||
|
{ TERMMOD, XK_U, externalpipe, { .v = openurlcmd } },
|
||||||
|
#endif // EXTERNALPIPE_PATCH
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config
|
||||||
INCS = -I$(X11INC) \
|
INCS = -I$(X11INC) \
|
||||||
`$(PKG_CONFIG) --cflags fontconfig` \
|
`$(PKG_CONFIG) --cflags fontconfig` \
|
||||||
`$(PKG_CONFIG) --cflags freetype2`
|
`$(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 fontconfig` \
|
||||||
`$(PKG_CONFIG) --libs freetype2`
|
`$(PKG_CONFIG) --libs freetype2`
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
void externalpipe(const Arg *);
|
|
@ -4,6 +4,10 @@
|
||||||
#include "copyurl.c"
|
#include "copyurl.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if EXTERNALPIPE_PATCH
|
||||||
|
#include "externalpipe.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if NEWTERM_PATCH
|
#if NEWTERM_PATCH
|
||||||
#include "newterm.c"
|
#include "newterm.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
#include "copyurl.h"
|
#include "copyurl.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if EXTERNALPIPE_PATCH
|
||||||
|
#include "externalpipe.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if FIXIME_PATCH
|
#if FIXIME_PATCH
|
||||||
void xximspot(int, int);
|
void xximspot(int, int);
|
||||||
#endif
|
#endif
|
||||||
|
|
15
patches.h
15
patches.h
|
@ -58,6 +58,11 @@
|
||||||
*/
|
*/
|
||||||
#define DISABLE_ROMAN_FONTS_PATCH 1
|
#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.
|
/* This patch adds better Input Method Editor (IME) support.
|
||||||
* https://st.suckless.org/patches/fix_ime/
|
* https://st.suckless.org/patches/fix_ime/
|
||||||
*/
|
*/
|
||||||
|
@ -97,6 +102,16 @@
|
||||||
*/
|
*/
|
||||||
#define SCROLLBACK_MOUSE_ALTSCREEN_PATCH 1
|
#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
|
* Vertically center lines in the space available if you have set a larger chscale in config.h
|
||||||
* https://st.suckless.org/patches/vertcenter/
|
* https://st.suckless.org/patches/vertcenter/
|
||||||
|
|
28
x.c
28
x.c
|
@ -20,6 +20,10 @@ static char *argv0;
|
||||||
#include "st.h"
|
#include "st.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
|
||||||
|
#if THEMED_CURSOR_PATCH
|
||||||
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
#endif // THEMED_CURSOR_PATCH
|
||||||
|
|
||||||
/* types used in config.h */
|
/* types used in config.h */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint mod;
|
uint mod;
|
||||||
|
@ -1233,13 +1237,21 @@ xinit(int cols, int rows)
|
||||||
/* white cursor, black outline */
|
/* white cursor, black outline */
|
||||||
#if HIDECURSOR_PATCH
|
#if HIDECURSOR_PATCH
|
||||||
xw.pointerisvisible = 1;
|
xw.pointerisvisible = 1;
|
||||||
|
#if THEMED_CURSOR_PATCH
|
||||||
|
xw.vpointer = XcursorLibraryLoadCursor(xw.dpy, mouseshape);
|
||||||
|
#else
|
||||||
xw.vpointer = XCreateFontCursor(xw.dpy, mouseshape);
|
xw.vpointer = XCreateFontCursor(xw.dpy, mouseshape);
|
||||||
|
#endif // THEMED_CURSOR_PATCH
|
||||||
XDefineCursor(xw.dpy, xw.win, xw.vpointer);
|
XDefineCursor(xw.dpy, xw.win, xw.vpointer);
|
||||||
|
#elif THEMED_CURSOR_PATCH
|
||||||
|
cursor = XcursorLibraryLoadCursor(xw.dpy, mouseshape);
|
||||||
|
XDefineCursor(xw.dpy, xw.win, cursor);
|
||||||
#else
|
#else
|
||||||
cursor = XCreateFontCursor(xw.dpy, mouseshape);
|
cursor = XCreateFontCursor(xw.dpy, mouseshape);
|
||||||
XDefineCursor(xw.dpy, xw.win, cursor);
|
XDefineCursor(xw.dpy, xw.win, cursor);
|
||||||
#endif // HIDECURSOR_PATCH
|
#endif // HIDECURSOR_PATCH
|
||||||
|
|
||||||
|
#if !THEMED_CURSOR_PATCH
|
||||||
if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) {
|
if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) {
|
||||||
xmousefg.red = 0xffff;
|
xmousefg.red = 0xffff;
|
||||||
xmousefg.green = 0xffff;
|
xmousefg.green = 0xffff;
|
||||||
|
@ -1251,13 +1263,16 @@ xinit(int cols, int rows)
|
||||||
xmousebg.green = 0x0000;
|
xmousebg.green = 0x0000;
|
||||||
xmousebg.blue = 0x0000;
|
xmousebg.blue = 0x0000;
|
||||||
}
|
}
|
||||||
|
#endif // THEMED_CURSOR_PATCH
|
||||||
|
|
||||||
#if HIDECURSOR_PATCH
|
#if HIDECURSOR_PATCH
|
||||||
|
#if !THEMED_CURSOR_PATCH
|
||||||
XRecolorCursor(xw.dpy, xw.vpointer, &xmousefg, &xmousebg);
|
XRecolorCursor(xw.dpy, xw.vpointer, &xmousefg, &xmousebg);
|
||||||
|
#endif // THEMED_CURSOR_PATCH
|
||||||
blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1);
|
blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1);
|
||||||
xw.bpointer = XCreatePixmapCursor(xw.dpy, blankpm, blankpm,
|
xw.bpointer = XCreatePixmapCursor(xw.dpy, blankpm, blankpm,
|
||||||
&xmousefg, &xmousebg, 0, 0);
|
&xmousefg, &xmousebg, 0, 0);
|
||||||
#else
|
#elif !THEMED_CURSOR_PATCH
|
||||||
XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg);
|
XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg);
|
||||||
#endif // HIDECURSOR_PATCH
|
#endif // HIDECURSOR_PATCH
|
||||||
|
|
||||||
|
@ -1520,9 +1535,20 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
|
||||||
}
|
}
|
||||||
|
|
||||||
if (base.mode & ATTR_REVERSE) {
|
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;
|
temp = fg;
|
||||||
fg = bg;
|
fg = bg;
|
||||||
bg = temp;
|
bg = temp;
|
||||||
|
#endif // SPOILER_PATCH
|
||||||
}
|
}
|
||||||
|
|
||||||
if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK)
|
if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK)
|
||||||
|
|
Loading…
Reference in New Issue