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

From:
Mikhail <mp39590@gmail.com>
Subject:
Re: tog: status bar prompt about togglable events
To:
gameoftrees@openbsd.org
Date:
Fri, 20 Jan 2023 21:25:16 +0300

Download raw body.

Thread
On Fri, Jan 20, 2023 at 09:09:07PM +0300, Mikhail wrote:
> Inlined patch adds short timed prompts to status bar about things like
> switching between diff algorithms, showing white spaces in patches,
> toggling bin/ascii views for blobs, changing committer and author
> representations, and switch between date/name sorting for ref view.
> 
> Originally I wanted it because I needed to see current diff algorithm,
> but decided to expand the patch to show all togglable events, except for
> ref view, where, for example, showing IDs speaks for itself by changing
> the look of the table and doesn't require a prompt.

Next version, previous one contained excessive NULL'ing of prompt in
draw_blame():

diff /home/misha/work/got
commit - 7713cc5e4f5544e81909670d592e89526ed86c9b
path + /home/misha/work/got
blob - 35282ce50aa4dec0745aa6402cd0b50d87b7416b
file + tog/tog.c
--- tog/tog.c
+++ tog/tog.c
@@ -690,6 +690,7 @@ struct tog_view {
 #define TOG_SEARCH_HAVE_NONE	3
 	regex_t regex;
 	regmatch_t regmatch;
+	const char *prompt;
 };
 
 static const struct got_error *open_diff_view(struct tog_view *,
@@ -1476,6 +1477,16 @@ view_input(struct tog_view **new, int *done, struct to
 		view->count = 0;
 	}
 
+	/*
+	 * Clear statusbar prompt, for blame view clear it only when
+	 * annotating is completed, otherwise it's too fast.
+	 */
+	if (view->type == TOG_VIEW_BLAME) {
+		if (view->state.blame.blame_complete)
+			view->prompt = NULL;
+	} else
+		view->prompt = NULL;
+
 	if (view->searching && !view->search_next_done) {
 		errcode = pthread_mutex_unlock(&tog_mutex);
 		if (errcode)
@@ -1668,10 +1679,13 @@ view_input(struct tog_view **new, int *done, struct to
 			err = view->input(new, view, ch);
 		break;
 	case 'A':
-		if (tog_diff_algo == GOT_DIFF_ALGORITHM_MYERS)
+		if (tog_diff_algo == GOT_DIFF_ALGORITHM_MYERS) {
 			tog_diff_algo = GOT_DIFF_ALGORITHM_PATIENCE;
-		else
+			view->prompt = "Patience algorithm";
+		} else {
 			tog_diff_algo = GOT_DIFF_ALGORITHM_MYERS;
+			view->prompt = "Myers algorithm";
+		}
 		TAILQ_FOREACH(v, views, entry) {
 			if (v->reset) {
 				err = v->reset(v);
@@ -2489,10 +2503,11 @@ draw_commits(struct tog_view *view)
 		if (s->limit_view && s->commits->ncommits == 0)
 			limit_str = "no matches found";
 
-		if (asprintf(&ncommits_str, " [%d/%d] %s %s",
+		if (asprintf(&ncommits_str, " [%d/%d] %s %s %s",
 		    entry ? entry->idx + 1 : 0, s->commits->ncommits,
 		    search_str ? search_str : (refs_str ? refs_str : ""),
-		    limit_str ? limit_str : "") == -1) {
+		    (limit_str ? limit_str : ""),
+		    (view->prompt ? view->prompt : "")) == -1) {
 			err = got_error_from_errno("asprintf");
 			goto done;
 		}
@@ -3718,6 +3733,7 @@ input_log_view(struct tog_view **new_view, struct tog_
 		break;
 	case '@':
 		s->use_committer = !s->use_committer;
+		view->prompt = (s->use_committer ? "Committer" : "Author");
 		break;
 	case 'G':
 	case '*':
@@ -5130,7 +5146,8 @@ show_diff_view(struct tog_view *view)
 		return err;
 	label2 = s->label2 ? s->label2 : id_str2;
 
-	if (asprintf(&header, "diff %s %s", label1, label2) == -1) {
+	if (asprintf(&header, "diff %s %s %s", label1, label2,
+	    (view->prompt ? view->prompt : "")) == -1) {
 		err = got_error_from_errno("asprintf");
 		free(id_str1);
 		free(id_str2);
@@ -5261,10 +5278,17 @@ input_diff_view(struct tog_view **new_view, struct tog
 		break;
 	case 'a':
 	case 'w':
-		if (ch == 'a')
+		if (ch == 'a') {
 			s->force_text_diff = !s->force_text_diff;
-		else if (ch == 'w')
+			view->prompt =
+			    (s->force_text_diff ? "Text diff" : "Bin diff");
+		}
+		else if (ch == 'w') {
 			s->ignore_whitespace = !s->ignore_whitespace;
+			view->prompt =
+			    (s->ignore_whitespace ?
+			    "Ignore whitespaces" : "Show whitespaces");
+		}
 		err = reset_diff_view(view);
 		break;
 	case 'g':
@@ -5621,7 +5645,8 @@ draw_blame(struct tog_view *view)
 	rewind(blame->f);
 	werase(view->window);
 
-	if (asprintf(&line, "commit %s", id_str) == -1) {
+	if (asprintf(&line, "commit %s %s", id_str,
+	    (view->prompt ? view->prompt : "")) == -1) {
 		err = got_error_from_errno("asprintf");
 		free(id_str);
 		return err;
@@ -8006,8 +8031,8 @@ show_ref_view(struct tog_view *view)
 
 	re = s->first_displayed_entry;
 
-	if (asprintf(&line, "references [%d/%d]", re->idx + s->selected + 1,
-	    s->nrefs) == -1)
+	if (asprintf(&line, "references [%d/%d] %s", re->idx + s->selected + 1,
+	    s->nrefs, (view->prompt ? view->prompt : "")) == -1)
 		return got_error_from_errno("asprintf");
 
 	err = format_line(&wline, &width, NULL, line, 0, view->ncols, 0, 0);
@@ -8233,6 +8258,8 @@ input_ref_view(struct tog_view **new_view, struct tog_
 		break;
 	case 'o':
 		s->sort_by_date = !s->sort_by_date;
+		view->prompt =
+		    (s->sort_by_date ? "Sort by date" : "Sort by name");
 		view->count = 0;
 		err = got_reflist_sort(&tog_refs, s->sort_by_date ?
 		    got_ref_cmp_by_commit_timestamp_descending :