#include <X/mit-copyright.h>
/* Copyright 1984, 1985 Massachusetts Institute of Technology */
static char *rcsid_cursor_c
= "$Header: cursor.c,v 10.9 86/02/01 16:06:14 tony Rel $";
* Moves the cursor to the specified position, checking for bounds.
* (this includes scrolling regions)
* The origin is considered to be 0, 0 for this procedure.
CursorSet(screen
, row
, col
, flags
)
register int maxr
= screen
->max_row
;
row
= (row
< 0 ? 0 : row
);
col
= (col
< 0 ? 0 : col
);
screen
->cur_col
= (col
<= screen
->max_col
? col
: screen
->max_col
);
screen
->cur_row
= (row
<= maxr
? row
: maxr
);
* moves the cursor left n, no wrap around
* moves the cursor forward n, no wraparound
if (screen
->cur_col
> screen
->max_col
)
screen
->cur_col
= screen
->max_col
;
* moves the cursor down n, no scrolling.
* Won't pass bottom margin or bottom of screen.
max
= (screen
->cur_row
> screen
->bot_marg
?
screen
->max_row
: screen
->bot_marg
);
if (screen
->cur_row
> max
)
* moves the cursor up n, no linestarving.
* Won't pass top margin or top of screen.
min
= (screen
->cur_row
< screen
->top_marg
?
if (screen
->cur_row
< min
)
* Moves cursor down amount lines, scrolls if necessary.
* Won't leave scrolling region. No carriage return.
* indexing when below scrolling region is cursor down.
* if cursor high enough, no scrolling necessary.
if (screen
->cur_row
> screen
->bot_marg
|| screen
->cur_row
+ amount
<= screen
->bot_marg
) {
CursorDown(screen
, amount
);
Scroll(screen
, amount
- (screen
->bot_marg
- screen
->cur_row
));
CursorDown(screen
, screen
->bot_marg
- screen
->cur_row
);
* Moves cursor up amount lines, reverse scrolls if necessary.
* Won't leave scrolling region. No carriage return.
* reverse indexing when above scrolling region is cursor up.
* if cursor low enough, no reverse indexing needed
if (screen
->cur_row
< screen
->top_marg
|| screen
->cur_row
-amount
>= screen
->top_marg
) {
CursorUp(screen
, amount
);
RevScroll(screen
, amount
- (screen
->cur_row
- screen
->top_marg
));
CursorUp(screen
, screen
->cur_row
- screen
->top_marg
);
* Moves Cursor To First Column In Line
* Toggles cursor on or off at cursor position in screen.
CursorToggle(screen
, turnOn
)
int fg
= screen
->foreground
;
int bg
= screen
->background
;
short flags
= screen
->buf
[screen
->cur_row
] [screen
->cur_col
];
if (((turnOn
? INVERSEbit
: 0) ^ (flags
& INVERSEbit
))) {
bg
= screen
->cursorcolor
;
/* If in normal mode repaint character */
if ((c
= (flags
& CHAR
)) == 0) c
= ' ';
XText(screen
->window
, CursorX (screen
), CursorY(screen
), &c
,1,
((flags
& BOLDbit
) ? screen
->fnt_bold
: screen
->fnt_norm
),
/* If in Tek mode then invert */
/* If in TekAmode then use TCursor instead of Cursor */
} else if (screen
->TekAMode
)
XPixFill(screen
->window
, TCursorX (screen
), TCursorY(screen
),
screen
->f_width
, screen
->f_height
, screen
->foreground
,
0, GXinvert
, screen
->xorplane
);
/* Avoid toggling cursor during Tektronix coordinate computations */
else if (!screen
->TekGMode
)
XPixFill(screen
->window
, CursorX (screen
), CursorY(screen
),
screen
->f_width
, screen
->f_height
, screen
->foreground
,
0, GXinvert
, screen
->xorplane
);