Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Aug 2014 14:54:37 +0000 (UTC)
From:      Jean-Sebastien Pedron <dumbbell@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r270273 - head/sys/dev/vt
Message-ID:  <201408211454.s7LEsbIM012504@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408211454.s7LEsbIM012504>