aboutsummaryrefslogtreecommitdiff
path: root/src/navigator.c
diff options
context:
space:
mode:
authorDmitrij D. Czarkoff <czarkoff@gmail.com>2016-04-26 22:07:02 +0200
committerDmitrij D. Czarkoff <czarkoff@gmail.com>2016-04-26 22:07:02 +0200
commitfe10d9d38f02dbfe229e40f96f9640c3568a7f69 (patch)
treed8c06b524331784d004b8a549004295c12067373 /src/navigator.c
parent4d2f36a98be483e021845e4e8fc17722a8aa800c (diff)
downloadimv-fe10d9d38f02dbfe229e40f96f9640c3568a7f69.tar.gz
Reimplement '-x' flag
This change effectively backs out f1737ddd06141afbe99f37af3b5c2d0f1df5fe7a, implementing the same functionality in a simpler and more correct way. Implementation details: * imv_navigator.wrapped - a new field that has value "0" by default; once navigator wraps around the list, this field recieves value "1". * imv_navigator_wrapped(&nav) - a new function that returns non-zero value iff navigator wrapped around the list. Currently just returns value of imv_navigator.wrapped. While at it, expanded "test_navigator_remove" and merged it with "test_navigator_add". Resulting test is called "test_navigator_add_remove". Fixes #94.
Diffstat (limited to 'src/navigator.c')
-rw-r--r--src/navigator.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/src/navigator.c b/src/navigator.c
index b4e65fb..2756134 100644
--- a/src/navigator.c
+++ b/src/navigator.c
@@ -42,6 +42,7 @@ void imv_navigator_init(struct imv_navigator *nav)
nav->cur_path = 0;
nav->last_move_direction = 1;
nav->changed = 0;
+ nav->wrapped = 0;
}
void imv_navigator_destroy(struct imv_navigator *nav)
@@ -126,12 +127,11 @@ const char *imv_navigator_selection(struct imv_navigator *nav)
return nav->paths[nav->cur_path];
}
-int imv_navigator_select_rel(struct imv_navigator *nav, int direction,
- const int cycle)
+void imv_navigator_select_rel(struct imv_navigator *nav, int direction)
{
int prev_path = nav->cur_path;
if(nav->num_paths == 0) {
- return 0;
+ return;
}
if(direction > 1) {
@@ -139,30 +139,22 @@ int imv_navigator_select_rel(struct imv_navigator *nav, int direction,
} else if(direction < -1) {
direction = -1;
} else if(direction == 0) {
- return 0;
+ return;
}
nav->cur_path += direction;
if(nav->cur_path == nav->num_paths) {
- /* end of list reached */
- if(!cycle) {
- /* undo move */
- nav->cur_path -= direction;
- return 0;
- }
+ /* Wrap after the end of the list */
nav->cur_path = 0;
+ nav->wrapped = 1;
} else if(nav->cur_path < 0) {
- /* going backwards at the beginning of the list */
- if(!cycle) {
- /* undo move */
- nav->cur_path -= direction;
- return 0;
- }
+ /* Wrap before the start of the list */
nav->cur_path = nav->num_paths - 1;
+ nav->wrapped = 1;
}
nav->last_move_direction = direction;
nav->changed = prev_path != nav->cur_path;
- return 1;
+ return;
}
void imv_navigator_remove(struct imv_navigator *nav, const char *path)
@@ -189,13 +181,13 @@ void imv_navigator_remove(struct imv_navigator *nav, const char *path)
if(nav->cur_path == removed) {
/* We just removed the current path */
if(nav->last_move_direction < 0) {
- /* Move left
- * the cycle parameter does not matter here */
- imv_navigator_select_rel(nav, -1, 0);
+ /* Move left */
+ imv_navigator_select_rel(nav, -1);
} else {
/* Try to stay where we are, unless we ran out of room */
if(nav->cur_path == nav->num_paths) {
nav->cur_path = 0;
+ nav->wrapped = 1;
}
}
}
@@ -253,5 +245,10 @@ int imv_navigator_poll_changed(struct imv_navigator *nav, const int nopoll)
return 0;
}
+int imv_navigator_wrapped(struct imv_navigator *nav)
+{
+ return nav->wrapped;
+}
+
/* vim:set ts=2 sts=2 sw=2 et: */