|
|
|
@ -72,7 +72,7 @@ struct {
|
|
|
|
|
extcmd_t f;
|
|
|
|
|
int fd;
|
|
|
|
|
unsigned int i, lastsep;
|
|
|
|
|
bool open;
|
|
|
|
|
pid_t pid;
|
|
|
|
|
} info;
|
|
|
|
|
|
|
|
|
|
struct {
|
|
|
|
@ -213,24 +213,27 @@ bool check_timeouts(struct timeval *t)
|
|
|
|
|
return tmin > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void close_info(void)
|
|
|
|
|
{
|
|
|
|
|
if (info.fd != -1) {
|
|
|
|
|
kill(info.pid, SIGTERM);
|
|
|
|
|
close(info.fd);
|
|
|
|
|
info.fd = -1;
|
|
|
|
|
waitpid(info.pid, NULL, WNOHANG);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void open_info(void)
|
|
|
|
|
{
|
|
|
|
|
static pid_t pid;
|
|
|
|
|
int pfd[2];
|
|
|
|
|
char w[12], h[12];
|
|
|
|
|
|
|
|
|
|
if (info.f.err != 0 || info.open || win.bar.h == 0)
|
|
|
|
|
if (info.f.err != 0 || info.fd >= 0 || win.bar.h == 0)
|
|
|
|
|
return;
|
|
|
|
|
if (info.fd != -1) {
|
|
|
|
|
close(info.fd);
|
|
|
|
|
kill(pid, SIGTERM);
|
|
|
|
|
info.fd = -1;
|
|
|
|
|
}
|
|
|
|
|
win.bar.l.buf[0] = '\0';
|
|
|
|
|
|
|
|
|
|
if (pipe(pfd) < 0)
|
|
|
|
|
return;
|
|
|
|
|
if ((pid = fork()) == 0) {
|
|
|
|
|
if ((info.pid = fork()) == 0) {
|
|
|
|
|
close(pfd[0]);
|
|
|
|
|
dup2(pfd[1], 1);
|
|
|
|
|
snprintf(w, sizeof(w), "%d", img.w);
|
|
|
|
@ -239,13 +242,12 @@ void open_info(void)
|
|
|
|
|
error(EXIT_FAILURE, errno, "exec: %s", info.f.cmd);
|
|
|
|
|
}
|
|
|
|
|
close(pfd[1]);
|
|
|
|
|
if (pid < 0) {
|
|
|
|
|
if (info.pid < 0) {
|
|
|
|
|
close(pfd[0]);
|
|
|
|
|
} else {
|
|
|
|
|
fcntl(pfd[0], F_SETFL, O_NONBLOCK);
|
|
|
|
|
info.fd = pfd[0];
|
|
|
|
|
info.i = info.lastsep = 0;
|
|
|
|
|
info.open = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -278,9 +280,7 @@ end:
|
|
|
|
|
info.i -= info.lastsep;
|
|
|
|
|
win.bar.l.buf[info.i] = '\0';
|
|
|
|
|
win_draw(&win);
|
|
|
|
|
close(info.fd);
|
|
|
|
|
info.fd = -1;
|
|
|
|
|
while (waitpid(-1, NULL, WNOHANG) > 0);
|
|
|
|
|
close_info();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void load_image(int new)
|
|
|
|
@ -309,7 +309,7 @@ void load_image(int new)
|
|
|
|
|
files[new].flags &= ~FF_WARN;
|
|
|
|
|
fileidx = current = new;
|
|
|
|
|
|
|
|
|
|
info.open = false;
|
|
|
|
|
close_info();
|
|
|
|
|
open_info();
|
|
|
|
|
arl_setup(&arl, files[fileidx].path);
|
|
|
|
|
|
|
|
|
@ -495,6 +495,7 @@ void run_key_handler(const char *key, unsigned int mask)
|
|
|
|
|
}
|
|
|
|
|
oldst = emalloc(fcnt * sizeof(*oldst));
|
|
|
|
|
|
|
|
|
|
close_info();
|
|
|
|
|
strncpy(win.bar.l.buf, "Running key handler...", win.bar.l.size);
|
|
|
|
|
win_draw(&win);
|
|
|
|
|
win_set_cursor(&win, CURSOR_WATCH);
|
|
|
|
@ -551,8 +552,7 @@ end:
|
|
|
|
|
if (changed) {
|
|
|
|
|
img_close(&img, true);
|
|
|
|
|
load_image(fileidx);
|
|
|
|
|
} else if (info.f.err == 0) {
|
|
|
|
|
info.open = false;
|
|
|
|
|
} else {
|
|
|
|
|
open_info();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|