diff options
Diffstat (limited to 'sys/dev/syscons/syscons.c')
-rw-r--r-- | sys/dev/syscons/syscons.c | 71 |
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; |