Improve the virtual scrolling mechanism to make middle clicking less

difficult.  Add a -L option (yet another option, indeed!) which changes the
speed of scrolling and change -U to only affect the scroll threshold.

This should make middle-clicking a much more pleasant experience.

PR:		bin/120186
Submitted by:	Aragon Gouveia <aragon -at- phat.za.net>
MFC after:	3 days
This commit is contained in:
Philip Paeps 2008-05-15 15:05:02 +00:00
parent 7e54279b42
commit 3e95467ca0
2 changed files with 58 additions and 15 deletions

View File

@ -30,7 +30,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd November 12, 2004
.Dd May 15, 2008
.Dt MOUSED 8
.Os
.Sh NAME
@ -43,7 +43,7 @@
.Op Fl F Ar rate
.Op Fl r Ar resolution
.Op Fl S Ar baudrate
.Op Fl VH Op Fl U Ar distance
.Op Fl VH Op Fl U Ar distance Fl L Ar distance
.Op Fl A Ar exp Ns Op , Ns Ar offset
.Op Fl a Ar X Ns Op , Ns Ar Y
.Op Fl C Ar threshold
@ -139,6 +139,18 @@ simultaneously.
The default timeout is 100 msec.
.It Fl F Ar rate
Set the report rate (reports/sec) of the device if supported.
.It Fl L Ar distance
When
.Dq Virtual Scrolling
is enabled, the
.Fl L
option can be used to set the
.Ar distance
(in pixels) that the mouse must move before a scroll event
is generated. This effectively controls the scrolling speed.
The default
.Ar distance
is 2 pixels.
.It Fl H
Enable
.Dq Horizontal Virtual Scrolling .
@ -148,7 +160,9 @@ horizontal scrolling.
Use the
.Fl U
option to set the distance the mouse must move before the scrolling mode is
activated.
activated and the
.Fl L
option to set the scrolling speed.
This option may be used with or without the
.Fl V
option.
@ -201,7 +215,9 @@ button down will cause motion to be interpreted as scrolling.
Use the
.Fl U
option to set the distance the mouse must move before the scrolling mode is
activated.
activated and the
.Fl L
option to set the scrolling speed.
.It Fl U Ar distance
When
.Dq Virtual Scrolling

View File

@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$");
#define DFLT_CLICKTHRESHOLD 500 /* 0.5 second */
#define DFLT_BUTTON2TIMEOUT 100 /* 0.1 second */
#define DFLT_SCROLLTHRESHOLD 3 /* 3 pixels */
#define DFLT_SCROLLSPEED 2 /* 2 pixels */
/* Abort 3-button emulation delay after this many movement events. */
#define BUTTON2_MAXMOVE 3
@ -418,6 +419,7 @@ static struct rodentparam {
float remainx; /* Remainder on X and Y axis, respectively... */
float remainy; /* ... to compensate for rounding errors. */
int scrollthreshold; /* Movement distance before virtual scrolling */
int scrollspeed; /* Movement distance to rate of scrolling */
} rodent = {
.flags = 0,
.portname = NULL,
@ -441,6 +443,7 @@ static struct rodentparam {
.remainx = 0.0,
.remainy = 0.0,
.scrollthreshold = DFLT_SCROLLTHRESHOLD,
.scrollspeed = DFLT_SCROLLSPEED,
};
/* button status */
@ -574,7 +577,7 @@ main(int argc, char *argv[])
for (i = 0; i < MOUSE_MAXBUTTON; ++i)
mstate[i] = &bstate[i];
while ((c = getopt(argc, argv, "3A:C:DE:F:HI:PRS:T:VU:a:cdfhi:l:m:p:r:st:w:z:")) != -1)
while ((c = getopt(argc, argv, "3A:C:DE:F:HI:L:PRS:T:VU:a:cdfhi:l:m:p:r:st:w:z:")) != -1)
switch(c) {
case '3':
@ -760,6 +763,14 @@ main(int argc, char *argv[])
pidfile = optarg;
break;
case 'L':
rodent.scrollspeed = atoi(optarg);
if (rodent.scrollspeed < 0) {
warnx("invalid argument `%s'", optarg);
usage();
}
break;
case 'P':
rodent.flags |= NoPnP;
break;
@ -1121,6 +1132,7 @@ moused(void)
if (action0.button == MOUSE_BUTTON2DOWN) {
if (scroll_state == SCROLL_NOTSCROLLING) {
scroll_state = SCROLL_PREPARE;
scroll_movement = hscroll_movement = 0;
debug("PREPARING TO SCROLL");
}
debug("[BUTTON2] flags:%08x buttons:%08x obuttons:%08x",
@ -1182,21 +1194,36 @@ moused(void)
* the stick/trackpoint/nipple, scroll!
*/
if (scroll_state == SCROLL_PREPARE) {
/* Ok, Set we're really scrolling now.... */
if (action2.dy || action2.dx)
scroll_state = SCROLL_SCROLLING;
}
if (scroll_state == SCROLL_SCROLLING) {
/* Middle button down, waiting for movement threshold */
if (action2.dy || action2.dx) {
if (rodent.flags & VirtualScroll) {
scroll_movement += action2.dy;
if (scroll_movement < -rodent.scrollthreshold) {
scroll_state = SCROLL_SCROLLING;
} else if (scroll_movement > rodent.scrollthreshold) {
scroll_state = SCROLL_SCROLLING;
}
}
if (rodent.flags & HVirtualScroll) {
hscroll_movement += action2.dx;
if (hscroll_movement < -rodent.scrollthreshold) {
scroll_state = SCROLL_SCROLLING;
} else if (hscroll_movement > rodent.scrollthreshold) {
scroll_state = SCROLL_SCROLLING;
}
}
if (scroll_state == SCROLL_SCROLLING) scroll_movement = hscroll_movement = 0;
}
} else if (scroll_state == SCROLL_SCROLLING) {
if (rodent.flags & VirtualScroll) {
scroll_movement += action2.dy;
debug("SCROLL: %d", scroll_movement);
if (scroll_movement < -rodent.scrollthreshold) {
if (scroll_movement < -rodent.scrollspeed) {
/* Scroll down */
action2.dz = -1;
scroll_movement = 0;
}
else if (scroll_movement > rodent.scrollthreshold) {
else if (scroll_movement > rodent.scrollspeed) {
/* Scroll up */
action2.dz = 1;
scroll_movement = 0;
@ -1206,11 +1233,11 @@ moused(void)
hscroll_movement += action2.dx;
debug("HORIZONTAL SCROLL: %d", hscroll_movement);
if (hscroll_movement < -rodent.scrollthreshold) {
if (hscroll_movement < -rodent.scrollspeed) {
action2.dz = -2;
hscroll_movement = 0;
}
else if (hscroll_movement > rodent.scrollthreshold) {
else if (hscroll_movement > rodent.scrollspeed) {
action2.dz = 2;
hscroll_movement = 0;
}