Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/wscons - refactor vcons_cursor_noread() a bit so it ...
details: https://anonhg.NetBSD.org/src/rev/a15e5d62f75e
branches: trunk
changeset: 950372:a15e5d62f75e
user: macallan <macallan%NetBSD.org@localhost>
date: Tue Jan 26 16:24:17 2021 +0000
description:
- refactor vcons_cursor_noread() a bit so it works the same way as the other
_noread() methods instead of duplicating half of vcons_cursor()
- skip clearing the cursor only if we use all _noread() methods
- clear RI_CURSOR in all copy*_noread() methods as well if we overwrite the
cursor
diffstat:
sys/dev/wscons/wsdisplay_vcons.c | 93 +++++++++++++++++----------------------
1 files changed, 41 insertions(+), 52 deletions(-)
diffs (171 lines):
diff -r 02f2140f1a0c -r a15e5d62f75e sys/dev/wscons/wsdisplay_vcons.c
--- a/sys/dev/wscons/wsdisplay_vcons.c Tue Jan 26 15:30:05 2021 +0000
+++ b/sys/dev/wscons/wsdisplay_vcons.c Tue Jan 26 16:24:17 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wsdisplay_vcons.c,v 1.49 2021/01/25 02:11:41 macallan Exp $ */
+/* $NetBSD: wsdisplay_vcons.c,v 1.50 2021/01/26 16:24:17 macallan Exp $ */
/*-
* Copyright (c) 2005, 2006 Michael Lorenz
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.49 2021/01/25 02:11:41 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.50 2021/01/26 16:24:17 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -320,6 +320,7 @@
scr->scr_cookie = vd->cookie;
scr->scr_vd = scr->scr_origvd = vd;
scr->scr_busy = 0;
+
if (scr->scr_type == NULL)
scr->scr_type = vd->defaulttype;
@@ -336,7 +337,6 @@
vd->eraserows = ri->ri_ops.eraserows;
vd->erasecols = ri->ri_ops.erasecols;
scr->putchar = ri->ri_ops.putchar;
- vd->cursor = ri->ri_ops.cursor;
if (scr->scr_flags & VCONS_NO_COPYCOLS) {
vd->copycols = vcons_copycols_noread;
@@ -350,15 +350,16 @@
vd->copyrows = ri->ri_ops.copyrows;
}
+ if (scr->scr_flags & VCONS_NO_CURSOR) {
+ vd->cursor = vcons_cursor_noread;
+ } else {
+ vd->cursor = ri->ri_ops.cursor;
+ }
+
ri->ri_ops.eraserows = vcons_eraserows;
ri->ri_ops.erasecols = vcons_erasecols;
ri->ri_ops.putchar = vcons_putchar;
- if (scr->scr_flags & VCONS_NO_CURSOR) {
- ri->ri_ops.cursor = vcons_cursor_noread;
- } else {
- ri->ri_ops.cursor = vcons_cursor;
- }
-
+ ri->ri_ops.cursor = vcons_cursor;
ri->ri_ops.copycols = vcons_copycols;
ri->ri_ops.copyrows = vcons_copyrows;
@@ -471,14 +472,17 @@
vd->copyrows = ri->ri_ops.copyrows;
}
+ if (scr->scr_flags & VCONS_NO_CURSOR) {
+ vd->cursor = vcons_cursor_noread;
+ } else {
+ vd->cursor = ri->ri_ops.cursor;
+ }
+
/* and put our wrappers back */
ri->ri_ops.eraserows = vcons_eraserows;
ri->ri_ops.erasecols = vcons_erasecols;
ri->ri_ops.putchar = vcons_putchar;
- if (scr->scr_flags & VCONS_NO_CURSOR) {
- ri->ri_ops.cursor = vcons_cursor_noread;
- } else
- ri->ri_ops.cursor = vcons_cursor;
+ ri->ri_ops.cursor = vcons_cursor;
ri->ri_ops.copycols = vcons_copycols;
ri->ri_ops.copyrows = vcons_copyrows;
vcons_unlock(vd->active);
@@ -955,6 +959,9 @@
pos++;
ppos++;
}
+ if (ri->ri_crow == row &&
+ (ri->ri_ccol >= dstcol && ri->ri_ccol < (dstcol + ncols )))
+ ri->ri_flg &= ~RI_CURSOR;
}
vcons_unlock(scr);
}
@@ -1130,6 +1137,8 @@
ppos++;
}
}
+ if (ri->ri_crow >= dstrow && ri->ri_crow < (dstrow + nrows))
+ ri->ri_flg &= ~RI_CURSOR;
}
vcons_unlock(scr);
}
@@ -1318,53 +1327,33 @@
{
struct rasops_info *ri = cookie;
struct vcons_screen *scr = ri->ri_hw;
- int offset = 0;
-
-#if defined(VCONS_DRAW_INTR)
- if (scr->scr_vd->use_intr) {
- vcons_lock(scr);
- if (scr->scr_ri.ri_crow != row || scr->scr_ri.ri_ccol != col) {
- scr->scr_ri.ri_crow = row;
- scr->scr_ri.ri_ccol = col;
- atomic_inc_uint(&scr->scr_dirty);
- }
- vcons_unlock(scr);
- return;
- }
-#endif
-
- vcons_lock(scr);
+ int offset = 0, ofs;
#ifdef WSDISPLAY_SCROLLSUPPORT
offset = scr->scr_current_offset;
#endif
- if (SCREEN_IS_VISIBLE(scr) && SCREEN_CAN_DRAW(scr)) {
- int ofs = offset + ri->ri_crow * ri->ri_cols + ri->ri_ccol;
- if (on && (ri->ri_flg & RI_CURSOR)) {
- scr->putchar(cookie, ri->ri_crow, ri->ri_ccol,
- scr->scr_chars[ofs], scr->scr_attrs[ofs]);
- ri->ri_flg &= ~RI_CURSOR;
- }
- ri->ri_crow = row;
- ri->ri_ccol = col;
- ofs = offset + ri->ri_crow * ri->ri_cols + ri->ri_ccol;
- if (on) {
- scr->putchar(cookie, row, col, scr->scr_chars[ofs],
+ ofs = offset + ri->ri_crow * ri->ri_cols + ri->ri_ccol;
+ if ((ri->ri_flg & RI_CURSOR) &&
+ ((scr->scr_flags & VCONS_DONT_READ) != VCONS_DONT_READ)) {
+ scr->putchar(cookie, ri->ri_crow, ri->ri_ccol,
+ scr->scr_chars[ofs], scr->scr_attrs[ofs]);
+ ri->ri_flg &= ~RI_CURSOR;
+ }
+ ri->ri_crow = row;
+ ri->ri_ccol = col;
+ ofs = offset + ri->ri_crow * ri->ri_cols + ri->ri_ccol;
+ if (on) {
+ scr->putchar(cookie, row, col, scr->scr_chars[ofs],
#ifdef VCONS_DEBUG_CURSOR_NOREAD
- /* draw a red cursor so we can tell which cursor()
- * implementation is being used */
- ((scr->scr_attrs[ofs] & 0xff00ffff) ^ 0x0f000000) |
- 0x00010000);
+ /* draw a red cursor so we can tell which cursor()
+ * implementation is being used */
+ ((scr->scr_attrs[ofs] & 0xff00ffff) ^ 0x0f000000) |
+ 0x00010000);
#else
- scr->scr_attrs[ofs] ^ 0x0f0f0000);
+ scr->scr_attrs[ofs] ^ 0x0f0f0000);
#endif
- ri->ri_flg |= RI_CURSOR;
- }
- } else {
- scr->scr_ri.ri_crow = row;
- scr->scr_ri.ri_ccol = col;
+ ri->ri_flg |= RI_CURSOR;
}
- vcons_unlock(scr);
}
/* methods to read/write characters via ioctl() */
Home |
Main Index |
Thread Index |
Old Index