Spawn info script & update bar contents only when needed
This commit is contained in:
parent
f3298400e6
commit
30802cec0f
@ -33,6 +33,7 @@
|
|||||||
void cleanup(void);
|
void cleanup(void);
|
||||||
void remove_file(int, bool);
|
void remove_file(int, bool);
|
||||||
void load_image(int);
|
void load_image(int);
|
||||||
|
void open_info(void);
|
||||||
void redraw(void);
|
void redraw(void);
|
||||||
void reset_cursor(void);
|
void reset_cursor(void);
|
||||||
void animate(void);
|
void animate(void);
|
||||||
@ -92,10 +93,13 @@ bool it_toggle_fullscreen(arg_t a)
|
|||||||
bool it_toggle_bar(arg_t a)
|
bool it_toggle_bar(arg_t a)
|
||||||
{
|
{
|
||||||
win_toggle_bar(&win);
|
win_toggle_bar(&win);
|
||||||
if (mode == MODE_IMAGE)
|
if (mode == MODE_IMAGE) {
|
||||||
img.checkpan = img.dirty = true;
|
img.checkpan = img.dirty = true;
|
||||||
else
|
if (win.bar.h > 0)
|
||||||
|
open_info();
|
||||||
|
} else {
|
||||||
tns.dirty = true;
|
tns.dirty = true;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
24
main.c
24
main.c
@ -76,6 +76,7 @@ struct {
|
|||||||
char *script;
|
char *script;
|
||||||
int fd;
|
int fd;
|
||||||
unsigned int i, lastsep;
|
unsigned int i, lastsep;
|
||||||
|
bool open;
|
||||||
} info;
|
} info;
|
||||||
|
|
||||||
timeout_t timeouts[] = {
|
timeout_t timeouts[] = {
|
||||||
@ -218,23 +219,25 @@ void open_info(void)
|
|||||||
static pid_t pid;
|
static pid_t pid;
|
||||||
int pfd[2];
|
int pfd[2];
|
||||||
|
|
||||||
win.bar.l[0] = '\0';
|
if (info.script == NULL || info.open || win.bar.h == 0)
|
||||||
|
return;
|
||||||
if (info.fd != -1) {
|
if (info.fd != -1) {
|
||||||
close(info.fd);
|
close(info.fd);
|
||||||
kill(pid, SIGTERM);
|
kill(pid, SIGTERM);
|
||||||
while (waitpid(-1, NULL, WNOHANG) > 0);
|
while (waitpid(-1, NULL, WNOHANG) > 0);
|
||||||
info.fd = -1;
|
info.fd = -1;
|
||||||
}
|
}
|
||||||
if (info.script == NULL || pipe(pfd) < 0)
|
win.bar.l[0] = '\0';
|
||||||
return;
|
|
||||||
|
|
||||||
|
if (pipe(pfd) < 0)
|
||||||
|
return;
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid > 0) {
|
if (pid > 0) {
|
||||||
close(pfd[1]);
|
close(pfd[1]);
|
||||||
fcntl(pfd[0], F_SETFL, O_NONBLOCK);
|
fcntl(pfd[0], F_SETFL, O_NONBLOCK);
|
||||||
info.fd = pfd[0];
|
info.fd = pfd[0];
|
||||||
info.i = info.lastsep = 0;
|
info.i = info.lastsep = 0;
|
||||||
|
info.open = true;
|
||||||
} else if (pid == 0) {
|
} else if (pid == 0) {
|
||||||
close(pfd[0]);
|
close(pfd[0]);
|
||||||
dup2(pfd[1], 1);
|
dup2(pfd[1], 1);
|
||||||
@ -293,6 +296,7 @@ void load_image(int new)
|
|||||||
alternate = fileidx;
|
alternate = fileidx;
|
||||||
fileidx = new;
|
fileidx = new;
|
||||||
|
|
||||||
|
info.open = false;
|
||||||
open_info();
|
open_info();
|
||||||
|
|
||||||
if (img.multi.cnt > 0 && img.multi.animate)
|
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);
|
for (fw = 0, i = filecnt; i > 0; fw++, i /= 10);
|
||||||
sel = mode == MODE_IMAGE ? fileidx : tns.sel;
|
sel = mode == MODE_IMAGE ? fileidx : tns.sel;
|
||||||
|
|
||||||
|
/* update window title */
|
||||||
if (mode == MODE_THUMB) {
|
if (mode == MODE_THUMB) {
|
||||||
win_set_title(&win, "sxiv");
|
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) {
|
if (tns.cnt == filecnt) {
|
||||||
n = snprintf(rt, rlen, "%0*d/%d", fw, sel + 1, filecnt);
|
n = snprintf(rt, rlen, "%0*d/%d", fw, sel + 1, filecnt);
|
||||||
ow_info = true;
|
ow_info = true;
|
||||||
@ -324,9 +337,6 @@ void update_info(void)
|
|||||||
ow_info = false;
|
ow_info = false;
|
||||||
}
|
}
|
||||||
} else {
|
} 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));
|
n = snprintf(rt, rlen, "%3d%% ", (int) (img.zoom * 100.0));
|
||||||
if (img.multi.cnt > 0) {
|
if (img.multi.cnt > 0) {
|
||||||
for (fn = 0, i = img.multi.cnt; i > 0; fn++, i /= 10);
|
for (fn = 0, i = img.multi.cnt; i > 0; fn++, i /= 10);
|
||||||
|
5
window.c
5
window.c
@ -119,12 +119,15 @@ void win_init(win_t *win)
|
|||||||
e->cmap = DefaultColormap(e->dpy, e->scr);
|
e->cmap = DefaultColormap(e->dpy, e->scr);
|
||||||
e->depth = DefaultDepth(e->dpy, e->scr);
|
e->depth = DefaultDepth(e->dpy, e->scr);
|
||||||
|
|
||||||
|
win_init_font(e->dpy, BAR_FONT);
|
||||||
|
|
||||||
win->white = WhitePixel(e->dpy, e->scr);
|
win->white = WhitePixel(e->dpy, e->scr);
|
||||||
win->bgcol = win_alloc_color(win, WIN_BG_COLOR);
|
win->bgcol = win_alloc_color(win, WIN_BG_COLOR);
|
||||||
win->fscol = win_alloc_color(win, WIN_FS_COLOR);
|
win->fscol = win_alloc_color(win, WIN_FS_COLOR);
|
||||||
win->selcol = win_alloc_color(win, SEL_COLOR);
|
win->selcol = win_alloc_color(win, SEL_COLOR);
|
||||||
win->bar.bgcol = win_alloc_color(win, BAR_BG_COLOR);
|
win->bar.bgcol = win_alloc_color(win, BAR_BG_COLOR);
|
||||||
win->bar.fgcol = win_alloc_color(win, BAR_FG_COLOR);
|
win->bar.fgcol = win_alloc_color(win, BAR_FG_COLOR);
|
||||||
|
win->bar.h = options->hide_bar ? 0 : barheight;
|
||||||
|
|
||||||
win->sizehints.flags = PWinGravity;
|
win->sizehints.flags = PWinGravity;
|
||||||
win->sizehints.win_gravity = NorthWestGravity;
|
win->sizehints.win_gravity = NorthWestGravity;
|
||||||
@ -135,8 +138,6 @@ void win_init(win_t *win)
|
|||||||
if (setlocale(LC_CTYPE, "") == NULL || XSupportsLocale() == 0)
|
if (setlocale(LC_CTYPE, "") == NULL || XSupportsLocale() == 0)
|
||||||
warn("no locale support");
|
warn("no locale support");
|
||||||
|
|
||||||
win_init_font(e->dpy, BAR_FONT);
|
|
||||||
|
|
||||||
wm_delete_win = XInternAtom(e->dpy, "WM_DELETE_WINDOW", False);
|
wm_delete_win = XInternAtom(e->dpy, "WM_DELETE_WINDOW", False);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user