moused related panic

Giorgos Keramidas keramida at freebsd.org
Mon Sep 5 18:54:36 PDT 2005


On 2005-09-05 21:58, Slawa Olhovchenkov <slw at zxy.spb.ru> wrote:
> On Mon, Sep 05, 2005 at 12:27:13PM -0400, Craig Rodrigues wrote:
>
> > On Sat, Sep 03, 2005 at 04:33:44PM +0300, Giorgos Keramidas wrote:
> > > This was on a console running with 132x25 mode.
> >
> > Can you try this?
>
> 1. I think your remember '()' around '||'
> 2. Now mouse cursor not moved.

I think I've found why this seems broken in non-graphics VESA modes.  In
vesa_ioctl(), the 132x25 text mode triggers (diff since August 30):

-		return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0);
+		return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0, 0);

By calling sc_set_text_mode() with a font width of zero, scp->font_width is
then initialized to 0 and all set_mouse_pos() calls avoid running the patched
section:

> > -    if (scp->mouse_xpos != scp->mouse_oldxpos || scp->mouse_ypos != scp->mouse_oldypos) {
> > +    if (scp->mouse_xpos != scp->mouse_oldxpos || scp->mouse_ypos != scp->mouse_oldypos && scp->font_size != 0 && scp->font_width != 0) {
> >  	scp->status |= MOUSE_MOVED;
> >      	scp->mouse_pos =
> >  	    (scp->mouse_ypos/scp->font_size - scp->yoff)*scp->xsize

The following patch fixes the movement of the cursor in VESA text modes and
avoids a panic in non-graphics VESA modes, by wrapping the graphics-specific
changes to the position of the cursor in ISGRAPHSC(scp) checks.  The extra
KASSERT() is probably not necessary, but I'd vote for leaving it there anyway.

%%%
Index: scmouse.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/syscons/scmouse.c,v
retrieving revision 1.38
diff -u -r1.38 scmouse.c
--- scmouse.c	30 Aug 2005 18:58:16 -0000	1.38
+++ scmouse.c	6 Sep 2005 01:51:08 -0000
@@ -140,9 +140,12 @@
 static void
 set_mouse_pos(scr_stat *scp)
 {
-    if (scp->mouse_xpos < scp->xoff*scp->font_width)
-	scp->mouse_xpos = scp->xoff*scp->font_width;
-    if (scp->mouse_ypos < scp->yoff*scp->font_size)
+
+    KASSERT(scp != NULL, ("null scp"));
+
+    if (scp->font_width != 0 && scp->mouse_xpos < scp->xoff * scp->font_width)
+	scp->mouse_xpos = scp->xoff * scp->font_width;
+    if (scp->font_size != 0 && scp->mouse_ypos < scp->yoff * scp->font_size)
 	scp->mouse_ypos = scp->yoff*scp->font_size;
     if (ISGRAPHSC(scp)) {
         if (scp->mouse_xpos > scp->xpixel-1)
@@ -151,17 +154,21 @@
 	    scp->mouse_ypos = scp->ypixel-1;
 	return;
     } else {
-	if (scp->mouse_xpos > (scp->xsize + scp->xoff)*scp->font_width - 1)
-	    scp->mouse_xpos = (scp->xsize + scp->xoff)*scp->font_width - 1;
-	if (scp->mouse_ypos > (scp->ysize + scp->yoff)*scp->font_size - 1)
-	    scp->mouse_ypos = (scp->ysize + scp->yoff)*scp->font_size - 1;
+	if (scp->font_width != 0 &&
+	    scp->mouse_xpos > (scp->xsize + scp->xoff) * scp->font_width - 1)
+	    scp->mouse_xpos = (scp->xsize + scp->xoff) * scp->font_width - 1;
+	if (scp->font_size != 0 &&
+	    scp->mouse_ypos > (scp->ysize + scp->yoff) * scp->font_size - 1)
+	    scp->mouse_ypos = (scp->ysize + scp->yoff) * scp->font_size - 1;
     }
 
     if (scp->mouse_xpos != scp->mouse_oldxpos || scp->mouse_ypos != scp->mouse_oldypos) {
 	scp->status |= MOUSE_MOVED;
-    	scp->mouse_pos =
-	    (scp->mouse_ypos/scp->font_size - scp->yoff)*scp->xsize 
-		+ scp->mouse_xpos/scp->font_width - scp->xoff;
+	if (ISGRAPHSC(scp)) {
+	    scp->mouse_pos =
+		(scp->mouse_ypos / scp->font_size - scp->yoff) * scp->xsize +
+		scp->mouse_xpos / scp->font_width - scp->xoff;
+	}
 #ifndef SC_NO_CUTPASTE
 	if ((scp->status & MOUSE_VISIBLE) && (scp->status & MOUSE_CUTTING))
 	    mouse_cut(scp);
%%%


More information about the freebsd-current mailing list