From 2a981df18167cf8dd0a1310b03061010c8ef71dd Mon Sep 17 00:00:00 2001 From: Sven Willner Date: Thu, 24 Aug 2017 20:28:24 +0200 Subject: added inotify support --- src/winwidget.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/winwidget.h') diff --git a/src/winwidget.h b/src/winwidget.h index 6a794e7..0555201 100644 --- a/src/winwidget.h +++ b/src/winwidget.h @@ -116,6 +116,10 @@ struct __winwidget { time_t click_start_time; unsigned char has_rotated; + +#ifdef HAVE_INOTIFY + int inotify_wd; +#endif }; int winwidget_loadimage(winwidget winwid, feh_file * filename); -- cgit v1.2.3 From 177cbff6af7b9845d592fb0497464d70ee423418 Mon Sep 17 00:00:00 2001 From: Sven Willner Date: Fri, 1 Sep 2017 14:51:21 +0200 Subject: fixed inotify for thumbnail mode --- src/thumbnail.c | 6 ++++++ src/winwidget.c | 50 +++++++++++++++++++++++++++++--------------------- src/winwidget.h | 5 +++++ 3 files changed, 40 insertions(+), 21 deletions(-) (limited to 'src/winwidget.h') diff --git a/src/thumbnail.c b/src/thumbnail.c index edf0f4f..b7108c8 100644 --- a/src/thumbnail.c +++ b/src/thumbnail.c @@ -790,7 +790,13 @@ void feh_thumbnail_show_fullsize(feh_file *thumbfile) free(thumbwin->file); thumbwin->file = gib_list_add_front(NULL, thumbfile); winwidget_rename(thumbwin, s); +#ifdef HAVE_INOTIFY + winwidget_inotify_remove(thumbwin); +#endif feh_reload_image(thumbwin, 1, 1); +#ifdef HAVE_INOTIFY + winwidget_inotify_add(thumbwin, thumbfile->filename); +#endif } } diff --git a/src/winwidget.c b/src/winwidget.c index 1a0bc7d..039a582 100644 --- a/src/winwidget.c +++ b/src/winwidget.c @@ -764,12 +764,7 @@ void winwidget_destroy_xwin(winwidget winwid) void winwidget_destroy(winwidget winwid) { #ifdef HAVE_INOTIFY - if (winwid->inotify_wd >= 0) { - D(("Removing inotify watch\n")); - if (inotify_rm_watch(opt.inotify_fd, winwid->inotify_wd)) - eprintf("inotify_rm_watch failed"); - winwid->inotify_wd = -1; - } + winwidget_inotify_remove(winwid); #endif winwidget_destroy_xwin(winwid); if (winwid->name) @@ -784,6 +779,32 @@ void winwidget_destroy(winwidget winwid) return; } +#ifdef HAVE_INOTIFY +void winwidget_inotify_remove(winwidget winwid) +{ + if (winwid->inotify_wd >= 0) { + D(("Removing inotify watch\n")); + if (inotify_rm_watch(opt.inotify_fd, winwid->inotify_wd)) + eprintf("inotify_rm_watch failed"); + winwid->inotify_wd = -1; + } +} +#endif + +#ifdef HAVE_INOTIFY +void winwidget_inotify_add(winwidget winwid, char *filename) +{ + if (opt.inotify) { + D(("Adding inotify watch for %s\n", filename)); + winwid->inotify_wd = inotify_add_watch(opt.inotify_fd, + filename, + IN_CLOSE_WRITE); + if (winwid->inotify_wd < 0) + eprintf("inotify_add_watch failed"); + } +} +#endif + #ifdef HAVE_INOTIFY #define INOTIFY_BUFFER_LEN (1024 * (sizeof (struct inotify_event)) + 16) void feh_event_handle_inotify(void) @@ -802,7 +823,6 @@ void feh_event_handle_inotify(void) event = (struct inotify_event *) &buf[i]; for (int i = 0; i < window_num; i++) { if(windows[i]->inotify_wd == event->wd) { - windows[i]->inotify_wd = -1; feh_reload_image(windows[i], 0, 1); break; } @@ -846,24 +866,12 @@ int winwidget_loadimage(winwidget winwid, feh_file * file) { D(("filename %s\n", file->filename)); #ifdef HAVE_INOTIFY - if (winwid->inotify_wd >= 0) { - D(("Removing inotify watch\n")); - if (inotify_rm_watch(opt.inotify_fd, winwid->inotify_wd)) - eprintf("inotify_rm_watch failed"); - winwid->inotify_wd = -1; - } + winwidget_inotify_remove(winwid); #endif int res = feh_load_image(&(winwid->im), file); #ifdef HAVE_INOTIFY if (res) { - if (opt.inotify) { - D(("Adding inotify watch for %s\n", file->filename)); - winwid->inotify_wd = inotify_add_watch(opt.inotify_fd, - file->filename, - IN_CLOSE_WRITE); - if (winwid->inotify_wd < 0) - eprintf("inotify_add_watch failed"); - } + winwidget_inotify_add(winwid, file->filename); } #endif return(res); diff --git a/src/winwidget.h b/src/winwidget.h index 0555201..d6b9546 100644 --- a/src/winwidget.h +++ b/src/winwidget.h @@ -122,6 +122,11 @@ struct __winwidget { #endif }; +#ifdef HAVE_INOTIFY +void winwidget_inotify_remove(winwidget winwid); +void winwidget_inotify_add(winwidget winwid, char *filename); +#endif + int winwidget_loadimage(winwidget winwid, feh_file * filename); void winwidget_show(winwidget winwid); void winwidget_show_menu(winwidget winwid); -- cgit v1.2.3 From 3671b53046afbeced26162fc413fcfb7971116b9 Mon Sep 17 00:00:00 2001 From: Sven Willner Date: Thu, 13 Sep 2018 15:29:57 +0200 Subject: Inotify: watch parent directory instead of just file --- src/thumbnail.c | 2 +- src/winwidget.c | 25 +++++++++++++------------ src/winwidget.h | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) (limited to 'src/winwidget.h') diff --git a/src/thumbnail.c b/src/thumbnail.c index b7108c8..761162f 100644 --- a/src/thumbnail.c +++ b/src/thumbnail.c @@ -795,7 +795,7 @@ void feh_thumbnail_show_fullsize(feh_file *thumbfile) #endif feh_reload_image(thumbwin, 1, 1); #ifdef HAVE_INOTIFY - winwidget_inotify_add(thumbwin, thumbfile->filename); + winwidget_inotify_add(thumbwin, thumbfile); #endif } } diff --git a/src/winwidget.c b/src/winwidget.c index 9270d69..c012fc0 100644 --- a/src/winwidget.c +++ b/src/winwidget.c @@ -792,13 +792,13 @@ void winwidget_inotify_remove(winwidget winwid) #endif #ifdef HAVE_INOTIFY -void winwidget_inotify_add(winwidget winwid, char *filename) +void winwidget_inotify_add(winwidget winwid, feh_file * file) { if (opt.auto_reload) { - D(("Adding inotify watch for %s\n", filename)); - winwid->inotify_wd = inotify_add_watch(opt.inotify_fd, - filename, - IN_CLOSE_WRITE); + D(("Adding inotify watch for %s\n", file->filename)); + char dir[PATH_MAX]; + feh_file_dirname(dir, file, PATH_MAX); + winwid->inotify_wd = inotify_add_watch(opt.inotify_fd, dir, IN_CLOSE_WRITE | IN_MOVED_TO); if (winwid->inotify_wd < 0) eprintf("inotify_add_watch failed"); } @@ -824,12 +824,13 @@ void feh_event_handle_inotify(void) for (int j = 0; j < window_num; j++) { if(windows[j]->inotify_wd == event->wd) { if (event->mask & IN_IGNORED) { - D(("Inotify watch was implicitely removed\n")); - feh_reload_image(windows[j], 0, 1); - winwidget_inotify_add(windows[j], FEH_FILE(windows[j]->file->data)->filename); - } else if (event->mask & IN_CLOSE_WRITE) { - D(("Inotify says file changed\n")); - feh_reload_image(windows[j], 0, 1); + D(("inotify watch was implicitely removed\n")); + windows[j]->inotify_wd = -1; + } else if (event->mask & (IN_CLOSE_WRITE | IN_MOVED_TO)) { + if (strcmp(event->name, FEH_FILE(windows[j]->file->data)->name) == 0) { + D(("inotify says file changed\n")); + feh_reload_image(windows[j], 0, 1); + } } break; } @@ -878,7 +879,7 @@ int winwidget_loadimage(winwidget winwid, feh_file * file) int res = feh_load_image(&(winwid->im), file); #ifdef HAVE_INOTIFY if (res) { - winwidget_inotify_add(winwid, file->filename); + winwidget_inotify_add(winwid, file); } #endif return(res); diff --git a/src/winwidget.h b/src/winwidget.h index d6b9546..b8d777e 100644 --- a/src/winwidget.h +++ b/src/winwidget.h @@ -124,7 +124,7 @@ struct __winwidget { #ifdef HAVE_INOTIFY void winwidget_inotify_remove(winwidget winwid); -void winwidget_inotify_add(winwidget winwid, char *filename); +void winwidget_inotify_add(winwidget winwid, feh_file * file); #endif int winwidget_loadimage(winwidget winwid, feh_file * filename); -- cgit v1.2.3