3 Commits

4 changed files with 97 additions and 5 deletions

View File

@@ -16,8 +16,30 @@ static char *externaleditcmd[] = { "/bin/sh", "-c",
"st -e vis \"$tmpfile\"\n", "st -e vis \"$tmpfile\"\n",
NULL}; NULL};
static char *externalcopycmd[] = { "/bin/sh", "-c", int lightmode = 0;
"sed 's/[ \t][ \t]*/\\n/g' | tac | awk '!x[$0]++' | dmenu -l 10 -w $WINDOWID | tr --delete '\\n' | vis-clipboard --copy",
#define COL_GRAY1 "'#222222'"
#define COL_GRAY2 "'#444444'"
#define COL_GRAY3 "'#bbbbbb'"
#define COL_GRAY4 "'#eeeeee'"
#define COL_CYAN "'#005577'"
#define DMENU_DARK "-l 10 -fn 'FiraCode Nerd Font:size=10' -nb " COL_GRAY1 " -nf " COL_GRAY3 " -sb " COL_CYAN " -sf " COL_GRAY4
#define DMENU_LIGHT "-l 10 -fn 'FiraCode Nerd Font:size=10' -nb " COL_GRAY3 " -nf " COL_GRAY1 " -sb " COL_CYAN " -sf " COL_GRAY4
static char *externalcopydarkcmd[] = { "/bin/sh", "-c",
"sed 's/[ \t][ \t]*/\\n/g' | tac | awk 'BEGIN{x[\"\"]++} !x[$0]++' | dmenu " DMENU_DARK " -w $WINDOWID -p Copy | tr -d '\\n' | vis-clipboard --copy",
NULL};
static char *externalpastedarkcmd[] = { "/bin/sh", "-c",
"sed 's/[ \t][ \t]*/\\n/g' | tac | awk 'BEGIN{x[\"\"]++} !x[$0]++' | dmenu " DMENU_DARK " -w $WINDOWID -p Paste | tr -d '\\n'",
NULL};
static char *externalcopylightcmd[] = { "/bin/sh", "-c",
"sed 's/[ \t][ \t]*/\\n/g' | tac | awk 'BEGIN{x[\"\"]++} !x[$0]++' | dmenu " DMENU_LIGHT " -w $WINDOWID -p Copy | tr -d '\\n' | vis-clipboard --copy",
NULL};
static char *externalpastelightcmd[] = { "/bin/sh", "-c",
"sed 's/[ \t][ \t]*/\\n/g' | tac | awk 'BEGIN{x[\"\"]++} !x[$0]++' | dmenu " DMENU_LIGHT " -w $WINDOWID -p Paste | tr -d '\\n'",
NULL}; NULL};
/* /*
@@ -212,7 +234,8 @@ static Shortcut shortcuts[] = {
{ TERMMOD, XK_V, clippaste, {.i = 0} }, { TERMMOD, XK_V, clippaste, {.i = 0} },
{ TERMMOD, XK_Y, selpaste, {.i = 0} }, { TERMMOD, XK_Y, selpaste, {.i = 0} },
{ TERMMOD, XK_E, externalpipe, { .v = externaleditcmd } }, { TERMMOD, XK_E, externalpipe, { .v = externaleditcmd } },
{ TERMMOD, XK_K, externalpipe, { .v = externalcopycmd } }, { TERMMOD, XK_K, externalpipecopy, { 0 } },
{ TERMMOD, XK_I, externalpipepaste, { 0 } },
{ ShiftMask, XK_Insert, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} },
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },

56
st.c
View File

@@ -2117,9 +2117,9 @@ strparse(void)
} }
void void
externalpipe(const Arg *arg) externalpipeinout(const Arg *arg, void (*processout)(int fildes))
{ {
int to[2]; int to[2], from[2];
char buf[UTF_SIZ]; char buf[UTF_SIZ];
void (*oldsigpipe)(int); void (*oldsigpipe)(int);
Glyph *bp, *end; Glyph *bp, *end;
@@ -2127,16 +2127,27 @@ externalpipe(const Arg *arg)
if (pipe(to) == -1) if (pipe(to) == -1)
return; return;
if (processout != NULL && pipe(from) == -1)
return;
switch (fork()) { switch (fork()) {
case -1: case -1:
close(to[0]); close(to[0]);
close(to[1]); close(to[1]);
if (processout != NULL) {
close(from[0]);
close(from[1]);
}
return; return;
case 0: case 0:
dup2(to[0], STDIN_FILENO); dup2(to[0], STDIN_FILENO);
close(to[0]); close(to[0]);
close(to[1]); close(to[1]);
if (processout != NULL) {
dup2(from[1], STDOUT_FILENO);
close(from[0]);
close(from[1]);
}
execvp(((char **)arg->v)[0], (char **)arg->v); execvp(((char **)arg->v)[0], (char **)arg->v);
fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]); fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
perror("failed"); perror("failed");
@@ -2144,6 +2155,8 @@ externalpipe(const Arg *arg)
} }
close(to[0]); close(to[0]);
if (processout != NULL)
close(from[1]);
/* ignore sigpipe for now, in case child exists early */ /* ignore sigpipe for now, in case child exists early */
oldsigpipe = signal(SIGPIPE, SIG_IGN); oldsigpipe = signal(SIGPIPE, SIG_IGN);
newline = 0; newline = 0;
@@ -2165,10 +2178,49 @@ externalpipe(const Arg *arg)
if (newline) if (newline)
(void)xwrite(to[1], "\n", 1); (void)xwrite(to[1], "\n", 1);
close(to[1]); close(to[1]);
if (processout != NULL) {
processout(from[0]);
close(from[0]);
}
/* restore */ /* restore */
signal(SIGPIPE, oldsigpipe); signal(SIGPIPE, oldsigpipe);
} }
void
externalpipe(const Arg *arg)
{
externalpipeinout(arg, NULL);
}
void
ttycopy(int fildes)
{
char buf[256];
int len;
len = read(fildes, buf, sizeof(buf));
if (len > 0 && len < sizeof(buf)) {
buf[len] = '\0';
ttywrite(buf, len, 1);
}
}
void
externalpipepaste(const Arg *)
{
Arg arg;
arg.v = externalpastecmd();
externalpipeinout(&arg, ttycopy);
}
void
externalpipecopy(const Arg *)
{
Arg arg;
arg.v = externalcopycmd();
externalpipeinout(&arg, NULL);
}
void void
strdump(void) strdump(void)
{ {

6
st.h
View File

@@ -83,6 +83,8 @@ void redraw(void);
void draw(void); void draw(void);
void externalpipe(const Arg *); void externalpipe(const Arg *);
void externalpipecopy(const Arg *);
void externalpipepaste(const Arg *);
void printscreen(const Arg *); void printscreen(const Arg *);
void printsel(const Arg *); void printsel(const Arg *);
void sendbreak(const Arg *); void sendbreak(const Arg *);
@@ -121,8 +123,12 @@ extern char *vtiden;
extern wchar_t *worddelimiters; extern wchar_t *worddelimiters;
extern int allowaltscreen; extern int allowaltscreen;
extern int allowwindowops; extern int allowwindowops;
extern int lightmode;
extern char *termname; extern char *termname;
extern unsigned int tabspaces; extern unsigned int tabspaces;
extern unsigned int defaultfg; extern unsigned int defaultfg;
extern unsigned int defaultbg; extern unsigned int defaultbg;
extern unsigned int defaultcs; extern unsigned int defaultcs;
char **externalcopycmd();
char **externalpastecmd();

11
x.c
View File

@@ -66,6 +66,16 @@ void kscrolldown(const Arg *);
/* config.h for applying patches and the configuration. */ /* config.h for applying patches and the configuration. */
#include "config.h" #include "config.h"
char **externalcopycmd()
{
return (lightmode) ? externalcopylightcmd : externalcopydarkcmd;
}
char **externalpastecmd()
{
return (lightmode) ? externalpastelightcmd : externalpastedarkcmd;
}
/* XEMBED messages */ /* XEMBED messages */
#define XEMBED_FOCUS_IN 4 #define XEMBED_FOCUS_IN 4
#define XEMBED_FOCUS_OUT 5 #define XEMBED_FOCUS_OUT 5
@@ -2109,6 +2119,7 @@ xrdb_load(void)
XRESOURCE_LOAD_INTEGER("bellvolume", bellvolume); XRESOURCE_LOAD_INTEGER("bellvolume", bellvolume);
XRESOURCE_LOAD_INTEGER("borderpx", borderpx); XRESOURCE_LOAD_INTEGER("borderpx", borderpx);
XRESOURCE_LOAD_INTEGER("cursorshape", cursorshape); XRESOURCE_LOAD_INTEGER("cursorshape", cursorshape);
XRESOURCE_LOAD_INTEGER("lightmode", lightmode);
XRESOURCE_LOAD_FLOAT("cwscale", cwscale); XRESOURCE_LOAD_FLOAT("cwscale", cwscale);
XRESOURCE_LOAD_FLOAT("chscale", chscale); XRESOURCE_LOAD_FLOAT("chscale", chscale);