Spawn info script & update bar contents only when needed
This commit is contained in:
24
main.c
24
main.c
@ -76,6 +76,7 @@ struct {
|
||||
char *script;
|
||||
int fd;
|
||||
unsigned int i, lastsep;
|
||||
bool open;
|
||||
} info;
|
||||
|
||||
timeout_t timeouts[] = {
|
||||
@ -218,23 +219,25 @@ void open_info(void)
|
||||
static pid_t pid;
|
||||
int pfd[2];
|
||||
|
||||
win.bar.l[0] = '\0';
|
||||
|
||||
if (info.script == NULL || info.open || win.bar.h == 0)
|
||||
return;
|
||||
if (info.fd != -1) {
|
||||
close(info.fd);
|
||||
kill(pid, SIGTERM);
|
||||
while (waitpid(-1, NULL, WNOHANG) > 0);
|
||||
info.fd = -1;
|
||||
}
|
||||
if (info.script == NULL || pipe(pfd) < 0)
|
||||
return;
|
||||
win.bar.l[0] = '\0';
|
||||
|
||||
if (pipe(pfd) < 0)
|
||||
return;
|
||||
pid = fork();
|
||||
if (pid > 0) {
|
||||
close(pfd[1]);
|
||||
fcntl(pfd[0], F_SETFL, O_NONBLOCK);
|
||||
info.fd = pfd[0];
|
||||
info.i = info.lastsep = 0;
|
||||
info.open = true;
|
||||
} else if (pid == 0) {
|
||||
close(pfd[0]);
|
||||
dup2(pfd[1], 1);
|
||||
@ -293,6 +296,7 @@ void load_image(int new)
|
||||
alternate = fileidx;
|
||||
fileidx = new;
|
||||
|
||||
info.open = false;
|
||||
open_info();
|
||||
|
||||
if (img.multi.cnt > 0 && img.multi.animate)
|
||||
@ -312,9 +316,18 @@ void update_info(void)
|
||||
for (fw = 0, i = filecnt; i > 0; fw++, i /= 10);
|
||||
sel = mode == MODE_IMAGE ? fileidx : tns.sel;
|
||||
|
||||
/* update window title */
|
||||
if (mode == MODE_THUMB) {
|
||||
win_set_title(&win, "sxiv");
|
||||
} else {
|
||||
snprintf(title, sizeof(title), "sxiv - %s", files[sel].name);
|
||||
win_set_title(&win, title);
|
||||
}
|
||||
|
||||
/* update bar contents */
|
||||
if (win.bar.h == 0)
|
||||
return;
|
||||
if (mode == MODE_THUMB) {
|
||||
if (tns.cnt == filecnt) {
|
||||
n = snprintf(rt, rlen, "%0*d/%d", fw, sel + 1, filecnt);
|
||||
ow_info = true;
|
||||
@ -324,9 +337,6 @@ void update_info(void)
|
||||
ow_info = false;
|
||||
}
|
||||
} else {
|
||||
snprintf(title, sizeof(title), "sxiv - %s", files[sel].name);
|
||||
win_set_title(&win, title);
|
||||
|
||||
n = snprintf(rt, rlen, "%3d%% ", (int) (img.zoom * 100.0));
|
||||
if (img.multi.cnt > 0) {
|
||||
for (fn = 0, i = img.multi.cnt; i > 0; fn++, i /= 10);
|
||||
|
Reference in New Issue
Block a user