Download raw body.
tog: refactor new view initialisation
On Sat, Jul 23, 2022 at 10:55:10PM +1000, Mark Jamsek wrote: > Done! Rebased and revised diff below. Nice, thanks. ok stsp@ > diff refs/heads/main refs/heads/refactor/view > commit - 65858f9a993c163be8f4af482e7b400535d61d17 > commit + f7f3c07965b57e9c57ddf6d2258e046367b65d1d > blob - 28101ce09b8c4dc44f69a65468af96ea5b319471 > blob + aaca1ae9bd59788b771d3797213ce44b033f50a8 > --- tog/tog.c > +++ tog/tog.c > @@ -439,6 +439,7 @@ struct tog_blame_view_state { > char *path; > struct got_repository *repo; > struct got_object_id *commit_id; > + struct got_object_id *id_to_log; > struct tog_blame blame; > int matched_line; > struct tog_colors colors; > @@ -1083,6 +1084,52 @@ view_set_child(struct tog_view *view, struct tog_view > return err; > } > > +static const struct got_error *view_dispatch_request(struct tog_view **, > + struct tog_view *, enum tog_view_type, int, int); > + > +static const struct got_error * > +view_request_new(struct tog_view **requested, struct tog_view *view, > + enum tog_view_type request) > +{ > + struct tog_view *new_view = NULL; > + const struct got_error *err; > + int y = 0, x = 0; > + > + *requested = NULL; > + > + if (view_is_parent_view(view)) > + view_get_split(view, &y, &x); > + > + err = view_dispatch_request(&new_view, view, request, y, x); > + if (err) > + return err; > + > + if (view_is_parent_view(view) && view->mode == TOG_VIEW_SPLIT_HRZN) { > + err = view_init_hsplit(view, y); > + if (err) > + return err; > + } > + > + view->focussed = 0; > + new_view->focussed = 1; > + new_view->mode = view->mode; > + new_view->nlines = view->lines - y; > + > + if (view_is_parent_view(view)) { > + view_transfer_size(new_view, view); > + err = view_close_child(view); > + if (err) > + return err; > + err = view_set_child(view, new_view); > + if (err) > + return err; > + view->focus_child = 1; > + } else > + *requested = new_view; > + > + return NULL; > +} > + > static void > tog_resizeterm(void) > { > @@ -3204,10 +3251,8 @@ input_log_view(struct tog_view **new_view, struct tog_ > { > const struct got_error *err = NULL; > struct tog_log_view_state *s = &view->state.log; > - struct tog_view *diff_view = NULL, *tree_view = NULL; > - struct tog_view *ref_view = NULL; > struct commit_queue_entry *entry; > - int begin_x = 0, begin_y = 0, eos, n, nscroll; > + int eos, n, nscroll; > > if (s->thread_args.load_all) { > if (ch == CTRL('g') || ch == KEY_BACKSPACE) > @@ -3329,73 +3374,13 @@ input_log_view(struct tog_view **new_view, struct tog_ > view->count = 0; > if (s->selected_entry == NULL) > break; > - > - /* get dimensions--don't split till initialisation succeeds */ > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - > - err = open_diff_view_for_commit(&diff_view, begin_y, begin_x, > - s->selected_entry->commit, s->selected_entry->id, > - view, s->repo); > - if (err) > - break; > - > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { /* safe to split */ > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - > - view->focussed = 0; > - diff_view->focussed = 1; > - diff_view->mode = view->mode; > - diff_view->nlines = view->lines - begin_y; > - > - if (view_is_parent_view(view)) { > - view_transfer_size(diff_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, diff_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = diff_view; > + err = view_request_new(new_view, view, TOG_VIEW_DIFF); > break; > case 'T': > view->count = 0; > if (s->selected_entry == NULL) > break; > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - err = browse_commit_tree(&tree_view, begin_y, begin_x, > - s->selected_entry, s->in_repo_path, s->head_ref_name, > - s->repo); > - if (err) > - break; > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - view->focussed = 0; > - tree_view->focussed = 1; > - tree_view->mode = view->mode; > - tree_view->nlines = view->lines - begin_y; > - if (view_is_parent_view(view)) { > - view_transfer_size(tree_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, tree_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = tree_view; > + err = view_request_new(new_view, view, TOG_VIEW_TREE); > break; > case KEY_BACKSPACE: > case CTRL('l'): > @@ -3464,37 +3449,7 @@ input_log_view(struct tog_view **new_view, struct tog_ > break; > case 'R': > view->count = 0; > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - ref_view = view_open(0, 0, begin_y, begin_x, TOG_VIEW_REF); > - if (ref_view == NULL) > - return got_error_from_errno("view_open"); > - err = open_ref_view(ref_view, s->repo); > - if (err) { > - view_close(ref_view); > - return err; > - } > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - view->focussed = 0; > - ref_view->focussed = 1; > - ref_view->mode = view->mode; > - ref_view->nlines = view->lines - begin_y; > - if (view_is_parent_view(view)) { > - view_transfer_size(ref_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, ref_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = ref_view; > + err = view_request_new(new_view, view, TOG_VIEW_REF); > break; > default: > view->count = 0; > @@ -5752,7 +5707,7 @@ static const struct got_error * > input_blame_view(struct tog_view **new_view, struct tog_view *view, int ch) > { > const struct got_error *err = NULL, *thread_err = NULL; > - struct tog_view *diff_view, *log_view; > + struct tog_view *diff_view; > struct tog_blame_view_state *s = &view->state.blame; > int eos, nscroll, begin_y = 0, begin_x = 0; > > @@ -5933,45 +5888,13 @@ input_blame_view(struct tog_view **new_view, struct to > break; > break; > } > - case 'L': { > - struct got_object_id *id = NULL; > - > + case 'L': > view->count = 0; > - id = get_selected_commit_id(s->blame.lines, s->blame.nlines, > - s->first_displayed_line, s->selected_line); > - if (id == NULL) > - break; > - > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - err = log_annotated_line(&log_view, begin_y, begin_x, > - s->repo, id); > - if (err) > - break; > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - > - view->focussed = 0; > - log_view->focussed = 1; > - log_view->mode = view->mode; > - log_view->nlines = view->lines - begin_y; > - if (view_is_parent_view(view)) { > - view_transfer_size(log_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, log_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = log_view; > + s->id_to_log = get_selected_commit_id(s->blame.lines, > + s->blame.nlines, s->first_displayed_line, s->selected_line); > + if (s->id_to_log) > + err = view_request_new(new_view, view, TOG_VIEW_LOG); > break; > - } > case KEY_ENTER: > case '\r': { > struct got_object_id *id = NULL; > @@ -6782,9 +6705,8 @@ 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; > struct got_tree_entry *te; > - int begin_y = 0, begin_x = 0, n, nscroll = view->nlines - 3; > + int n, nscroll = view->nlines - 3; > > switch (ch) { > case 'i': > @@ -6795,64 +6717,11 @@ input_tree_view(struct tog_view **new_view, struct tog > view->count = 0; > if (!s->selected_entry) > break; > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - err = log_selected_tree_entry(&log_view, begin_y, begin_x, s); > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - view->focussed = 0; > - log_view->focussed = 1; > - log_view->mode = view->mode; > - log_view->nlines = view->lines - begin_y; > - if (view_is_parent_view(view)) { > - view_transfer_size(log_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, log_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = log_view; > + err = view_request_new(new_view, view, TOG_VIEW_LOG); > break; > case 'R': > view->count = 0; > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - ref_view = view_open(0, 0, begin_y, begin_x, TOG_VIEW_REF); > - if (ref_view == NULL) > - return got_error_from_errno("view_open"); > - err = open_ref_view(ref_view, s->repo); > - if (err) { > - view_close(ref_view); > - return err; > - } > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - view->focussed = 0; > - ref_view->focussed = 1; > - ref_view->mode = view->mode; > - ref_view->nlines = view->lines - begin_y; > - if (view_is_parent_view(view)) { > - view_transfer_size(ref_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, ref_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = ref_view; > + err = view_request_new(new_view, view, TOG_VIEW_REF); > break; > case 'g': > case KEY_HOME: > @@ -6996,44 +6865,8 @@ input_tree_view(struct tog_view **new_view, struct tog > got_object_tree_close(subtree); > break; > } > - } else if (S_ISREG(got_tree_entry_get_mode( > - s->selected_entry))) { > - struct tog_view *blame_view; > - int begin_x = 0, begin_y = 0; > - > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - > - err = blame_tree_entry(&blame_view, begin_y, begin_x, > - s->selected_entry, &s->parents, > - s->commit_id, s->repo); > - if (err) > - break; > - > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - > - view->count = 0; > - view->focussed = 0; > - blame_view->focussed = 1; > - blame_view->mode = view->mode; > - blame_view->nlines = view->lines - begin_y; > - if (view_is_parent_view(view)) { > - view_transfer_size(blame_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, blame_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = blame_view; > - } > + } else if (S_ISREG(got_tree_entry_get_mode(s->selected_entry))) > + err = view_request_new(new_view, view, TOG_VIEW_BLAME); > break; > case KEY_RESIZE: > if (view->nlines >= 4 && s->selected >= view->nlines - 3) > @@ -7723,9 +7556,8 @@ input_ref_view(struct tog_view **new_view, struct tog_ > { > const struct got_error *err = NULL; > struct tog_ref_view_state *s = &view->state.ref; > - struct tog_view *log_view, *tree_view; > struct tog_reflist_entry *re; > - int begin_y = 0, begin_x = 0, n, nscroll = view->nlines - 1; > + int n, nscroll = view->nlines - 1; > > switch (ch) { > case 'i': > @@ -7757,68 +7589,13 @@ input_ref_view(struct tog_view **new_view, struct tog_ > view->count = 0; > if (!s->selected_entry) > break; > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - > - err = log_ref_entry(&log_view, begin_y, begin_x, > - s->selected_entry, s->repo); > - if (err) > - break; > - > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - > - view->focussed = 0; > - log_view->focussed = 1; > - log_view->mode = view->mode; > - log_view->nlines = view->lines - begin_y; > - if (view_is_parent_view(view)) { > - view_transfer_size(log_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, log_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = log_view; > + err = view_request_new(new_view, view, TOG_VIEW_LOG); > break; > case 'T': > view->count = 0; > if (!s->selected_entry) > break; > - if (view_is_parent_view(view)) > - view_get_split(view, &begin_y, &begin_x); > - err = browse_ref_tree(&tree_view, begin_y, begin_x, > - s->selected_entry, s->repo); > - if (err || tree_view == NULL) > - break; > - if (view_is_parent_view(view) && > - view->mode == TOG_VIEW_SPLIT_HRZN) { > - err = view_init_hsplit(view, begin_y); > - if (err) > - break; > - } > - view->focussed = 0; > - tree_view->focussed = 1; > - tree_view->mode = view->mode; > - tree_view->nlines = view->lines - begin_y; > - if (view_is_parent_view(view)) { > - view_transfer_size(tree_view, view); > - err = view_close_child(view); > - if (err) > - return err; > - err = view_set_child(view, tree_view); > - if (err) > - return err; > - view->focus_child = 1; > - } else > - *new_view = tree_view; > + err = view_request_new(new_view, view, TOG_VIEW_TREE); > break; > case 'g': > case KEY_HOME: > @@ -8034,6 +7811,88 @@ done: > return error; > } > > +static const struct got_error * > +view_dispatch_request(struct tog_view **new_view, struct tog_view *view, > + enum tog_view_type request, int y, int x) > +{ > + const struct got_error *err = NULL; > + > + *new_view = NULL; > + > + switch (request) { > + case TOG_VIEW_DIFF: > + if (view->type == TOG_VIEW_LOG) { > + struct tog_log_view_state *s = &view->state.log; > + > + err = open_diff_view_for_commit(new_view, y, x, > + s->selected_entry->commit, s->selected_entry->id, > + view, s->repo); > + } else > + return got_error_msg(GOT_ERR_NOT_IMPL, > + "parent/child view pair not supported"); > + break; > + case TOG_VIEW_BLAME: > + if (view->type == TOG_VIEW_TREE) { > + struct tog_tree_view_state *s = &view->state.tree; > + > + err = blame_tree_entry(new_view, y, x, > + s->selected_entry, &s->parents, s->commit_id, > + s->repo); > + } else > + return got_error_msg(GOT_ERR_NOT_IMPL, > + "parent/child view pair not supported"); > + break; > + case TOG_VIEW_LOG: > + if (view->type == TOG_VIEW_BLAME) > + err = log_annotated_line(new_view, y, x, > + view->state.blame.repo, view->state.blame.id_to_log); > + else if (view->type == TOG_VIEW_TREE) > + err = log_selected_tree_entry(new_view, y, x, > + &view->state.tree); > + else if (view->type == TOG_VIEW_REF) > + err = log_ref_entry(new_view, y, x, > + view->state.ref.selected_entry, > + view->state.ref.repo); > + else > + return got_error_msg(GOT_ERR_NOT_IMPL, > + "parent/child view pair not supported"); > + break; > + case TOG_VIEW_TREE: > + if (view->type == TOG_VIEW_LOG) > + err = browse_commit_tree(new_view, y, x, > + view->state.log.selected_entry, > + view->state.log.in_repo_path, > + view->state.log.head_ref_name, > + view->state.log.repo); > + else if (view->type == TOG_VIEW_REF) > + err = browse_ref_tree(new_view, y, x, > + view->state.ref.selected_entry, > + view->state.ref.repo); > + else > + return got_error_msg(GOT_ERR_NOT_IMPL, > + "parent/child view pair not supported"); > + break; > + case TOG_VIEW_REF: > + *new_view = view_open(0, 0, y, x, TOG_VIEW_REF); > + if (*new_view == NULL) > + return got_error_from_errno("view_open"); > + if (view->type == TOG_VIEW_LOG) > + err = open_ref_view(*new_view, view->state.log.repo); > + else if (view->type == TOG_VIEW_TREE) > + err = open_ref_view(*new_view, view->state.tree.repo); > + else > + err = got_error_msg(GOT_ERR_NOT_IMPL, > + "parent/child view pair not supported"); > + if (err) > + view_close(*new_view); > + break; > + default: > + return got_error_msg(GOT_ERR_NOT_IMPL, "invalid view"); > + } > + > + return err; > +} > + > /* > * If view was scrolled down to move the selected line into view when opening a > * horizontal split, scroll back up when closing the split/toggling fullscreen. > > -- > Mark Jamsek <fnc.bsdbox.org> > GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
tog: refactor new view initialisation