|
|
1.1 root 1: /*
2: * $Source: /u1/X/xterm/RCS/util.c,v $
3: * $Header: util.c,v 10.100 86/12/01 14:45:43 jg Rel $
4: */
5:
6: #include <X/mit-copyright.h>
7:
8: /* Copyright Massachusetts Institute of Technology 1984, 1985 */
9:
10: /* util.c */
11:
12: #ifndef lint
13: static char sccs_id[] = "@(#)util.c\tX10/6.6B\t12/26/86";
14: #endif lint
15:
16: #include <stdio.h>
17: #include <X/Xlib.h>
18: #include <signal.h>
19: #include <setjmp.h>
20: typedef int *jmp_ptr;
21:
22: #include "scrollbar.h"
23: #include "ptyx.h"
24: #include "data.h"
25: #include "error.h"
26:
27: /*
28: * These routines are used for the jump scroll feature
29: */
30: FlushScroll(screen)
31: register Screen *screen;
32: {
33: register int i;
34: register int shift = -screen->topline;
35: register int bot = screen->max_row - shift;
36: register int refreshtop;
37: register int refreshheight;
38: register int scrolltop;
39: register int scrollheight;
40:
41: if(screen->cursor_state)
42: HideCursor();
43: if(screen->scroll_amt > 0) {
44: refreshheight = screen->refresh_amt;
45: scrollheight = screen->bot_marg - screen->top_marg -
46: refreshheight + 1;
47: if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
48: (i = screen->max_row - screen->scroll_amt + 1))
49: refreshtop = i;
50: if(screen->sb && GetSaveState(screen->sb) &&
51: screen->top_marg == 0) {
52: scrolltop = 0;
53: if((scrollheight += shift) > i)
54: scrollheight = i;
55: if((i = screen->bot_marg - bot) > 0 &&
56: (refreshheight -= i) < screen->scroll_amt)
57: refreshheight = screen->scroll_amt;
58: if((i = -GetScrollBarTop(screen->sb)) <
59: screen->savelines) {
60: if((i += screen->scroll_amt) >
61: screen->savelines)
62: i = screen->savelines;
63: SetScrollBarTop(screen->sb, -i);
64: DrawScrollRegion(screen->sb);
65: }
66: } else {
67: scrolltop = screen->top_marg + shift;
68: if((i = bot - (screen->bot_marg - screen->refresh_amt +
69: screen->scroll_amt)) > 0) {
70: if(bot < screen->bot_marg)
71: refreshheight = screen->scroll_amt + i;
72: } else {
73: scrollheight += i;
74: refreshheight = screen->scroll_amt;
75: if((i = screen->top_marg + screen->scroll_amt -
76: 1 - bot) > 0) {
77: refreshtop += i;
78: refreshheight -= i;
79: }
80: }
81: }
82: } else {
83: refreshheight = -screen->refresh_amt;
84: scrollheight = screen->bot_marg - screen->top_marg -
85: refreshheight + 1;
86: refreshtop = screen->top_marg + shift;
87: scrolltop = refreshtop + refreshheight;
88: if((i = screen->bot_marg - bot) > 0)
89: scrollheight -= i;
90: if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
91: refreshheight -= i;
92: }
93: if(scrollheight > 0) {
94: if (screen->multiscroll && scrollheight == 1 &&
95: screen->topline == 0 && screen->top_marg == 0 &&
96: screen->bot_marg == screen->max_row) {
97: if (screen->incopy < 0 && screen->scrolls == 0)
98: CopyWait (screen);
99: screen->scrolls++;
100: } else {
101: if (screen->incopy)
102: CopyWait (screen);
103: screen->incopy = -1;
104: }
105:
106: XMoveArea (VWindow(screen), screen->border, (scrolltop +
107: screen->scroll_amt) * FontHeight(screen) + screen->border +
108: Titlebar(screen), screen->border, scrolltop * FontHeight(screen)
109: + screen->border + Titlebar(screen), Width(screen),
110: scrollheight * FontHeight(screen));
111: }
112: screen->scroll_amt = 0;
113: screen->refresh_amt = 0;
114: if(refreshheight > 0) {
115: XTileSet (VWindow(screen), screen->border, refreshtop *
116: FontHeight(screen) + screen->border + Titlebar(screen),
117: Width(screen), refreshheight * FontHeight(screen),
118: screen->bgndtile);
119: ScrnRefresh(screen, refreshtop, 0, refreshheight,
120: screen->max_col + 1);
121: }
122: }
123:
124: AddToRefresh(screen)
125: register Screen *screen;
126: {
127: register int amount = screen->refresh_amt;
128: register int row = screen->cur_row;
129:
130: if(amount == 0 || screen->instatus)
131: return(0);
132: if(amount > 0) {
133: register int bottom;
134:
135: if(row == (bottom = screen->bot_marg) - amount) {
136: screen->refresh_amt++;
137: return(1);
138: }
139: return(row >= bottom - amount + 1 && row <= bottom);
140: } else {
141: register int top;
142:
143: amount = -amount;
144: if(row == (top = screen->top_marg) + amount) {
145: screen->refresh_amt--;
146: return(1);
147: }
148: return(row <= top + amount - 1 && row >= top);
149: }
150: }
151:
152: /*
153: * scrolls the screen by amount lines, erases bottom, doesn't alter
154: * cursor position (i.e. cursor moves down amount relative to text).
155: * All done within the scrolling region, of course.
156: * requires: amount > 0
157: */
158: Scroll (screen, amount)
159: register Screen *screen;
160: register int amount;
161: {
162: register int i = screen->bot_marg - screen->top_marg + 1;
163: register int shift;
164: register int bot;
165: register int refreshtop;
166: register int refreshheight;
167: register int scrolltop;
168: register int scrollheight;
169:
170: if(screen->cursor_state)
171: HideCursor();
172: if (amount > i)
173: amount = i;
174: if(screen->jumpscroll) {
175: if(screen->scroll_amt > 0) {
176: if(screen->refresh_amt + amount > i)
177: FlushScroll(screen);
178: screen->scroll_amt += amount;
179: screen->refresh_amt += amount;
180: } else {
181: if(screen->scroll_amt < 0)
182: FlushScroll(screen);
183: screen->scroll_amt = amount;
184: screen->refresh_amt = amount;
185: }
186: refreshheight = 0;
187: } else {
188:
189: if (amount == i) {
190: ClearScreen(screen);
191: return;
192: }
193: shift = -screen->topline;
194: bot = screen->max_row - shift;
195: scrollheight = i - amount;
196: refreshheight = amount;
197: if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
198: (i = screen->max_row - refreshheight + 1))
199: refreshtop = i;
200: if(screen->sb && GetSaveState(screen->sb) && screen->top_marg == 0) {
201: scrolltop = 0;
202: if((scrollheight += shift) > i)
203: scrollheight = i;
204: if((i = -GetScrollBarTop(screen->sb)) < screen->savelines) {
205: if((i += amount) > screen->savelines)
206: i = screen->savelines;
207: SetScrollBarTop(screen->sb, -i);
208: DrawScrollRegion(screen->sb);
209: }
210: } else {
211: scrolltop = screen->top_marg + shift;
212: if((i = screen->bot_marg - bot) > 0) {
213: scrollheight -= i;
214: if((i = screen->top_marg + amount - 1 - bot) >= 0) {
215: refreshtop += i;
216: refreshheight -= i;
217: }
218: }
219: }
220: if(scrollheight > 0) {
221: if (screen->multiscroll
222: && amount==1 && screen->topline == 0
223: && screen->top_marg==0
224: && screen->bot_marg==screen->max_row) {
225: if (screen->incopy<0 && screen->scrolls==0)
226: CopyWait(screen);
227: screen->scrolls++;
228: } else {
229: if (screen->incopy)
230: CopyWait(screen);
231: screen->incopy = -1;
232: }
233:
234: XMoveArea(VWindow(screen), screen->border, (scrolltop+amount) *
235: FontHeight(screen) + screen->border + Titlebar(screen),
236: screen->border, scrolltop * FontHeight(screen) + screen->border
237: + Titlebar(screen), Width(screen), scrollheight *
238: FontHeight(screen));
239: }
240: if(refreshheight > 0) {
241: XTileSet (VWindow(screen), screen->border, refreshtop *
242: FontHeight(screen) + screen->border + Titlebar(screen),
243: Width(screen), refreshheight * FontHeight(screen),
244: screen->bgndtile);
245: if(refreshheight > shift)
246: refreshheight = shift;
247: }
248: }
249: if(screen->sb && GetSaveState(screen->sb) && screen->top_marg == 0)
250: ScrnDeleteLine(screen->allbuf, screen->bot_marg +
251: screen->savelines, 0, amount, screen->max_col + 1);
252: else
253: ScrnDeleteLine(screen->buf, screen->bot_marg, screen->top_marg,
254: amount, screen->max_col + 1);
255: if(refreshheight > 0)
256: ScrnRefresh(screen, refreshtop, 0, refreshheight,
257: screen->max_col + 1);
258: }
259:
260:
261: /*
262: * Reverse scrolls the screen by amount lines, erases top, doesn't alter
263: * cursor position (i.e. cursor moves up amount relative to text).
264: * All done within the scrolling region, of course.
265: * Requires: amount > 0
266: */
267: RevScroll(screen, amount)
268: register Screen *screen;
269: register int amount;
270: {
271: register int i = screen->bot_marg - screen->top_marg + 1;
272: register int shift;
273: register int bot;
274: register int refreshtop;
275: register int refreshheight;
276: register int scrolltop;
277: register int scrollheight;
278:
279: if(screen->cursor_state)
280: HideCursor();
281: if (amount > i)
282: amount = i;
283: if(screen->jumpscroll) {
284: if(screen->scroll_amt < 0) {
285: if(-screen->refresh_amt + amount > i)
286: FlushScroll(screen);
287: screen->scroll_amt -= amount;
288: screen->refresh_amt -= amount;
289: } else {
290: if(screen->scroll_amt > 0)
291: FlushScroll(screen);
292: screen->scroll_amt = -amount;
293: screen->refresh_amt = -amount;
294: }
295: } else {
296: shift = -screen->topline;
297: bot = screen->max_row - shift;
298: refreshheight = amount;
299: scrollheight = screen->bot_marg - screen->top_marg -
300: refreshheight + 1;
301: refreshtop = screen->top_marg + shift;
302: scrolltop = refreshtop + refreshheight;
303: if((i = screen->bot_marg - bot) > 0)
304: scrollheight -= i;
305: if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
306: refreshheight -= i;
307: if(scrollheight > 0) {
308: if (screen->multiscroll
309: && amount==1 && screen->topline == 0
310: && screen->top_marg==0
311: && screen->bot_marg==screen->max_row) {
312: if (screen->incopy<0 && screen->scrolls==0)
313: CopyWait(screen);
314: screen->scrolls++;
315: } else {
316: if (screen->incopy)
317: CopyWait(screen);
318: screen->incopy = -1;
319: }
320:
321: XMoveArea (VWindow(screen), screen->border, (scrolltop-amount) *
322: FontHeight(screen) + screen->border + Titlebar(screen),
323: screen->border, scrolltop * FontHeight(screen) + screen->border
324: + Titlebar(screen), Width(screen), scrollheight *
325: FontHeight(screen));
326: }
327: if(refreshheight > 0)
328: XTileSet (VWindow(screen), screen->border, refreshtop *
329: FontHeight(screen) + screen->border + Titlebar(screen),
330: Width(screen), refreshheight * FontHeight(screen),
331: screen->bgndtile);
332: }
333: ScrnInsertLine (screen->buf, screen->bot_marg, screen->top_marg,
334: amount, screen->max_col + 1);
335: }
336:
337: /*
338: * If cursor not in scrolling region, returns. Else,
339: * inserts n blank lines at the cursor's position. Lines above the
340: * bottom margin are lost.
341: */
342: InsertLine (screen, n)
343: register Screen *screen;
344: register int n;
345: {
346: register int i;
347: register int shift;
348: register int bot;
349: register int refreshtop;
350: register int refreshheight;
351: register int scrolltop;
352: register int scrollheight;
353:
354: if (screen->cur_row < screen->top_marg ||
355: screen->cur_row > screen->bot_marg)
356: return;
357: if(screen->cursor_state)
358: HideCursor();
359: screen->do_wrap = 0;
360: if (n > (i = screen->bot_marg - screen->cur_row + 1))
361: n = i;
362: if(screen->jumpscroll) {
363: if(screen->scroll_amt <= 0 &&
364: screen->cur_row <= -screen->refresh_amt) {
365: if(-screen->refresh_amt + n > screen->max_row + 1)
366: FlushScroll(screen);
367: screen->scroll_amt -= n;
368: screen->refresh_amt -= n;
369: } else if(screen->scroll_amt)
370: FlushScroll(screen);
371: }
372: if(!screen->scroll_amt) {
373: shift = -screen->topline;
374: bot = screen->max_row - shift;
375: refreshheight = n;
376: scrollheight = screen->bot_marg - screen->cur_row - refreshheight + 1;
377: refreshtop = screen->cur_row + shift;
378: scrolltop = refreshtop + refreshheight;
379: if((i = screen->bot_marg - bot) > 0)
380: scrollheight -= i;
381: if((i = screen->cur_row + refreshheight - 1 - bot) > 0)
382: refreshheight -= i;
383: if(scrollheight > 0) {
384: if (screen->incopy)
385: CopyWait (screen);
386: screen->incopy = -1;
387: XMoveArea (VWindow(screen), screen->border, (scrolltop - n) *
388: FontHeight(screen) + screen->border + Titlebar(screen),
389: screen->border, scrolltop * FontHeight(screen) + screen->border
390: + Titlebar(screen), Width(screen), scrollheight *
391: FontHeight(screen));
392: }
393: if(refreshheight > 0)
394: XTileSet (VWindow(screen),
395: screen->border, refreshtop * FontHeight(screen) + screen->border
396: + Titlebar(screen), Width(screen), refreshheight *
397: FontHeight(screen), screen->bgndtile);
398: }
399: /* adjust screen->buf */
400: ScrnInsertLine(screen->buf, screen->bot_marg, screen->cur_row, n,
401: screen->max_col + 1);
402: }
403:
404: /*
405: * If cursor not in scrolling region, returns. Else, deletes n lines
406: * at the cursor's position, lines added at bottom margin are blank.
407: */
408: DeleteLine(screen, n)
409: register Screen *screen;
410: register int n;
411: {
412: register int i;
413: register int shift;
414: register int bot;
415: register int refreshtop;
416: register int refreshheight;
417: register int scrolltop;
418: register int scrollheight;
419:
420: if (screen->cur_row < screen->top_marg ||
421: screen->cur_row > screen->bot_marg)
422: return;
423: if(screen->cursor_state)
424: HideCursor();
425: screen->do_wrap = 0;
426: if (n > (i = screen->bot_marg - screen->cur_row + 1))
427: n = i;
428: if(screen->jumpscroll) {
429: if(screen->scroll_amt >= 0 && screen->cur_row == screen->top_marg) {
430: if(screen->refresh_amt + n > screen->max_row + 1)
431: FlushScroll(screen);
432: screen->scroll_amt += n;
433: screen->refresh_amt += n;
434: } else if(screen->scroll_amt)
435: FlushScroll(screen);
436: }
437: if(!screen->scroll_amt) {
438:
439: shift = -screen->topline;
440: bot = screen->max_row - shift;
441: scrollheight = i - n;
442: refreshheight = n;
443: if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
444: (i = screen->max_row - refreshheight + 1))
445: refreshtop = i;
446: if(screen->sb && GetSaveState(screen->sb) && screen->cur_row == 0) {
447: scrolltop = 0;
448: if((scrollheight += shift) > i)
449: scrollheight = i;
450: if((i = -GetScrollBarTop(screen->sb)) < screen->savelines) {
451: if((i += n) > screen->savelines)
452: i = screen->savelines;
453: SetScrollBarTop(screen->sb, -i);
454: DrawScrollRegion(screen->sb);
455: }
456: } else {
457: scrolltop = screen->cur_row + shift;
458: if((i = screen->bot_marg - bot) > 0) {
459: scrollheight -= i;
460: if((i = screen->cur_row + n - 1 - bot) >= 0) {
461: refreshheight -= i;
462: }
463: }
464: }
465: if(scrollheight > 0) {
466: if (screen->incopy)
467: CopyWait(screen);
468: screen->incopy = -1;
469:
470: XMoveArea (VWindow(screen), screen->border, (scrolltop + n) *
471: FontHeight(screen) + screen->border + Titlebar(screen),
472: screen->border, scrolltop * FontHeight(screen) + screen->border
473: + Titlebar(screen), Width(screen), scrollheight *
474: FontHeight(screen));
475: }
476: if(refreshheight > 0)
477: XTileSet (VWindow(screen), screen->border, refreshtop *
478: FontHeight(screen) + screen->border + Titlebar(screen),
479: Width(screen), refreshheight * FontHeight(screen),
480: screen->bgndtile);
481: }
482: /* adjust screen->buf */
483: if(screen->sb && GetSaveState(screen->sb) && screen->cur_row == 0)
484: ScrnDeleteLine(screen->allbuf, screen->bot_marg +
485: screen->savelines, 0, n, screen->max_col + 1);
486: else
487: ScrnDeleteLine(screen->buf, screen->bot_marg, screen->cur_row,
488: n, screen->max_col + 1);
489: }
490:
491: /*
492: * Insert n blanks at the cursor's position, no wraparound
493: */
494: InsertChar (screen, n)
495: register Screen *screen;
496: register int n;
497: {
498: register int width = n * FontWidth(screen), cx, cy;
499:
500: if(screen->cursor_state)
501: HideCursor();
502: screen->do_wrap = 0;
503: if(screen->cur_row - screen->topline <= screen->max_row ||
504: screen->instatus) {
505: if(!AddToRefresh(screen)) {
506: if(screen->scroll_amt)
507: FlushScroll(screen);
508:
509: if (screen->incopy)
510: CopyWait (screen);
511: screen->incopy = -1;
512:
513: cx = CursorX (screen, screen->cur_col);
514: cy = CursorY (screen, screen->cur_row);
515: XMoveArea(VWindow(screen), cx, cy, cx + width, cy,
516: Width(screen) - (screen->cur_col + n) * FontWidth(screen),
517: FontHeight(screen));
518: XPixSet(VWindow(screen), cx, cy,
519: width, FontHeight(screen), screen->instatus ?
520: screen->foreground : screen->background);
521:
522: }
523: }
524: /* adjust screen->buf */
525: ScrnInsertChar(screen->buf, screen->cur_row, screen->cur_col, n,
526: screen->max_col + 1);
527: }
528:
529: /*
530: * Deletes n chars at the cursor's position, no wraparound.
531: */
532: DeleteChar (screen, n)
533: register Screen *screen;
534: register int n;
535: {
536: register int width, cx, cy;
537:
538: if(screen->cursor_state)
539: HideCursor();
540: screen->do_wrap = 0;
541: if (n > (width = screen->max_col + 1 - screen->cur_col))
542: n = width;
543:
544: if(screen->cur_row - screen->topline <= screen->max_row ||
545: screen->instatus) {
546: if(!AddToRefresh(screen)) {
547: if(screen->scroll_amt)
548: FlushScroll(screen);
549:
550: width = n * FontWidth(screen);
551:
552: if (screen->incopy)
553: CopyWait (screen);
554: screen->incopy = -1;
555:
556: cx = CursorX (screen, screen->cur_col);
557: cy = CursorY (screen, screen->cur_row);
558: XMoveArea(VWindow(screen), cx + width, cy, cx, cy,
559: Width(screen) - (screen->cur_col + n) * FontWidth(screen),
560: FontHeight(screen));
561: XPixSet (VWindow(screen),
562: screen->border + Width(screen) - width, cy,
563: width, FontHeight(screen), screen->instatus ?
564: screen->foreground : screen->background);
565:
566: }
567: }
568: /* adjust screen->buf */
569: ScrnDeleteChar (screen->buf, screen->cur_row, screen->cur_col, n,
570: screen->max_col + 1);
571:
572: }
573:
574: /*
575: * Clear from cursor position to beginning of display, inclusive.
576: */
577: ClearAbove (screen)
578: register Screen *screen;
579: {
580: register top, height;
581:
582: if(screen->cursor_state)
583: HideCursor();
584: if((top = -screen->topline) <= screen->max_row) {
585: if(screen->scroll_amt)
586: FlushScroll(screen);
587: if((height = screen->cur_row + top) > screen->max_row)
588: height = screen->max_row;
589: if((height -= top) > 0)
590: XTileSet(VWindow(screen), screen->border, top *
591: FontHeight(screen) + screen->border + Titlebar(screen),
592: Width(screen), height * FontHeight(screen),
593: screen->bgndtile);
594:
595: if(screen->cur_row - screen->topline <= screen->max_row)
596: ClearLeft(screen);
597: }
598: ClearBufRows(screen, 0, screen->cur_row - 1);
599: }
600:
601: /*
602: * Clear from cursor position to end of display, inclusive.
603: */
604: ClearBelow (screen)
605: register Screen *screen;
606: {
607: register top;
608:
609: ClearRight(screen);
610: if((top = screen->cur_row - screen->topline) <= screen->max_row) {
611: if(screen->scroll_amt)
612: FlushScroll(screen);
613: if(++top <= screen->max_row)
614: XTileSet(VWindow(screen), screen->border, top *
615: FontHeight(screen) + screen->border + Titlebar(screen),
616: Width(screen), (screen->max_row - top + 1) *
617: FontHeight(screen), screen->bgndtile);
618: }
619: ClearBufRows(screen, screen->cur_row + 1, screen->max_row);
620: }
621:
622: /*
623: * Clear last part of cursor's line, inclusive.
624: */
625: ClearRight (screen)
626: register Screen *screen;
627: {
628: if(screen->cursor_state)
629: HideCursor();
630: screen->do_wrap = 0;
631: if(screen->cur_row - screen->topline <= screen->max_row ||
632: screen->instatus) {
633: if(!AddToRefresh(screen)) {
634: if(screen->scroll_amt)
635: FlushScroll(screen);
636: XPixSet(VWindow(screen),
637: CursorX(screen, screen->cur_col),
638: CursorY(screen, screen->cur_row),
639: Width(screen) - screen->cur_col * FontWidth(screen),
640: FontHeight(screen), screen->instatus ? screen->foreground :
641: screen->background);
642: }
643: }
644: bzero(screen->buf [2 * screen->cur_row] + screen->cur_col,
645: (screen->max_col - screen->cur_col + 1));
646: bzero(screen->buf [2 * screen->cur_row + 1] + screen->cur_col,
647: (screen->max_col - screen->cur_col + 1));
648: }
649:
650: /*
651: * Clear first part of cursor's line, inclusive.
652: */
653: ClearLeft (screen)
654: register Screen *screen;
655: {
656: if(screen->cursor_state)
657: HideCursor();
658: screen->do_wrap = 0;
659: if(screen->cur_row - screen->topline <= screen->max_row ||
660: screen->instatus) {
661: if(!AddToRefresh(screen)) {
662: if(screen->scroll_amt)
663: FlushScroll(screen);
664:
665: XPixSet (VWindow(screen),
666: screen->border, CursorY (screen, screen->cur_row),
667: (screen->cur_col + 1) * FontWidth(screen),
668: FontHeight(screen), screen->instatus ? screen->foreground :
669: screen->background);
670: }
671: }
672: bzero (screen->buf [2 * screen->cur_row], (screen->cur_col + 1));
673: bzero (screen->buf [2 * screen->cur_row + 1], (screen->cur_col + 1));
674: }
675:
676: /*
677: * Erase the cursor's line.
678: */
679: ClearLine(screen)
680: register Screen *screen;
681: {
682: if(screen->cursor_state)
683: HideCursor();
684: screen->do_wrap = 0;
685: if(screen->cur_row - screen->topline <= screen->max_row ||
686: screen->instatus) {
687: if(!AddToRefresh(screen)) {
688: if(screen->scroll_amt)
689: FlushScroll(screen);
690: XPixSet (VWindow(screen),
691: screen->border, CursorY (screen, screen->cur_row),
692: Width(screen), FontHeight(screen), screen->instatus ?
693: screen->foreground : screen->background);
694: }
695: }
696: bzero (screen->buf [2 * screen->cur_row], (screen->max_col + 1));
697: bzero (screen->buf [2 * screen->cur_row + 1], (screen->max_col + 1));
698: }
699:
700: ClearScreen(screen)
701: register Screen *screen;
702: {
703: register int top;
704:
705: if(screen->cursor_state)
706: HideCursor();
707: screen->do_wrap = 0;
708: if((top = -screen->topline) <= screen->max_row) {
709: if(screen->scroll_amt)
710: FlushScroll(screen);
711: if(top == 0 && !screen->statusline)
712: XClear(VWindow(screen));
713: else
714: XTileSet(VWindow(screen), screen->border, top *
715: FontHeight(screen) + screen->border + Titlebar(screen),
716: Width(screen), (screen->max_row - top + 1) *
717: FontHeight(screen), screen->bgndtile);
718: }
719: ClearBufRows (screen, 0, screen->max_row);
720: screen->pagecnt = 0;
721: }
722:
723: CopyWait(screen)
724: register Screen *screen;
725: {
726: XEvent reply;
727: XEvent *rep = &reply;
728:
729: while (1) {
730: XWindowEvent (VWindow(screen), ExposeRegion|ExposeCopy, &reply);
731: switch (reply.type) {
732: case ExposeRegion:
733: if (((XExposeEvent *)rep)->detail == ExposeCopy &&
734: screen->incopy <= 0) {
735: screen->incopy = 1;
736: if (screen->scrolls > 0)
737: screen->scrolls--;
738: }
739: HandleExposure (screen, &reply);
740: break;
741: case ExposeCopy:
742: if (screen->incopy <= 0 && screen->scrolls > 0)
743: screen->scrolls--;
744: if (screen->scrolls == 0) {
745: screen->incopy = 0;
746: return;
747: }
748: screen->incopy = -1;
749: break;
750: }
751: }
752: }
753: /*
754: * This routine handles exposure events
755: */
756: HandleExposure (screen, reply)
757: register Screen *screen;
758: register XExposeEvent *reply;
759: {
760: register int toprow, leftcol, nrows, ncols;
761: extern Terminal term; /* kludge */
762: XExposeRegionEvent event;
763:
764: if((toprow = (reply->y - screen->border - Titlebar(screen)) /
765: FontHeight(screen)) < 0)
766: toprow = 0;
767: if((leftcol = (reply->x - screen->border) / FontWidth(screen)) < 0)
768: leftcol = 0;
769: nrows = (reply->y + reply->height - 1 - screen->border
770: - Titlebar(screen)) / FontHeight(screen) - toprow + 1;
771: ncols = (reply->x + reply->width - 1 - screen->border) /
772: FontWidth(screen) - leftcol + 1;
773: toprow -= screen->scrolls;
774: if (toprow < 0) {
775: nrows += toprow;
776: toprow = 0;
777: }
778: if (toprow + nrows - 1 > screen->max_row)
779: nrows = screen->max_row - toprow + 1 + screen->statusline;
780: if (leftcol + ncols - 1 > screen->max_col)
781: ncols = screen->max_col - leftcol + 1;
782:
783: if (nrows > 0 && ncols > 0) {
784: ScrnRefresh (screen, toprow, leftcol, nrows, ncols);
785: if (screen->cur_row >= toprow &&
786: screen->cur_row < toprow + nrows &&
787: screen->cur_col >= leftcol &&
788: screen->cur_col < leftcol + ncols)
789: return (1);
790: }
791: return (0);
792: }
793:
794: ReverseVideo (term)
795: Terminal *term;
796: {
797: register Screen *screen = &term->screen;
798: register Pixmap pix;
799: register int tmp;
800: register Window tek = TWindow(screen);
801: extern Pixmap B_Pixmap;
802: extern Pixmap W_Pixmap;
803:
804: if(screen->color & C_BACKGROUND)
805: XFreePixmap(screen->bgndtile);
806: tmp = screen->background;
807: if(screen->cursorcolor == screen->foreground)
808: screen->cursorcolor = tmp;
809: if(screen->mousecolor == screen->foreground)
810: screen->mousecolor = tmp;
811: screen->background = screen->foreground;
812: screen->foreground = tmp;
813:
814: screen->color = (screen->color & ~C_FBMASK) | switchfb[screen->color
815: & C_FBMASK];
816:
817: if(screen->color & C_BACKGROUND) {
818: if(!(screen->bgndtile = XMakeTile(screen->background)))
819: Error(ERROR_UBACK);
820: } else
821: screen->bgndtile = (screen->background == W_Pixel) ? W_Pixmap
822: : B_Pixmap;
823:
824: /* X11 arrow cursor feature */
825: XFreeCursor(screen->curs);
826: if (curs_shape && strcmp(curs_shape, "arrow") == 0)
827: screen->curs = make_arrow(screen->mousecolor,
828: screen->background, GXcopy);
829: else
830: screen->curs = make_xterm(screen->mousecolor,
831: screen->background, GXcopy);
832: XFreeCursor(screen->arrow);
833: screen->arrow = make_arrow(screen->mousecolor, screen->background,
834: GXcopy);
835:
836: XDefineCursor(VWindow(screen), screen->curs);
837: if(screen->sb)
838: XDefineCursor(screen->sb->bar, screen->sb->cursor =
839: screen->arrow);
840: if(screen->title.tbar)
841: XDefineCursor(screen->title.tbar, screen->arrow);
842: if(tek)
843: XDefineCursor(tek, screen->arrow);
844: #ifdef MODEMENU
845: MenuNewCursor(screen->arrow);
846: #endif MODEMENU
847:
848: if (screen->background < 2 && screen->foreground < 2) {
849: if (screen->bgndtile == B_Pixmap)
850: screen->bordertile = W_Pixmap;
851: else if (screen->bgndtile == W_Pixmap)
852: screen->bordertile = B_Pixmap;
853: pix = screen->bordertile;
854: if(screen->sb)
855: XChangeBorder (screen->sb->bar, pix);
856: if(screen->title.tbar)
857: XChangeBorder (screen->title.tbar, pix);
858: if(tek && screen->Ttitle.tbar)
859: XChangeBorder (screen->Ttitle.tbar, pix);
860: if(screen->borderwidth > 0) {
861: XChangeBorder (VWindow(screen), pix);
862: XChangeBorder (screen->iconVwin.window, pix);
863: if(tek) {
864: XChangeBorder (tek, pix);
865: XChangeBorder (screen->iconTwin.window, pix);
866: }
867: }
868: }
869:
870: XChangeBackground (VWindow(screen), screen->bgndtile);
871: XChangeBackground (screen->iconVwin.window, screen->bgndtile);
872: if(screen->title.tbar)
873: XChangeBackground (screen->title.tbar, screen->bgndtile);
874: if(tek) {
875: XChangeBackground (screen->iconTwin.window, screen->bgndtile);
876: if(screen->Ttitle.tbar)
877: XChangeBackground (screen->Ttitle.tbar, screen->bgndtile);
878: TekReverseVideo(screen);
879: }
880: XClear (VWindow(screen));
881: XClear (screen->iconVwin.window);
882: ScrnRefresh (screen, 0, 0, screen->max_row + 1 + screen->statusline,
883: screen->max_col + 1);
884: if(screen->Tshow) {
885: XClear (tek);
886: XClear (screen->iconTwin.window);
887: TekExpose((XExposeWindowEvent *)0);
888: }
889: if(Titlebar(screen)) {
890: XClear(screen->title.tbar);
891: VTTitleExpose(NULL);
892: if(screen->Tshow) {
893: XClear(screen->Ttitle.tbar);
894: TekTitleExpose(NULL);
895: }
896: }
897: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.