|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* Copyright 1984, 1985 Massachusetts Institute of Technology */ ! 4: ! 5: /* cursor.c */ ! 6: ! 7: ! 8: #ifndef lint ! 9: static char *rcsid_cursor_c = "$Header: cursor.c,v 10.9 86/02/01 16:06:14 tony Rel $"; ! 10: #endif lint ! 11: ! 12: #include <X/Xlib.h> ! 13: #include <stdio.h> ! 14: #include "ptyx.h" ! 15: ! 16: /* ! 17: * Moves the cursor to the specified position, checking for bounds. ! 18: * (this includes scrolling regions) ! 19: * The origin is considered to be 0, 0 for this procedure. ! 20: */ ! 21: CursorSet(screen, row, col, flags) ! 22: register Screen *screen; ! 23: register int row, col; ! 24: unsigned flags; ! 25: { ! 26: register int maxr = screen->max_row; ! 27: ! 28: if (flags & ORIGIN) { ! 29: row += screen->top_marg; ! 30: maxr = screen->bot_marg; ! 31: } ! 32: ! 33: row = (row < 0 ? 0 : row); ! 34: col = (col < 0 ? 0 : col); ! 35: screen->cur_col = (col <= screen->max_col ? col : screen->max_col); ! 36: screen->cur_row = (row <= maxr ? row : maxr); ! 37: screen->do_wrap = 0; ! 38: } ! 39: ! 40: /* ! 41: * moves the cursor left n, no wrap around ! 42: */ ! 43: CursorBack(screen, n) ! 44: register Screen *screen; ! 45: int n; ! 46: { ! 47: screen->cur_col -= n; ! 48: if (screen->cur_col < 0) ! 49: screen->cur_col = 0; ! 50: screen->do_wrap = 0; ! 51: } ! 52: ! 53: /* ! 54: * moves the cursor forward n, no wraparound ! 55: */ ! 56: CursorForward(screen, n) ! 57: register Screen *screen; ! 58: int n; ! 59: { ! 60: screen->cur_col += n; ! 61: if (screen->cur_col > screen->max_col) ! 62: screen->cur_col = screen->max_col; ! 63: screen->do_wrap = 0; ! 64: } ! 65: ! 66: /* ! 67: * moves the cursor down n, no scrolling. ! 68: * Won't pass bottom margin or bottom of screen. ! 69: */ ! 70: CursorDown(screen, n) ! 71: register Screen *screen; ! 72: int n; ! 73: { ! 74: register int max; ! 75: ! 76: max = (screen->cur_row > screen->bot_marg ? ! 77: screen->max_row : screen->bot_marg); ! 78: ! 79: screen->cur_row += n; ! 80: if (screen->cur_row > max) ! 81: screen->cur_row = max; ! 82: screen->do_wrap = 0; ! 83: } ! 84: ! 85: /* ! 86: * moves the cursor up n, no linestarving. ! 87: * Won't pass top margin or top of screen. ! 88: */ ! 89: CursorUp(screen, n) ! 90: register Screen *screen; ! 91: int n; ! 92: { ! 93: register int min; ! 94: ! 95: min = (screen->cur_row < screen->top_marg ? ! 96: 0 : screen->top_marg); ! 97: ! 98: screen->cur_row -= n; ! 99: if (screen->cur_row < min) ! 100: screen->cur_row = min; ! 101: screen->do_wrap = 0; ! 102: } ! 103: ! 104: /* ! 105: * Moves cursor down amount lines, scrolls if necessary. ! 106: * Won't leave scrolling region. No carriage return. ! 107: */ ! 108: Index(screen, amount) ! 109: register Screen *screen; ! 110: register int amount; ! 111: { ! 112: /* ! 113: * indexing when below scrolling region is cursor down. ! 114: * if cursor high enough, no scrolling necessary. ! 115: */ ! 116: if (screen->cur_row > screen->bot_marg ! 117: || screen->cur_row + amount <= screen->bot_marg) { ! 118: CursorDown(screen, amount); ! 119: return; ! 120: } ! 121: ! 122: Scroll(screen, amount - (screen->bot_marg - screen->cur_row)); ! 123: CursorDown(screen, screen->bot_marg - screen->cur_row); ! 124: } ! 125: ! 126: /* ! 127: * Moves cursor up amount lines, reverse scrolls if necessary. ! 128: * Won't leave scrolling region. No carriage return. ! 129: */ ! 130: RevIndex(screen, amount) ! 131: register Screen *screen; ! 132: register int amount; ! 133: { ! 134: /* ! 135: * reverse indexing when above scrolling region is cursor up. ! 136: * if cursor low enough, no reverse indexing needed ! 137: */ ! 138: if (screen->cur_row < screen->top_marg ! 139: || screen->cur_row-amount >= screen->top_marg) { ! 140: CursorUp(screen, amount); ! 141: return; ! 142: } ! 143: ! 144: RevScroll(screen, amount - (screen->cur_row - screen->top_marg)); ! 145: CursorUp(screen, screen->cur_row - screen->top_marg); ! 146: } ! 147: ! 148: ! 149: /* ! 150: * Moves Cursor To First Column In Line ! 151: */ ! 152: CarriageReturn(screen) ! 153: register Screen *screen; ! 154: { ! 155: screen->cur_col = 0; ! 156: screen->do_wrap = 0; ! 157: } ! 158: ! 159: /* ! 160: * Toggles cursor on or off at cursor position in screen. ! 161: */ ! 162: CursorToggle(screen, turnOn) ! 163: register Screen *screen; ! 164: int turnOn; ! 165: { ! 166: int fg = screen->foreground; ! 167: int bg = screen->background; ! 168: short flags = screen->buf [screen->cur_row] [screen->cur_col]; ! 169: char c; ! 170: if (((turnOn ? INVERSEbit : 0) ^ (flags & INVERSEbit))) { ! 171: fg = screen->background; ! 172: bg = screen->cursorcolor; ! 173: } ! 174: /* If in normal mode repaint character */ ! 175: if (!screen->TekEmu) { ! 176: if ((c = (flags & CHAR)) == 0) c = ' '; ! 177: XText(screen->window, CursorX (screen), CursorY(screen), &c,1, ! 178: ((flags & BOLDbit) ? screen->fnt_bold : screen->fnt_norm), ! 179: fg, bg); ! 180: /* If in Tek mode then invert */ ! 181: /* If in TekAmode then use TCursor instead of Cursor */ ! 182: } else if (screen->TekAMode) ! 183: XPixFill(screen->window, TCursorX (screen), TCursorY(screen), ! 184: screen->f_width, screen->f_height, screen->foreground, ! 185: 0, GXinvert, screen->xorplane); ! 186: ! 187: /* Avoid toggling cursor during Tektronix coordinate computations */ ! 188: else if (!screen->TekGMode) ! 189: XPixFill(screen->window, CursorX (screen), CursorY(screen), ! 190: screen->f_width, screen->f_height, screen->foreground, ! 191: 0, GXinvert, screen->xorplane); ! 192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.