#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <i86.h>
#include <sys/mman.h>
#include <sys/dev.h>
#include <sys/mouse.h>
#include <sys/proxy.h>
#include <errno.h>
#include "X.h"
#include "xf86.h"
#include "xf86Priv.h"
#include "xf86Xinput.h"
#include "xf86OSmouse.h"
extern int miPointerGetMotionEvents(
DeviceIntPtr ,
xTimecoord * ,
unsigned long ,
unsigned long ,
ScreenPtr
);
struct _mouse_ctrl *QNX_mouse = NULL;
pid_t QNX_mouse_proxy = -1;
Bool QNX_mouse_event = FALSE;
static void
OsMouseReadInput(InputInfoPtr pInfo)
{
struct mouse_event events[16];
int i, nEvents;
int buttons, col, row;
int armed = 0;
MouseDevPtr pMse;
pMse = pInfo->private;
while ((nEvents = mouse_read(QNX_mouse, &events,
16, QNX_mouse_proxy, &armed) ) > 0) {
for (i = 0; i < nEvents; i ++){
col = events[i].dx;
row = -events[i].dy;
buttons = events[i].buttons;
pMse->PostEvent(pInfo, buttons, col, row, 0, 0);
}
}
if (!armed) ErrorF("Drained mouse queue, armed = 0??\n");
QNX_mouse_event = FALSE;
}
static int
OsMouseProc(pPointer, what)
DeviceIntPtr pPointer;
int what;
{
int i, ret, armed;
int nbuttons;
unsigned char *map;
struct mouse_event mevent;
MouseDevPtr pMse;
InputInfoPtr pInfo;
pInfo = pPointer->public.devicePrivate;
pMse = pInfo->private;
pMse->device = pPointer;
switch (what) {
case DEVICE_INIT:
pPointer->public.on = FALSE;
if (QNX_mouse_proxy == -1) {
if((QNX_mouse_proxy =
qnx_proxy_attach(0, 0, 0, -1)) == -1){
FatalError("xf86MouseOn: Could not create mouse proxy; %s\n",
strerror(errno));
}
}
if (QNX_mouse == NULL) QNX_mouse =
mouse_open(0, NULL, xf86Info.consoleFd);
if (QNX_mouse == NULL) {
if (xf86AllowMouseOpenFail) {
ErrorF("Cannot open mouse (%s) - Continuing...\n",
strerror(errno));
return(-1);
}
FatalError("Cannot open mouse (%s)\n", strerror(errno));
}
ErrorF("Opened mouse: handle %d buttons\n", QNX_mouse->handle,
QNX_mouse->buttons);
pInfo->fd = QNX_mouse->fd;
mouse_flush(QNX_mouse);
QNX_mouse_event = FALSE;
nbuttons = 3;
map = (unsigned char *) xalloc(nbuttons + 1);
if (map == (unsigned char *) NULL)
FatalError("Failed to allocate memory for mouse structures\n");
for(i=0;i <= nbuttons; i++)
map[i] = i;
InitPointerDeviceStruct ((DevicePtr) pPointer, map, nbuttons,
miPointerGetMotionEvents, pMse->Ctrl,
miPointerGetMotionBufferSize());
xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
xf86InitValuatorDefaults(pPointer, 0);
xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
xf86InitValuatorDefaults(pPointer, 1);
xf86MotionHistoryAllocate(pInfo);
xfree(map);
break;
case DEVICE_ON:
if(QNX_mouse == NULL) return(-1);
pMse->lastButtons = 0;
pMse->emulateState = 0;
pPointer->public.on = TRUE;
mouse_flush(QNX_mouse);
ret = mouse_read(QNX_mouse, &mevent, 0,
QNX_mouse_proxy, NULL);
ErrorF("MouseOn: armed proxy, %d, proxy pid %d\n", ret,
QNX_mouse_proxy);
if (ret < 0) {
FatalError("xf86MouseOn: could not arm proxy; %s\n",
strerror(errno));
}
break;
case DEVICE_CLOSE:
case DEVICE_OFF:
if(QNX_mouse == NULL) return(-1);
pPointer->public.on = FALSE;
if (what == DEVICE_CLOSE){
mouse_close (QNX_mouse);
QNX_mouse = NULL;
}
pPointer->public.on = FALSE;
break;
}
return (Success);
}
static int
SupportedInterfaces(void)
{
return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_MISC | 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;
}
static const char *
DefaultProtocol(void)
{
return "OSMouse";
}
static Bool
OsMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
{
MouseDevPtr pMse;
pMse = pInfo->private;
pMse->protocol = protocol;
xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
xf86CollectInputOptions(pInfo, NULL, NULL);
xf86ProcessCommonOptions(pInfo, pInfo->options);
pMse->CommonOptions(pInfo);
pInfo->device_control = OsMouseProc;
pInfo->read_input = OsMouseReadInput;
pInfo->flags |= XI86_CONFIGURED;
return TRUE;
}
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;
}