svn commit: r270273 - head/sys/dev/vt
Jean-Sebastien Pedron
dumbbell at FreeBSD.org
Thu Aug 21 14:54:38 UTC 2014
Author: dumbbell
Date: Thu Aug 21 14:54:37 2014
New Revision: 270273
URL: http://svnweb.freebsd.org/changeset/base/270273
Log:
vt(4): If the cursor didn't move, don't mark its position as dirty
Currently, this has no effect, because the cursor is always redrawn
anyway. But this will be useful after improvements to the vd_bitbltchr_t
callback API.
The vt_device structure members used to store the position of the cursor
as of the last redraw are renamed from vd_mdirty{x,y} to vd_mold{x,y}.
The associated comment is fixed too. Also, their value is now expressed
in pixels, not in character columns/row.
MFC after: 1 week
Modified:
head/sys/dev/vt/vt.h
head/sys/dev/vt/vt_core.c
Modified: head/sys/dev/vt/vt.h
==============================================================================
--- head/sys/dev/vt/vt.h Thu Aug 21 14:12:11 2014 (r270272)
+++ head/sys/dev/vt/vt.h Thu Aug 21 14:54:37 2014 (r270273)
@@ -122,10 +122,10 @@ struct vt_device {
struct vt_window *vd_markedwin; /* (?) Copy/paste buf owner. */
const struct vt_driver *vd_driver; /* (c) Graphics driver. */
void *vd_softc; /* (u) Driver data. */
- uint16_t vd_mx; /* (?) Mouse X. */
- uint16_t vd_my; /* (?) Mouse Y. */
- vt_axis_t vd_mdirtyx; /* (?) Screen width. */
- vt_axis_t vd_mdirtyy; /* (?) Screen height. */
+ uint16_t vd_mx; /* (?) Current mouse X. */
+ uint16_t vd_my; /* (?) current mouse Y. */
+ vt_axis_t vd_moldx; /* (?) Mouse X as of last redraw. */
+ vt_axis_t vd_moldy; /* (?) Mouse Y as of last redraw. */
uint32_t vd_mstate; /* (?) Mouse state. */
term_pos_t vd_offset; /* (?) Pixel offset. */
vt_axis_t vd_width; /* (?) Screen width. */
Modified: head/sys/dev/vt/vt_core.c
==============================================================================
--- head/sys/dev/vt/vt_core.c Thu Aug 21 14:12:11 2014 (r270272)
+++ head/sys/dev/vt/vt_core.c Thu Aug 21 14:54:37 2014 (r270273)
@@ -835,9 +835,33 @@ vt_flush(struct vt_device *vd)
#ifndef SC_NO_CUTPASTE
if ((vd->vd_flags & VDF_MOUSECURSOR) && /* Mouse support enabled. */
!(vw->vw_flags & VWF_MOUSE_HIDE)) { /* Cursor displayed. */
- /* Mark last mouse position as dirty to erase. */
- vtbuf_mouse_cursor_position(&vw->vw_buf, vd->vd_mdirtyx,
- vd->vd_mdirtyy);
+ if (vd->vd_moldx != vd->vd_mx ||
+ vd->vd_moldy != vd->vd_my) {
+ /*
+ * Mark last mouse position as dirty to erase.
+ *
+ * FIXME: The font size could be different among
+ * all windows, so the column/row calculation
+ * below isn't correct for all windows.
+ *
+ * FIXME: The cursor can span more than one
+ * character cell. vtbuf_mouse_cursor_position
+ * marks surrounding cells as dirty. But due
+ * to font size possibly inconsistent across
+ * windows, this may not be sufficient. This
+ * causes part of the cursor to not be erased.
+ */
+ vtbuf_mouse_cursor_position(&vw->vw_buf,
+ vd->vd_moldx / vf->vf_width,
+ vd->vd_moldy / vf->vf_height);
+
+ /*
+ * Save point of last mouse cursor to erase it
+ * later.
+ */
+ vd->vd_moldx = vd->vd_mx;
+ vd->vd_moldy = vd->vd_my;
+ }
}
#endif
@@ -892,9 +916,6 @@ vt_flush(struct vt_device *vd)
vd->vd_offset.tp_row + vd->vd_my,
vd->vd_offset.tp_col + vd->vd_mx,
w, h, TC_WHITE, TC_BLACK);
- /* Save point of last mouse cursor to erase it later. */
- vd->vd_mdirtyx = vd->vd_mx / vf->vf_width;
- vd->vd_mdirtyy = vd->vd_my / vf->vf_height;
}
#endif
}
More information about the svn-src-head
mailing list