|
Carlos Lopez |
a09598 |
/* darwin-input.c -- code to manage the input event queue
|
|
Carlos Lopez |
a09598 |
$Id: darwin-input.c,v 1.4 2002/12/13 00:22:51 jharper Exp $ */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
* Copyright (c) 2001-2002 Torrey T. Lyons. All Rights Reserved.
|
|
Carlos Lopez |
a09598 |
* Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
Carlos Lopez |
a09598 |
* copy of this software and associated documentation files (the "Software"),
|
|
Carlos Lopez |
a09598 |
* to deal in the Software without restriction, including without limitation
|
|
Carlos Lopez |
a09598 |
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
Carlos Lopez |
a09598 |
* and/or sell copies of the Software, and to permit persons to whom the
|
|
Carlos Lopez |
a09598 |
* Software is furnished to do so, subject to the following conditions:
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* The above copyright notice and this permission notice shall be included in
|
|
Carlos Lopez |
a09598 |
* all copies or substantial portions of the Software.
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Carlos Lopez |
a09598 |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Carlos Lopez |
a09598 |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
Carlos Lopez |
a09598 |
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
Carlos Lopez |
a09598 |
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
Carlos Lopez |
a09598 |
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
Carlos Lopez |
a09598 |
* DEALINGS IN THE SOFTWARE.
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* Except as contained in this notice, the name(s) of the above copyright
|
|
Carlos Lopez |
a09598 |
* holders shall not be used in advertising or otherwise to promote the sale,
|
|
Carlos Lopez |
a09598 |
* use or other dealings in this Software without prior written authorization.
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#include "darwin.h"
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#include "mipointer.h" // mi software cursor
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#include <pthread.h></pthread.h>
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#define QUEUE_SIZE 256
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
static struct {
|
|
Carlos Lopez |
a09598 |
pthread_mutex_t mutex;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* DIX looks at these two integer values, when they're equal
|
|
Carlos Lopez |
a09598 |
it won't call ProcessInputEvents (). */
|
|
Carlos Lopez |
a09598 |
HWEventQueueType head, tail;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
xEvent events[QUEUE_SIZE];
|
|
Carlos Lopez |
a09598 |
} event_queue;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* fd[0] = reading, fd[1] = writing */
|
|
Carlos Lopez |
a09598 |
static int event_fd[2];
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DarwinEnqueueEvent (const xEvent *e)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
int newtail, oldtail;
|
|
Carlos Lopez |
a09598 |
int need_write = FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pthread_mutex_lock (&event_queue.mutex);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
oldtail = (event_queue.tail - 1) % QUEUE_SIZE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (e->u.u.type == MotionNotify
|
|
Carlos Lopez |
a09598 |
&& event_queue.tail != event_queue.head
|
|
Carlos Lopez |
a09598 |
&& event_queue.events[oldtail].u.u.type == MotionNotify)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
/* Two adjacent motion notify events. Coalesce them. */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
memcpy (&event_queue.events[oldtail], e, sizeof (xEvent));
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
else
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
newtail = (event_queue.tail + 1) % QUEUE_SIZE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (newtail != event_queue.head)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
memcpy (&event_queue.events[event_queue.tail], e, sizeof (xEvent));
|
|
Carlos Lopez |
a09598 |
event_queue.tail = newtail;
|
|
Carlos Lopez |
a09598 |
need_write = TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pthread_mutex_unlock (&event_queue.mutex);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (need_write)
|
|
Carlos Lopez |
a09598 |
write (event_fd[1], &need_write, sizeof (need_write));
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DarwinDequeueEvent (xEvent *e)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
Bool ret = FALSE;
|
|
Carlos Lopez |
a09598 |
int unused;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pthread_mutex_lock (&event_queue.mutex);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (event_queue.head != event_queue.tail)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
memcpy (e, &event_queue.events[event_queue.head], sizeof (xEvent));
|
|
Carlos Lopez |
a09598 |
event_queue.head = (event_queue.head + 1) % QUEUE_SIZE;
|
|
Carlos Lopez |
a09598 |
ret = TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pthread_mutex_unlock (&event_queue.mutex);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (ret)
|
|
Carlos Lopez |
a09598 |
read (event_fd[0], &unused, sizeof (unused));
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return ret;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DarwinInputPreInit (void)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
if (pipe (event_fd) != 0)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
perror ("pipe");
|
|
Carlos Lopez |
a09598 |
exit (1);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
event_queue.head = event_queue.tail = 0;
|
|
Carlos Lopez |
a09598 |
pthread_mutex_init (&event_queue.mutex, NULL);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DarwinInputInit (void)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
SetInputCheck (&event_queue.head, &event_queue.tail);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
=============================================================================
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
mouse and keyboard callbacks
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
=============================================================================
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
* DarwinChangePointerControl
|
|
Carlos Lopez |
a09598 |
* Set mouse acceleration and thresholding
|
|
Carlos Lopez |
a09598 |
* FIXME: We currently ignore the threshold in ctrl->threshold.
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
static void DarwinChangePointerControl(DeviceIntPtr device, PtrCtrl *ctrl)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
/* do nothing here */
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
* DarwinMouseProc
|
|
Carlos Lopez |
a09598 |
* Handle the initialization, etc. of a mouse
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
int DarwinMouseProc(DeviceIntPtr pPointer, int what)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
char map[6];
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
switch (what) {
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
case DEVICE_INIT:
|
|
Carlos Lopez |
a09598 |
pPointer->public.on = FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
// Set button map.
|
|
Carlos Lopez |
a09598 |
map[1] = 1;
|
|
Carlos Lopez |
a09598 |
map[2] = 2;
|
|
Carlos Lopez |
a09598 |
map[3] = 3;
|
|
Carlos Lopez |
a09598 |
map[4] = 4;
|
|
Carlos Lopez |
a09598 |
map[5] = 5;
|
|
Carlos Lopez |
a09598 |
InitPointerDeviceStruct( (DevicePtr)pPointer,
|
|
Carlos Lopez |
a09598 |
map,
|
|
Carlos Lopez |
a09598 |
5, // numbuttons (4 & 5 are scroll wheel)
|
|
Carlos Lopez |
a09598 |
miPointerGetMotionEvents,
|
|
Carlos Lopez |
a09598 |
DarwinChangePointerControl,
|
|
Carlos Lopez |
a09598 |
0 );
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
case DEVICE_ON:
|
|
Carlos Lopez |
a09598 |
pPointer->public.on = TRUE;
|
|
Carlos Lopez |
a09598 |
AddEnabledDevice(event_fd[0]);
|
|
Carlos Lopez |
a09598 |
return Success;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
case DEVICE_CLOSE:
|
|
Carlos Lopez |
a09598 |
case DEVICE_OFF:
|
|
Carlos Lopez |
a09598 |
pPointer->public.on = FALSE;
|
|
Carlos Lopez |
a09598 |
RemoveEnabledDevice(event_fd[0]);
|
|
Carlos Lopez |
a09598 |
return Success;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return Success;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
* DarwinKeybdProc
|
|
Carlos Lopez |
a09598 |
* Callback from X
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
int DarwinKeybdProc(DeviceIntPtr pDev, int onoff)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
switch ( onoff ) {
|
|
Carlos Lopez |
a09598 |
case DEVICE_INIT:
|
|
Carlos Lopez |
a09598 |
DarwinKeyboardInit( pDev );
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
case DEVICE_ON:
|
|
Carlos Lopez |
a09598 |
pDev->public.on = TRUE;
|
|
Carlos Lopez |
a09598 |
AddEnabledDevice(event_fd[0]);
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
case DEVICE_OFF:
|
|
Carlos Lopez |
a09598 |
pDev->public.on = FALSE;
|
|
Carlos Lopez |
a09598 |
RemoveEnabledDevice(event_fd[0]);
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
case DEVICE_CLOSE:
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return Success;
|
|
Carlos Lopez |
a09598 |
}
|