moused(8): Add command line option to restrict interface type

to evdev or sysmouse. It is required to avoid receiving of double events
on hybrid devices supporting both interfaces like ums (4).

MFC after:	1 day
Reviewed by:	glebius (via private chat)
Differential Revision:	https://reviews.freebsd.org/D52647
This commit is contained in:
Vladimir Kondratyev
2025-09-21 16:14:48 +03:00
parent b1442e6b8d
commit 1335bf5ce1
4 changed files with 60 additions and 19 deletions
+1 -1
View File
@@ -589,7 +589,7 @@ saver="NO" # screen saver: Uses /boot/kernel/${saver}_saver.ko
moused_nondefault_enable="NO" # Treat non-default mice as enabled unless
# specifically overridden in rc.conf(5).
moused_enable="NO" # Run the mouse daemon.
moused_type="auto" # See man page for rc.conf(5) for available settings.
moused_type="evdev" # See man page for rc.conf(5) for available settings.
moused_port="auto" # Set to your mouse port.
moused_flags="" # Any additional flags to moused.
mousechar_start="NO" # if 0xd0-0xd3 default range is occupied in your
+5 -2
View File
@@ -16,6 +16,7 @@ start_cmd="moused_start"
pidprefix="/var/run/moused"
pidfile="${pidprefix}.pid"
pidarg=
typearg=
load_rc_config $name
# doesn't make sense to run in a svcj: nojail keyword
@@ -49,15 +50,17 @@ moused_start()
eval myflags=\${moused_${ms}_flags-$moused_flags}
eval myport=\${moused_${ms}_port-/dev/$ms}
eval mytype=\${moused_${ms}_type-$moused_type}
if [ -n "$mytype" ] && check_kern_features evdev_support; then
typearg="-t ${mytype}"
fi
else
ms="default"
myflags="$moused_flags"
myport="$moused_port"
mytype="$moused_type"
fi
startmsg -n "Starting ${ms} moused"
/usr/sbin/moused ${myflags} -p ${myport} -t ${mytype} ${pidarg}
/usr/sbin/moused ${myflags} -p ${myport} ${typearg} ${pidarg}
startmsg '.'
mousechar_arg=
+27 -4
View File
@@ -49,7 +49,7 @@
.Op Fl m Ar N=M
.Op Fl w Ar N
.Op Fl z Ar target
.Op Fl t Ar mousetype
.Op Fl t Ar interfacetype
.Op Fl l Ar level
.Op Fl 3 Op Fl E Ar timeout
.Op Fl T Ar distance Ns Op , Ns Ar time Ns Op , Ns Ar after
@@ -329,9 +329,32 @@ or
.Ar high .
This option may not be supported by all the device.
.It Fl t Ar type
Ignored.
Used for compatibiliy with legacy
.Nm .
Force the interface type of the mouse attached to the port.
You may explicitly specify a type listed below, or use
.Ar auto
to let the
.Nm
utility automatically select an appropriate protocol for the given
character device.
If you entirely omit this option in the command line,
.Fl t Ar auto
is assumed.
.Pp
Valid types for this option are listed below.
.Bl -tag -compact -width systemmouse
.It Ar evdev
Input event device usualy residing in
.Pa /dev/input .
.It Ar sysmouse
Traditional protocol used by e.g.
.Xr ums 4
and
.Xr psm 4
drivers.
.El
.Pp
Note that this option restricts usage of the given port rather then gives
a hint.
.It Fl q Ar config
Path to configuration file.
.It Fl Q Ar quirks
+27 -12
View File
@@ -448,6 +448,7 @@ static const char *config_file = CONFDIR "/moused.conf";
#endif
static const char *quirks_path = QUIRKSDIR;
static struct quirks_context *quirks;
static enum device_if force_if = DEVICE_IF_UNKNOWN;
static int opt_rate = 0;
static int opt_resolution = MOUSE_RES_UNKNOWN;
@@ -529,7 +530,8 @@ main(int argc, char *argv[])
struct rodent *r;
pid_t mpid;
int c;
int i;
u_int i;
int n;
u_long ul;
char *errstr;
@@ -552,26 +554,26 @@ main(int argc, char *argv[])
break;
case 'a':
i = sscanf(optarg, "%lf,%lf", &opt_accelx, &opt_accely);
if (i == 0) {
n = sscanf(optarg, "%lf,%lf", &opt_accelx, &opt_accely);
if (n == 0) {
warnx("invalid linear acceleration argument "
"'%s'", optarg);
usage();
}
if (i == 1)
if (n == 1)
opt_accely = opt_accelx;
break;
case 'A':
opt_exp_accel = true;
i = sscanf(optarg, "%lf,%lf", &opt_expoaccel,
n = sscanf(optarg, "%lf,%lf", &opt_expoaccel,
&opt_expoffset);
if (i == 0) {
if (n == 0) {
warnx("invalid exponential acceleration "
"argument '%s'", optarg);
usage();
}
if (i == 1)
if (n == 1)
opt_expoffset = 1.0;
break;
@@ -646,8 +648,19 @@ main(int argc, char *argv[])
break;
case 't':
if (strcmp(optarg, "auto") != 0)
warnx("ignore mouse type `%s'", optarg);
if (strcmp(optarg, "auto") == 0) {
force_if = DEVICE_IF_UNKNOWN;
break;
}
for (i = 0; i < nitems(rifs); i++)
if (strcmp(optarg, rifs[i].name) == 0) {
force_if = i;
break;
}
if (i == nitems(rifs)) {
warnx("no such interface type `%s'", optarg);
usage();
}
break;
case 'w':
@@ -1224,7 +1237,7 @@ usage(void)
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
"usage: moused [-dfg] [-I file] [-F rate] [-r resolution]",
" [-VH [-U threshold]] [-a X[,Y]] [-C threshold] [-m N=M] [-w N]",
" [-z N] [-t <mousetype>] [-l level] [-3 [-E timeout]]",
" [-z N] [-t <interfacetype>] [-l level] [-3 [-E timeout]]",
" [-T distance[,time[,after]]] -p <port> [-q config] [-Q quirks]",
" moused [-d] -i <port|if|type|model|all> -p <port>");
exit(1);
@@ -1338,9 +1351,11 @@ r_identify_if(int fd)
{
int dummy;
if (ioctl(fd, EVIOCGVERSION, &dummy) >= 0)
if ((force_if == DEVICE_IF_UNKNOWN || force_if == DEVICE_IF_EVDEV) &&
ioctl(fd, EVIOCGVERSION, &dummy) >= 0)
return (DEVICE_IF_EVDEV);
if (ioctl(fd, MOUSE_GETLEVEL, &dummy) >= 0)
if ((force_if == DEVICE_IF_UNKNOWN || force_if == DEVICE_IF_SYSMOUSE) &&
ioctl(fd, MOUSE_GETLEVEL, &dummy) >= 0)
return (DEVICE_IF_SYSMOUSE);
return (DEVICE_IF_UNKNOWN);
}