Download raw body.
tog: tree view page up/down bugs
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? :) diff 27752ab45618d08c710a021bc20bc697e9b84e52 f12247906244fdb249a1f32b1f9e7ab6c295f32c blob - 7a8da014ea57dd3e28bf67cd12619ae6389b3918 blob + 068f96afe9fec778506b0bdf6cc1d1ca92f1be9a --- 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; - int begin_x = 0, nscrolled; + int begin_x = 0; switch (ch) { case 'i': @@ -5390,23 +5384,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: @@ -5430,18 +5424,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