summaryrefslogtreecommitdiff
path: root/src/thumbnail.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/thumbnail.c')
-rw-r--r--src/thumbnail.c41
1 files changed, 26 insertions, 15 deletions
diff --git a/src/thumbnail.c b/src/thumbnail.c
index da14760..a77152a 100644
--- a/src/thumbnail.c
+++ b/src/thumbnail.c
@@ -786,36 +786,47 @@ void feh_thumbnail_select(winwidget winwid, feh_thumbnail *thumbnail)
void feh_thumbnail_select_next(winwidget winwid, int jump)
{
- gib_list *l, *tmp;
- int i;
+ gib_list *l;
+ feh_thumbnail *thumb;
+ int len = 0, cur = 0, target = 0;
- for (l = thumbnails; l && l->next; l = l->next) {
- tmp = l;
- for (i = jump; (i > 0) && tmp->next; i--)
- tmp = tmp->next;
- if (tmp->data == td.selected)
- break;
+ for (l = thumbnails; l; l = l->next) {
+ thumb = FEH_THUMB(l->data);
+ if (thumb == td.selected)
+ cur = len;
+ len++;
}
- feh_thumbnail_select(winwid, FEH_THUMB(l->data));
+ target = (cur + len - jump) % len;
+
+ for (l = thumbnails; l; l = l->next) {
+ if (target-- == 0) {
+ feh_thumbnail_select(winwid, FEH_THUMB(l->data));
+ }
+ }
}
void feh_thumbnail_select_prev(winwidget winwid, int jump)
{
gib_list *l;
feh_thumbnail *thumb;
- int i;
+ int len = 0, cur = 0, target = 0;
for (l = thumbnails; l; l = l->next) {
thumb = FEH_THUMB(l->data);
- if ((thumb == td.selected) && l->next) {
- for (i = jump; (i > 0) && l->next; i--)
- l = l->next;
+ if (thumb == td.selected)
+ cur = len;
+ len++;
+ }
+
+ target = (cur + jump) % len;
+
+ for (l = thumbnails; l; l = l->next) {
+ if (target-- == 0) {
feh_thumbnail_select(winwid, FEH_THUMB(l->data));
- return;
+ break;
}
}
- feh_thumbnail_select(winwid, FEH_THUMB(thumbnails->data));
}
inline void feh_thumbnail_show_selected()