|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved.
23: *
24: * EventDriver.h - Exported Interface Event Driver object.
25: *
26: * The EventDriver is a pseudo-device driver.
27: *
28: * HISTORY
29: * 19 Mar 1992 Mike Paquette at NeXT
30: * Created.
31: * 4 Aug 1993 Erik Kay at NeXT
32: * API cleanup
33: */
34:
35: #ifndef _IOHIDSYSTEM_H
36: #define _IOHIDSYSTEM_H
37:
38: #include <IOKit/IOTimerEventSource.h>
39: #include <IOKit/IOService.h>
40: #include <IOKit/IOUserClient.h>
41: #include <IOKit/IOWorkLoop.h>
42: #include <IOKit/IOCommandQueue.h>
43: #include <IOKit/IOBufferMemoryDescriptor.h>
44: #include <IOKit/graphics/IOGraphicsDevice.h>
45: #include <IOKit/hidsystem/IOHIDevice.h>
46: #include <IOKit/hidsystem/IOHIDShared.h>
47: #include <IOKit/hidsystem/IOHIDTypes.h>
48: #include <IOKit/hidsystem/IOLLEvent.h>
49: #include "ev_keymap.h" /* For NX_NUM_SCANNED_SPECIALKEYS */
50:
51: typedef void (*IOHIDAction)(OSObject *, void *);
52:
53: class IOHIDSystem : public IOService
54: {
55: OSDeclareDefaultStructors(IOHIDSystem);
56:
57: friend class IOHIDUserClient;
58: friend class IOHIDParamUserClient;
59:
60: private:
61: IOLock * driverLock;
62:
63: IOWorkLoop * workLoop;
64: IOTimerEventSource * timerES;
65: IOCommandQueue * cmdQ;
66: IOUserClient * serverConnect;
67: IOUserClient * paramConnect;
68: IONotifier * publishNotify;
69:
70: // Ports on which we hold send rights
71: mach_port_t eventPort; // Send msg here when event queue
72: // goes non-empty
73: mach_port_t _specialKeyPort[NX_NUM_SCANNED_SPECIALKEYS]; // Special key msgs
74: void *eventMsg; // Msg to be sent to Window Server.
75:
76: // Shared memory area information
77: IOBufferMemoryDescriptor * globalMemory;
78: vm_offset_t shmem_addr; // kernel address of shared memory
79: vm_size_t shmem_size; // size of shared memory
80:
81: // Pointers to structures which occupy the shared memory area.
82: volatile void *evs; // Pointer to private driver shmem
83: volatile EvGlobals *evg; // Pointer to EvGlobals (shmem)
84: // Internal variables related to the shared memory area
85: int lleqSize; // # of entries in low-level queue
86: // FIXME: why is this ivar lleqSize an ivar? {Dan]
87:
88: // Screens list
89: vm_size_t evScreenSize; // Byte size of evScreen array
90: void *evScreen; // array of screens known to driver
91: volatile void *lastShmemPtr; // Pointer used to index thru shmem
92: // while assigning shared areas to
93: // drivers.
94: int screens; // running total of allocated screens
95: int currentScreen; // Current active screen
96: Bounds cursorPin; // Range to which cursor is pinned
97: // while on this screen.
98: Bounds workSpace; // Bounds of full workspace.
99: // Event Status state - This includes things like event timestamps,
100: // time til screen dim, and related things manipulated through the
101: // Event Status API.
102: //
103: Point pointerLoc; // Current pointing device location
104: // The value leads evg->cursorLoc.
105: Point pointerDelta; // The cumulative pointer delta values since
106: // previous mouse move event was posted
107: Point clickLoc; // location of last mouse click
108: Point clickSpaceThresh; // max mouse delta to be a doubleclick
109: int clickState; // Current click state
110: unsigned char lastPressure; // last pressure seen
111: bool lastProximity; // last proximity state seen
112:
113: SInt32 curVolume; // Value of volume setting.
114: SInt32 dimmedBrightness;// Value of screen brightness when autoDim
115: // has turned on.
116: SInt32 curBright; // The current brightness is cached here while
117: // the driver is open. This number is always
118: // the user-specified brightness level; if the
119: // screen is autodimmed, the actual brightness
120: // level in the monitor will be less.
121: SInt32 autoDimmed; // Is screen currently autodimmed?
122: bool evOpenCalled; // Has the driver been opened?
123: bool evInitialized; // Has the first-open-only initialization run?
124: bool eventsOpen; // Boolean: has evmmap been called yet?
125: bool cursorStarted; // periodic events running?
126: bool cursorEnabled; // cursor positioning ok?
127:
128: short leftENum; // Unique ID for last left down event
129: short rightENum; // Unique ID for last right down event
130:
131: // The periodic event mechanism timestamps and state
132: // are recorded here.
133: AbsoluteTime thisPeriodicRun;
134: AbsoluteTime periodicEventDelta;// Time between periodic events
135: // todo: make infinite
136: AbsoluteTime clickTime; // Timestamps used to determine doubleclicks
137: AbsoluteTime clickTimeThresh;
138: AbsoluteTime autoDimPeriod; // How long since last user action before
139: // we autodim screen? User preference item,
140: // set by InitMouse and evsioctl
141: AbsoluteTime autoDimTime; // Time value when we will autodim screen,
142: // if autoDimmed is 0.
143: // Set in LLEventPost.
144:
145: AbsoluteTime waitSustain; // Sustain time before removing cursor
146: AbsoluteTime waitSusTime; // Sustain counter
147: AbsoluteTime waitFrameRate; // Ticks per wait cursor frame
148: AbsoluteTime waitFrameTime; // Wait cursor frame timer
149:
150: // Flags used in scheduling periodic event callbacks
151: bool needSetCursorPosition;
152: bool needToKickEventConsumer;
153: IOLock * kickConsumerLock;
154:
155: public:
156: IOService * displayManager; // points to display manager
157:
158: private:
159: inline short getUniqueEventNum();
160:
161: /* Resets */
162: void _resetMouseParameters();
163: void _resetKeyboardParameters();
164:
165: /* Initialize the shared memory area */
166: void initShmem();
167: /* Dispatch low level events through shared memory to the WindowServer */
168: void postEvent(int what,
169: /* at */ Point * location,
170: /* atTime */ AbsoluteTime ts,
171: /* withData */ NXEventData * myData);
172: /* Dispatch mechanisms for screen state changes */
173: void evDispatch(int screen,
174: /* command */ EvCmd evcmd);
175: /* Dispatch mechanism for special key press */
176: void evSpecialKeyMsg(unsigned key,
177: /* direction */ unsigned dir,
178: /* flags */ unsigned f,
179: /* level */ unsigned l);
180: /* Message the event consumer to process posted events */
181: void kickEventConsumer();
182: IOReturn sendWorkLoopCommand(OSObject * target,
183: IOHIDAction action,
184: void * data);
185: static void _doPerformInIOThread( void* self,
186: void* target,
187: void* action,
188: void* data,
189: void* unused);
190: static void _periodicEvents(IOHIDSystem * self,
191: IOTimerEventSource *timer);
192:
193: static void _performSpecialKeyMsg(IOHIDSystem * self,
194: struct evioSpecialKeyMsg *msg);
195: static void _performKickEventConsumer(IOHIDSystem * self,void *);
196:
197: static bool publishNotificationHandler( IOHIDSystem * self,
198: void * ref, IOService * newService );
199:
200: /*
201: * HISTORICAL NOTE:
202: * The following methods were part of the IOHIDSystem(Input) category;
203: * the declarations have now been merged directly into this class.
204: *
205: * Exported Interface Event Driver object input services.
206: */
207:
208: private:
209: // Schedule next periodic run based on current event system state.
210: void scheduleNextPeriodicEvent();
211: // Message invoked to run periodic events. This method runs in the workloop.
212: void periodicEvents(IOTimerEventSource *timer);
213: // Start the cursor running.
214: bool startCursor();
215: // Repin cursor location.
216: bool resetCursor();
217: // Wait Cursor machinery.
218: void showWaitCursor();
219: void hideWaitCursor();
220: void animateWaitCursor();
221: void changeCursor(int frame);
222: // Return screen number a point lies on.
223: int pointToScreen(Point * p);
224: // Set the undimmed brightness.
225: void setBrightness(int b);
226: // Return undimmed brightness.
227: int brightness();
228: // Set the dimmed brightness.
229: void setAutoDimBrightness(int b);
230: // Return dimmed brightness.
231: int autoDimBrightness();
232: // Return the current brightness.
233: int currentBrightness();
234: // Dim all displays.
235: void doAutoDim();
236: // Return display brightness to normal.
237: void undoAutoDim();
238: // Force dim/undim.
239: void forceAutoDimState(bool dim);
240: // Audio volume control.
241: void setAudioVolume(int v);
242: // Audio volume control, from ext user.
243: void setUserAudioVolume(int v);
244: // Return audio volume.
245: int audioVolume();
246: // Propagate state out to screens.
247: void setBrightness();
248:
249: void showCursor();
250: void hideCursor();
251: void moveCursor();
252: // Claim ownership of event sources.
253: void attachDefaultEventSources();
254: // Give up ownership of event sources.
255: void detachEventSources();
256: bool registerEventSource(IOHIDevice * source);
257:
258: // Set abs cursor position.
259: void setCursorPosition(Point * newLoc);
260: void _setButtonState(int buttons,
261: /* atTime */ AbsoluteTime ts);
262: void _setCursorPosition(Point * newLoc);
263:
264: void _postMouseMoveEvent(int what,
265: Point * location,
266: AbsoluteTime theClock);
267:
268: /* END HISTORICAL NOTE */
269:
270: public:
271: static IOHIDSystem * instance(); /* Return the current instance of the */
272: /* EventDriver, or 0 if none. */
273:
274: virtual bool init(OSDictionary * properties = 0);
275: virtual IOHIDSystem * probe(IOService * provider,
276: SInt32 * score);
277: virtual bool start(IOService * provider);
278: virtual IOReturn message(UInt32 type, IOService * provider,
279: void * argument);
280: virtual void free();
281:
282: virtual IOWorkLoop *getWorkLoop() const;
283:
284: virtual IOReturn evOpen(void);
285: virtual IOReturn evClose(void);
286:
287: virtual bool updateProperties(void);
288: virtual IOReturn setParamProperties(OSDictionary * dict);
289: virtual bool serializeProperties( OSSerialize * s ) const;
290:
291: /* Create the shared memory area */
292: virtual IOReturn createShmem(void*,void*,void*,void*,void*,void*);
293: /* Set the port for event available notify msg */
294: virtual void setEventPort(mach_port_t port);
295: /* Set the port for the special key keypress msg */
296: virtual IOReturn setSpecialKeyPort(
297: /* keyFlavor */ int special_key,
298: /* keyPort */ mach_port_t key_port);
299: virtual mach_port_t specialKeyPort(int special_key);
300:
301:
302: virtual IOReturn newUserClient(task_t owningTask,
303: /* withToken */ void * security_id,
304: /* ofType */ UInt32 type,
305: /* client */ IOUserClient ** handler);
306:
307: /*
308: * HISTORICAL NOTE:
309: * The following methods were part of the IOHIPointingEvents protocol;
310: * the declarations have now been merged directly into this class.
311: */
312:
313: public:
314: /* Mouse event reporting */
315: virtual void relativePointerEvent(int buttons,
316: /* deltaX */ int dx,
317: /* deltaY */ int dy,
318: /* atTime */ AbsoluteTime ts);
319:
320: /* Tablet event reporting */
321: virtual void absolutePointerEvent(int buttons,
322: /* at */ Point * newLoc,
323: /* withBounds */ Bounds * bounds,
324: /* inProximity */ bool proximity,
325: /* withPressure */ int pressure,
326: /* withAngle */ int stylusAngle,
327: /* atTime */ AbsoluteTime ts);
328:
329: /* Mouse scroll wheel event reporting */
330: virtual void scrollWheelEvent(short deltaAxis1,
331: short deltaAxis2,
332: short deltaAxis3,
333: AbsoluteTime ts);
334:
335:
336: virtual void tabletEvent(NXEventData *tabletData,
337: AbsoluteTime ts);
338:
339: virtual void proximityEvent(NXEventData *proximityData,
340: AbsoluteTime ts);
341:
342: /*
343: * HISTORICAL NOTE:
344: * The following methods were part of the IOHIKeyboardEvents protocol;
345: * the declarations have now been merged directly into this class.
346: */
347:
348: public:
349: virtual void keyboardEvent(unsigned eventType,
350: /* flags */ unsigned flags,
351: /* keyCode */ unsigned key,
352: /* charCode */ unsigned charCode,
353: /* charSet */ unsigned charSet,
354: /* originalCharCode */ unsigned origCharCode,
355: /* originalCharSet */ unsigned origCharSet,
356: /* repeat */ bool repeat,
357: /* atTime */ AbsoluteTime ts);
358: virtual void keyboardSpecialEvent(unsigned eventType,
359: /* flags */ unsigned flags,
360: /* keyCode */ unsigned key,
361: /* specialty */ unsigned flavor,
362: /* atTime */ AbsoluteTime ts);
363: virtual void updateEventFlags(unsigned flags); /* Does not generate events */
364:
365:
366:
367:
368: private:
369:
370: /*
371: * statics for upstream callouts
372: */
373:
374: void _scaleLocationToCurrentScreen(Point *location, Bounds *bounds); // Should this one be public???
375:
376: static void _relativePointerEvent( IOHIDSystem * self,
377: int buttons,
378: /* deltaX */ int dx,
379: /* deltaY */ int dy,
380: /* atTime */ AbsoluteTime ts);
381:
382: /* Tablet event reporting */
383: static void _absolutePointerEvent(IOHIDSystem * self,
384: int buttons,
385: /* at */ Point * newLoc,
386: /* withBounds */ Bounds * bounds,
387: /* inProximity */ bool proximity,
388: /* withPressure */ int pressure,
389: /* withAngle */ int stylusAngle,
390: /* atTime */ AbsoluteTime ts);
391:
392: /* Mouse scroll wheel event reporting */
393: static void _scrollWheelEvent(IOHIDSystem *self,
394: short deltaAxis1,
395: short deltaAxis2,
396: short deltaAxis3,
397: AbsoluteTime ts);
398:
399: static void _tabletEvent(IOHIDSystem *self,
400: NXEventData *tabletData,
401: AbsoluteTime ts);
402:
403: static void _proximityEvent(IOHIDSystem *self,
404: NXEventData *proximityData,
405: AbsoluteTime ts);
406:
407: static void _keyboardEvent( IOHIDSystem * self,
408: unsigned eventType,
409: /* flags */ unsigned flags,
410: /* keyCode */ unsigned key,
411: /* charCode */ unsigned charCode,
412: /* charSet */ unsigned charSet,
413: /* originalCharCode */ unsigned origCharCode,
414: /* originalCharSet */ unsigned origCharSet,
415: /* repeat */ bool repeat,
416: /* atTime */ AbsoluteTime ts);
417: static void _keyboardSpecialEvent( IOHIDSystem * self,
418: unsigned eventType,
419: /* flags */ unsigned flags,
420: /* keyCode */ unsigned key,
421: /* specialty */ unsigned flavor,
422: /* atTime */ AbsoluteTime ts);
423: static void _updateEventFlags( IOHIDSystem * self,
424: unsigned flags); /* Does not generate events */
425:
426:
427: /*
428: * HISTORICAL NOTE:
429: * The following methods were part of the IOUserClient protocol;
430: * the declarations have now been merged directly into this class.
431: */
432:
433: public:
434:
435: virtual IOReturn setEventsEnable(void*,void*,void*,void*,void*,void*);
436: virtual IOReturn setCursorEnable(void*,void*,void*,void*,void*,void*);
437: virtual IOReturn extPostEvent(void*,void*,void*,void*,void*,void*);
438: virtual IOReturn extSetMouseLocation(void*,void*,void*,void*,void*,void*);
439: virtual IOReturn extGetButtonEventNum(void*,void*,void*,void*,void*,void*);
440:
441: /*
442: * HISTORICAL NOTE:
443: * The following methods were part of the IOScreenRegistration protocol;
444: * the declarations have now been merged directly into this class.
445: *
446: * Methods exported by the EventDriver for display systems.
447: *
448: * The screenRegister protocol is used by frame buffer drivers to register
449: * themselves with the Event Driver. These methods are called in response
450: * to an _IOGetParameterInIntArray() call with "IO_Framebuffer_Register" or
451: * "IO_Framebuffer_Unregister".
452: */
453:
454: public:
455: virtual int registerScreen(IOGraphicsDevice * instance,
456: /* bounds */ Bounds * bp);
457: // /* shmem */ void ** addr,
458: // /* size */ int * size)
459: virtual void unregisterScreen(int index);
460:
461: /*
462: * HISTORICAL NOTE:
463: * The following methods were part of the IOWorkspaceBounds protocol;
464: * the declarations have now been merged directly into this class.
465: *
466: * Absolute position input devices and some specialized output devices
467: * may need to know the bounding rectangle for all attached displays.
468: * The following method returns a Bounds* for the workspace. Please note
469: * that the bounds are kept as signed values, and that on a multi-display
470: * system the minx and miny values may very well be negative.
471: */
472:
473: public:
474: virtual Bounds * workspaceBounds();
475:
476: /* END HISTORICAL NOTES */
477: };
478:
479: #endif /* !_IOHIDSYSTEM_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.