aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/syscons/syscons.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/syscons/syscons.c')
-rw-r--r--sys/dev/syscons/syscons.c71
1 files changed, 41 insertions, 30 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 4141dea4b05f..bf610c993027 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -873,6 +873,7 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
{
int error;
int i;
+ struct cursor_attr *cap;
sc_softc_t *sc;
scr_stat *scp;
int s;
@@ -942,15 +943,17 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
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;
+ switch (((int *)data)[0] & CONS_LOCAL_CURSOR) {
+ case 0:
+ cap = &sc->curs_attr;
+ break;
+ case CONS_LOCAL_CURSOR:
+ cap = &scp->base_curs_attr;
+ break;
}
+ ((int *)data)[1] = cap->base;
+ ((int *)data)[2] = cap->height;
+ ((int *)data)[0] = cap->flags;
return 0;
case CONS_SETCURSORSHAPE: /* set cursor shape (new interface) */
@@ -2982,15 +2985,15 @@ update_cursor_image(scr_stat *scp)
void
sc_set_cursor_image(scr_stat *scp)
{
- scp->curs_attr.flags = scp->curr_curs_attr.flags;
+ scp->curs_attr = scp->base_curs_attr;
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->curs_attr.base = imin(scp->base_curs_attr.base,
scp->font_size - 1);
- scp->curs_attr.height = imin(scp->curr_curs_attr.height,
+ scp->curs_attr.height = imin(scp->base_curs_attr.height,
scp->font_size - scp->curs_attr.base);
} else { /* block cursor */
scp->curs_attr.base = 0;
@@ -3005,19 +3008,30 @@ sc_set_cursor_image(scr_stat *scp)
}
static void
+sc_adjust_ca(struct cursor_attr *cap, int flags, int base, int height)
+{
+ if (0) {
+ /* Dummy clause to avoid changing indentation later. */
+ } else {
+ if (base >= 0)
+ cap->base = base;
+ if (height >= 0)
+ cap->height = height;
+ if (!(flags & CONS_SHAPEONLY_CURSOR))
+ cap->flags = flags & CONS_CURSOR_ATTRS;
+ }
+}
+
+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;
+ scp->base_curs_attr = scp->dflt_curs_attr;
else
- scp->curr_curs_attr.flags = flags & CONS_CURSOR_ATTRS;
+ sc_adjust_ca(&scp->base_curs_attr, flags, base, height);
if ((scp == scp->sc->cur_scp) && !ISGRAPHSC(scp)) {
sc_set_cursor_image(scp);
@@ -3033,8 +3047,11 @@ sc_change_cursor_shape(scr_stat *scp, int flags, int base, int height)
int s;
int i;
+ if (flags == -1)
+ flags = CONS_SHAPEONLY_CURSOR;
+
s = spltty();
- if ((flags != -1) && (flags & CONS_LOCAL_CURSOR)) {
+ if (flags & CONS_LOCAL_CURSOR) {
/* local (per vty) change */
change_cursor_shape(scp, flags, base, height);
splx(s);
@@ -3043,16 +3060,10 @@ sc_change_cursor_shape(scr_stat *scp, int flags, int base, int height)
/* 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;
- }
+ if (flags & CONS_RESET_CURSOR)
+ sc->curs_attr = sc->dflt_curs_attr;
+ else
+ sc_adjust_ca(&sc->curs_attr, flags, base, height);
for (i = sc->first_vty; i < sc->first_vty + sc->vtys; ++i) {
if ((tp = SC_DEV(sc, i)) == NULL)
@@ -3212,7 +3223,7 @@ scinit(int unit, int flags)
sc->dflt_curs_attr.height = howmany(scp->font_size, 8);
sc->dflt_curs_attr.flags = 0;
sc->curs_attr = sc->dflt_curs_attr;
- scp->curr_curs_attr = scp->dflt_curs_attr = sc->curs_attr;
+ scp->base_curs_attr = scp->dflt_curs_attr = sc->curs_attr;
#ifndef SC_NO_SYSMOUSE
sc_mouse_move(scp, scp->xpixel/2, scp->ypixel/2);
@@ -3525,7 +3536,7 @@ init_scp(sc_softc_t *sc, int vty, scr_stat *scp)
scp->ts = NULL;
scp->rndr = NULL;
scp->border = (SC_NORM_ATTR >> 4) & 0x0f;
- scp->curr_curs_attr = scp->dflt_curs_attr = sc->curs_attr;
+ scp->base_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;