Annotation of 43BSD/contrib/X/xterm/cursor.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.