1 /* $NetBSD: tp.c,v 1.8 2009/03/03 18:43:15 nonaka Exp $ */
4 * Copyright (c) 2002, 2003 TAKEMRUA Shin
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of The NetBSD Foundation nor the names of its
16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
34 #include <sys/ioctl.h>
35 #include <sys/fcntl.h>
42 #define MIN(a, b) ((a) < (b) ? (a) : (b))
45 #include <sys/cdefs.h>
46 __RCSID("$NetBSD: tp.c,v 1.8 2009/03/03 18:43:15 nonaka Exp $");
50 tp_init(struct tp
*tp
, int fd
)
53 struct wsmouse_calibcoords calibcoords
;
55 #ifdef WSMOUSEIO_SETVERSION
56 int version
= WSMOUSE_EVENT_VERSION
;
58 if (ioctl(fd
, WSMOUSEIO_SETVERSION
, &version
) == -1) {
66 if (ioctl(tp
->fd
, WSMOUSEIO_GTYPE
, &type
) < 0)
68 if (type
!= WSMOUSE_TYPE_TPANEL
) {
73 if (ioctl(tp
->fd
, WSMOUSEIO_GCALIBCOORDS
, &calibcoords
) < 0)
76 flags
= fcntl(tp
->fd
, F_GETFL
);
77 if (flags
== (u_int
)-1)
80 if (fcntl(tp
->fd
, F_SETFL
, flags
) < 0)
83 id
.type
= WSMOUSE_ID_TYPE_UIDSTR
;
84 if (ioctl(tp
->fd
, WSMOUSEIO_GETID
, &id
) == 0) {
85 (void)strlcpy(tp
->id
, (char *)id
.data
,
86 MIN(sizeof(tp
->id
), id
.length
));
96 tp_setrawmode(struct tp
*tp
)
98 struct wsmouse_calibcoords raw
;
100 memset(&raw
, 0, sizeof(raw
));
101 raw
.samplelen
= WSMOUSE_CALIBCOORDS_RESET
;
103 return ioctl(tp
->fd
, WSMOUSEIO_SCALIBCOORDS
, &raw
);
107 tp_setcalibcoords(struct tp
*tp
, struct wsmouse_calibcoords
*calibcoords
)
109 return ioctl(tp
->fd
, WSMOUSEIO_SCALIBCOORDS
, calibcoords
);
113 tp_flush(struct tp
*tp
)
115 struct wscons_event ev
;
119 while (read(tp
->fd
, &ev
, sizeof(ev
)) == sizeof(ev
)) {
121 case WSCONS_EVENT_MOUSE_UP
:
122 case WSCONS_EVENT_MOUSE_DOWN
:
123 case WSCONS_EVENT_MOUSE_DELTA_X
:
124 case WSCONS_EVENT_MOUSE_DELTA_Y
:
125 case WSCONS_EVENT_MOUSE_ABSOLUTE_X
:
126 case WSCONS_EVENT_MOUSE_ABSOLUTE_Y
:
127 case WSCONS_EVENT_MOUSE_DELTA_Z
:
128 case WSCONS_EVENT_MOUSE_ABSOLUTE_Z
:
141 tp_get(struct tp
*tp
, int *x
, int *y
, int (*cancel
)(void *), void *data
)
143 struct wscons_event ev
;
144 int x_done
, y_done
, res
;
148 if (cancel
!= NULL
&& (res
= (*cancel
)(data
)) != 0)
150 if ((res
= read(tp
->fd
, &ev
, sizeof(ev
))) < 0) {
151 if (errno
!= EWOULDBLOCK
)
155 if (res
!= sizeof(ev
)) {
160 case WSCONS_EVENT_MOUSE_ABSOLUTE_X
:
167 case WSCONS_EVENT_MOUSE_ABSOLUTE_Y
:
181 tp_waitup(struct tp
*tp
, int msec
, int (*cancel
)(void*), void *data
)
186 if (cancel
!= NULL
&& (res
= (*cancel
)(data
)) != 0)
189 if (tp_flush(tp
) == 0)