diff --git a/commands.c b/commands.c index 97cadf2..3257b1e 100644 --- a/commands.c +++ b/commands.c @@ -83,9 +83,6 @@ bool cg_switch_mode(arg_t _) load_image(fileidx); mode = MODE_IMAGE; } - close_info(); - open_info(); - title_dirty = true; return true; } @@ -415,12 +412,7 @@ bool ci_slideshow(arg_t _) bool ct_move_sel(arg_t dir) { - bool dirty = tns_move_selection(&tns, dir, prefix); - if (dirty) { - close_info(); - open_info(); - } - return dirty; + return tns_move_selection(&tns, dir, prefix); } bool ct_reload_all(arg_t _) diff --git a/image.c b/image.c index 5e2a7a0..6020e93 100644 --- a/image.c +++ b/image.c @@ -717,7 +717,7 @@ static bool img_fit(img_t *img) if (ABS(img->zoom - z) > 1.0 / MAX(img->w, img->h)) { img->zoom = z; - img->dirty = title_dirty = true; + img->dirty = true; return true; } else { return false; @@ -852,7 +852,7 @@ bool img_zoom_to(img_t *img, float z) img->y = y - (y - img->y) * z / img->zoom; img->zoom = z; img->scalemode = SCALE_ZOOM; - img->dirty = img->checkpan = title_dirty = true; + img->dirty = img->checkpan = true; return true; } else { return false; diff --git a/main.c b/main.c index 2514237..a050aa8 100644 --- a/main.c +++ b/main.c @@ -70,7 +70,6 @@ int alternate; int markcnt; int markidx; int prefix; -bool title_dirty; const XButtonEvent *xbutton_ev; static void autoreload(void); @@ -316,7 +315,7 @@ static void open_title(void) char *argv[8]; char w[12] = "", h[12] = "", z[12] = "", fidx[12], fcnt[12]; - if (wintitle.f.err || !title_dirty) + if (wintitle.f.err) return; close_title(); @@ -331,7 +330,6 @@ static void open_title(void) fidx, fcnt, w, h, z, NULL); if ((wintitle.pid = spawn(&wintitle.fd, NULL, argv)) > 0) fcntl(wintitle.fd, F_SETFL, O_NONBLOCK); - title_dirty = false; } void close_info(void) @@ -402,10 +400,7 @@ void load_image(int new) files[new].flags &= ~FF_WARN; fileidx = current = new; - close_info(); - open_info(); arl_add(&arl, files[fileidx].path); - title_dirty = true; if (img.multi.cnt > 0 && img.multi.animate) set_timeout(animate, img.multi.frames[img.multi.sel].delay, true); @@ -443,9 +438,33 @@ static void update_info(void) const char *mark; win_bar_t *l = &win.bar.l, *r = &win.bar.r; + static struct { + const char *filepath; + int fileidx; + float zoom; + appmode_t mode; + } prev; + + if (prev.fileidx != fileidx || prev.mode != mode || + (prev.filepath == NULL || !STREQ(prev.filepath, files[fileidx].path))) + { + close_info(); + open_info(); + open_title(); + } else if (mode == MODE_IMAGE && prev.zoom != img.zoom) { + open_title(); + } + /* update bar contents */ if (win.bar.h == 0 || extprefix) return; + + free((char *)prev.filepath); + prev.filepath = estrdup(files[fileidx].path); + prev.fileidx = fileidx; + prev.zoom = img.zoom; + prev.mode = mode; + for (fw = 0, i = filecnt; i > 0; fw++, i /= 10) ; mark = files[fileidx].flags & FF_MARK ? "* " : ""; @@ -520,7 +539,6 @@ void redraw(void) tns_render(&tns); } update_info(); - open_title(); win_draw(&win); reset_timeout(redraw); reset_cursor(); @@ -669,8 +687,6 @@ static bool run_key_handler(const char *key, unsigned int mask) if (mode == MODE_IMAGE && changed) { img_close(&img, true); load_image(fileidx); - } else { - open_info(); } free(oldst); reset_cursor(); diff --git a/nsxiv.h b/nsxiv.h index 949fc4b..e137bfe 100644 --- a/nsxiv.h +++ b/nsxiv.h @@ -468,6 +468,5 @@ extern int alternate; extern int markcnt; extern int markidx; extern int prefix; -extern bool title_dirty; #endif /* NSXIV_H */ diff --git a/thumbs.c b/thumbs.c index d2f91a7..500446f 100644 --- a/thumbs.c +++ b/thumbs.c @@ -447,7 +447,6 @@ void tns_render(tns_t *tns) } tns->dirty = false; tns_highlight(tns, *tns->sel, true); - title_dirty = true; } void tns_mark(tns_t *tns, int n, bool mark) @@ -516,7 +515,6 @@ bool tns_move_selection(tns_t *tns, direction_t dir, int cnt) tns_check_view(tns, false); if (!tns->dirty) tns_highlight(tns, *tns->sel, true); - title_dirty = true; } return *tns->sel != old; }