t* sacc + cursorline and uri preview
       
   URI git clone git://git.codevoid.de/sacc-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR LICENSE
       ---
   DIR commit 21f414d9dc19a291e207562994c35bb9e3df3bc1
   DIR parent ed833e386ffe895fe2c675b549e7353fe0d3308f
   URI Author: Quentin Rameau <quinq@fifth.space>
       Date:   Thu, 27 Jul 2017 13:20:34 +0200
       
       Fix jumptoline with random line number in ti UI
       
       Thanks to Hiltjo for spotting it!
       
       Diffstat:
         M ui_ti.c                             |      59 ++++++++++++++++---------------
       
       1 file changed, 30 insertions(+), 29 deletions(-)
       ---
   DIR diff --git a/ui_ti.c b/ui_ti.c
       t@@ -235,39 +235,40 @@ movecurline(Item *item, int l)
        }
        
        static void
       -jumptoline(Item *entry, ssize_t offset)
       +jumptoline(Item *entry, ssize_t line, int absolute)
        {
                Dir *dir = entry->dat;
       -        size_t nitems;
       -        int plines = lines-2;
       +        size_t lastitem;
       +        int lastpagetop, plines = lines-2;
        
                if (!dir)
                        return;
       +        lastitem = dir->nitems-1;
        
       -        nitems = dir->nitems;
       +        if (line < 0)
       +                line = 0;
       +        if (line > lastitem)
       +                line = lastitem;
        
       -        if (offset <= 0) {
       -                if (!dir->curline)
       -                        return;
       -                dir->printoff = 0;
       -                dir->curline = 0;
       -        } else if (offset + plines < nitems) {
       -                dir->printoff = offset;
       -                dir->curline = offset;
       -        } else if (dir->curline == nitems-1) {
       +        if (dir->curline == line)
                        return;
       -        } else if (nitems < plines) {
       -                dir->curline = nitems-1;
       -        } else if (offset == nitems) {
       -                dir->printoff = nitems-1 - plines;
       -                dir->curline = nitems-1;
       -        } else {
       -                offset = nitems-1 - plines;
       -                if (dir->printoff == offset)
       -                        dir->curline = nitems-1;
       -                else if (dir->curline < offset)
       -                        dir->curline = offset;
       -                dir->printoff = offset;
       +
       +        if (lastitem <= plines) {              /* all items fit on one page */
       +                dir->curline = line;
       +        } else if (line == 0) {                /* jump to top */
       +                if (absolute || dir->curline > plines || dir->printoff == 0)
       +                        dir->curline = 0;
       +                dir->printoff = 0;
       +        } else if (line + plines < lastitem) { /* jump before last page */
       +                dir->curline = line;
       +                dir->printoff = line;
       +        } else {                               /* jump within the last page */
       +                lastpagetop = lastitem - plines;
       +                if (dir->printoff == lastpagetop || absolute)
       +                        dir->curline = line;
       +                else if (dir->curline < lastpagetop)
       +                        dir->curline = lastpagetop;
       +                dir->printoff = lastpagetop;
                }
        
                display(entry);
       t@@ -336,11 +337,11 @@ selectitem(Item *entry)
                                continue;
                        case _key_pgdown:
                        pgdown:
       -                        jumptoline(entry, dir->printoff + plines);
       +                        jumptoline(entry, dir->printoff + plines, 0);
                                continue;
                        case _key_end:
                        end:
       -                        jumptoline(entry, dir->nitems);
       +                        jumptoline(entry, dir->nitems, 0);
                                continue;
                        case _key_lnup:
                        lnup:
       t@@ -348,11 +349,11 @@ selectitem(Item *entry)
                                continue;
                        case _key_pgup:
                        pgup:
       -                        jumptoline(entry, dir->printoff - plines);
       +                        jumptoline(entry, dir->printoff - plines, 0);
                                continue;
                        case _key_home:
                        home:
       -                        jumptoline(entry, 0);
       +                        jumptoline(entry, 0, 0);
                                continue;
                        case _key_quit:
                        quit: