commit - f5215bb92ac7f34310ec43d9075c048566b64628
commit + 34bc9ec93390147cb97d9ac809424af222337ef4
blob - bc37cceed85d1e8e7c53e34fec163f26ce9d3160
blob + 91c6bf2af3d21401e8599b7140a0790904a1cc0b
--- tog/tog.c
+++ tog/tog.c
return view->begin_x > 0;
}
+/*
+ * Erase all content of the view. Can be used to "flash" the view because
+ * the view loop will redraw it quickly, providing a more subtle visual
+ * effect than curs_flash(3) would provide.
+ */
static void
+view_flash(struct tog_view *view)
+{
+ werase(view->window);
+ update_panels();
+ doupdate();
+}
+
+static void
tog_resizeterm(void)
{
int cols, lines;
}
static void
-scroll_up(struct commit_queue_entry **first_displayed_entry, int maxscroll,
+scroll_up(struct tog_view *view,
+ struct commit_queue_entry **first_displayed_entry, int maxscroll,
struct commit_queue *commits)
{
struct commit_queue_entry *entry;
int nscrolled = 0;
entry = TAILQ_FIRST(&commits->head);
- if (*first_displayed_entry == entry)
+ if (*first_displayed_entry == entry) {
+ view_flash(view);
return;
+ }
entry = *first_displayed_entry;
while (entry && nscrolled < maxscroll) {
}
static const struct got_error *
-scroll_down(struct commit_queue_entry **first_displayed_entry, int maxscroll,
+scroll_down(struct tog_view *view,
+ struct commit_queue_entry **first_displayed_entry, int maxscroll,
struct commit_queue_entry **last_displayed_entry,
struct commit_queue *commits, int *log_complete, int *commits_needed,
pthread_cond_t *need_commits)
do {
pentry = TAILQ_NEXT(*last_displayed_entry, entry);
- if (pentry == NULL)
+ if (pentry == NULL) {
+ if (*log_complete)
+ view_flash(view);
break;
+ }
*last_displayed_entry = pentry;
s->selected--;
if (s->selected > 0)
break;
- scroll_up(&s->first_displayed_entry, 1,
+ scroll_up(view, &s->first_displayed_entry, 1,
&s->commits);
break;
case KEY_PPAGE:
break;
if (TAILQ_FIRST(&s->commits.head) ==
s->first_displayed_entry) {
+ if (s->selected == 0) {
+ view_flash(view);
+ break;
+ }
s->selected = 0;
break;
}
- scroll_up(&s->first_displayed_entry,
+ scroll_up(view, &s->first_displayed_entry,
view->nlines, &s->commits);
break;
case 'j':
s->selected++;
break;
}
- err = scroll_down(&s->first_displayed_entry, 1,
+ err = scroll_down(view, &s->first_displayed_entry, 1,
&s->last_displayed_entry, &s->commits,
&s->thread_args.log_complete,
&s->thread_args.commits_needed,
first = s->first_displayed_entry;
if (first == NULL)
break;
- err = scroll_down(&s->first_displayed_entry,
+ err = scroll_down(view, &s->first_displayed_entry,
view->nlines, &s->last_displayed_entry,
&s->commits, &s->thread_args.log_complete,
&s->thread_args.commits_needed,
case KEY_UP:
if (s->first_displayed_line > 1)
s->first_displayed_line--;
+ else
+ view_flash(view);
break;
case KEY_PPAGE:
+ if (s->first_displayed_line == 1) {
+ view_flash(view);
+ break;
+ }
i = 0;
while (i++ < view->nlines - 1 &&
s->first_displayed_line > 1)
case KEY_DOWN:
if (!s->eof)
s->first_displayed_line++;
+ else
+ view_flash(view);
break;
case KEY_NPAGE:
case ' ':
+ if (s->eof) {
+ view_flash(view);
+ break;
+ }
i = 0;
while (!s->eof && i++ < view->nlines - 1) {
char *line;
else if (s->selected_line == 1 &&
s->first_displayed_line > 1)
s->first_displayed_line--;
+ else
+ view_flash(view);
break;
case KEY_PPAGE:
if (s->first_displayed_line == 1) {
+ if (s->selected_line == 1) {
+ view_flash(view);
+ break;
+ }
s->selected_line = 1;
break;
}
else if (s->last_displayed_line <
s->blame.nlines)
s->first_displayed_line++;
+ else
+ view_flash(view);
break;
case 'b':
case 'p': {
}
case KEY_NPAGE:
case ' ':
+ if (s->last_displayed_line >= s->blame.nlines &&
+ s->selected_line >= MIN(s->blame.nlines,
+ view->nlines - 2)) {
+ view_flash(view);
+ break;
+ }
if (s->last_displayed_line >= s->blame.nlines &&
s->selected_line < view->nlines - 2) {
s->selected_line = MIN(s->blame.nlines,
}
static void
-tree_scroll_up(struct got_tree_entry **first_displayed_entry, int maxscroll,
+tree_scroll_up(struct tog_view *view,
+ struct got_tree_entry **first_displayed_entry, int maxscroll,
const struct got_tree_entries *entries, int isroot)
{
struct got_tree_entry *te, *prev;
te = SIMPLEQ_FIRST(&entries->head);
if (*first_displayed_entry == te) {
+ view_flash(view);
if (!isroot)
*first_displayed_entry = NULL;
return;
break;
case 'k':
case KEY_UP:
+ if (s->selected == 0) {
+ view_flash(view);
+ break;
+ }
if (s->selected > 0) {
s->selected--;
if (s->selected == 0)
}
if (s->selected > 0)
break;
- tree_scroll_up(&s->first_displayed_entry, 1,
+ tree_scroll_up(view, &s->first_displayed_entry, 1,
s->entries, s->tree == s->root);
break;
case KEY_PPAGE:
- tree_scroll_up(&s->first_displayed_entry,
+ tree_scroll_up(view, &s->first_displayed_entry,
MAX(0, view->nlines - 4 - s->selected), s->entries,
s->tree == s->root);
s->selected = 0;
if (SIMPLEQ_NEXT(s->last_displayed_entry, entry)
== NULL) {
/* can't scroll any further */
+ view_flash(view);
break;
}
tree_scroll_down(&s->first_displayed_entry, 1,
/* can't scroll any further; move cursor down */
if (s->selected < s->ndisplayed - 1)
s->selected = s->ndisplayed - 1;
+ else
+ view_flash(view);
break;
}
nscrolled = tree_scroll_down(&s->first_displayed_entry,