222 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright 1997,1998 by UCHIYAMA Yasushi
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software and its
 | |
|  * documentation for any purpose is hereby granted without fee, provided that
 | |
|  * the above copyright notice appear in all copies and that both that
 | |
|  * copyright notice and this permission notice appear in supporting
 | |
|  * documentation, and that the name of UCHIYAMA Yasushi not be used in
 | |
|  * advertising or publicity pertaining to distribution of the software without
 | |
|  * specific, written prior permission.  UCHIYAMA Yasushi makes no representations
 | |
|  * about the suitability of this software for any purpose.  It is provided
 | |
|  * "as is" without express or implied warranty.
 | |
|  *
 | |
|  * UCHIYAMA YASUSHI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | |
|  * EVENT SHALL UCHIYAMA YASUSHI BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | |
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | |
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | |
|  * PERFORMANCE OF THIS SOFTWARE.
 | |
|  *
 | |
|  */
 | |
| /* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/hurd/hurd_mouse.c,v 1.7 2000/02/10 22:33:44 dawes Exp $ */
 | |
| 
 | |
| #define NEED_EVENTS
 | |
| #ifdef HAVE_XORG_CONFIG_H
 | |
| #include <xorg-config.h>
 | |
| #endif
 | |
| 
 | |
| #include <X11/X.h>
 | |
| #include <X11/Xproto.h>
 | |
| #include "inputstr.h"
 | |
| #include "scrnintstr.h"
 | |
| #include "mipointer.h"
 | |
| 
 | |
| #include "xf86.h"
 | |
| #include "xf86Xinput.h"
 | |
| #include "xf86OSmouse.h"
 | |
| #include "xf86_OSlib.h"
 | |
| #include "xisb.h"
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <errno.h>
 | |
| #include <sys/time.h>
 | |
| #include <sys/file.h>
 | |
| #include <assert.h>
 | |
| #include <mach.h>
 | |
| #include <sys/ioctl.h>
 | |
| 
 | |
| typedef unsigned short kev_type;		/* kd event type */
 | |
| typedef unsigned char Scancode;
 | |
| 
 | |
| struct mouse_motion {		
 | |
|     short mm_deltaX;		/* units? */
 | |
|     short mm_deltaY;
 | |
| };
 | |
| 
 | |
| typedef struct {
 | |
|     kev_type type;			/* see below */
 | |
|     struct timeval time;		/* timestamp */
 | |
|     union {				/* value associated with event */
 | |
| 	boolean_t up;		/* MOUSE_LEFT .. MOUSE_RIGHT */
 | |
| 	Scancode sc;		/* KEYBD_EVENT */
 | |
| 	struct mouse_motion mmotion;	/* MOUSE_MOTION */
 | |
|     } value;
 | |
| } kd_event;
 | |
| 
 | |
| /* 
 | |
|  * kd_event ID's.
 | |
|  */
 | |
| #define MOUSE_LEFT	1		/* mouse left button up/down */
 | |
| #define MOUSE_MIDDLE	2
 | |
| #define MOUSE_RIGHT	3
 | |
| #define MOUSE_MOTION	4		/* mouse motion */
 | |
| #define KEYBD_EVENT	5		/* key up/down */
 | |
| 
 | |
| #define NUMEVENTS	64
 | |
| 
 | |
| /*
 | |
|  * OsMouseReadInput --
 | |
|  *      Get some events from our queue.  Process all outstanding events now.
 | |
|  */
 | |
| static void
 | |
| OsMouseReadInput(InputInfoPtr pInfo)
 | |
