1ee3138f1Smrg/*
2ee3138f1Smrg * Copyright 1997,1998 by UCHIYAMA Yasushi
3ee3138f1Smrg *
4ee3138f1Smrg * Permission to use, copy, modify, distribute, and sell this software and its
5ee3138f1Smrg * documentation for any purpose is hereby granted without fee, provided that
6ee3138f1Smrg * the above copyright notice appear in all copies and that both that
7ee3138f1Smrg * copyright notice and this permission notice appear in supporting
8ee3138f1Smrg * documentation, and that the name of UCHIYAMA Yasushi not be used in
9ee3138f1Smrg * advertising or publicity pertaining to distribution of the software without
10ee3138f1Smrg * specific, written prior permission.  UCHIYAMA Yasushi makes no representations
11ee3138f1Smrg * about the suitability of this software for any purpose.  It is provided
12ee3138f1Smrg * "as is" without express or implied warranty.
13ee3138f1Smrg *
14ee3138f1Smrg * UCHIYAMA YASUSHI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15ee3138f1Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16ee3138f1Smrg * EVENT SHALL UCHIYAMA YASUSHI BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17ee3138f1Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18ee3138f1Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19ee3138f1Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20ee3138f1Smrg * PERFORMANCE OF THIS SOFTWARE.
21ee3138f1Smrg *
22ee3138f1Smrg */
23ee3138f1Smrg
24ee3138f1Smrg#ifdef HAVE_CONFIG_H
25ee3138f1Smrg#include <config.h>
26ee3138f1Smrg#endif
27ee3138f1Smrg
28b425557eSmrg#include <xorg-server.h>
29ee3138f1Smrg#include <X11/X.h>
30ee3138f1Smrg
31ee3138f1Smrg#include "compiler.h"
32ee3138f1Smrg
33ee3138f1Smrg#include "xf86.h"
34ee3138f1Smrg#include "xf86Priv.h"
35ee3138f1Smrg#include "xf86_OSlib.h"
36ee3138f1Smrg
37ee3138f1Smrg#include "xf86Xinput.h"
38ee3138f1Smrg#include "xf86OSKbd.h"
39ee3138f1Smrg#include "atKeynames.h"
40ee3138f1Smrg#include "xf86Keymap.h"
41ee3138f1Smrg
42ee3138f1Smrg#include <stdio.h>
43ee3138f1Smrg#include <errno.h>
44ee3138f1Smrg#include <sys/time.h>
45ee3138f1Smrg#include <sys/file.h>
46ee3138f1Smrg#include <assert.h>
47ee3138f1Smrg#include <mach.h>
48ee3138f1Smrg#include <sys/ioctl.h>
49ee3138f1Smrg
50ee3138f1Smrgtypedef unsigned short kev_type;		/* kd event type */
51ee3138f1Smrgtypedef unsigned char Scancode;
52ee3138f1Smrg
53ee3138f1Smrgstruct mouse_motion {
54ee3138f1Smrg    short mm_deltaX;		/* units? */
55ee3138f1Smrg    short mm_deltaY;
56ee3138f1Smrg};
57ee3138f1Smrg
58ee3138f1Smrgtypedef struct {
59ee3138f1Smrg    kev_type type;			/* see below */
60ee3138f1Smrg    struct timeval time;		/* timestamp */
61ee3138f1Smrg    union {				/* value associated with event */
62ee3138f1Smrg	boolean_t up;		/* MOUSE_LEFT .. MOUSE_RIGHT */
63ee3138f1Smrg	Scancode sc;		/* KEYBD_EVENT */
64ee3138f1Smrg	struct mouse_motion mmotion;	/* MOUSE_MOTION */
65ee3138f1Smrg    } value;
66ee3138f1Smrg} kd_event;
67ee3138f1Smrg
68ee3138f1Smrg/*
69ee3138f1Smrg * kd_event ID's.
70ee3138f1Smrg */
71ee3138f1Smrg#define MOUSE_LEFT	1		/* mouse left button up/down */
72ee3138f1Smrg#define MOUSE_MIDDLE	2
73ee3138f1Smrg#define MOUSE_RIGHT	3
74ee3138f1Smrg#define MOUSE_MOTION	4		/* mouse motion */
75ee3138f1Smrg#define KEYBD_EVENT	5		/* key up/down */
76ee3138f1Smrg
77ee3138f1Smrg/***********************************************************************
78ee3138f1Smrg * Keyboard
79ee3138f1Smrg **********************************************************************/
80ee3138f1Smrgstatic void
81ee3138f1SmrgSoundKbdBell(InputInfoPtr pInfo, int loudness,int pitch,int duration)
82ee3138f1Smrg{
83ee3138f1Smrg    return;
84ee3138f1Smrg}
85ee3138f1Smrg
86ee3138f1Smrgstatic void
87ee3138f1SmrgSetKbdLeds(InputInfoPtr pInfo, int leds)
88ee3138f1Smrg{
89ee3138f1Smrg    return;
90ee3138f1Smrg}
91ee3138f1Smrg
92ee3138f1Smrgstatic int
93ee3138f1SmrgGetKbdLeds(InputInfoPtr pInfo)
94ee3138f1Smrg{
95ee3138f1Smrg    return 0;
96ee3138f1Smrg}
97ee3138f1Smrg
98ee3138f1Smrgstatic void
99ee3138f1SmrgKbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
100ee3138f1Smrg{
101ee3138f1Smrg    pKeySyms->map        = map;
102ee3138f1Smrg    pKeySyms->mapWidth   = GLYPHS_PER_KEY;
103ee3138f1Smrg    pKeySyms->minKeyCode = MIN_KEYCODE;
104ee3138f1Smrg    pKeySyms->maxKeyCode = MAX_KEYCODE;
105ee3138f1Smrg    return;
106ee3138f1Smrg}
107ee3138f1Smrg
108ee3138f1Smrgstatic int
109ee3138f1SmrgKbdOn(InputInfoPtr pInfo, int what)
110ee3138f1Smrg{
111ee3138f1Smrg    int data = 1;
112ee3138f1Smrg    if( ioctl( pInfo->fd, _IOW('k', 1, int),&data) < 0)
113ee3138f1Smrg	FatalError("Cannot set event mode on keyboard (%s)\n",strerror(errno));
114ee3138f1Smrg    return Success;
115ee3138f1Smrg}
116ee3138f1Smrgstatic int
117ee3138f1SmrgKbdOff(InputInfoPtr pInfo, int what)
118ee3138f1Smrg{
119ee3138f1Smrg    int data = 2;
120ee3138f1Smrg    if( ioctl( pInfo->fd, _IOW('k', 1, int),&data) < 0)
121ee3138f1Smrg	FatalError("can't reset keyboard mode (%s)\n",strerror(errno));
122ee3138f1Smrg    return Success;
123ee3138f1Smrg}
124ee3138f1Smrg
125ee3138f1Smrgstatic int
126ee3138f1SmrgKbdInit(InputInfoPtr pInfo, int what)
127ee3138f1Smrg{
128ee3138f1Smrg    return Success;
129ee3138f1Smrg}
130ee3138f1Smrg
131ee3138f1Smrgstatic void
132ee3138f1SmrgReadInput(InputInfoPtr pInfo)
133ee3138f1Smrg{
134ee3138f1Smrg    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
135ee3138f1Smrg    kd_event ke;
136ee3138f1Smrg    while( read(pInfo->fd, &ke, sizeof(ke)) == sizeof(ke) )
137ee3138f1Smrg	pKbd->PostEvent(pInfo, ke.value.sc & 0x7f, ke.value.sc & 0x80 ? FALSE : TRUE);
138ee3138f1Smrg}
139ee3138f1Smrg
140ee3138f1Smrgstatic Bool
141ee3138f1SmrgOpenKeyboard(InputInfoPtr pInfo)
142ee3138f1Smrg{
143ee3138f1Smrg    pInfo->fd = xf86Info.consoleFd;
144ee3138f1Smrg    return TRUE;
145ee3138f1Smrg}
146ee3138f1Smrg
147ee3138f1SmrgBool
148ee3138f1Smrgxf86OSKbdPreInit(InputInfoPtr pInfo)
149ee3138f1Smrg{
150ee3138f1Smrg    KbdDevPtr pKbd = pInfo->private;
151ee3138f1Smrg
152ee3138f1Smrg    pKbd->KbdInit       = KbdInit;
153ee3138f1Smrg    pKbd->KbdOn         = KbdOn;
154ee3138f1Smrg    pKbd->KbdOff        = KbdOff;
155ee3138f1Smrg    pKbd->Bell          = SoundKbdBell;
156ee3138f1Smrg    pKbd->SetLeds       = SetKbdLeds;
157ee3138f1Smrg    pKbd->GetLeds       = GetKbdLeds;
158ee3138f1Smrg    pKbd->KbdGetMapping = KbdGetMapping;
159ee3138f1Smrg    pKbd->RemapScanCode = ATScancode;
160ee3138f1Smrg    pKbd->OpenKeyboard  = OpenKeyboard;
161ee3138f1Smrg    pKbd->private       = NULL;
162ee3138f1Smrg    pInfo->read_input   = ReadInput;
163ee3138f1Smrg    return TRUE;
164ee3138f1Smrg}
165