259 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright 2001 by J. Kean Johnston <jkj@sco.com>
 | 
						|
 *
 | 
						|
 * 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 J. Kean Johnston not be used in
 | 
						|
 * advertising or publicity pertaining to distribution of the software without
 | 
						|
 * specific, written prior permission.  J. Kean Johnston makes no
 | 
						|
 * representations about the suitability of this software for any purpose.
 | 
						|
 * It is provided "as is" without express or implied warranty.
 | 
						|
 *
 | 
						|
 * J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
						|
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
						|
 * EVENT SHALL J. KEAN JOHNSTON 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.
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef HAVE_XORG_CONFIG_H
 | 
						|
#include <xorg-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <X11/X.h>
 | 
						|
#include "compiler.h"
 | 
						|
 | 
						|
#include "xf86.h"
 | 
						|
#include "xf86Priv.h"
 | 
						|
#include "xf86_OSlib.h"
 | 
						|
#include "xf86Xinput.h"
 | 
						|
#include "xf86OSmouse.h"
 | 
						|
#include "mipointer.h"
 | 
						|
#include <sys/event.h>
 | 
						|
#include <mouse.h>
 | 
						|
 | 
						|
static int
 | 
						|
SupportedInterfaces (void)
 | 
						|
{
 | 
						|
  return MSE_MISC;
 | 
						|
}
 | 
						|
 | 
						|
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 const char *
 | 
						|