| {
 | |
|     MouseDevPtr pMse;
 | |
|     static kd_event eventList[NUMEVENTS];
 | |
|     int n, c; 
 | |
|     kd_event *event = eventList;
 | |
|     unsigned char *pBuf;
 | |
| 
 | |
|     pMse = pInfo->private;
 | |
| 
 | |
|     XisbBlockDuration(pMse->buffer, -1);
 | |
|     pBuf = (unsigned char *)eventList;
 | |
|     n = 0;
 | |
|     while ((c = XisbRead(pMse->buffer)) >= 0 && n < sizeof(eventList))
 | |
| 	pBuf[n++] = (unsigned char)c;
 | |
| 
 | |
|     if (n == 0)
 | |
| 	return;
 | |
| 
 | |
|     n /= sizeof(kd_event);
 | |
|     while( n-- ) {
 | |
| 	int buttons = pMse->lastButtons;
 | |
| 	int dx = 0, dy = 0;
 | |
| 	switch (event->type) {
 | |
| 	case MOUSE_RIGHT:
 | |
| 	    buttons  = buttons & 6 |(event->value.up ? 0 : 1);
 | |
| 	    break;
 | |
| 	case MOUSE_MIDDLE:
 | |
| 	    buttons  = buttons & 5 |(event->value.up ? 0 : 2);
 | |
| 	    break;
 | |
| 	case MOUSE_LEFT:
 | |
| 	    buttons  = buttons & 3 |(event->value.up ? 0 : 4) ;
 | |
| 	    break;
 | |
| 	case MOUSE_MOTION:
 | |
| 	    dx = event->value.mmotion.mm_deltaX;
 | |
| 	    dy = - event->value.mmotion.mm_deltaY;
 | |
| 	    break;
 | |
| 	default:
 | |
| 	    ErrorF("Bad mouse event (%d)\n",event->type);
 | |
| 	    continue;
 | |
| 	}
 | |
| 	pMse->PostEvent(pInfo, buttons, dx, dy, 0, 0);
 | |
| 	++event;
 | |
|     }
 | |
|     return;
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| OsMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
 | |
| {
 | |
|     MouseDevPtr pMse;
 | |
| 
 | |
|     /* This is called when the protocol is "OSMouse". */
 | |
| 
 | |
|     pMse = pInfo->private;
 | |
|     pMse->protocol = protocol;
 | |
|     xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
 | |
| 
 | |
|     /* Collect the options, and process the common options. */
 | |
|     xf86CollectInputOptions(pInfo, NULL, NULL);
 | |
|     xf86ProcessCommonOptions(pInfo, pInfo->options);
 | |
| 
 | |
|     /* Check if the device can be opened. */
 | |
|     pInfo->fd = xf86OpenSerial(pInfo->options); 
 | |
|     if (pInfo->fd == -1) {
 | |
| 	if (xf86GetAllowMouseOpenFail())
 | |
| 	    xf86Msg(X_WARNING, "%s: cannot open input device\n", pInfo->name);
 | |
| 	else {
 | |
| 	    xf86Msg(X_ERROR, "%s: cannot open input device\n", pInfo->name);
 | |
| 	    xfree(pMse);
 | |
| 	    return FALSE;
 | |
| 	}
 | |
|     }
 | |
|     xf86CloseSerial(pInfo->fd);
 | |
|     pInfo->fd = -1;
 | |
| 
 | |
|     /* Process common mouse options (like Emulate3Buttons, etc). */
 | |
|     pMse->CommonOptions(pInfo);
 | |
| 
 | |
|     /* Setup the local procs. */
 | |
|     pInfo->read_input = OsMouseReadInput;
 | |
|     
 | |
|     pInfo->flags |= XI86_CONFIGURED;
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static int
 | |
| SupportedInterfaces(void)
 | |
| {
 | |
|     /* XXX Need to check this. */
 | |
|     return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_AUTO;
 | |
| }
 | |
| 
 | |
| static const char *internalNames[] = {
 | |
| 	"OSMouse",
 | |
| 	NULL
 | |
| };
 | |
| 
 | |
| static const char **
 | |
| BuiltinNames(void)
 | |
| {
 | |
|     return internalNames;
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| CheckProtocol(const char *protocol)
 | |
| {
 | |
|     int i;
 | |
| 
 | |
|     for (i = 0; internalNames[i]; i++)
 | |
| 	if (xf86NameCmp(protocol, internalNames[i]) == 0)
 | |
| 	    return TRUE;
 | |
|     return FALSE;
 | |
| }
 | |
| 
 | |
| /* XXX Is this appropriate?  If not, this function should be removed. */
 | |
| static const char *
 | |
| DefaultProtocol(void)
 | |
| {
 | |
|     return "OSMouse";
 | |
| }
 | |
| 
 | |
| OSMouseInfoPtr
 | |
| xf86OSMouseInit(int flags)
 | |
| {
 | |
|     OSMouseInfoPtr p;
 | |
| 
 | |
|     p = xcalloc(sizeof(OSMouseInfoRec), 1);
 | |
|     if (!p)
 | |
| 	return NULL;
 | |
|     p->SupportedInterfaces = SupportedInterfaces;
 | |
|     p->BuiltinNames = BuiltinNames;
 | |
|     p->DefaultProtocol = DefaultProtocol;
 | |
|     p->CheckProtocol = CheckProtocol;
 | |
|     p->PreInit = OsMousePreInit;
 | |
|     return p;
 | |
| }
 | |
| 
 |