|
|
1.1 ! root 1: /* move4.c */ ! 2: ! 3: /* Author: ! 4: * Steve Kirkendall ! 5: * 14407 SW Teal Blvd. #C ! 6: * Beaverton, OR 97005 ! 7: * [email protected] ! 8: */ ! 9: ! 10: ! 11: /* This file contains movement functions which are screen-relative */ ! 12: ! 13: #include "config.h" ! 14: #include "vi.h" ! 15: ! 16: /* This moves the cursor to a particular row on the screen */ ! 17: /*ARGSUSED*/ ! 18: MARK m_row(m, cnt, key) ! 19: MARK m; /* the cursor position */ ! 20: long cnt; /* the row we'll move to */ ! 21: int key; /* the keystroke of this move - H/L/M */ ! 22: { ! 23: DEFAULT(1); ! 24: ! 25: /* calculate destination line based on key */ ! 26: cnt--; ! 27: switch (key) ! 28: { ! 29: case 'H': ! 30: cnt = topline + cnt; ! 31: break; ! 32: ! 33: case 'M': ! 34: cnt = topline + (LINES - 1) / 2; ! 35: break; ! 36: ! 37: case 'L': ! 38: cnt = botline - cnt; ! 39: break; ! 40: } ! 41: ! 42: /* return the mark of the destination line */ ! 43: return MARK_AT_LINE(cnt); ! 44: } ! 45: ! 46: ! 47: /* This function repositions the current line to show on a given row */ ! 48: MARK m_z(m, cnt, key) ! 49: MARK m; /* the cursor */ ! 50: long cnt; /* the line number we're repositioning */ ! 51: int key; /* key struck after the z */ ! 52: { ! 53: long newtop; ! 54: int i; ! 55: ! 56: /* Which line are we talking about? */ ! 57: if (cnt < 0 || cnt > nlines) ! 58: { ! 59: return MARK_UNSET; ! 60: } ! 61: if (cnt) ! 62: { ! 63: m = MARK_AT_LINE(cnt); ! 64: newtop = cnt; ! 65: } ! 66: else ! 67: { ! 68: newtop = markline(m); ! 69: } ! 70: ! 71: /* allow a "window size" number to be entered */ ! 72: for (i = 0; key >= '0' && key <= '9'; key = getkey(0)) ! 73: { ! 74: i = i * 10 + key - '0'; ! 75: } ! 76: #ifndef CRUNCH ! 77: if (i > 0 && i <= LINES - 1) ! 78: { ! 79: *o_window = i; ! 80: wset = TRUE; ! 81: } ! 82: #else ! 83: /* the number is ignored if -DCRUNCH */ ! 84: #endif ! 85: ! 86: /* figure out which line will have to be at the top of the screen */ ! 87: switch (key) ! 88: { ! 89: case '\n': ! 90: #if OSK ! 91: case '\l': ! 92: #else ! 93: case '\r': ! 94: #endif ! 95: case '+': ! 96: break; ! 97: ! 98: case '.': ! 99: case 'z': ! 100: newtop -= LINES / 2; ! 101: break; ! 102: ! 103: case '-': ! 104: newtop -= LINES - 1; ! 105: break; ! 106: ! 107: default: ! 108: return MARK_UNSET; ! 109: } ! 110: ! 111: /* make the new topline take effect */ ! 112: redraw(MARK_UNSET, FALSE); ! 113: if (newtop >= 1) ! 114: { ! 115: topline = newtop; ! 116: } ! 117: else ! 118: { ! 119: topline = 1L; ! 120: } ! 121: redrawrange(0L, INFINITY, INFINITY); ! 122: ! 123: /* The cursor doesn't move */ ! 124: return m; ! 125: } ! 126: ! 127: ! 128: /* This function scrolls the screen. It does this by calling redraw() with ! 129: * an off-screen line as the argument. It will move the cursor if necessary ! 130: * so that the cursor is on the new screen. ! 131: */ ! 132: /*ARGSUSED*/ ! 133: MARK m_scroll(m, cnt, key) ! 134: MARK m; /* the cursor position */ ! 135: long cnt; /* for some keys: the number of lines to scroll */ ! 136: int key; /* keystroke that causes this movement */ ! 137: { ! 138: MARK tmp; /* a temporary mark, used as arg to redraw() */ ! 139: ! 140: /* adjust cnt, and maybe *o_scroll, depending of key */ ! 141: switch (key) ! 142: { ! 143: case ctrl('F'): ! 144: case ctrl('B'): ! 145: DEFAULT(1); ! 146: redrawrange(0L, INFINITY, INFINITY); /* force complete redraw */ ! 147: cnt = cnt * (LINES - 1) - 2; /* keeps two old lines on screen */ ! 148: break; ! 149: ! 150: case ctrl('E'): ! 151: case ctrl('Y'): ! 152: DEFAULT(1); ! 153: break; ! 154: ! 155: case ctrl('U'): ! 156: case ctrl('D'): ! 157: if (cnt == 0) /* default */ ! 158: { ! 159: cnt = *o_scroll; ! 160: } ! 161: else ! 162: { ! 163: if (cnt > LINES - 1) ! 164: { ! 165: cnt = LINES - 1; ! 166: } ! 167: *o_scroll = cnt; ! 168: } ! 169: break; ! 170: } ! 171: ! 172: /* scroll up or down, depending on key */ ! 173: switch (key) ! 174: { ! 175: case ctrl('B'): ! 176: case ctrl('Y'): ! 177: case ctrl('U'): ! 178: cnt = topline - cnt; ! 179: if (cnt < 1L) ! 180: { ! 181: cnt = 1L; ! 182: m = MARK_FIRST; ! 183: } ! 184: tmp = MARK_AT_LINE(cnt) + markidx(m); ! 185: redraw(tmp, FALSE); ! 186: if (markline(m) > botline) ! 187: { ! 188: m = MARK_AT_LINE(botline); ! 189: } ! 190: break; ! 191: ! 192: case ctrl('F'): ! 193: case ctrl('E'): ! 194: case ctrl('D'): ! 195: cnt = botline + cnt; ! 196: if (cnt > nlines) ! 197: { ! 198: cnt = nlines; ! 199: m = MARK_LAST; ! 200: } ! 201: tmp = MARK_AT_LINE(cnt) + markidx(m); ! 202: redraw(tmp, FALSE); ! 203: if (markline(m) < topline) ! 204: { ! 205: m = MARK_AT_LINE(topline); ! 206: } ! 207: break; ! 208: } ! 209: ! 210: return m; ! 211: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.