Make sure that all mouse buttons are released when clients

using /dev/consolectl close. This fixes a problem where if
a USB mouse is detached while a button is pressed, that
button is never released.

MFC after:	1 week
This commit is contained in:
Hans Petter Selasky 2013-02-06 11:16:18 +00:00
parent 5fb0e927a8
commit 68fdacf7c5

View File

@ -253,11 +253,13 @@ static struct ttydevsw sc_ttydevsw = {
};
static d_ioctl_t consolectl_ioctl;
static d_close_t consolectl_close;
static struct cdevsw consolectl_devsw = {
.d_version = D_VERSION,
.d_flags = D_NEEDGIANT,
.d_flags = D_NEEDGIANT | D_TRACKCLOSE,
.d_ioctl = consolectl_ioctl,
.d_close = consolectl_close,
.d_name = "consolectl",
};
@ -1561,6 +1563,23 @@ consolectl_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
return sctty_ioctl(dev->si_drv1, cmd, data, td);
}
static int
consolectl_close(struct cdev *dev, int flags, int mode, struct thread *td)
{
#ifndef SC_NO_SYSMOUSE
mouse_info_t info;
memset(&info, 0, sizeof(info));
info.operation = MOUSE_ACTION;
/*
* Make sure all buttons are released when moused and other
* console daemons exit, so that no buttons are left pressed.
*/
(void) sctty_ioctl(dev->si_drv1, CONS_MOUSECTL, (caddr_t)&info, td);
#endif
return (0);
}
static void
sc_cnprobe(struct consdev *cp)
{