]> git.neil.brown.name Git - wiggle.git/commitdiff
Browse: avoid display problems when changing view-mode.
authorNeil Brown <neilb@suse.de>
Fri, 11 May 2012 03:36:37 +0000 (13:36 +1000)
committerNeil Brown <neilb@suse.de>
Fri, 11 May 2012 03:36:37 +0000 (13:36 +1000)
If we change mode so that the current end-of-line is no longer
visible, the display gets confused and add extra lines.  So when mode
changes, move backward then forward to ensure we are on a visibile
line.

Signed-off-by: NeilBrown <neilb@suse.de>
vpatch.c

index a3ce40497d02a9aaf749bb88a5d965206a2a926a..2a995ed4325a8995a328d4e0c1159886a683ff2b 100644 (file)
--- a/vpatch.c
+++ b/vpatch.c
@@ -1287,7 +1287,7 @@ static void merge_window(struct plist *p, FILE *f, int reverse)
        memset(&curs, 0, sizeof(curs));
        vpos = pos;
        while (1) {
-               if (refresh == 2) {
+               if (refresh >= 2) {
                        char buf[100];
                        clear();
                        snprintf(buf, 100, "File: %s%s Mode: %s\n",
@@ -1781,38 +1781,38 @@ static void merge_window(struct plist *p, FILE *f, int reverse)
                case 'a': /* 'after' view in patch window */
                        mode = AFTER; modename = "after"; modehelp = after_help;
                        mmode = mode; curs.alt = 0;
-                       refresh = 2;
+                       refresh = 3;
                        break;
                case 'b': /* 'before' view in patch window */
                        mode = BEFORE; modename = "before"; modehelp = before_help;
                        mmode = mode; curs.alt = 0;
-                       refresh = 2;
+                       refresh = 3;
                        break;
                case 'o': /* 'original' view in the merge window */
                        mode = ORIG; modename = "original"; modehelp = orig_help;
                        mmode = mode; curs.alt = 0;
-                       refresh = 2;
+                       refresh = 3;
                        break;
                case 'r': /* the 'result' view in the merge window */
                        mode = RESULT; modename = "result"; modehelp = result_help;
                        mmode = mode; curs.alt = 0;
-                       refresh = 2;
+                       refresh = 3;
                        break;
                case 'd':
                        mode = BEFORE|AFTER; modename = "diff"; modehelp = diff_help;
                        mmode = mode; curs.alt = 0;
-                       refresh = 2;
+                       refresh = 3;
                        break;
                case 'm':
                        mode = ORIG|RESULT; modename = "merge"; modehelp = merge_help;
                        mmode = mode; curs.alt = 0;
-                       refresh = 2;
+                       refresh = 3;
                        break;
 
                case '|':
                        mode = ORIG|RESULT|BEFORE|AFTER; modename = "sidebyside"; modehelp = sidebyside_help;
                        mmode = mode; curs.alt = 0;
-                       refresh = 2;
+                       refresh = 3;
                        break;
 
                case 'H': /* scroll window to the right */
@@ -1871,6 +1871,19 @@ static void merge_window(struct plist *p, FILE *f, int reverse)
                                free(a);
                        }
                }
+               if (refresh == 3) {
+                       /* move backward and forward to make sure we
+                        * are on a visible line
+                        */
+                       tpos = pos;
+                       prev_mline(&tpos, fm, fb, fa, ci.merger, mmode);
+                       if (tpos.p.m >= 0)
+                               pos = tpos;
+                       tpos = pos;
+                       next_mline(&tpos, fm, fb, fa, ci.merger, mmode);
+                       if (ci.merger[tpos.p.m].type != End)
+                               pos = tpos;
+               }
        }
 }