wsmoused: support absolute mouse position events
Tested with VirtualBox Guest Addtions.
This commit is contained in:
parent
47ed2bf4a1
commit
f9113856a8
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: selection.c,v 1.10 2007/05/27 15:05:00 jmmv Exp $ */
|
/* $NetBSD: selection.c,v 1.11 2021/11/24 14:34:51 uwe Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2002, 2003, 2004, 2007 The NetBSD Foundation, Inc.
|
* Copyright (c) 2002, 2003, 2004, 2007 The NetBSD Foundation, Inc.
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
__RCSID("$NetBSD: selection.c,v 1.10 2007/05/27 15:05:00 jmmv Exp $");
|
__RCSID("$NetBSD: selection.c,v 1.11 2021/11/24 14:34:51 uwe Exp $");
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
@ -226,6 +226,7 @@ selection_cleanup(void)
|
||||||
void
|
void
|
||||||
selection_wsmouse_event(struct wscons_event evt)
|
selection_wsmouse_event(struct wscons_event evt)
|
||||||
{
|
{
|
||||||
|
const struct wsmouse_calibcoords *abs = &Selmouse.sm_mouse->m_calib;
|
||||||
|
|
||||||
if (IS_MOTION_EVENT(evt.type)) {
|
if (IS_MOTION_EVENT(evt.type)) {
|
||||||
if (Selmouse.sm_selecting)
|
if (Selmouse.sm_selecting)
|
||||||
|
@ -259,7 +260,30 @@ selection_wsmouse_event(struct wscons_event evt)
|
||||||
Selmouse.sm_count_y++;
|
Selmouse.sm_count_y++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WSCONS_EVENT_MOUSE_DELTA_Z:
|
case WSCONS_EVENT_MOUSE_DELTA_Z: /* FALLTHROUGH */
|
||||||
|
case WSCONS_EVENT_MOUSE_DELTA_W:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WSCONS_EVENT_MOUSE_ABSOLUTE_X:
|
||||||
|
if (!Selmouse.sm_mouse->m_doabs)
|
||||||
|
break;
|
||||||
|
/* max x is inclusive in both selmouse and tpcalib */
|
||||||
|
Selmouse.sm_x
|
||||||
|
= ((evt.value - abs->minx) * (Selmouse.sm_max_x + 1))
|
||||||
|
/ (abs->maxx - abs->minx + 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WSCONS_EVENT_MOUSE_ABSOLUTE_Y:
|
||||||
|
if (!Selmouse.sm_mouse->m_doabs)
|
||||||
|
break;
|
||||||
|
/* max y is inclusive in both selmouse and tpcalib */
|
||||||
|
Selmouse.sm_y
|
||||||
|
= ((evt.value - abs->miny) * (Selmouse.sm_max_y + 1))
|
||||||
|
/ (abs->maxy - abs->miny + 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WSCONS_EVENT_MOUSE_ABSOLUTE_Z: /* FALLTHROUGH */
|
||||||
|
case WSCONS_EVENT_MOUSE_ABSOLUTE_W:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: wsmoused.c,v 1.27 2021/09/01 06:10:06 mlelstv Exp $ */
|
/* $NetBSD: wsmoused.c,v 1.28 2021/11/24 14:34:51 uwe Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2002, 2003, 2004 The NetBSD Foundation, Inc.
|
* Copyright (c) 2002, 2003, 2004 The NetBSD Foundation, Inc.
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
__COPYRIGHT("@(#) Copyright (c) 2002, 2003\
|
__COPYRIGHT("@(#) Copyright (c) 2002, 2003\
|
||||||
The NetBSD Foundation, Inc. All rights reserved.");
|
The NetBSD Foundation, Inc. All rights reserved.");
|
||||||
__RCSID("$NetBSD: wsmoused.c,v 1.27 2021/09/01 06:10:06 mlelstv Exp $");
|
__RCSID("$NetBSD: wsmoused.c,v 1.28 2021/11/24 14:34:51 uwe Exp $");
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
@ -250,7 +250,7 @@ init_mouse(void)
|
||||||
static void
|
static void
|
||||||
open_device(unsigned int secs)
|
open_device(unsigned int secs)
|
||||||
{
|
{
|
||||||
int version = WSMOUSE_EVENT_VERSION;
|
int status;
|
||||||
|
|
||||||
if (Mouse.m_devfd != -1)
|
if (Mouse.m_devfd != -1)
|
||||||
return;
|
return;
|
||||||
|
@ -262,10 +262,38 @@ open_device(unsigned int secs)
|
||||||
if (Mouse.m_devfd == -1)
|
if (Mouse.m_devfd == -1)
|
||||||
log_err(EXIT_FAILURE, "cannot open %s", Mouse.m_devname);
|
log_err(EXIT_FAILURE, "cannot open %s", Mouse.m_devname);
|
||||||
|
|
||||||
if (ioctl(Mouse.m_devfd, WSMOUSEIO_SETVERSION, &version) == -1)
|
const int version = WSMOUSE_EVENT_VERSION;
|
||||||
|
status = ioctl(Mouse.m_devfd, WSMOUSEIO_SETVERSION, &version);
|
||||||
|
if (status == -1)
|
||||||
log_err(EXIT_FAILURE, "cannot set version %s", Mouse.m_devname);
|
log_err(EXIT_FAILURE, "cannot set version %s", Mouse.m_devname);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get calibration data for touch panel. Not fatal if we can't.
|
||||||
|
*/
|
||||||
|
Mouse.m_doabs = 0;
|
||||||
|
|
||||||
|
unsigned int mouse_type = 0; /* defined WSMOUSE_TYPE_* start at 1 */
|
||||||
|
status = ioctl(Mouse.m_devfd, WSMOUSEIO_GTYPE, &mouse_type);
|
||||||
|
if (status == -1) {
|
||||||
|
log_warn("WSMOUSEIO_GTYPE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* absolute position events make no sense for free-ranging mice */
|
||||||
|
if (mouse_type != WSMOUSE_TYPE_TPANEL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
status = ioctl(Mouse.m_devfd, WSMOUSEIO_GCALIBCOORDS, &Mouse.m_calib);
|
||||||
|
if (status == -1) {
|
||||||
|
log_warn("WSMOUSEIO_GCALIBCOORDS");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mouse.m_doabs = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
/* Main program event loop. This function polls the wscons status
|
/* Main program event loop. This function polls the wscons status
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: wsmoused.h,v 1.9 2006/03/18 02:06:38 elad Exp $ */
|
/* $NetBSD: wsmoused.h,v 1.10 2021/11/24 14:34:51 uwe Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2002, 2003, 2004 The NetBSD Foundation, Inc.
|
* Copyright (c) 2002, 2003, 2004 The NetBSD Foundation, Inc.
|
||||||
|
@ -34,7 +34,13 @@
|
||||||
|
|
||||||
#define IS_MOTION_EVENT(type) (((type) == WSCONS_EVENT_MOUSE_DELTA_X) || \
|
#define IS_MOTION_EVENT(type) (((type) == WSCONS_EVENT_MOUSE_DELTA_X) || \
|
||||||
((type) == WSCONS_EVENT_MOUSE_DELTA_Y) || \
|
((type) == WSCONS_EVENT_MOUSE_DELTA_Y) || \
|
||||||
((type) == WSCONS_EVENT_MOUSE_DELTA_Z))
|
((type) == WSCONS_EVENT_MOUSE_DELTA_Z) || \
|
||||||
|
((type) == WSCONS_EVENT_MOUSE_DELTA_W) || \
|
||||||
|
((type) == WSCONS_EVENT_MOUSE_ABSOLUTE_X) || \
|
||||||
|
((type) == WSCONS_EVENT_MOUSE_ABSOLUTE_Y) || \
|
||||||
|
((type) == WSCONS_EVENT_MOUSE_ABSOLUTE_Z) || \
|
||||||
|
((type) == WSCONS_EVENT_MOUSE_ABSOLUTE_W))
|
||||||
|
|
||||||
#define IS_BUTTON_EVENT(type) (((type) == WSCONS_EVENT_MOUSE_UP) || \
|
#define IS_BUTTON_EVENT(type) (((type) == WSCONS_EVENT_MOUSE_UP) || \
|
||||||
((type) == WSCONS_EVENT_MOUSE_DOWN))
|
((type) == WSCONS_EVENT_MOUSE_DOWN))
|
||||||
|
|
||||||
|
@ -45,6 +51,10 @@ struct mouse {
|
||||||
char *m_devname; /* File name of wsmouse device */
|
char *m_devname; /* File name of wsmouse device */
|
||||||
char *m_fifoname; /* File name of fifo */
|
char *m_fifoname; /* File name of fifo */
|
||||||
int m_disabled; /* Whether if the mouse is disabled or not */
|
int m_disabled; /* Whether if the mouse is disabled or not */
|
||||||
|
|
||||||
|
/* support for absolute position events */
|
||||||
|
int m_doabs;
|
||||||
|
struct wsmouse_calibcoords m_calib;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mode_bootstrap {
|
struct mode_bootstrap {
|
||||||
|
|
Loading…
Reference in New Issue