home *** CD-ROM | disk | FTP | other *** search
- /*
- * $XConsortium: util.c,v 1.31 91/06/20 18:34:47 gildea Exp $
- */
-
- /*
- * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation, and that the name of Digital Equipment
- * Corporation not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior permission.
- *
- *
- * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
- /* util.c */
-
- #include "ptyx.h"
- #include "data.h"
- #include "error.h"
- #include "menu.h"
-
- #include <stdio.h>
-
- static void horizontal_copy_area();
- static void vertical_copy_area();
-
- /*
- * These routines are used for the jump scroll feature
- */
- FlushScroll(screen)
- register TScreen *screen;
- {
- register int i;
- register int shift = -screen->topline;
- register int bot = screen->max_row - shift;
- register int refreshtop;
- register int refreshheight;
- register int scrolltop;
- register int scrollheight;
-
- if(screen->cursor_state)
- HideCursor();
- if(screen->scroll_amt > 0) {
- refreshheight = screen->refresh_amt;
- scrollheight = screen->bot_marg - screen->top_marg -
- refreshheight + 1;
- if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
- (i = screen->max_row - screen->scroll_amt + 1))
- refreshtop = i;
- if(screen->scrollWidget && !screen->alternate
- && screen->top_marg == 0) {
- scrolltop = 0;
- if((scrollheight += shift) > i)
- scrollheight = i;
- if((i = screen->bot_marg - bot) > 0 &&
- (refreshheight -= i) < screen->scroll_amt)
- refreshheight = screen->scroll_amt;
- if((i = screen->savedlines) < screen->savelines) {
- if((i += screen->scroll_amt) >
- screen->savelines)
- i = screen->savelines;
- screen->savedlines = i;
- ScrollBarDrawThumb(screen->scrollWidget);
- }
- } else {
- scrolltop = screen->top_marg + shift;
- if((i = bot - (screen->bot_marg - screen->refresh_amt +
- screen->scroll_amt)) > 0) {
- if(bot < screen->bot_marg)
- refreshheight = screen->scroll_amt + i;
- } else {
- scrollheight += i;
- refreshheight = screen->scroll_amt;
- if((i = screen->top_marg + screen->scroll_amt -
- 1 - bot) > 0) {
- refreshtop += i;
- refreshheight -= i;
- }
- }
- }
- } else {
- refreshheight = -screen->refresh_amt;
- scrollheight = screen->bot_marg - screen->top_marg -
- refreshheight + 1;
- refreshtop = screen->top_marg + shift;
- scrolltop = refreshtop + refreshheight;
- if((i = screen->bot_marg - bot) > 0)
- scrollheight -= i;
- if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
- refreshheight -= i;
- }
- scrolling_copy_area(screen, scrolltop+screen->scroll_amt,
- scrollheight, screen->scroll_amt);
- ScrollSelection(screen, -(screen->scroll_amt));
- screen->scroll_amt = 0;
- screen->refresh_amt = 0;
- if(refreshheight > 0) {
- XClearArea (
- screen->display,
- TextWindow(screen),
- (int) screen->border + screen->scrollbar,
- (int) refreshtop * FontHeight(screen) + screen->border,
- (unsigned) Width(screen),
- (unsigned) refreshheight * FontHeight(screen),
- FALSE);
- ScrnRefresh(screen, refreshtop, 0, refreshheight,
- screen->max_col + 1, False);
- }
- }
-
- AddToRefresh(screen)
- register TScreen *screen;
- {
- register int amount = screen->refresh_amt;
- register int row = screen->cur_row;
-
- if(amount == 0)
- return(0);
- if(amount > 0) {
- register int bottom;
-
- if(row == (bottom = screen->bot_marg) - amount) {
- screen->refresh_amt++;
- return(1);
- }
- return(row >= bottom - amount + 1 && row <= bottom);
- } else {
- register int top;
-
- amount = -amount;
- if(row == (top = screen->top_marg) + amount) {
- screen->refresh_amt--;
- return(1);
- }
- return(row <= top + amount - 1 && row >= top);
- }
- }
-
- /*
- * scrolls the screen by amount lines, erases bottom, doesn't alter
- * cursor position (i.e. cursor moves down amount relative to text).
- * All done within the scrolling region, of course.
- * requires: amount > 0
- */
- Scroll(screen, amount)
- register TScreen *screen;
- register int amount;
- {
- register int i = screen->bot_marg - screen->top_marg + 1;
- register int shift;
- register int bot;
- register int refreshtop = 0;
- register int refreshheight;
- register int scrolltop;
- register int scrollheight;
-
- if(screen->cursor_state)
- HideCursor();
- if (amount > i)
- amount = i;
- if(screen->jumpscroll) {
- if(screen->scroll_amt > 0) {
- if(screen->refresh_amt + amount > i)
- FlushScroll(screen);
- screen->scroll_amt += amount;
- screen->refresh_amt += amount;
- } else {
- if(screen->scroll_amt < 0)
- FlushScroll(screen);
- screen->scroll_amt = amount;
- screen->refresh_amt = amount;
- }
- refreshheight = 0;
- } else {
- ScrollSelection(screen, -(amount));
- if (amount == i) {
- ClearScreen(screen);
- return;
- }
- shift = -screen->topline;
- bot = screen->max_row - shift;
- scrollheight = i - amount;
- refreshheight = amount;
- if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
- (i = screen->max_row - refreshheight + 1))
- refreshtop = i;
- if(screen->scrollWidget && !screen->alternate
- && screen->top_marg == 0) {
- scrolltop = 0;
- if((scrollheight += shift) > i)
- scrollheight = i;
- if((i = screen->savedlines) < screen->savelines) {
- if((i += amount) > screen->savelines)
- i = screen->savelines;
- screen->savedlines = i;
- ScrollBarDrawThumb(screen->scrollWidget);
- }
- } else {
- scrolltop = screen->top_marg + shift;
- if((i = screen->bot_marg - bot) > 0) {
- scrollheight -= i;
- if((i = screen->top_marg + amount - 1 - bot) >= 0) {
- refreshtop += i;
- refreshheight -= i;
- }
- }
- }
-
- if (screen->multiscroll && amount == 1 &&
- screen->topline == 0 && screen->top_marg == 0 &&
- screen->bot_marg == screen->max_row) {
- if (screen->incopy < 0 && screen->scrolls == 0)
- CopyWait(screen);
- screen->scrolls++;
- }
- scrolling_copy_area(screen, scrolltop+amount, scrollheight, amount);
- if(refreshheight > 0) {
- XClearArea (
- screen->display,
- TextWindow(screen),
- (int) screen->border + screen->scrollbar,
- (int) refreshtop * FontHeight(screen) + screen->border,
- (unsigned) Width(screen),
- (unsigned) refreshheight * FontHeight(screen),
- FALSE);
- if(refreshheight > shift)
- refreshheight = shift;
- }
- }
- if(screen->scrollWidget && !screen->alternate && screen->top_marg == 0)
- ScrnDeleteLine(screen->allbuf, screen->bot_marg +
- screen->savelines, 0, amount, screen->max_col + 1);
- else
- ScrnDeleteLine(screen->buf, screen->bot_marg, screen->top_marg,
- amount, screen->max_col + 1);
- if(refreshheight > 0)
- ScrnRefresh(screen, refreshtop, 0, refreshheight,
- screen->max_col + 1, False);
- }
-
-
- /*
- * Reverse scrolls the screen by amount lines, erases top, doesn't alter
- * cursor position (i.e. cursor moves up amount relative to text).
- * All done within the scrolling region, of course.
- * Requires: amount > 0
- */
- RevScroll(screen, amount)
- register TScreen *screen;
- register int amount;
- {
- register int i = screen->bot_marg - screen->top_marg + 1;
- register int shift;
- register int bot;
- register int refreshtop;
- register int refreshheight;
- register int scrolltop;
- register int scrollheight;
-
- if(screen->cursor_state)
- HideCursor();
- if (amount > i)
- amount = i;
- if(screen->jumpscroll) {
- if(screen->scroll_amt < 0) {
- if(-screen->refresh_amt + amount > i)
- FlushScroll(screen);
- screen->scroll_amt -= amount;
- screen->refresh_amt -= amount;
- } else {
- if(screen->scroll_amt > 0)
- FlushScroll(screen);
- screen->scroll_amt = -amount;
- screen->refresh_amt = -amount;
- }
- } else {
- shift = -screen->topline;
- bot = screen->max_row - shift;
- refreshheight = amount;
- scrollheight = screen->bot_marg - screen->top_marg -
- refreshheight + 1;
- refreshtop = screen->top_marg + shift;
- scrolltop = refreshtop + refreshheight;
- if((i = screen->bot_marg - bot) > 0)
- scrollheight -= i;
- if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
- refreshheight -= i;
-
- if (screen->multiscroll && amount == 1 &&
- screen->topline == 0 && screen->top_marg == 0 &&
- screen->bot_marg == screen->max_row) {
- if (screen->incopy < 0 && screen->scrolls == 0)
- CopyWait(screen);
- screen->scrolls++;
- }
- scrolling_copy_area(screen, scrolltop-amount, scrollheight, -amount);
- if(refreshheight > 0)
- XClearArea (
- screen->display,
- TextWindow(screen),
- (int) screen->border + screen->scrollbar,
- (int) refreshtop * FontHeight(screen) + screen->border,
- (unsigned) Width(screen),
- (unsigned) refreshheight * FontHeight(screen),
- FALSE);
- }
- ScrnInsertLine (screen->buf, screen->bot_marg, screen->top_marg,
- amount, screen->max_col + 1);
- }
-
- /*
- * If cursor not in scrolling region, returns. Else,
- * inserts n blank lines at the cursor's position. Lines above the
- * bottom margin are lost.
- */
- InsertLine (screen, n)
- register TScreen *screen;
- register int n;
- {
- register int i;
- register int shift;
- register int bot;
- register int refreshtop;
- register int refreshheight;
- register int scrolltop;
- register int scrollheight;
-
- if (screen->cur_row < screen->top_marg ||
- screen->cur_row > screen->bot_marg)
- return;
- if(screen->cursor_state)
- HideCursor();
- screen->do_wrap = 0;
- if (n > (i = screen->bot_marg - screen->cur_row + 1))
- n = i;
- if(screen->jumpscroll) {
- if(screen->scroll_amt <= 0 &&
- screen->cur_row <= -screen->refresh_amt) {
- if(-screen->refresh_amt + n > screen->max_row + 1)
- FlushScroll(screen);
- screen->scroll_amt -= n;
- screen->refresh_amt -= n;
- } else if(screen->scroll_amt)
- FlushScroll(screen);
- }
- if(!screen->scroll_amt) {
- shift = -screen->topline;
- bot = screen->max_row - shift;
- refreshheight = n;
- scrollheight = screen->bot_marg - screen->cur_row - refreshheight + 1;
- refreshtop = screen->cur_row + shift;
- scrolltop = refreshtop + refreshheight;
- if((i = screen->bot_marg - bot) > 0)
- scrollheight -= i;
- if((i = screen->cur_row + refreshheight - 1 - bot) > 0)
- refreshheight -= i;
- vertical_copy_area(screen, scrolltop-n, scrollheight, -n);
- if(refreshheight > 0)
- XClearArea (
- screen->display,
- TextWindow(screen),
- (int) screen->border + screen->scrollbar,
- (int) refreshtop * FontHeight(screen) + screen->border,
- (unsigned) Width(screen),
- (unsigned) refreshheight * FontHeight(screen),
- FALSE);
- }
- /* adjust screen->buf */
- ScrnInsertLine(screen->buf, screen->bot_marg, screen->cur_row, n,
- screen->max_col + 1);
- }
-
- /*
- * If cursor not in scrolling region, returns. Else, deletes n lines
- * at the cursor's position, lines added at bottom margin are blank.
- */
- DeleteLine(screen, n)
- register TScreen *screen;
- register int n;
- {
- register int i;
- register int shift;
- register int bot;
- register int refreshtop;
- register int refreshheight;
- register int scrolltop;
- register int scrollheight;
-
- if (screen->cur_row < screen->top_marg ||
- screen->cur_row > screen->bot_marg)
- return;
- if(screen->cursor_state)
- HideCursor();
- screen->do_wrap = 0;
- if (n > (i = screen->bot_marg - screen->cur_row + 1))
- n = i;
- if(screen->jumpscroll) {
- if(screen->scroll_amt >= 0 && screen->cur_row == screen->top_marg) {
- if(screen->refresh_amt + n > screen->max_row + 1)
- FlushScroll(screen);
- screen->scroll_amt += n;
- screen->refresh_amt += n;
- } else if(screen->scroll_amt)
- FlushScroll(screen);
- }
- if(!screen->scroll_amt) {
-
- shift = -screen->topline;
- bot = screen->max_row - shift;
- scrollheight = i - n;
- refreshheight = n;
- if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
- (i = screen->max_row - refreshheight + 1))
- refreshtop = i;
- if(screen->scrollWidget && !screen->alternate && screen->cur_row == 0) {
- scrolltop = 0;
- if((scrollheight += shift) > i)
- scrollheight = i;
- if((i = screen->savedlines) < screen->savelines) {
- if((i += n) > screen->savelines)
- i = screen->savelines;
- screen->savedlines = i;
- ScrollBarDrawThumb(screen->scrollWidget);
- }
- } else {
- scrolltop = screen->cur_row + shift;
- if((i = screen->bot_marg - bot) > 0) {
- scrollheight -= i;
- if((i = screen->cur_row + n - 1 - bot) >= 0) {
- refreshheight -= i;
- }
- }
- }
- vertical_copy_area(screen, scrolltop+n, scrollheight, n);
- if(refreshheight > 0)
- XClearArea (
- screen->display,
- TextWindow(screen),
- (int) screen->border + screen->scrollbar,
- (int) refreshtop * FontHeight(screen) + screen->border,
- (unsigned) Width(screen),
- (unsigned) refreshheight * FontHeight(screen),
- FALSE);
- }
- /* adjust screen->buf */
- if(screen->scrollWidget && !screen->alternate && screen->cur_row == 0)
- ScrnDeleteLine(screen->allbuf, screen->bot_marg +
- screen->savelines, 0, n, screen->max_col + 1);
- else
- ScrnDeleteLine(screen->buf, screen->bot_marg, screen->cur_row,
- n, screen->max_col + 1);
- }
-
- /*
- * Insert n blanks at the cursor's position, no wraparound
- */
- InsertChar (screen, n)
- register TScreen *screen;
- register int n;
- {
- register int cx, cy;
-
- if(screen->cursor_state)
- HideCursor();
- screen->do_wrap = 0;
- if(screen->cur_row - screen->topline <= screen->max_row) {
- if(!AddToRefresh(screen)) {
- if(screen->scroll_amt)
- FlushScroll(screen);
-
- /*
- * prevent InsertChar from shifting the end of a line over
- * if it is being appended to
- */
- if (non_blank_line (screen->buf, screen->cur_row,
- screen->cur_col, screen->max_col + 1))
- horizontal_copy_area(screen, screen->cur_col,
- screen->max_col+1 - (screen->cur_col+n),
- n);
-
- cx = CursorX (screen, screen->cur_col);
- cy = CursorY (screen, screen->cur_row);
-
- XFillRectangle(
- screen->display,
- TextWindow(screen),
- screen->reverseGC,
- cx, cy,
- (unsigned) n * FontWidth(screen), (unsigned) FontHeight(screen));
- }
- }
- /* adjust screen->buf */
- ScrnInsertChar(screen->buf, screen->cur_row, screen->cur_col, n,
- screen->max_col + 1);
- }
-
- /*
- * Deletes n chars at the cursor's position, no wraparound.
- */
- DeleteChar (screen, n)
- register TScreen *screen;
- register int n;
- {
- register int width;
-
- if(screen->cursor_state)
- HideCursor();
- screen->do_wrap = 0;
- if (n > (width = screen->max_col + 1 - screen->cur_col))
- n = width;
-
- if(screen->cur_row - screen->topline <= screen->max_row) {
- if(!AddToRefresh(screen)) {
- if(screen->scroll_amt)
- FlushScroll(screen);
-
- horizontal_copy_area(screen, screen->cur_col+n,
- screen->max_col+1 - (screen->cur_col+n),
- -n);
-
- XFillRectangle
- (screen->display, TextWindow(screen),
- screen->reverseGC,
- screen->border + screen->scrollbar
- + Width(screen) - n*FontWidth(screen),
- CursorY (screen, screen->cur_row), n * FontWidth(screen),
- FontHeight(screen));
- }
- }
- /* adjust screen->buf */
- ScrnDeleteChar (screen->buf, screen->cur_row, screen->cur_col, n,
- screen->max_col + 1);
-
- }
-
- /*
- * Clear from cursor position to beginning of display, inclusive.
- */
- ClearAbove (screen)
- register TScreen *screen;
- {
- register top, height;
-
- if(screen->cursor_state)
- HideCursor();
- if((top = -screen->topline) <= screen->max_row) {
- if(screen->scroll_amt)
- FlushScroll(screen);
- if((height = screen->cur_row + top) > screen->max_row)
- height = screen->max_row;
- if((height -= top) > 0)
- XClearArea(screen->display, TextWindow(screen),
- screen->border + screen->scrollbar, top *
- FontHeight(screen) + screen->border,
- Width(screen), height * FontHeight(screen), FALSE);
-
- if(screen->cur_row - screen->topline <= screen->max_row)
- ClearLeft(screen);
- }
- ClearBufRows(screen, 0, screen->cur_row - 1);
- }
-
- /*
- * Clear from cursor position to end of display, inclusive.
- */
- ClearBelow (screen)
- register TScreen *screen;
- {
- register top;
-
- ClearRight(screen);
- if((top = screen->cur_row - screen->topline) <= screen->max_row) {
- if(screen->scroll_amt)
- FlushScroll(screen);
- if(++top <= screen->max_row)
- XClearArea(screen->display, TextWindow(screen),
- screen->border + screen->scrollbar, top *
- FontHeight(screen) + screen->border,
- Width(screen), (screen->max_row - top + 1) *
- FontHeight(screen), FALSE);
- }
- ClearBufRows(screen, screen->cur_row + 1, screen->max_row);
- }
-
- /*
- * Clear last part of cursor's line, inclusive.
- */
- ClearRight (screen)
- register TScreen *screen;
- {
- if(screen->cursor_state)
- HideCursor();
- screen->do_wrap = 0;
- if(screen->cur_row - screen->topline <= screen->max_row) {
- if(!AddToRefresh(screen)) {
- if(screen->scroll_amt)
- FlushScroll(screen);
- XFillRectangle(screen->display, TextWindow(screen),
- screen->reverseGC,
- CursorX(screen, screen->cur_col),
- CursorY(screen, screen->cur_row),
- Width(screen) - screen->cur_col * FontWidth(screen),
- FontHeight(screen));
- }
- }
- bzero(screen->buf [2 * screen->cur_row] + screen->cur_col,
- (screen->max_col - screen->cur_col + 1));
- bzero(screen->buf [2 * screen->cur_row + 1] + screen->cur_col,
- (screen->max_col - screen->cur_col + 1));
- /* with the right part cleared, we can't be wrapping */
- screen->buf [2 * screen->cur_row + 1] [0] &= ~LINEWRAPPED;
- }
-
- /*
- * Clear first part of cursor's line, inclusive.
- */
- ClearLeft (screen)
- register TScreen *screen;
- {
- int i;
- Char *cp;
-
- if(screen->cursor_state)
- HideCursor();
- screen->do_wrap = 0;
- if(screen->cur_row - screen->topline <= screen->max_row) {
- if(!AddToRefresh(screen)) {
- if(screen->scroll_amt)
- FlushScroll(screen);
- XFillRectangle (screen->display, TextWindow(screen),
- screen->reverseGC,
- screen->border + screen->scrollbar,
- CursorY (screen, screen->cur_row),
- (screen->cur_col + 1) * FontWidth(screen),
- FontHeight(screen));
- }
- }
-
- for ( i=0, cp=screen->buf[2 * screen->cur_row];
- i < screen->cur_col + 1;
- i++, cp++)
- *cp = ' ';
- for ( i=0, cp=screen->buf[2 * screen->cur_row + 1];
- i < screen->cur_col + 1;
- i++, cp++)
- *cp = CHARDRAWN;
- }
-
- /*
- * Erase the cursor's line.
- */
- ClearLine(screen)
- register TScreen *screen;
- {
- if(screen->cursor_state)
- HideCursor();
- screen->do_wrap = 0;
- if(screen->cur_row - screen->topline <= screen->max_row) {
- if(!AddToRefresh(screen)) {
- if(screen->scroll_amt)
- FlushScroll(screen);
- XFillRectangle (screen->display, TextWindow(screen),
- screen->reverseGC,
- screen->border + screen->scrollbar,
- CursorY (screen, screen->cur_row),
- Width(screen), FontHeight(screen));
- }
- }
- bzero (screen->buf [2 * screen->cur_row], (screen->max_col + 1));
- bzero (screen->buf [2 * screen->cur_row + 1], (screen->max_col + 1));
- }
-
- ClearScreen(screen)
- register TScreen *screen;
- {
- register int top;
-
- if(screen->cursor_state)
- HideCursor();
- screen->do_wrap = 0;
- if((top = -screen->topline) <= screen->max_row) {
- if(screen->scroll_amt)
- FlushScroll(screen);
- if(top == 0)
- XClearWindow(screen->display, TextWindow(screen));
- else
- XClearArea(screen->display, TextWindow(screen),
- screen->border + screen->scrollbar,
- top * FontHeight(screen) + screen->border,
- Width(screen), (screen->max_row - top + 1) *
- FontHeight(screen), FALSE);
- }
- ClearBufRows (screen, 0, screen->max_row);
- }
-
- CopyWait(screen)
- register TScreen *screen;
- {
- XEvent reply;
- XEvent *rep = &reply;
-
- while (1) {
- XWindowEvent (screen->display, VWindow(screen),
- ExposureMask, &reply);
- switch (reply.type) {
- case Expose:
- HandleExposure (screen, &reply);
- break;
- case NoExpose:
- case GraphicsExpose:
- if (screen->incopy <= 0) {
- screen->incopy = 1;
- if (screen->scrolls > 0)
- screen->scrolls--;
- }
- if (reply.type == GraphicsExpose)
- HandleExposure (screen, &reply);
-
- if ((reply.type == NoExpose) ||
- ((XExposeEvent *)rep)->count == 0) {
- if (screen->incopy <= 0 && screen->scrolls > 0)
- screen->scrolls--;
- if (screen->scrolls == 0) {
- screen->incopy = 0;
- return;
- }
- screen->incopy = -1;
- }
- break;
- }
- }
- }
-
- /*
- * used by vertical_copy_area and and horizontal_copy_area
- */
- static void
- copy_area(screen, src_x, src_y, width, height, dest_x, dest_y)
- TScreen *screen;
- int src_x, src_y;
- unsigned int width, height;
- int dest_x, dest_y;
- {
- /* wait for previous CopyArea to complete unless
- multiscroll is enabled and active */
- if (screen->incopy && screen->scrolls == 0)
- CopyWait(screen);
- screen->incopy = -1;
-
- /* save for translating Expose events */
- screen->copy_src_x = src_x;
- screen->copy_src_y = src_y;
- screen->copy_width = width;
- screen->copy_height = height;
- screen->copy_dest_x = dest_x;
- screen->copy_dest_y = dest_y;
-
- XCopyArea(screen->display,
- TextWindow(screen), TextWindow(screen),
- screen->normalGC,
- src_x, src_y, width, height, dest_x, dest_y);
- }
-
- /*
- * use when inserting or deleting characters on the current line
- */
- static void
- horizontal_copy_area(screen, firstchar, nchars, amount)
- TScreen *screen;
- int firstchar; /* char pos on screen to start copying at */
- int nchars;
- int amount; /* number of characters to move right */
- {
- int src_x = CursorX(screen, firstchar);
- int src_y = CursorY(screen, screen->cur_row);
-
- copy_area(screen, src_x, src_y,
- (unsigned)nchars*FontWidth(screen), FontHeight(screen),
- src_x + amount*FontWidth(screen), src_y);
- }
-
- /*
- * use when inserting or deleting lines from the screen
- */
- static void
- vertical_copy_area(screen, firstline, nlines, amount)
- TScreen *screen;
- int firstline; /* line on screen to start copying at */
- int nlines;
- int amount; /* number of lines to move up (neg=down) */
- {
- if(nlines > 0) {
- int src_x = screen->border + screen->scrollbar;
- int src_y = firstline * FontHeight(screen) + screen->border;
-
- copy_area(screen, src_x, src_y,
- (unsigned)Width(screen), nlines*FontHeight(screen),
- src_x, src_y - amount*FontHeight(screen));
- }
- }
-
- /*
- * use when scrolling the entire screen
- */
- scrolling_copy_area(screen, firstline, nlines, amount)
- TScreen *screen;
- int firstline; /* line on screen to start copying at */
- int nlines;
- int amount; /* number of lines to move up (neg=down) */
- {
-
- if(nlines > 0) {
- vertical_copy_area(screen, firstline, nlines, amount);
- }
- }
-
- /*
- * Handler for Expose events on the VT widget.
- * Returns 1 iff the area where the cursor was got refreshed.
- */
- HandleExposure (screen, event)
- register TScreen *screen;
- register XEvent *event;
- {
- register XExposeEvent *reply = (XExposeEvent *)event;
-
- /* if not doing CopyArea or if this is a GraphicsExpose, don't translate */
- if(!screen->incopy || event->type != Expose)
- return handle_translated_exposure (screen, reply->x, reply->y,
- reply->width, reply->height);
- else {
- /* compute intersection of area being copied with
- area being exposed. */
- int both_x1 = Max(screen->copy_src_x, reply->x);
- int both_y1 = Max(screen->copy_src_y, reply->y);
- int both_x2 = Min(screen->copy_src_x+screen->copy_width,
- reply->x+reply->width);
- int both_y2 = Min(screen->copy_src_y+screen->copy_height,
- reply->y+reply->height);
- int value = 0;
-
- /* was anything copied affected? */
- if(both_x2 > both_x1 && both_y2 > both_y1) {
- /* do the copied area */
- value = handle_translated_exposure
- (screen, reply->x + screen->copy_dest_x - screen->copy_src_x,
- reply->y + screen->copy_dest_y - screen->copy_src_y,
- reply->width, reply->height);
- }
- /* was anything not copied affected? */
- if(reply->x < both_x1 || reply->y < both_y1
- || reply->x+reply->width > both_x2
- || reply->y+reply->height > both_y2)
- value = handle_translated_exposure (screen, reply->x, reply->y,
- reply->width, reply->height);
-
- return value;
- }
- }
-
- /*
- * Called by the ExposeHandler to do the actual repaint after the coordinates
- * have been translated to allow for any CopyArea in progress.
- * The rectangle passed in is pixel coordinates.
- */
- handle_translated_exposure (screen, rect_x, rect_y, rect_width, rect_height)
- register TScreen *screen;
- register int rect_x, rect_y;
- register unsigned int rect_width, rect_height;
- {
- register int toprow, leftcol, nrows, ncols;
- extern Bool waiting_for_initial_map;
-
- toprow = (rect_y - screen->border) / FontHeight(screen);
- if(toprow < 0)
- toprow = 0;
- leftcol = (rect_x - screen->border - screen->scrollbar)
- / FontWidth(screen);
- if(leftcol < 0)
- leftcol = 0;
- nrows = (rect_y + rect_height - 1 - screen->border) /
- FontHeight(screen) - toprow + 1;
- ncols =
- (rect_x + rect_width - 1 - screen->border - screen->scrollbar) /
- FontWidth(screen) - leftcol + 1;
- toprow -= screen->scrolls;
- if (toprow < 0) {
- nrows += toprow;
- toprow = 0;
- }
- if (toprow + nrows - 1 > screen->max_row)
- nrows = screen->max_row - toprow + 1;
- if (leftcol + ncols - 1 > screen->max_col)
- ncols = screen->max_col - leftcol + 1;
-
- if (nrows > 0 && ncols > 0) {
- ScrnRefresh (screen, toprow, leftcol, nrows, ncols, False);
- if (waiting_for_initial_map) {
- first_map_occurred ();
- }
- if (screen->cur_row >= toprow &&
- screen->cur_row < toprow + nrows &&
- screen->cur_col >= leftcol &&
- screen->cur_col < leftcol + ncols)
- return (1);
-
- }
- return (0);
- }
-
- ReverseVideo (termw)
- XtermWidget termw;
- {
- register TScreen *screen = &termw->screen;
- GC tmpGC;
- Window tek = TWindow(screen);
- unsigned long tmp;
-
- tmp = termw->core.background_pixel;
- if(screen->cursorcolor == screen->foreground)
- screen->cursorcolor = tmp;
- termw->core.background_pixel = screen->foreground;
- screen->foreground = tmp;
-
- tmp = screen->mousecolorback;
- screen->mousecolorback = screen->mousecolor;
- screen->mousecolor = tmp;
-
- tmpGC = screen->normalGC;
- screen->normalGC = screen->reverseGC;
- screen->reverseGC = tmpGC;
-
- tmpGC = screen->normalboldGC;
- screen->normalboldGC = screen->reverseboldGC;
- screen->reverseboldGC = tmpGC;
-
- recolor_cursor (screen->pointer_cursor,
- screen->mousecolor, screen->mousecolorback);
- recolor_cursor (screen->arrow,
- screen->mousecolor, screen->mousecolorback);
-
- termw->misc.re_verse = !termw->misc.re_verse;
-
- XDefineCursor(screen->display, TextWindow(screen), screen->pointer_cursor);
- if(tek)
- XDefineCursor(screen->display, tek, screen->arrow);
-
-
- if(screen->scrollWidget)
- ScrollBarReverseVideo(screen->scrollWidget);
-
- XSetWindowBackground(screen->display, TextWindow(screen), termw->core.background_pixel);
- if(tek) {
- TekReverseVideo(screen);
- }
- XClearWindow(screen->display, TextWindow(screen));
- ScrnRefresh (screen, 0, 0, screen->max_row + 1,
- screen->max_col + 1, False);
- if(screen->Tshow) {
- XClearWindow(screen->display, tek);
- TekExpose((Widget)NULL, (XEvent *)NULL, (Region)NULL);
- }
- update_reversevideo();
- }
-
-
- recolor_cursor (cursor, fg, bg)
- Cursor cursor; /* X cursor ID to set */
- unsigned long fg, bg; /* pixel indexes to look up */
- {
- register TScreen *screen = &term->screen;
- register Display *dpy = screen->display;
- XColor colordefs[2]; /* 0 is foreground, 1 is background */
-
- colordefs[0].pixel = fg;
- colordefs[1].pixel = bg;
- XQueryColors (dpy, DefaultColormap (dpy, DefaultScreen (dpy)),
- colordefs, 2);
- XRecolorCursor (dpy, cursor, colordefs, colordefs+1);
- return;
- }
-
-