evtErrStr (int evterr)
 | 
						|
{
 | 
						|
  switch (evterr) {
 | 
						|
  case -1: return "error in config files";
 | 
						|
  case -2: return "no mouse devices to attach";
 | 
						|
  case -3: return "unable to open device";
 | 
						|
  case -4: return "unable to open event queue";
 | 
						|
  case -999: return "unable to initialize event driver";
 | 
						|
  default: return "unknown event driver error";
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
OsMouseProc (DeviceIntPtr pPointer, int what)
 | 
						|
{
 | 
						|
  InputInfoPtr pInfo;
 | 
						|
  MouseDevPtr pMse;
 | 
						|
  unsigned char map[9];
 | 
						|
  dmask_t dmask;
 | 
						|
  MessageType from = X_CONFIG;
 | 
						|
  int evi;
 | 
						|
 | 
						|
  pInfo = pPointer->public.devicePrivate;
 | 
						|
  pMse = pInfo->private;
 | 
						|
  pMse->device = pPointer;
 | 
						|
 | 
						|
  switch (what) {
 | 
						|
  case DEVICE_INIT: 
 | 
						|
    pPointer->public.on = FALSE;
 | 
						|
 | 
						|
    dmask = D_ABS | D_REL | D_BUTTON;
 | 
						|
    if ((evi = ev_initf(xf86Info.consoleFd)) < 0) {
 | 
						|
      FatalError ("OsMouseProc: Event driver initialization failed (%s)\n",
 | 
						|
          evtErrStr(evi));
 | 
						|
    }
 | 
						|
    pInfo->fd = ev_open (&dmask);
 | 
						|
    if (pInfo->fd < 0) {
 | 
						|
      FatalError ("OsMouseProc: DEVICE_INIT failed (%s)\n", evtErrStr(pInfo->fd));
 | 
						|
    }
 | 
						|
 | 
						|
    pMse->buttons = xf86SetIntOption (pInfo->options, "Buttons", 0);
 | 
						|
    if (pMse->buttons == 0) {
 | 
						|
      pMse->buttons = 8;
 | 
						|
      from = X_DEFAULT;
 | 
						|
    }
 | 
						|
    xf86Msg (from, "%s: Buttons: %d\n", pInfo->name, pMse->buttons);
 | 
						|
 | 
						|
    for (evi = 0; evi <= 8; evi++)
 | 
						|
      map[evi] = evi;
 | 
						|
 | 
						|
    InitPointerDeviceStruct((DevicePtr)pPointer, map, 8,
 | 
						|
        miPointerGetMotionEvents, pMse->Ctrl,
 | 
						|
        miPointerGetMotionBufferSize());
 | 
						|
 | 
						|
    /* X valuator */
 | 
						|
    xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
 | 
						|
    xf86InitValuatorDefaults(pPointer, 0);
 | 
						|
 | 
						|
    /* Y valuator */
 | 
						|
    xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
 | 
						|
    xf86InitValuatorDefaults(pPointer, 1);
 | 
						|
 | 
						|
    xf86MotionHistoryAllocate(pInfo);
 | 
						|
 | 
						|
    ev_flush();
 | 
						|
    ev_suspend();
 | 
						|
    break;
 | 
						|
 | 
						|
  case DEVICE_ON:
 | 
						|
    pMse->lastButtons = 0;
 | 
						|
    pMse->lastMappedButtons = 0;
 | 
						|
    pMse->emulateState = 0;
 | 
						|
    pPointer->public.on = TRUE;
 | 
						|
    ev_resume();
 | 
						|
    AddEnabledDevice (pInfo->fd);
 | 
						|
    break;
 | 
						|
 | 
						|
  case DEVICE_OFF:
 | 
						|
  case DEVICE_CLOSE:
 | 
						|
    pPointer->public.on = FALSE;
 | 
						|
    RemoveEnabledDevice (pInfo->fd);
 | 
						|
    if (what == DEVICE_CLOSE) {
 | 
						|
      ev_close();
 | 
						|
      pInfo->fd = -1;
 | 
						|
    } else {
 | 
						|
      ev_suspend();
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  return Success;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
OsMouseReadInput (InputInfoPtr pInfo)
 | 
						|
{
 | 
						|
  MouseDevPtr pMse;
 | 
						|
  EVENT *evp;
 | 
						|
 | 
						|
  pMse = pInfo->private;
 | 
						|
 | 
						|
  while ((evp = ev_read()) != (EVENT *)0) {
 | 
						|
    int buttons = EV_BUTTONS(*evp);
 | 
						|
    int dx = EV_DX(*evp), dy = -(EV_DY(*evp)), dz = 0;
 | 
						|
 | 
						|
    if (buttons & WHEEL_FWD)
 | 
						|
      dz = -1;
 | 
						|
    else if (buttons & WHEEL_BACK)
 | 
						|
      dz = 1;
 | 
						|
 | 
						|
    buttons &= ~(WHEEL_FWD | WHEEL_BACK);
 | 
						|
 | 
						|
    pMse->PostEvent (pInfo, buttons, dx, dy, dz, 0);
 | 
						|
    ev_pop();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
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 = ev_initf(xf86Info.consoleFd);
 | 
						|
  if (pInfo->fd != -1) {
 | 
						|
    dmask_t dmask = (D_ABS | D_REL | D_BUTTON);
 | 
						|
    pInfo->fd = ev_open(&dmask);
 | 
						|
  } else {
 | 
						|
    pInfo->fd = -999;
 | 
						|
  }
 | 
						|
 | 
						|
  if (pInfo->fd < 0) {
 | 
						|
    if (xf86GetAllowMouseOpenFail())
 | 
						|
      xf86Msg(X_WARNING, "%s: cannot open event manager (%s)\n",
 | 
						|
          pInfo->name, evtErrStr(pInfo->fd));
 | 
						|
    else {
 | 
						|
      xf86Msg(X_ERROR, "%s: cannot open event manager (%s)\n",
 | 
						|
          pInfo->name, evtErrStr(pInfo->fd));
 | 
						|
      xfree(pMse);
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  ev_close();
 | 
						|
  pInfo->fd = -1;
 | 
						|
 | 
						|
  /* Process common mouse options (like Emulate3Buttons, etc). */
 | 
						|
  pMse->CommonOptions(pInfo);
 | 
						|
 | 
						|
  /* Setup the local procs. */
 | 
						|
  pInfo->device_control = OsMouseProc;
 | 
						|
  pInfo->read_input = OsMouseReadInput;
 | 
						|
    
 | 
						|
  pInfo->flags |= XI86_CONFIGURED;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT 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;
 | 
						|
}
 |