summaryrefslogtreecommitdiffstats
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.c96
1 files changed, 43 insertions, 53 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index af242b3..60ceede 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -633,12 +633,7 @@ sckbdevent(keyboard_t *thiskbd, int event, void *arg)
}
}
-#ifndef SC_NO_CUTPASTE
- if (sc->cur_scp->status & MOUSE_VISIBLE) {
- sc_remove_mouse_image(sc->cur_scp);
- sc->cur_scp->status &= ~MOUSE_VISIBLE;
- }
-#endif /* SC_NO_CUTPASTE */
+ sc->cur_scp->status |= MOUSE_HIDDEN;
return 0;
}
@@ -1479,6 +1474,7 @@ sccncheckc(dev_t dev)
static void
sccndbctl(dev_t dev, int on)
{
+ /* assert(sc_console_unit >= 0) */
/* try to switch to the kernel console screen */
if (on && debugger == 0) {
/*
@@ -1489,8 +1485,10 @@ sccndbctl(dev_t dev, int on)
scrn_timer(NULL);
if (!cold
&& sc_console->sc->cur_scp->smode.mode == VT_AUTO
- && sc_console->smode.mode == VT_AUTO)
+ && sc_console->smode.mode == VT_AUTO) {
+ sc_console->sc->cur_scp->status |= MOUSE_HIDDEN;
sc_switch_scr(sc_console->sc, sc_console->index);
+ }
}
if (on)
++debugger;
@@ -1719,12 +1717,18 @@ scrn_update(scr_stat *scp, int show_cursor)
#ifndef SC_NO_CUTPASTE
/* remove the previous mouse pointer image if necessary */
- if ((scp->status & (MOUSE_VISIBLE | MOUSE_MOVED))
- == (MOUSE_VISIBLE | MOUSE_MOVED)) {
- /* FIXME: I don't like this... XXX */
- sc_remove_mouse_image(scp);
- if (scp->end >= scp->xsize*scp->ysize)
- scp->end = scp->xsize*scp->ysize - 1;
+ if (scp->status & MOUSE_VISIBLE) {
+ s = scp->mouse_pos;
+ e = scp->mouse_pos + scp->xsize + 1;
+ if ((scp->status & (MOUSE_MOVED | MOUSE_HIDDEN))
+ || and_region(&s, &e, scp->start, scp->end)
+ || ((scp->status & CURSOR_ENABLED) &&
+ (and_region(&s, &e, scp->cursor_pos, scp->cursor_pos)
+ || and_region(&s, &e, scp->cursor_oldpos, scp->cursor_oldpos)))) {
+ sc_remove_mouse_image(scp);
+ if (scp->end >= scp->xsize*scp->ysize)
+ scp->end = scp->xsize*scp->ysize - 1;
+ }
}
#endif /* !SC_NO_CUTPASTE */
@@ -1784,49 +1788,33 @@ scrn_update(scr_stat *scp, int show_cursor)
/* update cursor image */
if (scp->status & CURSOR_ENABLED) {
+ s = scp->start;
+ e = scp->end;
/* did cursor move since last time ? */
if (scp->cursor_pos != scp->cursor_oldpos) {
/* do we need to remove old cursor image ? */
- if (scp->cursor_oldpos < scp->start ||
- scp->cursor_oldpos > scp->end) {
+ if (!and_region(&s, &e, scp->cursor_oldpos, scp->cursor_oldpos))
sc_remove_cursor_image(scp);
- }
sc_draw_cursor_image(scp);
- }
- else {
- /* cursor didn't move, has it been overwritten ? */
- if (scp->cursor_pos >= scp->start && scp->cursor_pos <= scp->end) {
- sc_draw_cursor_image(scp);
- } else {
- /* if its a blinking cursor, we may have to update it */
- if (scp->sc->flags & SC_BLINK_CURSOR)
- (*scp->rndr->blink_cursor)(scp, scp->cursor_pos,
- sc_inside_cutmark(scp,
- scp->cursor_pos));
- }
+ } else {
+ 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)
+ /* if it's a blinking cursor, update it */
+ (*scp->rndr->blink_cursor)(scp, scp->cursor_pos,
+ sc_inside_cutmark(scp,
+ scp->cursor_pos));
}
}
#ifndef SC_NO_CUTPASTE
/* update "pseudo" mouse pointer image */
- if (scp->status & MOUSE_VISIBLE) {
- /* did mouse move since last time ? */
- if (scp->status & MOUSE_MOVED) {
- /* the previous pointer image has been removed, see above */
- scp->status &= ~MOUSE_MOVED;
- sc_draw_mouse_image(scp);
- } else {
- /* mouse didn't move, has it been overwritten ? */
- if (scp->mouse_pos + scp->xsize + 1 >= scp->start &&
- scp->mouse_pos <= scp->end) {
- sc_draw_mouse_image(scp);
- } else if (scp->cursor_pos == scp->mouse_pos ||
- scp->cursor_pos == scp->mouse_pos + 1 ||
- scp->cursor_pos == scp->mouse_pos + scp->xsize ||
- scp->cursor_pos == scp->mouse_pos + scp->xsize + 1) {
- sc_draw_mouse_image(scp);
- }
- }
+ if (scp->sc->flags & SC_MOUSE_ENABLED) {
+ if (!(scp->status & (MOUSE_VISIBLE | MOUSE_HIDDEN))) {
+ scp->status &= ~MOUSE_MOVED;
+ sc_draw_mouse_image(scp);
+ }
}
#endif /* SC_NO_CUTPASTE */
@@ -2346,6 +2334,7 @@ exchange_scr(sc_softc_t *sc)
else
sc_vtb_init(&scp->scr, VTB_FRAMEBUFFER, scp->xsize, scp->ysize,
(void *)sc->adp->va_window, FALSE);
+ scp->status |= MOUSE_HIDDEN;
sc_move_cursor(scp, scp->xpos, scp->ypos);
if (!ISGRAPHSC(scp))
sc_set_cursor_image(scp);
@@ -2408,7 +2397,7 @@ update_cursor_image(scr_stat *scp)
int blink;
if (scp->sc->flags & SC_CHAR_CURSOR) {
- scp->cursor_base = scp->sc->cursor_base;
+ 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;
@@ -2430,7 +2419,7 @@ void
sc_set_cursor_image(scr_stat *scp)
{
if (scp->sc->flags & SC_CHAR_CURSOR) {
- scp->cursor_base = scp->sc->cursor_base;
+ 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;
@@ -2566,7 +2555,6 @@ scinit(int unit, int flags)
sc_vtb_copy(&scp->scr, 0, &scp->vtb, 0, scp->xsize*scp->ysize);
/* move cursors to the initial positions */
- scp->mouse_pos = scp->mouse_oldpos = 0;
if (col >= scp->xsize)
col = 0;
if (row >= scp->ysize)
@@ -2580,6 +2568,9 @@ scinit(int unit, int flags)
sc->cursor_base = 0;
i = bios_value.cursor_end - bios_value.cursor_start + 1;
sc->cursor_height = imin(i, scp->font_size);
+#ifndef SC_NO_SYSMOUSE
+ sc_mouse_move(scp, scp->xpixel/2, scp->ypixel/2);
+#endif
if (!ISGRAPHSC(scp)) {
sc_set_cursor_image(scp);
sc_draw_cursor_image(scp);
@@ -2725,7 +2716,8 @@ sc_clean_up(scr_stat *scp)
if ((error = wait_scrn_saver_stop(scp->sc)))
return error;
#endif /* NSPLASH */
- scp->status &= ~MOUSE_VISIBLE;
+ scp->status |= MOUSE_HIDDEN;
+ sc_remove_mouse_image(scp);
sc_remove_cutmarking(scp);
return 0;
}
@@ -2844,8 +2836,6 @@ init_scp(sc_softc_t *sc, int vty, scr_stat *scp)
scp->border = BG_BLACK;
scp->cursor_base = sc->cursor_base;
scp->cursor_height = imin(sc->cursor_height, scp->font_size);
- scp->mouse_xpos = scp->xoff*8 + scp->xsize*8/2;
- scp->mouse_ypos = (scp->ysize + scp->yoff)*scp->font_size/2;
scp->mouse_cut_start = scp->xsize*scp->ysize;
scp->mouse_cut_end = -1;
scp->mouse_signal = 0;
@@ -2855,7 +2845,7 @@ init_scp(sc_softc_t *sc, int vty, scr_stat *scp)
scp->bell_pitch = bios_value.bell_pitch;
scp->bell_duration = BELL_DURATION;
scp->status |= (bios_value.shift_state & NLKED);
- scp->status |= CURSOR_ENABLED;
+ scp->status |= CURSOR_ENABLED | MOUSE_HIDDEN;
scp->pid = 0;
scp->proc = NULL;
scp->smode.mode = VT_AUTO;
OpenPOWER on IntegriCloud