#include <locale.h>
#include <signal.h>
#include <sys/select.h>
+#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#include <libgen.h>
#include "arg.h"
#include "st.h"
#include "win.h"
+#include "normalMode.h"
/* types used in config.h */
typedef struct {
static void zoomabs(const Arg *);
static void zoomreset(const Arg *);
static void ttysend(const Arg *);
+static void plumber(const Arg *);
/* config.h for applying patches and the configuration. */
#include "config.h"
static void selclear_(XEvent *);
static void selrequest(XEvent *);
static void setsel(char *, Time);
+static void plumb(char *sel);
static void mousesel(XEvent *, int);
static void mousereport(XEvent *);
static char *kmap(KeySym, uint);
static int match(uint, uint);
+
static void run(void);
static void usage(void);
};
/* Globals */
+static int plumbsel;
static DC dc;
static XWindow xw;
static XSelection xsel;
free(xsel.clipboard);
xsel.clipboard = NULL;
+ xsetsel(getsel());
if (xsel.primary != NULL) {
xsel.clipboard = xstrdup(xsel.primary);
ttywrite(arg->s, strlen(arg->s), 1);
}
+void
+plumber(const Arg *arg)
+{
+ plumb(xsel.primary);
+}
+
int
evcol(XEvent *e)
{
setsel(str, CurrentTime);
}
+void
+plumbinit()
+{
+ for(plumbsel = 0; plumb_cmd[plumbsel]; plumbsel++);
+}
+
+void
+plumb(char *sel) {
+ if (sel == NULL)
+ return;
+ char cwd[PATH_MAX];
+ pid_t child;
+ if (subprocwd(cwd) != 0)
+ return;
+
+ plumb_cmd[plumbsel] = sel;
+
+ switch(child = fork()) {
+ case -1:
+ return;
+ case 0:
+ if (chdir(cwd) != 0)
+ exit(1);
+ if (execvp(plumb_cmd[0], plumb_cmd) == -1)
+ exit(1);
+ exit(0);
+ default:
+ waitpid(child, NULL, 0);
+ }
+}
+
void
brelease(XEvent *e)
{
return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor);
}
+void normalMode() { historyModeToggle((win.mode ^=MODE_NORMAL) & MODE_NORMAL); }
+
void
xloadcols(void)
{
for (i = 0, xp = winx, yp = winy + font->ascent; i < len; ++i) {
/* Fetch rune and mode for current glyph. */
- rune = glyphs[i].u;
- mode = glyphs[i].mode;
+ Glyph g = glyphs[i];
+ historyOverlay(x+i, y, &g);
+ rune = g.u;
+ mode = g.mode;
/* Skip dummy wide-character spacing. */
if (mode == ATTR_WDUMMY)
int
xstartdraw(void)
{
+ if (IS_SET(MODE_VISIBLE))
+ XCopyArea(xw.dpy, xw.win, xw.buf, dc.gc, 0, 0, win.w, win.h, 0, 0);
return IS_SET(MODE_VISIBLE);
}
i = ox = 0;
for (x = x1; x < x2 && i < numspecs; x++) {
new = line[x];
+ historyOverlay(x, y1, &new);
if (new.mode == ATTR_WDUMMY)
continue;
if (selected(x, y1))
len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status);
else
len = XLookupString(e, buf, sizeof buf, &ksym, NULL);
+ if (IS_SET(MODE_NORMAL)) {
+ if (kpressHist(buf, len, match(ControlMask, e->state), &ksym)
+ == finished) normalMode();
+ return;
+ }
/* 1. shortcuts */
for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) {
if (ksym == bp->keysym && match(bp->mod, e->state)) {
} ARGEND;
run:
+ plumbinit();
if (argc > 0) /* eat all remaining arguments */
opt_cmd = argv;