summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@derf.homelinux.org>2010-03-25 08:37:42 +0100
committerDaniel Friesel <derf@derf.homelinux.org>2010-03-25 08:37:42 +0100
commit4e84bc4b78603e5f5b9f85d8b0dff93b8886f17b (patch)
tree88cf4a162a4acd9007aad33dd0f5ed95ccd19ceb
parent5ca513aea73d041dd3d45c7b02c310fc7bcb8cec (diff)
Actually detect an empty filelist
This fixes imlib2 warnings (and occasional X errors/segfaults), which used to occur when all files in feh's filelist were suddenly deleted by an external application. Now, feh simply quits with "No more slides in show" (which makes more sense, IMHO).
-rw-r--r--TODO4
-rw-r--r--src/collage.c1
-rw-r--r--src/filelist.c2
-rw-r--r--src/index.c1
-rw-r--r--src/slideshow.c23
-rw-r--r--src/thumbnail.c1
6 files changed, 9 insertions, 23 deletions
diff --git a/TODO b/TODO
index 054f5fe..bc90f0e 100644
--- a/TODO
+++ b/TODO
@@ -6,10 +6,6 @@ having to focus it. Have to be a bit careful with this but could be useful.
key/option/signal/timeout to totally reload filelist (rescan directories etc)
-The "No more slides left in show" bug was fixed, but now there's a rare
-condition (viewing a few images, removing them externally while viewing,
-then resizing the window) causing imlib2 warnings.
-
<keypad begin> antialieses the image, but doing that automatically upon
key release would be better. However, I couldn't find a way to do that so far.
Even when holding down a key, everytime the eventloop runs I get a
diff --git a/src/collage.c b/src/collage.c
index e76f8ae..3e03828 100644
--- a/src/collage.c
+++ b/src/collage.c
@@ -119,7 +119,6 @@ void init_collage_mode(void)
file = FEH_FILE(l->data);
if (last) {
filelist = feh_file_remove_from_list(filelist, last);
- filelist_len--;
last = NULL;
}
D(3, ("About to load image %s\n", file->filename));
diff --git a/src/filelist.c b/src/filelist.c
index da17f15..2eb43af 100644
--- a/src/filelist.c
+++ b/src/filelist.c
@@ -113,6 +113,8 @@ gib_list *feh_file_remove_from_list(gib_list * list, gib_list * l)
{
D_ENTER(4);
feh_file_free(FEH_FILE(l->data));
+ D(4, ("filelist_len %d -> %d\n", filelist_len, filelist_len - 1));
+ filelist_len--;
D_RETURN(4, gib_list_remove(list, l));
}
diff --git a/src/index.c b/src/index.c
index 5c13d19..c7c0a84 100644
--- a/src/index.c
+++ b/src/index.c
@@ -306,7 +306,6 @@ void init_index_mode(void)
file = FEH_FILE(l->data);
if (last) {
filelist = feh_file_remove_from_list(filelist, last);
- filelist_len--;
last = NULL;
}
D(4, ("About to load image %s\n", file->filename));
diff --git a/src/slideshow.c b/src/slideshow.c
index 1a3ffe8..314374c 100644
--- a/src/slideshow.c
+++ b/src/slideshow.c
@@ -50,7 +50,6 @@ void init_slideshow_mode(void)
file = FEH_FILE(l->data);
if (last) {
filelist = feh_file_remove_from_list(filelist, last);
- filelist_len--;
last = NULL;
}
current_file = l;
@@ -128,6 +127,7 @@ void feh_reload_image(winwidget w, int resize, int force_new)
winwidget_rename(w, title);
free(title);
free(new_title);
+ filelist = feh_file_remove_from_list(filelist, w->file);
D_RETURN_(4);
}
if (force_new) {
@@ -244,7 +244,6 @@ void slideshow_change_image(winwidget winwid, int change)
if (last) {
filelist = feh_file_remove_from_list(filelist, last);
- filelist_len--;
last = NULL;
}
s = slideshow_create_name(FEH_FILE(current_file->data));
@@ -268,18 +267,12 @@ void slideshow_change_image(winwidget winwid, int change)
} else
last = current_file;
}
- if (!success) {
- /* We get here if three files in a row could not be loaded.
- * However, it seems that this piece of code is never reached when feh
- * would otherwise fail; it's only executed in the aforementioned case,
- * causing slideshows to exit although there still are lots of working slides.
- *
- * So far, there is one known case were we should exit here:
- * When viewing a set of files, externally removing all of them and then resizing
- * the window in feh, feh will print lots of imlib errors and eventually segfault.
- */
- weprintf("No more slides in show?");
- }
+ if (last)
+ filelist = feh_file_remove_from_list(filelist, last);
+
+ if (filelist_len == 0)
+ eprintf("No more slides in show");
+
if (opt.slideshow_delay >= 0.0)
feh_add_timer(cb_slide_timer, winwid, opt.slideshow_delay, "SLIDE_CHANGE");
D_RETURN_(4);
@@ -445,7 +438,6 @@ void feh_filelist_image_remove(winwidget winwid, char do_delete)
doomed = current_file;
slideshow_change_image(winwid, SLIDE_NEXT);
- filelist_len--;
if (do_delete)
filelist = feh_file_rm_and_free(filelist, doomed);
else
@@ -460,7 +452,6 @@ void feh_filelist_image_remove(winwidget winwid, char do_delete)
free(s);
} else if ((winwid->type == WIN_TYPE_SINGLE)
|| (winwid->type == WIN_TYPE_THUMBNAIL_VIEWER)) {
- filelist_len--;
if (do_delete)
filelist = feh_file_rm_and_free(filelist, winwid->file);
else
diff --git a/src/thumbnail.c b/src/thumbnail.c
index a2246ac..425fa8c 100644
--- a/src/thumbnail.c
+++ b/src/thumbnail.c
@@ -179,7 +179,6 @@ void init_thumbnail_mode(void)
file = FEH_FILE(l->data);
if (last) {
filelist = feh_file_remove_from_list(filelist, last);
- filelist_len--;
last = NULL;
}
D(4, ("About to load image %s\n", file->filename));