tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Adding mouse sensitivity adjustment to wsmouse



On Thu May 20 2010 11:04:01 Marc Balmer wrote:
> Am 20.05.10 18:58, schrieb Sverre Froyen:
> > On Thu May 20 2010 10:49:06 Marc Balmer wrote:
> >> So I suggest that you leave out the changes for absolute positioning
> >> devices, I have some, and I can not imagine how this would be of any
> >> good in this case.  For relative devices, I think the approach can make
> >> sense.
> >> 
> >> Can you provide a complete diff?  Make sure the default settings are the
> >> same as we have now, i.e. don't break existing setups.
> > 
> > It is a complete diff except for the ioctls. I was hoping for some input
> > on that aspect.
> 
> Well, I more or less suggested you provide a *new* complete diff, with
> the absolute parts removed.

OK. New diff attached. 

> As for the ioctls, I suggest you make a proposal.  Looks to me like you
> only have to pass an X, Y, and Z factor to the driver.

Possible ioctls in new diff. I suggest we delete the old and never(?) 
implemented WSMOUSEIO_SSCALE.

> Also you might want to check if the scaling functionality is present in
> X.Org already?

It appears that xorg provides acceleration support only (xinput set-ptr-
feedback). As you suggested, changing xorg.conf allows configuring the two 
mouse inputs separately, so adding scaling support to xorg would solve my 
problem.

Finally, it looks like moused(8) provides linear scaling support. I have not 
yet tested it, however.

