1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-16 10:20:30 +00:00

Refine cursor type/shape control escape sequences and

ioctls. We can now add ve, vi and vs capabilities to
cons25 in termcap.

Discussed with and tested by: ache
This commit is contained in:
Kazutaka YOKOTA 2001-08-02 08:30:40 +00:00
parent 61ce6eeee3
commit 4866e2769a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=81030
6 changed files with 235 additions and 113 deletions

View File

@ -199,8 +199,8 @@ vga_txtcursor_shape(scr_stat *scp, int base, int height, int blink)
return;
/* the caller may set height <= 0 in order to disable the cursor */
#if 0
scp->cursor_base = base;
scp->cursor_height = height;
scp->curs_attr.base = base;
scp->curs_attr.height = height;
#endif
(*vidsw[scp->sc->adapter]->set_hw_cursor_shape)(scp->sc->adp,
base, height,
@ -217,7 +217,7 @@ draw_txtcharcursor(scr_stat *scp, int at, u_short c, u_short a, int flip)
scp->cursor_saveunder_attr = a;
#ifndef SC_NO_FONT_LOADING
if (sc->flags & SC_CHAR_CURSOR) {
if (scp->curs_attr.flags & CONS_CHAR_CURSOR) {
unsigned char *font;
int h;
int i;
@ -232,22 +232,20 @@ draw_txtcharcursor(scr_stat *scp, int at, u_short c, u_short a, int flip)
font = sc->font_14;
h = 14;
}
if (scp->cursor_base >= h)
if (scp->curs_attr.base >= h)
return;
if (flip)
a = (a & 0x8800)
| ((a & 0x7000) >> 4) | ((a & 0x0700) << 4);
bcopy(font + c*h, font + sc->cursor_char*h, h);
font = font + sc->cursor_char*h;
for (i = imax(h - scp->cursor_base - scp->cursor_height, 0);
i < h - scp->cursor_base; ++i) {
for (i = imax(h - scp->curs_attr.base - scp->curs_attr.height, 0);
i < h - scp->curs_attr.base; ++i) {
font[i] ^= 0xff;
}
sc->font_loading_in_progress = TRUE;
/* XXX */
(*vidsw[sc->adapter]->load_font)(sc->adp, 0, h, font,
sc->cursor_char, 1);
sc->font_loading_in_progress = FALSE;
sc_vtb_putc(&scp->scr, at, sc->cursor_char, a);
} else
#endif /* SC_NO_FONT_LOADING */
@ -274,7 +272,7 @@ vga_txtcursor(scr_stat *scp, int at, int blink, int on, int flip)
video_adapter_t *adp;
int cursor_attr;
if (scp->cursor_height <= 0) /* the text cursor is disabled */
if (scp->curs_attr.height <= 0) /* the text cursor is disabled */
return;
adp = scp->sc->adp;
@ -621,8 +619,8 @@ vga_pxlcursor_shape(scr_stat *scp, int base, int height, int blink)
return;
/* the caller may set height <= 0 in order to disable the cursor */
#if 0
scp->cursor_base = base;
scp->cursor_height = height;
scp->curs_attr.base = base;
scp->curs_attr.height = height;
#endif
}
@ -644,7 +642,7 @@ draw_pxlcursor(scr_stat *scp, int at, int on, int flip)
+ scp->yoff*scp->font_size*line_width
+ (at%scp->xsize)
+ scp->font_size*line_width*(at/scp->xsize)
+ (scp->font_size - scp->cursor_base - 1)*line_width;
+ (scp->font_size - scp->curs_attr.base - 1)*line_width;
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
@ -666,8 +664,8 @@ draw_pxlcursor(scr_stat *scp, int at, int on, int flip)
col = (on) ? ((a & 0xf000) >> 4) : (a & 0x0f00);
outw(GDCIDX, col | 0x00); /* set/reset */
f = &(scp->font[sc_vtb_getc(&scp->vtb, at)*scp->font_size
+ scp->font_size - scp->cursor_base - 1]);
height = imin(scp->cursor_height, scp->font_size);
+ scp->font_size - scp->curs_attr.base - 1]);
height = imin(scp->curs_attr.height, scp->font_size);
for (i = 0; i < height; ++i, --f) {
outw(GDCIDX, (*f << 8) | 0x08); /* bit mask */
writeb(d, 0);
@ -683,7 +681,7 @@ static int pxlblinkrate = 0;
static void
vga_pxlcursor(scr_stat *scp, int at, int blink, int on, int flip)
{
if (scp->cursor_height <= 0) /* the text cursor is disabled */
if (scp->curs_attr.height <= 0) /* the text cursor is disabled */
return;
if (on) {

View File

@ -189,7 +189,21 @@ scterm_scan_esc(scr_stat *scp, term_stat *tcp, u_char c)
FG_LIGHTBLUE, FG_LIGHTMAGENTA, FG_LIGHTCYAN, FG_WHITE
#endif
};
static int cattrs[] = {
0, /* block */
CONS_BLINK_CURSOR, /* blinking block */
CONS_CHAR_CURSOR, /* underline */
CONS_CHAR_CURSOR | CONS_BLINK_CURSOR, /* blinking underline */
CONS_RESET_CURSOR, /* reset to default */
CONS_HIDDEN_CURSOR, /* hide cursor */
};
static int tcattrs[] = {
CONS_RESET_CURSOR | CONS_LOCAL_CURSOR, /* normal */
CONS_HIDDEN_CURSOR | CONS_LOCAL_CURSOR, /* invisible */
CONS_BLINK_CURSOR | CONS_LOCAL_CURSOR, /* very visible */
};
sc_softc_t *sc;
int v0, v1, v2;
int i, n;
i = n = 0;
@ -231,6 +245,8 @@ scterm_scan_esc(scr_stat *scp, term_stat *tcp, u_char c)
= tcp->dflt_std_color;
tcp->rev_color = tcp->dflt_rev_color;
tcp->cur_attr = mask2attr(tcp);
sc_change_cursor_shape(scp,
CONS_RESET_CURSOR | CONS_LOCAL_CURSOR, -1, -1);
sc_clear_screen(scp);
break;
@ -562,33 +578,34 @@ scterm_scan_esc(scr_stat *scp, term_stat *tcp, u_char c)
}
break;
case 'C': /* set cursor type & shape */
case 'C': /* set global/parmanent cursor type & shape */
i = spltty();
if (!ISGRAPHSC(sc->cur_scp))
sc_remove_cursor_image(sc->cur_scp);
if (tcp->num_param == 1) {
if (tcp->param[0] & 0x01)
sc->flags |= SC_BLINK_CURSOR;
else
sc->flags &= ~SC_BLINK_CURSOR;
if (tcp->param[0] & 0x02)
sc->flags |= SC_CHAR_CURSOR;
else
sc->flags &= ~SC_CHAR_CURSOR;
} else if (tcp->num_param == 2) {
sc->cursor_base = scp->font_size
- (tcp->param[1] & 0x1F) - 1;
sc->cursor_height = (tcp->param[1] & 0x1F)
- (tcp->param[0] & 0x1F) + 1;
}
/*
* The cursor shape is global property;
* all virtual consoles are affected.
* Update the cursor in the current console...
*/
if (!ISGRAPHSC(sc->cur_scp)) {
sc_set_cursor_image(sc->cur_scp);
sc_draw_cursor_image(sc->cur_scp);
n = tcp->num_param;
v0 = tcp->param[0];
v1 = tcp->param[1];
v2 = tcp->param[2];
switch (n) {
case 1: /* flags only */
if (v0 < sizeof(cattrs)/sizeof(cattrs[0]))
v0 = cattrs[v0];
else /* backward compatibility */
v0 = cattrs[v0 & 0x3];
sc_change_cursor_shape(scp, v0, -1, -1);
break;
case 2:
v2 = 0;
v0 &= 0x1f; /* backward compatibility */
v1 &= 0x1f;
/* FALL THROUGH */
case 3: /* base and height */
if (v2 == 0) /* count from top */
sc_change_cursor_shape(scp, -1,
scp->font_size - v1 - 1,
v1 - v0 + 1);
else if (v2 == 1) /* count from bottom */
sc_change_cursor_shape(scp, -1,
v0, v1 - v0 + 1);
break;
}
splx(i);
break;
@ -624,6 +641,23 @@ scterm_scan_esc(scr_stat *scp, term_stat *tcp, u_char c)
tcp->cur_attr = mask2attr(tcp);
}
break;
case 'S': /* set local/temporary cursor type & shape */
i = spltty();
n = tcp->num_param;
v0 = tcp->param[0];
switch (n) {
case 0:
v0 = 0;
/* FALL THROUGH */
case 1:
if (v0 < sizeof(tcattrs)/sizeof(tcattrs[0]))
sc_change_cursor_shape(scp,
tcattrs[v0], -1, -1);
break;
}
splx(i);
break;
}
#if notyet
} else if (tcp->esc == 4) { /* seen ESC Q */

View File

@ -199,8 +199,8 @@ vga_txtcursor_shape(scr_stat *scp, int base, int height, int blink)
return;
/* the caller may set height <= 0 in order to disable the cursor */
#if 0
scp->cursor_base = base;
scp->cursor_height = height;
scp->curs_attr.base = base;
scp->curs_attr.height = height;
#endif
(*vidsw[scp->sc->adapter]->set_hw_cursor_shape)(scp->sc->adp,
base, height,
@ -217,7 +217,7 @@ draw_txtcharcursor(scr_stat *scp, int at, u_short c, u_short a, int flip)
scp->cursor_saveunder_attr = a;
#ifndef SC_NO_FONT_LOADING
if (sc->flags & SC_CHAR_CURSOR) {
if (scp->curs_attr.flags & CONS_CHAR_CURSOR) {
unsigned char *font;
int h;
int i;
@ -232,22 +232,20 @@ draw_txtcharcursor(scr_stat *scp, int at, u_short c, u_short a, int flip)
font = sc->font_14;
h = 14;
}
if (scp->cursor_base >= h)
if (scp->curs_attr.base >= h)
return;
if (flip)
a = (a & 0x8800)
| ((a & 0x7000) >> 4) | ((a & 0x0700) << 4);
bcopy(font + c*h, font + sc->cursor_char*h, h);
font = font + sc->cursor_char*h;
for (i = imax(h - scp->cursor_base - scp->cursor_height, 0);
i < h - scp->cursor_base; ++i) {
for (i = imax(h - scp->curs_attr.base - scp->curs_attr.height, 0);
i < h - scp->curs_attr.base; ++i) {
font[i] ^= 0xff;
}
sc->font_loading_in_progress = TRUE;
/* XXX */
(*vidsw[sc->adapter]->load_font)(sc->adp, 0, h, font,
sc->cursor_char, 1);
sc->font_loading_in_progress = FALSE;
sc_vtb_putc(&scp->scr, at, sc->cursor_char, a);
} else
#endif /* SC_NO_FONT_LOADING */
@ -274,7 +272,7 @@ vga_txtcursor(scr_stat *scp, int at, int blink, int on, int flip)
video_adapter_t *adp;
int cursor_attr;
if (scp->cursor_height <= 0) /* the text cursor is disabled */
if (scp->curs_attr.height <= 0) /* the text cursor is disabled */
return;
adp = scp->sc->adp;
@ -621,8 +619,8 @@ vga_pxlcursor_shape(scr_stat *scp, int base, int height, int blink)
return;
/* the caller may set height <= 0 in order to disable the cursor */
#if 0
scp->cursor_base = base;
scp->cursor_height = height;
scp->curs_attr.base = base;
scp->curs_attr.height = height;
#endif
}
@ -644,7 +642,7 @@ draw_pxlcursor(scr_stat *scp, int at, int on, int flip)
+ scp->yoff*scp->font_size*line_width
+ (at%scp->xsize)
+ scp->font_size*line_width*(at/scp->xsize)
+ (scp->font_size - scp->cursor_base - 1)*line_width;
+ (scp->font_size - scp->curs_attr.base - 1)*line_width;
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
@ -666,8 +664,8 @@ draw_pxlcursor(scr_stat *scp, int at, int on, int flip)
col = (on) ? ((a & 0xf000) >> 4) : (a & 0x0f00);
outw(GDCIDX, col | 0x00); /* set/reset */
f = &(scp->font[sc_vtb_getc(&scp->vtb, at)*scp->font_size
+ scp->font_size - scp->cursor_base - 1]);
height = imin(scp->cursor_height, scp->font_size);
+ scp->font_size - scp->curs_attr.base - 1]);
height = imin(scp->curs_attr.height, scp->font_size);
for (i = 0; i < height; ++i, --f) {
outw(GDCIDX, (*f << 8) | 0x08); /* bit mask */
writeb(d, 0);
@ -683,7 +681,7 @@ static int pxlblinkrate = 0;
static void
vga_pxlcursor(scr_stat *scp, int at, int blink, int on, int flip)
{
if (scp->cursor_height <= 0) /* the text cursor is disabled */
if (scp->curs_attr.height <= 0) /* the text cursor is disabled */
return;
if (on) {

View File

@ -176,6 +176,7 @@ static int finish_vt_rel(scr_stat *scp, int release, int *s);
static int finish_vt_acq(scr_stat *scp);
static void exchange_scr(sc_softc_t *sc);
static void update_cursor_image(scr_stat *scp);
static void change_cursor_shape(scr_stat *scp, int flags, int base, int height);
static int save_kbd_state(scr_stat *scp);
static int update_kbd_state(scr_stat *scp, int state, int mask);
static int update_kbd_leds(scr_stat *scp, int which);
@ -697,26 +698,29 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
splx(s);
return 0;
case CONS_CURSORTYPE: /* set cursor type blink/noblink */
case CONS_CURSORTYPE: /* set cursor type (obsolete) */
s = spltty();
if (!ISGRAPHSC(sc->cur_scp))
sc_remove_cursor_image(sc->cur_scp);
if ((*(int*)data) & 0x01)
sc->flags |= SC_BLINK_CURSOR;
else
sc->flags &= ~SC_BLINK_CURSOR;
if ((*(int*)data) & 0x02) {
sc->flags |= SC_CHAR_CURSOR;
} else
sc->flags &= ~SC_CHAR_CURSOR;
/*
* The cursor shape is global property; all virtual consoles
* are affected. Update the cursor in the current console...
*/
if (!ISGRAPHSC(sc->cur_scp)) {
sc_set_cursor_image(sc->cur_scp);
sc_draw_cursor_image(sc->cur_scp);
*(int *)data &= CONS_CURSOR_ATTRS;
sc_change_cursor_shape(scp, *(int *)data, -1, -1);
splx(s);
return 0;
case CONS_GETCURSORSHAPE: /* get cursor shape (new interface) */
if (((int *)data)[0] & CONS_LOCAL_CURSOR) {
((int *)data)[0] = scp->curr_curs_attr.flags;
((int *)data)[1] = scp->curr_curs_attr.base;
((int *)data)[2] = scp->curr_curs_attr.height;
} else {
((int *)data)[0] = sc->curs_attr.flags;
((int *)data)[1] = sc->curs_attr.base;
((int *)data)[2] = sc->curs_attr.height;
}
return 0;
case CONS_SETCURSORSHAPE: /* set cursor shape (new interface) */
s = spltty();
sc_change_cursor_shape(scp, ((int *)data)[0],
((int *)data)[1], ((int *)data)[2]);
splx(s);
return 0;
@ -1791,7 +1795,7 @@ scrn_update(scr_stat *scp, int show_cursor)
if (and_region(&s, &e, scp->cursor_pos, scp->cursor_pos))
/* cursor didn't move, but has been overwritten */
sc_draw_cursor_image(scp);
else if (scp->sc->flags & SC_BLINK_CURSOR)
else if (scp->curs_attr.flags & CONS_BLINK_CURSOR)
/* if it's a blinking cursor, update it */
(*scp->rndr->blink_cursor)(scp, scp->cursor_pos,
sc_inside_cutmark(scp,
@ -2408,7 +2412,7 @@ sc_draw_cursor_image(scr_stat *scp)
/* assert(scp == scp->sc->cur_scp); */
++scp->sc->videoio_in_progress;
(*scp->rndr->draw_cursor)(scp, scp->cursor_pos,
scp->sc->flags & SC_BLINK_CURSOR, TRUE,
scp->curs_attr.flags & CONS_BLINK_CURSOR, TRUE,
sc_inside_cutmark(scp, scp->cursor_pos));
scp->cursor_oldpos = scp->cursor_pos;
--scp->sc->videoio_in_progress;
@ -2420,7 +2424,7 @@ sc_remove_cursor_image(scr_stat *scp)
/* assert(scp == scp->sc->cur_scp); */
++scp->sc->videoio_in_progress;
(*scp->rndr->draw_cursor)(scp, scp->cursor_oldpos,
scp->sc->flags & SC_BLINK_CURSOR, FALSE,
scp->curs_attr.flags & CONS_BLINK_CURSOR, FALSE,
sc_inside_cutmark(scp, scp->cursor_oldpos));
--scp->sc->videoio_in_progress;
}
@ -2428,45 +2432,98 @@ sc_remove_cursor_image(scr_stat *scp)
static void
update_cursor_image(scr_stat *scp)
{
int blink;
if (scp->sc->flags & SC_CHAR_CURSOR) {
scp->cursor_base = imax(0, scp->sc->cursor_base);
scp->cursor_height = imin(scp->sc->cursor_height, scp->font_size);
} else {
scp->cursor_base = 0;
scp->cursor_height = scp->font_size;
}
blink = scp->sc->flags & SC_BLINK_CURSOR;
/* assert(scp == scp->sc->cur_scp); */
++scp->sc->videoio_in_progress;
(*scp->rndr->draw_cursor)(scp, scp->cursor_oldpos, blink, FALSE,
sc_inside_cutmark(scp, scp->cursor_pos));
(*scp->rndr->set_cursor)(scp, scp->cursor_base, scp->cursor_height, blink);
(*scp->rndr->draw_cursor)(scp, scp->cursor_pos, blink, TRUE,
sc_inside_cutmark(scp, scp->cursor_pos));
--scp->sc->videoio_in_progress;
sc_remove_cursor_image(scp);
sc_set_cursor_image(scp);
sc_draw_cursor_image(scp);
}
void
sc_set_cursor_image(scr_stat *scp)
{
if (scp->sc->flags & SC_CHAR_CURSOR) {
scp->cursor_base = imax(0, scp->sc->cursor_base);
scp->cursor_height = imin(scp->sc->cursor_height, scp->font_size);
} else {
scp->cursor_base = 0;
scp->cursor_height = scp->font_size;
scp->curs_attr.flags = scp->curr_curs_attr.flags;
if (scp->curs_attr.flags & CONS_HIDDEN_CURSOR) {
/* hidden cursor is internally represented as zero-height underline */
scp->curs_attr.flags = CONS_CHAR_CURSOR;
scp->curs_attr.base = scp->curs_attr.height = 0;
} else if (scp->curs_attr.flags & CONS_CHAR_CURSOR) {
scp->curs_attr.base = imin(scp->curr_curs_attr.base,
scp->font_size - 1);
scp->curs_attr.height = imin(scp->curr_curs_attr.height,
scp->font_size - scp->curs_attr.base);
} else { /* block cursor */
scp->curs_attr.base = 0;
scp->curs_attr.height = scp->font_size;
}
/* assert(scp == scp->sc->cur_scp); */
++scp->sc->videoio_in_progress;
(*scp->rndr->set_cursor)(scp, scp->cursor_base, scp->cursor_height,
scp->sc->flags & SC_BLINK_CURSOR);
(*scp->rndr->set_cursor)(scp, scp->curs_attr.base, scp->curs_attr.height,
scp->curs_attr.flags & CONS_BLINK_CURSOR);
--scp->sc->videoio_in_progress;
}
static void
change_cursor_shape(scr_stat *scp, int flags, int base, int height)
{
if ((scp == scp->sc->cur_scp) && !ISGRAPHSC(scp))
sc_remove_cursor_image(scp);
if (base >= 0)
scp->curr_curs_attr.base = base;
if (height >= 0)
scp->curr_curs_attr.height = height;
if (flags & CONS_RESET_CURSOR)
scp->curr_curs_attr = scp->dflt_curs_attr;
else
scp->curr_curs_attr.flags = flags & CONS_CURSOR_ATTRS;
if ((scp == scp->sc->cur_scp) && !ISGRAPHSC(scp)) {
sc_set_cursor_image(scp);
sc_draw_cursor_image(scp);
}
}
void
sc_change_cursor_shape(scr_stat *scp, int flags, int base, int height)
{
sc_softc_t *sc;
dev_t dev;
int s;
int i;
s = spltty();
if ((flags != -1) && (flags & CONS_LOCAL_CURSOR)) {
/* local (per vty) change */
change_cursor_shape(scp, flags, base, height);
splx(s);
return;
}
/* global change */
sc = scp->sc;
if (base >= 0)
sc->curs_attr.base = base;
if (height >= 0)
sc->curs_attr.height = height;
if (flags != -1) {
if (flags & CONS_RESET_CURSOR)
sc->curs_attr = sc->dflt_curs_attr;
else
sc->curs_attr.flags = flags & CONS_CURSOR_ATTRS;
}
for (i = sc->first_vty; i < sc->first_vty + sc->vtys; ++i) {
if ((dev = SC_DEV(sc, i)) == NODEV)
continue;
if ((scp = SC_STAT(dev)) == NULL)
continue;
scp->dflt_curs_attr = sc->curs_attr;
change_cursor_shape(scp, CONS_RESET_CURSOR, -1, -1);
}
splx(s);
}
static void
scinit(int unit, int flags)
{
@ -2595,12 +2652,18 @@ scinit(int unit, int flags)
scp->xpos = col;
scp->ypos = row;
scp->cursor_pos = scp->cursor_oldpos = row*scp->xsize + col;
if (bios_value.cursor_end < scp->font_size)
sc->cursor_base = scp->font_size - bios_value.cursor_end - 1;
sc->dflt_curs_attr.base = scp->font_size -
bios_value.cursor_end - 1;
else
sc->cursor_base = 0;
sc->dflt_curs_attr.base = 0;
i = bios_value.cursor_end - bios_value.cursor_start + 1;
sc->cursor_height = imin(i, scp->font_size);
sc->dflt_curs_attr.height = imin(i, scp->font_size);
sc->dflt_curs_attr.flags = 0;
sc->curs_attr = sc->dflt_curs_attr;
scp->curr_curs_attr = scp->dflt_curs_attr = sc->curs_attr;
#ifndef SC_NO_SYSMOUSE
sc_mouse_move(scp, scp->xpixel/2, scp->ypixel/2);
#endif
@ -2868,8 +2931,7 @@ init_scp(sc_softc_t *sc, int vty, scr_stat *scp)
scp->ts = NULL;
scp->rndr = NULL;
scp->border = BG_BLACK;
scp->cursor_base = sc->cursor_base;
scp->cursor_height = imin(sc->cursor_height, scp->font_size);
scp->curr_curs_attr = scp->dflt_curs_attr = sc->curs_attr;
scp->mouse_cut_start = scp->xsize*scp->ysize;
scp->mouse_cut_end = -1;
scp->mouse_signal = 0;

View File

@ -155,6 +155,13 @@ typedef struct sc_vtb {
int vtb_tail; /* valid for VTB_RINGBUFFER only */
} sc_vtb_t;
/* text cursor attributes */
struct cursor_attr {
int flags;
int base;
int height;
};
/* softc */
struct keyboard;
@ -172,8 +179,10 @@ typedef struct sc_softc {
int flags; /* status flags */
#define SC_VISUAL_BELL (1 << 0)
#define SC_QUIET_BELL (1 << 1)
#if 0 /* not used anymore */
#define SC_BLINK_CURSOR (1 << 2)
#define SC_CHAR_CURSOR (1 << 3)
#endif
#define SC_MOUSE_ENABLED (1 << 4)
#define SC_SCRN_IDLE (1 << 5)
#define SC_SCRN_BLANKED (1 << 6)
@ -205,8 +214,8 @@ typedef struct sc_softc {
long scrn_time_stamp;
char cursor_base;
char cursor_height;
struct cursor_attr dflt_curs_attr;
struct cursor_attr curs_attr;
u_char scr_map[256];
u_char scr_rmap[256];
@ -267,8 +276,9 @@ typedef struct scr_stat {
int cursor_oldpos; /* cursor old buffer position */
u_short cursor_saveunder_char; /* saved char under cursor */
u_short cursor_saveunder_attr; /* saved attr under cursor */
char cursor_base; /* cursor base line # */
char cursor_height; /* cursor height */
struct cursor_attr dflt_curs_attr;
struct cursor_attr curr_curs_attr;
struct cursor_attr curs_attr;
int mouse_pos; /* mouse buffer position */
int mouse_oldpos; /* mouse old buffer position */
@ -517,6 +527,8 @@ void sc_puts(scr_stat *scp, u_char *buf, int len);
void sc_draw_cursor_image(scr_stat *scp);
void sc_remove_cursor_image(scr_stat *scp);
void sc_set_cursor_image(scr_stat *scp);
void sc_change_cursor_shape(scr_stat *scp, int flags,
int base, int height);
int sc_clean_up(scr_stat *scp);
int sc_switch_scr(sc_softc_t *sc, u_int next_scr);
void sc_alloc_scr_buffer(scr_stat *scp, int wait, int discard);

View File

@ -103,9 +103,11 @@ typedef struct ssaver ssaver_t;
#define CONS_SSAVER _IOW('c', 5, ssaver_t)
#define CONS_GSAVER _IOWR('c', 6, ssaver_t)
/* set the text cursor shape */
/* set the text cursor type (obsolete, see CONS_CURSORSHAPE below) */
/*
#define CONS_BLINK_CURSOR (1 << 0)
#define CONS_CHAR_CURSOR (1 << 1)
*/
#define CONS_CURSORTYPE _IOW('c', 7, int)
/* set the bell type to audible or visual */
@ -175,6 +177,22 @@ typedef struct mouse_info mouse_info_t;
/* start the screen saver */
#define CONS_SAVERSTART _IOW('c', 13, int)
/* set the text cursor shape (see also CONS_CURSORTYPE above) */
#define CONS_BLINK_CURSOR (1 << 0)
#define CONS_CHAR_CURSOR (1 << 1)
#define CONS_HIDDEN_CURSOR (1 << 2)
#define CONS_CURSOR_ATTRS (CONS_BLINK_CURSOR | CONS_CHAR_CURSOR | \
CONS_HIDDEN_CURSOR)
#define CONS_RESET_CURSOR (1 << 30)
#define CONS_LOCAL_CURSOR (1 << 31)
#define CONS_CURSOR_FLAGS (CONS_RESET_CURSOR | CONS_LOCAL_CURSOR)
struct cshape {
/* shape[0]: flags, shape[1]: base, shape[2]: height */
int shape[3];
};
#define CONS_GETCURSORSHAPE _IOWR('c', 14, struct cshape)
#define CONS_SETCURSORSHAPE _IOW('c', 15, struct cshape)
/* set/get font data */
struct fnt8 {
char fnt8x8[8*256];