#include "config.h"
/* predeclare some things */
-void exec(char* cmd);
+void exec(char* cmd, char* arg);
void cut(char* arg);
void paste(char* arg);
static bool SyncMouse = false;
static int SearchDir = DOWN;
static char* SearchTerm = NULL;
+static int ExecRequest = 0;
#define PRESSED(btn) \
((KeyBtnState & (1 << (btn + 7))) == (1 << (btn + 7)))
if (PRESSED(MouseRight)) {
puts("fetch tag");
} else if (PRESSED(MouseMiddle)) {
- puts("exec with arg");
+ /* if we didnt get an arg, find one in the selection */
+ char* arg = NULL;
+ if (!arg || !*arg) arg = view_getstr(win_view(EDIT));
+ if (!arg || !*arg) arg = view_getstr(win_view(TAGS));
+ char* str = view_fetch(win_view(id), row, col, riscmd);
+ if (str) exec(str, arg);
+ free(str);
+ free(arg);
+ ExecRequest = 0;
} else {
if (count == 1)
view_setcursor(win_view(id), row, col, win_keymodsset(ModShift));
}
static void mouse_middle(WinRegion id, bool pressed, size_t row, size_t col) {
- if (pressed) return;
+ if (pressed) { ExecRequest = 1; return; }
if (PRESSED(MouseLeft)) {
cut(NULL);
- } else {
+ } else if (ExecRequest) {
char* str = view_fetch(win_view(id), row, col, riscmd);
- if (str) exec(str);
+ if (str) exec(str, NULL);
free(str);
}
}
static void xbtnrelease(XConf* x, XEvent* e) {
(void)x;
Now = e->xbutton.time;
- KeyBtnState = (e->xbutton.state & ~(1 << (e->xbutton.button + 7)));
+ KeyBtnState = (KeyBtnState & ~(1 << (e->xbutton.button + 7)));
mouse_click(e->xbutton.button, false, e->xbutton.x, e->xbutton.y);
}
return NULL;
}
-static void tag_exec(Tag* tag, char* arg) {
- /* if we didnt get an arg, find one in the selection */
- if (!arg || !*arg) arg = view_getstr(win_view(TAGS));
- if (!arg || !*arg) arg = view_getstr(win_view(EDIT));
- /* execute the tag handler */
- tag->action(!arg || !*arg ? NULL : arg);
- free(arg);
-}
-
static void cmd_exec(char* cmd) {
/* parse the command sigils */
char op = '\0', **execcmd = NULL;
free(cmd);
}
-void exec(char* cmd) {
+void exec(char* cmd, char* arg) {
/* skip leading space */
for (; *cmd && isspace(*cmd); cmd++);
if (!*cmd) return;
if (tag) {
for (; *cmd && !isspace(*cmd); cmd++); /* strip off tag name */
for (; *cmd && isspace(*cmd); cmd++); /* strip off leading space */
- tag_exec(tag, (*cmd ? strdup(cmd) : NULL));
+ //tag_exec(tag, (*cmd ? strdup(cmd) : arg));
+ arg = (*cmd ? strdup(cmd) : arg);
+ tag->action(!arg || !*arg ? NULL : arg);
+ } else if (arg) {
+ cmd = (arg ? strmcat(cmd, " '", arg, "'", 0) : strmcat(cmd));
+ cmd_exec(cmd);
+ free(cmd);
} else {
cmd_exec(cmd);
}
static void execute(char* arg) {
(void)arg;
char* str = view_getcmd(win_view(FOCUSED));
- if (str) exec(str);
+ if (str) exec(str, NULL);
free(str);
}
static void lnexec(char* cmd) {
select_line(NULL);
- exec(cmd);
+ exec(cmd, NULL);
}
static void tag_kill(char* cmd) {