summaryrefslogtreecommitdiffstats
path: root/src/listnav.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/listnav.c')
-rw-r--r--src/listnav.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/listnav.c b/src/listnav.c
index 707a973..28db2d3 100644
--- a/src/listnav.c
+++ b/src/listnav.c
@@ -12,26 +12,30 @@ listnav_init(struct listnav *nav)
void
listnav_update_bounds(struct listnav *nav, int min, int max)
{
+ ASSERT(max >= min);
nav->min = min;
nav->max = max;
- nav->wmin = MAX(nav->wmin, nav->min);
- nav->wmax = MIN(nav->wmin + nav->wlen, nav->max);
- nav->sel = MIN(MAX(nav->sel, nav->wmin), nav->wmax - 1);
+ listnav_update_wlen(nav, MIN(nav->wlen, nav->max - nav->min));
}
void
listnav_update_wlen(struct listnav *nav, int wlen)
{
- nav->wlen = wlen;
- nav->wmax = MIN(nav->wmin + nav->wlen, nav->max);
- nav->sel = MIN(MAX(nav->sel, nav->wmin), nav->wmax - 1);
+ ASSERT(wlen >= 0);
+
+ nav->wlen = MIN(wlen, nav->max - nav->min);
+ if (nav->wmin < nav->min)
+ nav->wmin = nav->min;
+ if (nav->wmin + nav->wlen > nav->max)
+ nav->wmin = nav->max - nav->wlen;
+ nav->wmax = nav->wmin + nav->wlen;
+ nav->sel = MAX(MIN(nav->sel, nav->wmax - 1), nav->wmin);
}
void
listnav_update_sel(struct listnav *nav, int sel)
{
nav->sel = MAX(MIN(sel, nav->max - 1), nav->min);
-
if (nav->sel >= nav->wmax) {
nav->wmax = nav->sel + 1;
nav->wmin = MAX(nav->min, nav->wmax - nav->wlen);