From 1c82ab582e08a97cb80727fb97109baa8a31286f Mon Sep 17 00:00:00 2001 From: QDoussot Date: Mon, 1 Jul 2024 13:20:12 +0200 Subject: [PATCH 1/7] Enable to keep split configuration between views --- include/tig/display.h | 12 ++++++++++++ src/display.c | 13 +++++++++++++ src/tig.c | 19 +++++++++++++++++++ src/view.c | 19 +++++++++++++++++-- 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/include/tig/display.h b/include/tig/display.h index 68d23acc0..c621e692b 100644 --- a/include/tig/display.h +++ b/include/tig/display.h @@ -43,6 +43,18 @@ extern unsigned int current_view; #define view_is_displayed(view) \ (view == display[0] || view == display[1]) +// Save the succession of the array of active views +struct display_lineage; +struct display_lineage { + struct view *display[2]; + unsigned int current_view; + + struct display_lineage *prev; +}; +extern struct display_lineage *display_lineage; + +void free_display_lineage(); + void init_tty(void); void init_display(void); void resize_display(void); diff --git a/src/display.c b/src/display.c index c0322a501..f945183d7 100644 --- a/src/display.c +++ b/src/display.c @@ -32,6 +32,8 @@ static void set_terminal_modes(void); struct view *display[2]; unsigned int current_view; +struct display_lineage *display_lineage = NULL; + static WINDOW *display_win[2]; static WINDOW *display_title[2]; static WINDOW *display_sep; @@ -900,4 +902,15 @@ enable_mouse(bool enable) #endif } +void +free_display_lineage() +{ + struct display_lineage *lineage = display_lineage; + while(lineage != NULL) { + struct display_lineage *prev = lineage->prev; + free(lineage); + lineage = prev; + } +} + /* vim: set ts=8 sw=8 noexpandtab: */ diff --git a/src/tig.c b/src/tig.c index 1b1f4cc4d..5391aeff5 100644 --- a/src/tig.c +++ b/src/tig.c @@ -329,6 +329,24 @@ view_driver(struct view *view, enum request request) view->prev = view; break; } + // If we try to quit the first view of the display lineage + // and there is a previous views configuration, + // restore this last + else if(view->prev && view->prev == view) { + if(display_lineage) { + foreach_view(view, i) + end_update(view, true); + struct display_lineage * dl = display_lineage; + load_view(dl->display[0], dl->display[0], OPEN_DEFAULT | OPEN_RELOAD); + if (dl->current_view == 1) { + load_view(dl->display[1], dl->display[0], OPEN_SPLIT); + } + free(display_lineage); + display_lineage = display_lineage->prev; + break; + } + + } if (request == REQ_VIEW_CLOSE_NO_QUIT) { report("Can't close last remaining view"); break; @@ -337,6 +355,7 @@ view_driver(struct view *view, enum request request) case REQ_QUIT: foreach_view(view, i) end_update(view, true); + free_display_lineage(); return false; default: diff --git a/src/view.c b/src/view.c index 3944e5f3e..7660546ed 100644 --- a/src/view.c +++ b/src/view.c @@ -800,9 +800,24 @@ load_view(struct view *view, struct view *prev, enum open_flags flags) { bool refresh = !view_no_refresh(view, flags); - /* When prev == view it means this is the first loaded view. */ if (prev && view != prev) { - view->prev = prev; + bool split = !!(flags & OPEN_SPLIT); + if (split) { + view->prev = prev; + } else { + // A new maximized view is up to be opened, + // so let's create a new lineage element + struct display_lineage *prev_dl = display_lineage; + + display_lineage = malloc(sizeof(struct display_lineage)); + display_lineage->prev = prev_dl; + display_lineage->display[0] = display[0]; + display_lineage->display[1] = display[1]; + display_lineage->current_view = current_view; + //Mimic that we are on the first view of the lineage element + view->prev = view; + + } } if (!refresh && view_can_refresh(view) && From 55c6f23a135ac27931633de4ac8b69adef9f911a Mon Sep 17 00:00:00 2001 From: QDoussot Date: Mon, 1 Jul 2024 15:32:29 +0200 Subject: [PATCH 2/7] Keep the line type for potential previously opened stage view Necessary now that this flow is possible: Main -> Staged changes -> Help -> Main -> Untracked Changes -> Untracked files -> Stage view To avoid having a message about 'No stage content...' --- src/stage.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/stage.c b/src/stage.c index f82aeec0e..65afd26c7 100644 --- a/src/stage.c +++ b/src/stage.c @@ -670,7 +670,6 @@ stage_request(struct view *view, enum request request, struct line *line) case REQ_VIEW_CLOSE: case REQ_VIEW_CLOSE_NO_QUIT: - stage_line_type = 0; return request; case REQ_ENTER: From 8a8aa385ecb14fcdd502e8285d03257e8e780fb4 Mon Sep 17 00:00:00 2001 From: QDoussot Date: Mon, 1 Jul 2024 16:44:36 +0200 Subject: [PATCH 3/7] Test that split view is preserved when coming back from maximized screen --- test/main/keep-split-view-test | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100755 test/main/keep-split-view-test diff --git a/test/main/keep-split-view-test b/test/main/keep-split-view-test new file mode 100755 index 000000000..9ec5bb5c1 --- /dev/null +++ b/test/main/keep-split-view-test @@ -0,0 +1,27 @@ + +#!/bin/sh +# +# Test display and options specific to the main view. + +. libtest.sh +. libgit.sh + +export LINES=16 + +tigrc < + :save-display main-and-diff.screen + :view-help + :view-close + :save-display main-and-diff-back.screen +' + +git_clone 'repo-one' + +test_tig + +assert_equals 'main-and-diff.screen' < main-and-diff-back.screen From d715eb7c05bbd5c1cf0014e16058415919e2e4d0 Mon Sep 17 00:00:00 2001 From: QDoussot Date: Sun, 13 Oct 2024 00:08:06 +0200 Subject: [PATCH 4/7] Fix premature call to free --- src/tig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tig.c b/src/tig.c index 5391aeff5..448c9f31f 100644 --- a/src/tig.c +++ b/src/tig.c @@ -341,8 +341,8 @@ view_driver(struct view *view, enum request request) if (dl->current_view == 1) { load_view(dl->display[1], dl->display[0], OPEN_SPLIT); } - free(display_lineage); display_lineage = display_lineage->prev; + free(dl); break; } From ab3a9d4c61f94a93d2ab8029219e5a4027ab77c3 Mon Sep 17 00:00:00 2001 From: QDoussot Date: Sun, 13 Oct 2024 00:00:21 +0200 Subject: [PATCH 5/7] Fix broken maximized stage view behavior when last change is staged --- src/stage.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/stage.c b/src/stage.c index 65afd26c7..f4e1904c6 100644 --- a/src/stage.c +++ b/src/stage.c @@ -802,10 +802,13 @@ stage_read(struct view *view, struct buffer *buf, bool force_stop) } /* After git apply, git diff-files can sometimes return an empty line. */ - if (view->lines <= 1 && !force_stop && view->prev) { + if (view->lines <= 1 && !force_stop && display_lineage) { watch_apply(&view->watch, WATCH_INDEX); stage_line_type = 0; - maximize_view(view->prev, false); + maximize_view(display_lineage->display[0], false); + struct display_lineage * exiting_dl = display_lineage; + display_lineage = display_lineage->prev; + free(exiting_dl); return false; } From 00c6bc6d3e20769516c2f08dd4b413dc4a9929a8 Mon Sep 17 00:00:00 2001 From: QDoussot Date: Sun, 13 Oct 2024 00:06:03 +0200 Subject: [PATCH 6/7] Test exit of maximized stage view when every change has been staged --- test/stage/maximized-unstaged-changes-test | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/stage/maximized-unstaged-changes-test b/test/stage/maximized-unstaged-changes-test index bf571111d..a3fee8995 100755 --- a/test/stage/maximized-unstaged-changes-test +++ b/test/stage/maximized-unstaged-changes-test @@ -18,6 +18,8 @@ steps ' :save-display split.screen :view-diff :save-display maximized.screen + :status-update + :save-display closed.screen ' tigrc <' to jump to file diff - line 1 of 107 9% EOF + +assert_equals 'closed.screen' < Date: Sun, 13 Oct 2024 00:11:52 +0200 Subject: [PATCH 7/7] Define a function to go back in display lineage --- include/tig/display.h | 1 + src/display.c | 5 +++++ src/stage.c | 4 +--- src/tig.c | 3 +-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/tig/display.h b/include/tig/display.h index c621e692b..95f4c4829 100644 --- a/include/tig/display.h +++ b/include/tig/display.h @@ -53,6 +53,7 @@ struct display_lineage { }; extern struct display_lineage *display_lineage; +void rewind_lineage(); void free_display_lineage(); void init_tty(void); diff --git a/src/display.c b/src/display.c index f945183d7..80b2cb0fc 100644 --- a/src/display.c +++ b/src/display.c @@ -902,6 +902,11 @@ enable_mouse(bool enable) #endif } +void rewind_lineage() { + struct display_lineage *exited = display_lineage; + display_lineage = display_lineage->prev; + free(exited); +} void free_display_lineage() { diff --git a/src/stage.c b/src/stage.c index f4e1904c6..92220cc6a 100644 --- a/src/stage.c +++ b/src/stage.c @@ -806,9 +806,7 @@ stage_read(struct view *view, struct buffer *buf, bool force_stop) watch_apply(&view->watch, WATCH_INDEX); stage_line_type = 0; maximize_view(display_lineage->display[0], false); - struct display_lineage * exiting_dl = display_lineage; - display_lineage = display_lineage->prev; - free(exiting_dl); + rewind_lineage(); return false; } diff --git a/src/tig.c b/src/tig.c index 448c9f31f..24ce8cf76 100644 --- a/src/tig.c +++ b/src/tig.c @@ -341,8 +341,7 @@ view_driver(struct view *view, enum request request) if (dl->current_view == 1) { load_view(dl->display[1], dl->display[0], OPEN_SPLIT); } - display_lineage = display_lineage->prev; - free(dl); + rewind_lineage(); break; }