aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorNRK <nrk@disroot.org>2023-09-30 10:53:32 +0200
committerNRK <nrk@disroot.org>2023-09-30 10:53:32 +0200
commit3659361e76c5c994bee3467787c00e89780cccbc (patch)
tree1994aa7ab2672029f91b5c859f92f026d73070e2 /main.c
parent80a71315de2bec9924f2e06a825d4400f2b5a4f8 (diff)
downloadnsxiv-3659361e76c5c994bee3467787c00e89780cccbc.tar.zst
centralize script handling logic (#477)
currently the logic of when to open/close script is scattered around the entire code-base which is both ugly and error-prone. this patch centralizes script handling by remembering the relevant information on each redraw and then comparing it with the previous information to figure out whether something changed or not. this also fixes a bug where scripts weren't being called in thumbnail mode when mouse was used for selecting a different image. Closes: https://codeberg.org/nsxiv/nsxiv/issues/475 Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/477 Reviewed-by: eylles <eylles@noreply.codeberg.org>
Diffstat (limited to 'main.c')
-rw-r--r--main.c34
1 files changed, 25 insertions, 9 deletions
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();