Download raw body.
tog: vsplit view restored after resize of fullscreen mode
On 23-04-21 11:00AM, Stefan Sperling wrote:
> On Fri, Apr 21, 2023 at 01:26:14PM +1000, Mark Jamsek wrote:
> > On 23-04-20 09:01PM, Mikhail wrote:
> > > Make xterm big enough to be able to show vertical split and do the
> > > following in a repo:
> > >
> > > <enter> (show any commit in vsplit)
> > > F
> > > <resize xterm>
> > >
> > > vsplit view is restored.
> > >
> > > Is it expected?
> >
> > It's arguably surprising behaviour but, yes, this is how tog has always
> > behaved--at least as far back as 0.60--so is expected in that sense.
> >
> > I'm not sure if it should be changed as this sort of comports with the
> > docs (emphasis added):
> >
> > F Toggle fullscreen mode for a split-screen view. **tog will
> > automatically use vertical split-screen views if the size of the
> > terminal window is sufficiently large.**
> >
> > And this is convenient sometimes. For example, when tog is started in
> > a small 80x24 term which is then increased and if viewing a diff, it
> > auto-splits with the log view. This is handy imo.
> >
> > That said, we could keep that aspect, but when the user explicitly
> > requests fullscreen mode with F, not split when resized.
>
> I would be fine with F overriding this. Pressing F again would then
> return to automatic mode, either fullscreen or split view depending
> on the current terminal size. Would that work?
> The docs could be of course be updated to say something more specific
> like "Force fullscreen mode. By default, tog will automatically use
> split-screen views if ..."
Yes, this should be quite straight forward; just record when F is
toggled and only redraw fullscreen when we get a SIGWINCH. Please let me
know if the below diff produces the behaviour you describe and if so
I'll continue with it and update the docs too.
diffstat /home/mark/src/got
M tog/tog.c | 26+ 5-
1 file changed, 26 insertions(+), 5 deletions(-)
diff /home/mark/src/got
commit - 9cbac887301ab85a09a6e123f9963b76f60514e1
path + /home/mark/src/got
blob - a411c9ed187b845c6ae5b24e656b8f43e9515a72
file + tog/tog.c
--- tog/tog.c
+++ tog/tog.c
@@ -655,6 +655,7 @@ struct tog_view {
int gline, hiline; /* navigate to and highlight this nG line */
int ch, count; /* current keymap and count prefix */
int resized; /* set when in a resize event */
+ int fullscreen; /* set when 'F'ullscreen is toggled */
int focussed; /* Only set on one parent or child view at a time. */
int dying;
struct tog_view *parent;
@@ -1746,13 +1747,24 @@ view_input(struct tog_view **new, int *done, struct to
tog_sigwinch_received = 0;
tog_sigcont_received = 0;
TAILQ_FOREACH(v, views, entry) {
- err = view_resize(v);
- if (err)
- return err;
+ if (!v->fullscreen) {
+ err = view_resize(v);
+ if (err)
+ return err;
+ }
err = v->input(new, v, KEY_RESIZE);
if (err)
return err;
- if (v->child) {
+ if (v->child && v->child->fullscreen) {
+ err = view_fullscreen(v->child);
+ if (err)
+ return err;
+ if (v->fullscreen) {
+ err = view_fullscreen(v);
+ if (err)
+ return err;
+ }
+ } else if (v->child) {
err = view_resize(v->child);
if (err)
return err;
@@ -1760,7 +1772,8 @@ view_input(struct tog_view **new, int *done, struct to
KEY_RESIZE);
if (err)
return err;
- if (v->child->resized_x || v->child->resized_y) {
+ if (v->child->resized_x ||
+ v->child->resized_y) {
err = view_resize_split(v, 0);
if (err)
return err;
@@ -1826,8 +1839,12 @@ view_input(struct tog_view **new, int *done, struct to
if (view_is_splitscreen(view->child)) {
view->focussed = 0;
view->child->focussed = 1;
+ view->fullscreen = 1;
+ view->child->fullscreen = 1;
err = view_fullscreen(view->child);
} else {
+ view->fullscreen = 0;
+ view->child->fullscreen = 0;
err = view_splitscreen(view->child);
if (!err)
err = view_resize_split(view, 0);
@@ -1840,8 +1857,12 @@ view_input(struct tog_view **new, int *done, struct to
if (view_is_splitscreen(view)) {
view->parent->focussed = 0;
view->focussed = 1;
+ view->fullscreen = 1;
+ view->parent->fullscreen = 1;
err = view_fullscreen(view);
} else {
+ view->fullscreen = 0;
+ view->parent->fullscreen = 0;
err = view_splitscreen(view);
if (!err && view->mode != TOG_VIEW_SPLIT_HRZN)
err = view_resize(view->parent);
--
Mark Jamsek <fnc.bsdbox.org|got.bsdbox.org>
GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
tog: vsplit view restored after resize of fullscreen mode