Download raw body.
tog: tree view page up/down bugs
On Sun, Nov 29, 2020 at 01:40:15PM +0100, Stefan Sperling wrote:
> On Thu, Nov 26, 2020 at 09:41:19PM +0100, Christian Weisgerber wrote:
> > Stefan Sperling:
> >
> > > Thanks. Should be fixed with this version of the patch.
> > >
> > > diff refs/heads/main refs/heads/togtree
> > > blob - feaac17d0e83e59b9ef24e80a5f347f16db2f891
> > > blob + 1f237865b895aeaddf0db2aa913b97b6b8a8ec75
> >
> > Still not quite right. The synthetical ".." entry continues to
> > prove troublesome.
> >
> > * Standard 80x24 terminal.
> > * In the got.git repository, run "tog tree lib".
> > * The first displayed entry is "..".
> > * Page down once.
> > * Page up once.
> > * The first displayed entry is now "arraylist.h". You need to
> > move/page up one more to get back to "..".
>
> Maybe this time? :)
Rebased diff. I've just comitted another trivial change which overlaps.
diff 6e88edf0cbe9b44bb70c2b59d313aea6b5197a8e 19366d097e5368b7850c41aa2dfb2587054eb22e
blob - 8442a98a5d8df651d1a68212c02dc9bb7284c585
blob + 1e86a0b31d06f8b7654c3cf6f435d952ee57bb6b
--- tog/tog.c
+++ tog/tog.c
@@ -4991,29 +4991,24 @@ tree_scroll_up(struct tog_view *view,
struct got_tree_object *tree, int isroot)
{
struct got_tree_entry *te;
- int i;
+ int i = 0;
if (*first_displayed_entry == NULL)
return;
- te = got_object_tree_get_entry(tree, 0);
- if (*first_displayed_entry == te) {
- if (!isroot)
- *first_displayed_entry = NULL;
- return;
+ te = got_tree_entry_get_prev(tree, *first_displayed_entry);
+ while (i++ < maxscroll) {
+ if (te == NULL) {
+ if (!isroot)
+ *first_displayed_entry = NULL;
+ break;
+ }
+ *first_displayed_entry = te;
+ te = got_tree_entry_get_prev(tree, te);
}
-
- i = 0;
- while (*first_displayed_entry && i < maxscroll) {
- *first_displayed_entry = got_tree_entry_get_prev(tree,
- *first_displayed_entry);
- i++;
- }
- if (!isroot && te == got_object_tree_get_first_entry(tree) && i < maxscroll)
- *first_displayed_entry = NULL;
}
-static int
+static void
tree_scroll_down(struct got_tree_entry **first_displayed_entry, int maxscroll,
struct got_tree_entry *last_displayed_entry,
struct got_tree_object *tree)
@@ -5034,7 +5029,6 @@ tree_scroll_down(struct got_tree_entry **first_display
next = got_tree_entry_get_next(tree, next);
}
}
- return n;
}
static const struct got_error *
@@ -5359,7 +5353,7 @@ input_tree_view(struct tog_view **new_view, struct tog
const struct got_error *err = NULL;
struct tog_tree_view_state *s = &view->state.tree;
struct tog_view *log_view, *ref_view;
- int begin_x = 0, nscrolled;
+ int begin_x = 0;
switch (ch) {
case 'i':
@@ -5416,23 +5410,23 @@ input_tree_view(struct tog_view **new_view, struct tog
case KEY_UP:
if (s->selected > 0) {
s->selected--;
- if (s->selected == 0)
- break;
- }
- if (s->selected > 0)
break;
+ }
tree_scroll_up(view, &s->first_displayed_entry, 1,
s->tree, s->tree == s->root);
break;
case KEY_PPAGE:
case CTRL('b'):
+ if (s->tree == s->root) {
+ if (got_object_tree_get_first_entry(s->tree) ==
+ s->first_displayed_entry)
+ s->selected = 0;
+ } else {
+ if (s->first_displayed_entry == NULL)
+ s->selected = 0;
+ }
tree_scroll_up(view, &s->first_displayed_entry,
- MAX(0, view->nlines - 4 - s->selected), s->tree,
- s->tree == s->root);
- s->selected = 0;
- if (got_object_tree_get_first_entry(s->tree) ==
- s->first_displayed_entry && s->tree != s->root)
- s->first_displayed_entry = NULL;
+ MAX(0, view->nlines - 3), s->tree, s->tree == s->root);
break;
case 'j':
case KEY_DOWN:
@@ -5456,18 +5450,8 @@ input_tree_view(struct tog_view **new_view, struct tog
s->selected = s->ndisplayed - 1;
break;
}
- nscrolled = tree_scroll_down(&s->first_displayed_entry,
- view->nlines, s->last_displayed_entry, s->tree);
- if (nscrolled < view->nlines) {
- int ndisplayed = 0;
- struct got_tree_entry *te;
- te = s->first_displayed_entry;
- do {
- ndisplayed++;
- te = got_tree_entry_get_next(s->tree, te);
- } while (te);
- s->selected = ndisplayed - 1;
- }
+ tree_scroll_down(&s->first_displayed_entry, view->nlines - 3,
+ s->last_displayed_entry, s->tree);
break;
case KEY_ENTER:
case '\r':
tog: tree view page up/down bugs