Annotation of 43BSDTahoe/new/X/xterm/cursor.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     $Source: /u1/X/xterm/RCS/cursor.c,v $
                      3:  *     $Header: cursor.c,v 10.100 86/12/01 14:43:54 jg Rel $
                      4:  */
                      5: 
                      6: #ifndef lint
                      7: static char *rcsid_cursor_c = "$Header: cursor.c,v 10.100 86/12/01 14:43:54 jg Rel $";
                      8: #endif lint
                      9: 
                     10: #include <X/mit-copyright.h>
                     11: 
                     12: /* Copyright 1984, 1985   Massachusetts Institute of Technology                */
                     13: 
                     14: /* cursor.c */
                     15: 
                     16: 
                     17: #ifndef lint
                     18: static char sccs_id[] = "@(#)cursor.c\tX10/6.6B\t12/26/86";
                     19: #endif lint
                     20: 
                     21: #include <X/Xlib.h>
                     22: #include <stdio.h>
                     23: #include <sys/ioctl.h>
                     24: #include "scrollbar.h"
                     25: #include "ptyx.h"
                     26: 
                     27: extern Terminal term;
                     28: 
                     29: /*
                     30:  * Moves the cursor to the specified position, checking for bounds.
                     31:  * (this includes scrolling regions)
                     32:  * The origin is considered to be 0, 0 for this procedure.
                     33:  * In the status line, the cursor moves only horizontally.
                     34:  */
                     35: CursorSet(screen, row, col, flags)
                     36: register Screen        *screen;
                     37: register int   row, col;
                     38: unsigned       flags;
                     39: {
                     40:        register int maxr;
                     41: 
                     42:        col = (col < 0 ? 0 : col);
                     43:        screen->cur_col = (col <= screen->max_col ? col : screen->max_col);
                     44:        if(!screen->instatus) {
                     45:                maxr = screen->max_row;
                     46:                if (flags & ORIGIN) {
                     47:                        row += screen->top_marg;
                     48:                        maxr = screen->bot_marg;
                     49:                }
                     50:                row = (row < 0 ? 0 : row);
                     51:                screen->cur_row = (row <= maxr ? row : maxr);
                     52:        }
                     53:        screen->do_wrap = 0;
                     54: }
                     55: 
                     56: /*
                     57:  * moves the cursor left n, no wrap around
                     58:  */
                     59: CursorBack(screen, n)
                     60: register Screen        *screen;
                     61: int            n;
                     62: {
                     63:        register int i, j, k, rev;
                     64: 
                     65:        if((rev = (term.flags & (REVERSEWRAP | WRAPAROUND)) ==
                     66:         (REVERSEWRAP | WRAPAROUND)) && screen->do_wrap)
                     67:                n--;
                     68:        if ((screen->cur_col -= n) < 0) {
                     69:                if(rev) {
                     70:                        if((i = (j = screen->max_col + 1) * screen->cur_row +
                     71:                         screen->cur_col) < 0) {
                     72:                                k = j * (screen->max_row + 1);
                     73:                                i += ((-i) / k + 1) * k;
                     74:                        }
                     75:                        screen->cur_row = i / j;
                     76:                        screen->cur_col = i % j;
                     77:                } else
                     78:                        screen->cur_col = 0;
                     79:        }
                     80:        screen->do_wrap = 0;
                     81: }
                     82: 
                     83: /*
                     84:  * moves the cursor forward n, no wraparound
                     85:  */
                     86: CursorForward(screen, n)
                     87: register Screen        *screen;
                     88: int            n;
                     89: {
                     90:        screen->cur_col += n;
                     91:        if (screen->cur_col > screen->max_col)
                     92:                screen->cur_col = screen->max_col;
                     93:        screen->do_wrap = 0;
                     94: }
                     95: 
                     96: /* 
                     97:  * moves the cursor down n, no scrolling.
                     98:  * Won't pass bottom margin or bottom of screen.
                     99:  */
                    100: CursorDown(screen, n)
                    101: register Screen        *screen;
                    102: int            n;
                    103: {
                    104:        register int max;
                    105: 
                    106:        max = (screen->cur_row > screen->bot_marg ?
                    107:                screen->max_row : screen->bot_marg);
                    108: 
                    109:        screen->cur_row += n;
                    110:        if (screen->cur_row > max)
                    111:                screen->cur_row = max;
                    112:        screen->do_wrap = 0;
                    113: }
                    114: 
                    115: /* 
                    116:  * moves the cursor up n, no linestarving.
                    117:  * Won't pass top margin or top of screen.
                    118:  */
                    119: CursorUp(screen, n)
                    120: register Screen        *screen;
                    121: int            n;
                    122: {
                    123:        register int min;
                    124: 
                    125:        min = (screen->cur_row < screen->top_marg ?
                    126:                0 : screen->top_marg);
                    127: 
                    128:        screen->cur_row -= n;
                    129:        if (screen->cur_row < min)
                    130:                screen->cur_row = min;
                    131:        screen->do_wrap = 0;
                    132: }
                    133: 
                    134: /* 
                    135:  * Moves cursor down amount lines, scrolls if necessary.
                    136:  * Won't leave scrolling region. No carriage return.
                    137:  */
                    138: Index(screen, amount)
                    139: register Screen        *screen;
                    140: register int   amount;
                    141: {
                    142:        register int lines, j;
                    143:        register char *str;
                    144:        int n;
                    145:        XEvent ev;
                    146: 
                    147:        /* 
                    148:         * indexing when below scrolling region is cursor down.
                    149:         * if cursor high enough, no scrolling necessary.
                    150:         */
                    151:        if (screen->cur_row > screen->bot_marg
                    152:         || screen->cur_row + amount <= screen->bot_marg) {
                    153:                if(screen->pagemode)
                    154:                        screen->pagecnt += amount;
                    155:                CursorDown(screen, amount);
                    156:                return;
                    157:        }
                    158: 
                    159:        CursorDown(screen, j = screen->bot_marg - screen->cur_row);
                    160:        amount -= j;
                    161:        if((lines = screen->bot_marg - screen->top_marg - screen->pageoverlap)
                    162:         <= 0)
                    163:                lines = 1;
                    164:        if(!screen->pagemode || (amount + screen->pagecnt) <= lines) {
                    165:                if(screen->pagemode)
                    166:                        screen->pagecnt += amount;
                    167:                Scroll(screen, amount);
                    168:                return;
                    169:        }
                    170:        ioctl(screen->respond, TIOCSTOP, NULL);
                    171:        if(screen->cursor_state)
                    172:                HideCursor();
                    173:        if((j = lines - screen->pagecnt) > 0) {
                    174:                Scroll(screen, j);
                    175:                amount -= j;
                    176:        }
                    177:        do {
                    178:                if(screen->scroll_amt)
                    179:                        FlushScroll(screen);
                    180:                j = FALSE;
                    181:                do {
                    182:                        XNextEvent(&ev);
                    183:                        switch((int)ev.type) {
                    184:                         case KeyPressed:
                    185:                                str = XLookupMapping(&ev, &n);
                    186:                                if(n > 0) {
                    187:                                        if(*str == '\r')
                    188:                                                screen->pagecnt = (lines - 1);
                    189:                                        else if(*str < ' ' || *str == '\177') {
                    190:                                                screen->pagecnt = 0;
                    191:                                                Input(&term.keyboard, screen,
                    192:                                                 &ev);
                    193:                                                ioctl(screen->respond, TIOCSTOP,
                    194:                                                 NULL);
                    195:                                        } else
                    196:                                                screen->pagecnt = 0;
                    197:                                } else
                    198:                                        screen->pagecnt = 0;
                    199:                                j = TRUE;
                    200:                                break;
                    201:                         case ButtonPressed:
                    202:                         case ButtonReleased:
                    203:                                screen->pagecnt = amount;
                    204:                                xeventpass(&ev);
                    205:                                if(!screen->pagemode) {
                    206:                                        Scroll(screen, amount);
                    207:                                        ioctl(screen->respond, TIOCSTART, NULL);
                    208:                                        return;
                    209:                                }
                    210:                                break;
                    211:                         default:
                    212:                                xeventpass(&ev);
                    213:                                break;
                    214:                        }
                    215:                } while(!j);
                    216:                j = lines - screen->pagecnt;
                    217:                if(j > amount)
                    218:                        j = amount;
                    219:                Scroll(screen, j);
                    220:                screen->pagecnt += j;
                    221:        } while((amount -= j) > 0);
                    222:        ioctl(screen->respond, TIOCSTART, NULL);
                    223: }
                    224: 
                    225: /*
                    226:  * Moves cursor up amount lines, reverse scrolls if necessary.
                    227:  * Won't leave scrolling region. No carriage return.
                    228:  */
                    229: RevIndex(screen, amount)
                    230: register Screen        *screen;
                    231: register int   amount;
                    232: {
                    233:        /*
                    234:         * reverse indexing when above scrolling region is cursor up.
                    235:         * if cursor low enough, no reverse indexing needed
                    236:         */
                    237:        if (screen->cur_row < screen->top_marg
                    238:         || screen->cur_row-amount >= screen->top_marg) {
                    239:                CursorUp(screen, amount);
                    240:                return;
                    241:        }
                    242: 
                    243:        RevScroll(screen, amount - (screen->cur_row - screen->top_marg));
                    244:        CursorUp(screen, screen->cur_row - screen->top_marg);
                    245: }
                    246: 
                    247: /*
                    248:  * Moves Cursor To First Column In Line
                    249:  */
                    250: CarriageReturn(screen)
                    251: register Screen *screen;
                    252: {
                    253:        screen->cur_col = 0;
                    254:        screen->do_wrap = 0;
                    255: }
                    256: 
                    257: /*
                    258:  * Save Cursor and Attributes
                    259:  */
                    260: CursorSave(term, sc)
                    261: register Terminal *term;
                    262: register SavedCursor *sc;
                    263: {
                    264:        register Screen *screen = &term->screen;
                    265: 
                    266:        sc->row = screen->cur_row;
                    267:        sc->col = screen->cur_col;
                    268:        sc->flags = term->flags;
                    269:        sc->curgl = screen->curgl;
                    270:        sc->curgr = screen->curgr;
                    271:        bcopy(screen->gsets, sc->gsets, sizeof(screen->gsets));
                    272: }
                    273: 
                    274: /*
                    275:  * Restore Cursor and Attributes
                    276:  */
                    277: CursorRestore(term, sc)
                    278: register Terminal *term;
                    279: register SavedCursor *sc;
                    280: {
                    281:        register Screen *screen = &term->screen;
                    282: 
                    283:        bcopy(sc->gsets, screen->gsets, sizeof(screen->gsets));
                    284:        screen->curgl = sc->curgl;
                    285:        screen->curgr = sc->curgr;
                    286:        term->flags &= ~(BOLD|INVERSE|UNDERLINE);
                    287:        term->flags |= sc->flags & (BOLD|INVERSE|UNDERLINE);
                    288:        CursorSet(screen, sc->row, sc->col, term->flags);
                    289: }

unix.superglobalmegacorp.com

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