"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
Re: tog: fix resize failure to populate log view commits
To:
Mark Jamsek <mark@jamsek.com>
Cc:
gameoftrees@openbsd.org
Date:
Mon, 18 Jul 2022 14:49:19 +0200

Download raw body.

Thread
On Mon, Jul 18, 2022 at 10:34:27PM +1000, Mark Jamsek wrote:
> If resizing a log view while on the _last_ loaded commit on the bottom
> edge of the screen, some of the new lines are not populated.
> 
> repro:
> $ tog  # 80x24
> 23j  # move down to the last commit
> *increase terminal height to ~30 lines then reduce back to 80x24*
> ~5j  # move down to the _last_ commit
> *increase terminal height to ~33 lines*
> 
> Most of the new lines are empty.
> 
> We call request_log_commits() from view_resize()--but only when the view
> has a child view. The fix simply moves this check, so that we always
> call request_log_commits() if the terminal height has been increased,
> irrespective of whether a child view exists.

I only have a concern about style consistency:

Could we add a resize function pointer to struct tog_view and call this
(if not NULL) instead of checking the view type and manipulating diff
view state in view_resize() directly?

The code would then move into a new resize_diff_view() function.

> diff /home/mark/src/git/got-current
> commit - d2587c5f95c6edb51ccc8d4abfac838b58f3a463
> path + /home/mark/src/git/got-current
> blob - 97ac0690a9232815bb10bc4a237246e2ec53e069
> file + tog/tog.c
> --- tog/tog.c
> +++ tog/tog.c
> @@ -875,24 +875,6 @@ view_resize(struct tog_view *view)
>  			show_panel(view->child->panel);
>  		}
>  		/*
> -		 * Request commits if terminal height was increased in a log
> -		 * view so we have enough commits loaded to populate the view.
> -		 */
> -		if (view->type == TOG_VIEW_LOG && dif > 0) {
> -			struct tog_log_view_state *ts = &view->state.log;
> -
> -			if (ts->commits.ncommits < ts->selected_entry->idx +
> -			    view->lines - ts->selected) {
> -				view->nscrolled = ts->selected_entry->idx +
> -				    view->lines - ts->selected -
> -				    ts->commits.ncommits + dif;
> -				err = request_log_commits(view);
> -				if (err)
> -					return err;
> -			}
> -		}
> -
> -		/*
>  		 * XXX This is ugly and needs to be moved into the above
>  		 * logic but "works" for now and my attempts at moving it
>  		 * break either 'tab' or 'F' key maps in horizontal splits.
> @@ -915,6 +897,24 @@ view_resize(struct tog_view *view)
>  	} else if (view->parent == NULL)
>  		ncols = COLS;
> 
> +	/*
> +	 * Request commits if terminal height was increased in a log
> +	 * view so we have enough commits loaded to populate the view.
> +	 */
> +	if (view->type == TOG_VIEW_LOG && dif > 0) {
> +		struct tog_log_view_state *ts = &view->state.log;
> +
> +		if (ts->commits.ncommits < ts->selected_entry->idx +
> +				view->lines - ts->selected) {
> +			view->nscrolled = ts->selected_entry->idx +
> +				view->lines - ts->selected -
> +				ts->commits.ncommits + dif + 1;
> +			err = request_log_commits(view);
> +			if (err)
> +				return err;
> +		}
> +	}
> +
>  	if (wresize(view->window, nlines, ncols) == ERR)
>  		return got_error_from_errno("wresize");
>  	if (replace_panel(view->panel, view->window) == ERR)
> 
> -- 
> Mark Jamsek <fnc.bsdbox.org>
> GPG: F2FF 13DE 6A06 C471 CA80  E6E2 2930 DC66 86EE CF68