Thanks,
Sverre
? sys/dev/wscons/wsmouse.c.save
Index: sys/dev/wscons/wsconsio.h
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsconsio.h,v
retrieving revision 1.92
diff -u -p -r1.92 wsconsio.h
--- sys/dev/wscons/wsconsio.h   31 Dec 2009 05:08:05 -0000      1.92
+++ sys/dev/wscons/wsconsio.h   20 May 2010 23:28:28 -0000
@@ -217,9 +217,6 @@ struct wskbd_scroll_data {
 #define        WSMOUSE_RES_DEFAULT     75
 #define        WSMOUSE_RES_MAX         100
 
-/* Set scale factor (num / den).  Not applicable to all mouse types. */
-#define        WSMOUSEIO_SSCALE        _IOW('W', 34, u_int[2])
-
 /* Set sample rate.  Not applicable to all mouse types. */
 #define        WSMOUSEIO_SRATE         _IOW('W', 35, u_int)
 #define        WSMOUSE_RATE_MIN        0
@@ -265,6 +262,11 @@ struct wsmouse_repeat {
 #define WSMOUSEIO_SETVERSION   _IOW('W', 41, int)
 #define WSMOUSE_EVENT_VERSION  WSEVENT_VERSION
 
+/* Set scale factor in percent. */
+#define        WSMOUSEIO_SETSCALEXY    _IOW('W', 42, int)
+#define        WSMOUSEIO_SETSCALEZ     _IOW('W', 43, int)
+#define        WSMOUSEIO_SETSCALEW     _IOW('W', 44, int)
+
 /*
  * Display ioctls (64 - 95)
  */
Index: sys/dev/wscons/wsmouse.c
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsmouse.c,v
retrieving revision 1.62
diff -u -p -r1.62 wsmouse.c
--- sys/dev/wscons/wsmouse.c    15 Jan 2009 04:22:11 -0000      1.62
+++ sys/dev/wscons/wsmouse.c    20 May 2010 23:28:29 -0000
@@ -144,6 +144,8 @@ extern int wsmuxdebug;
 #define INVALID_Y      INT_MAX
 #define INVALID_Z      INT_MAX
 
+#define WSCONS_MOUSE_RES       100
+
 struct wsmouse_softc {
        struct wsevsrc  sc_base;
 
@@ -161,6 +163,11 @@ struct wsmouse_softc {
        int             sc_z;           /* absolute-z */
        int             sc_w;           /* absolute-w */
 
+       int             sc_mx;
+       int             sc_my;
+       int             sc_mz;
+       int             sc_mw;
+
        int             sc_refcnt;
        u_char          sc_dying;       /* device is being detached */
 
@@ -251,6 +258,12 @@ wsmouse_attach(device_t parent, device_t
        callout_init(&sc->sc_repeat_callout, 0);
        callout_setfunc(&sc->sc_repeat_callout, wsmouse_repeat, sc);
 
+       /* One-to-one scale multipliers. */
+       sc->sc_mx = WSCONS_MOUSE_RES;
+       sc->sc_my = WSCONS_MOUSE_RES;
+       sc->sc_mz = WSCONS_MOUSE_RES;
+       sc->sc_mw = WSCONS_MOUSE_RES;
+
 #if NWSMUX > 0
        sc->sc_base.me_ops = &wsmouse_srcops;
        mux = device_cfdata(self)->wsmousedevcf_mux;
@@ -370,13 +383,13 @@ wsmouse_input(device_t wsmousedev, u_int
 
        sc->sc_mb = btns;
        if (!(flags & WSMOUSE_INPUT_ABSOLUTE_X))
-               sc->sc_dx += x;
+               sc->sc_dx += x * sc->sc_mx;
        if (!(flags & WSMOUSE_INPUT_ABSOLUTE_Y))
-               sc->sc_dy += y;
+               sc->sc_dy += y * sc->sc_my;
        if (!(flags & WSMOUSE_INPUT_ABSOLUTE_Z))
-               sc->sc_dz += z;
+               sc->sc_dz += z * sc->sc_mz;
        if (!(flags & WSMOUSE_INPUT_ABSOLUTE_W))
-               sc->sc_dw += w;
+               sc->sc_dw += w * sc->sc_mw;
 
        /*
         * We have at least one event (mouse button, delta-X, or
@@ -395,9 +408,9 @@ wsmouse_input(device_t wsmousedev, u_int
                        nevents++;
                }
        } else {
-               if (sc->sc_dx) {
+               if (sc->sc_dx / WSCONS_MOUSE_RES) {
                        events[nevents].type = WSCONS_EVENT_MOUSE_DELTA_X;
-                       events[nevents].value = sc->sc_dx;
+                       events[nevents].value = sc->sc_dx / WSCONS_MOUSE_RES;
                        nevents++;
                }
        }
@@ -408,9 +421,9 @@ wsmouse_input(device_t wsmousedev, u_int
                        nevents++;
                }
        } else {
-               if (sc->sc_dy) {
+               if (sc->sc_dy / WSCONS_MOUSE_RES) {
                        events[nevents].type = WSCONS_EVENT_MOUSE_DELTA_Y;
-                       events[nevents].value = sc->sc_dy;
+                       events[nevents].value = sc->sc_dy / WSCONS_MOUSE_RES;
                        nevents++;
                }
        }
@@ -421,9 +434,9 @@ wsmouse_input(device_t wsmousedev, u_int
                        nevents++;
                }
        } else {
-               if (sc->sc_dz) {
+               if (sc->sc_dz / WSCONS_MOUSE_RES) {
                        events[nevents].type = WSCONS_EVENT_MOUSE_DELTA_Z;
-                       events[nevents].value = sc->sc_dz;
+                       events[nevents].value = sc->sc_dz / WSCONS_MOUSE_RES;
                        nevents++;
                }
        }
@@ -434,9 +447,9 @@ wsmouse_input(device_t wsmousedev, u_int
                        nevents++;
                }
        } else {
-               if (sc->sc_dw) {
+               if (sc->sc_dw / WSCONS_MOUSE_RES) {
                        events[nevents].type = WSCONS_EVENT_MOUSE_DELTA_W;
-                       events[nevents].value = sc->sc_dw;
+                       events[nevents].value = sc->sc_dw / WSCONS_MOUSE_RES;
                        nevents++;
                }
        }
@@ -494,10 +507,10 @@ wsmouse_input(device_t wsmousedev, u_int
                /* All events were correctly injected into the queue.
                 * Synchronize the mouse's status with what the user
                 * has received. */
-               sc->sc_x = x; sc->sc_dx = 0;
-               sc->sc_y = y; sc->sc_dy = 0;
-               sc->sc_z = z; sc->sc_dz = 0;
-               sc->sc_w = w; sc->sc_dw = 0;
+               sc->sc_x = x; sc->sc_dx %= WSCONS_MOUSE_RES;
+               sc->sc_y = y; sc->sc_dy %= WSCONS_MOUSE_RES;
+               sc->sc_z = z; sc->sc_dz %= WSCONS_MOUSE_RES;
+               sc->sc_w = w; sc->sc_dw %= WSCONS_MOUSE_RES;
                sc->sc_ub = ub;
 #if NWSMUX > 0
                DPRINTFN(5,("wsmouse_input: %s wakeup evar=%p\n",
@@ -687,6 +700,7 @@ wsmouse_do_ioctl(struct wsmouse_softc *s
 {
        int error;
        struct wsmouse_repeat *wr;
+       int s;
 
        if (sc->sc_dying)
                return (EIO);
@@ -749,6 +763,31 @@ wsmouse_do_ioctl(struct wsmouse_softc *s
 
                return 0;
 
+       case WSMOUSEIO_SETSCALEXY:
+               if (*(int *)data == 0)
+                       return EINVAL;
+               s = spltty();
+               sc->sc_my = sc->sc_mx =
+                   (*(int *)data) * WSCONS_MOUSE_RES / 100;
+               splx(s);
+               return 0;
+
+       case WSMOUSEIO_SETSCALEZ:
+               if (*(int *)data == 0)
+                       return EINVAL;
+               s = spltty();
+               sc->sc_mz = (*(int *)data) * WSCONS_MOUSE_RES / 100;
+               splx(s);
+               return 0;
+
+       case WSMOUSEIO_SETSCALEW:
+               if (*(int *)data == 0)
+                       return EINVAL;
+               s = spltty();
+               sc->sc_mw = (*(int *)data) * WSCONS_MOUSE_RES / 100;
+               splx(s);
+               return 0;
+
        case WSMOUSEIO_SETVERSION:
                return wsevent_setversion(sc->sc_base.me_evp, *(int *)data);
        }


Home | Main Index | Thread Index | Old Index