int target; /* display column - or -1 if we are looking for 'pos' */
int col; /* where we found pos or target */
int width; /* Size of char, for moving to the right */
+ int alt; /* Cursor is in alternate window */
};
/* used for checking location during search */
mvaddch(row, lcols, '|');
draw_mside(mode&~(BEFORE|AFTER), row, 0, start, lcols,
- fm, fb, fa, m, pos, curs);
+ fm, fb, fa, m, pos, curs && !curs->alt ? curs : NULL);
draw_mside(mode&~(ORIG|RESULT), row, lcols+1, start, rcols,
- fm, fb, fa, m, pos, NULL);
+ fm, fb, fa, m, pos, curs && curs->alt ? curs : NULL);
} else
draw_mside(mode, row, 0, start, cols,
fm, fb, fa, m, pos, curs);
" ESC-v page up",
" N go to next patch chunk",
" P go to previous patch chunk",
+ " O move cursor to alternate pane",
" ^ control-A go to start of line",
" $ control-E go to end of line",
"",
int lastrow = 0; /* end of screen, or just above 'splitrow' */
int i, c, cswitch;
int mode = ORIG|RESULT;
+ int mmode = mode; /* Mode for moving - used when in 'other' pane */
char *modename = "merge";
char **modehelp = merge_help;
pos.p.lineno = 1;
pos.state = 0;
next_mline(&pos, fm, fb, fa, ci.merger, mode);
+ memset(&curs, 0, sizeof(curs));
vpos = pos;
while (1) {
if (refresh == 2) {
}
if (row < 1 || row >= lastrow)
refresh = 1;
+ if (curs.alt)
+ refresh = 1;
if (mode == (ORIG|RESULT)) {
int cmode = check_line(pos, fm, fb, fa, ci.merger, mode);
lastrow = splitrow - 1;
refresh = 1;
}
- if (splitrow >= 0 && !(cmode & CHANGES)) {
+ if (!curs.alt && splitrow >= 0 && !(cmode & CHANGES)) {
splitrow = -1;
lastrow = rows-1;
refresh = 1;
start = 0;
retry:
draw_mline(mode, row, start, cols, fm, fb, fa, ci.merger,
- pos, &curs);
+ pos, (splitrow >= 0 && curs.alt) ? NULL : &curs);
if (curs.width == 0 && start < curs.col) {
/* width == 0 implies it appear after end-of-screen */
i < rows && ci.merger[tpos.p.m].type != End;
i++) {
draw_mline(smode, i, start, cols, fm, fb, fa, ci.merger,
- tpos, NULL);
+ tpos,
+ (i == srow && curs.alt) ? &curs : NULL);
next_mline(&tpos, fm, fb, fa, ci.merger, smode);
}
while (i < rows)
}
clrtoeol();
/* '+1' to skip over the leading +/-/| char */
- move(row, curs.col-start+1);
+ if (curs.alt && splitrow > 0)
+ move((rows + splitrow)/2, curs.col - start + 1);
+ else if (curs.alt && ((mode & (BEFORE|AFTER)) &&
+ (mode & (ORIG|RESULT))))
+ move(row, curs.col-start + (cols-1)/2+2);
+ else
+ move(row, curs.col-start+1);
c = getch();
tmeta = meta; meta = 0;
tnum = num; num = -1;
tpos = pos; row++;
do {
pos = tpos; row--;
- prev_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ prev_mline(&tpos, fm, fb, fa, ci.merger, mmode);
} while (tpos.p.m >= 0);
if (row <= 0)
row = 0;
tpos = pos; row--;
do {
pos = tpos; row++;
- next_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ next_mline(&tpos, fm, fb, fa, ci.merger, mmode);
} while (ci.merger[tpos.p.m].type != End);
if (row >= lastrow)
row = lastrow;
}
do {
if (mcontains(tpos, fm, fb, fa, ci.merger,
- mode, search, &curs, searchdir,
+ mmode, search, &curs, searchdir,
ignore_case >= 2)) {
curs.target = -1;
pos = tpos;
}
if (searchdir < 0) {
trow--;
- prev_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ prev_mline(&tpos, fm, fb, fa, ci.merger, mmode);
} else {
trow++;
- next_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ next_mline(&tpos, fm, fb, fa, ci.merger, mmode);
}
} while (tpos.p.m >= 0 && ci.merger[tpos.p.m].type != End);
searchdir /= abs(searchdir);
tnum = 1;
for (; tnum > 0 ; tnum--) {
tpos = pos;
- next_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ next_mline(&tpos, fm, fb, fa, ci.merger, mmode);
if (ci.merger[tpos.p.m].type != End) {
pos = tpos;
row++;
tpos = pos; row--;
do {
pos = tpos; row++;
- next_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ next_mline(&tpos, fm, fb, fa, ci.merger, mmode);
} while (pos.state != 0 && ci.merger[tpos.p.m].type != End);
tpos = pos; row--;
do {
pos = tpos; row++;
- next_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ next_mline(&tpos, fm, fb, fa, ci.merger, mmode);
} while (pos.state == 0 && ci.merger[tpos.p.m].type != End);
break;
tpos = pos; row++;
do {
pos = tpos; row--;
- prev_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ prev_mline(&tpos, fm, fb, fa, ci.merger, mmode);
} while (tpos.state == 0 && tpos.p.m >= 0);
tpos = pos; row++;
do {
pos = tpos; row--;
- prev_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ prev_mline(&tpos, fm, fb, fa, ci.merger, mmode);
} while (tpos.state != 0 && tpos.p.m >= 0);
break;
tnum = 1;
for (; tnum > 0 ; tnum--) {
tpos = pos;
- prev_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ prev_mline(&tpos, fm, fb, fa, ci.merger, mmode);
if (tpos.p.m >= 0) {
pos = tpos;
row--;
if (curs.target < 0) {
/* Try to go to end of previous line */
tpos = pos;
- prev_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ prev_mline(&tpos, fm, fb, fa, ci.merger, mmode);
if (tpos.p.m >= 0) {
pos = tpos;
row--;
else {
/* end of line, go to next */
tpos = pos;
- next_mline(&tpos, fm, fb, fa, ci.merger, mode);
+ next_mline(&tpos, fm, fb, fa, ci.merger, mmode);
if (ci.merger[tpos.p.m].type != End) {
pos = tpos;
curs.pos = pos.p;
curs.target = 1000;
break;
+ case 'O':
+ curs.alt = !curs.alt;
+ if (curs.alt && mode == (ORIG|RESULT))
+ mmode = (BEFORE|AFTER);
+ else
+ mmode = mode;
+ break;
+
case 'a': /* 'after' view in patch window */
mode = AFTER; modename = "after"; modehelp = after_help;
+ mmode = mode; curs.alt = 0;
refresh = 2;
break;
case 'b': /* 'before' view in patch window */
mode = BEFORE; modename = "before"; modehelp = before_help;
+ mmode = mode; curs.alt = 0;
refresh = 2;
break;
case 'o': /* 'original' view in the merge window */
mode = ORIG; modename = "original"; modehelp = orig_help;
+ mmode = mode; curs.alt = 0;
refresh = 2;
break;
case 'r': /* the 'result' view in the merge window */
mode = RESULT; modename = "result"; modehelp = result_help;
+ mmode = mode; curs.alt = 0;
refresh = 2;
break;
case 'd':
mode = BEFORE|AFTER; modename = "diff"; modehelp = diff_help;
+ mmode = mode; curs.alt = 0;
refresh = 2;
break;
case 'm':
mode = ORIG|RESULT; modename = "merge"; modehelp = merge_help;
+ mmode = mode; curs.alt = 0;
refresh = 2;
break;
case '|':
mode = ORIG|RESULT|BEFORE|AFTER; modename = "sidebyside"; modehelp = sidebyside_help;
+ mmode = mode; curs.alt = 0;
refresh = 2;
break;