|
|
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.