|
|
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: /****************************************************************************** ! 23: ! 24: evio.h ! 25: Ioctl calls for the events driver ! 26: Leovitch 02Jan88 ! 27: ! 28: Copyright 1988 NeXT, Inc. ! 29: ! 30: CAUTION: Developers should stick to the API exported in ! 31: <drivers/event_status_driver.h> to guarantee ! 32: binary compatability of their applications in future ! 33: releases. ! 34: ! 35: Modified: ! 36: ! 37: 09Dec88 Leo Broken out from evsio.h ! 38: 24Aug89 Ted ANSI function prototyping. ! 39: 19Feb90 Ted Major revision for multiple driver support. ! 40: 26Feb90 Ted New evioScreen structure and EVIOST ioctl. ! 41: 12Mar90 Ted New ev_unregister_screen function, SCREENTOKEN constant. ! 42: 06May90 Ted Added AALastEventSent and AALastEventConsumed to EvVars. ! 43: 22May90 Trey More wait cursor vars in EvVars. ! 44: 13Jun90 Ted NXCursorData structure. ! 45: 18Jun90 Ted Default wait cursor constants. ! 46: 26Sep90 Ted Enhanced cursor system to support intelligent drivers. ! 47: 26Nov90 Ted Removed NXSaveCursor and NXCursorData structures ! 48: 28Nov90 Ted Remove EvVars, rolled into EventGlobals ! 49: 28Nov90 Ted Renamed EventGlobals -> EvGlobals, eventGlobals -> evg ! 50: 05May92 Mike Reworked for NRW driver architecture. ! 51: ! 52: ******************************************************************************/ ! 53: ! 54: #ifndef _DEV_EVIO_H ! 55: #define _DEV_EVIO_H ! 56: ! 57: #include <sys/cdefs.h> ! 58: ! 59: __BEGIN_DECLS ! 60: ! 61: #if KERNEL ! 62: #include <IOKit/system.h> ! 63: #else /* !KERNEL */ ! 64: #include <mach/message.h> ! 65: #include <IOKit/IOKitLib.h> ! 66: #endif /* KERNEL */ ! 67: ! 68: #include <IOKit/IOReturn.h> ! 69: #include <IOKit/graphics/IOGraphicsTypes.h> ! 70: #include <IOKit/hidsystem/IOHIDTypes.h> ! 71: #include <IOKit/hidsystem/IOLLEvent.h> ! 72: ! 73: /* ! 74: * Identify this driver as one that uses the new driverkit and messaging API ! 75: */ ! 76: #ifndef _NeXT_MACH_EVENT_DRIVER_ ! 77: #define _NeXT_MACH_EVENT_DRIVER_ (1) ! 78: #endif /* _NeXT_MACH_EVENT_DRIVER_ */ ! 79: ! 80: ! 81: /* Pressure Constants */ ! 82: #define MINPRESSURE EV_MINPRESSURE ! 83: #define MAXPRESSURE EV_MAXPRESSURE ! 84: ! 85: #define LLEQSIZE 80 /* Entries in low-level event queue */ ! 86: ! 87: typedef struct _NXEQElStruct { ! 88: int next; /* Slot of lleq for next event */ ! 89: ev_lock_data_t sema; /* Is high-level code reading this event now? */ ! 90: NXEvent event; /* The event itself */ ! 91: } NXEQElement; ! 92: ! 93: ! 94: /****************************************************************************** ! 95: SHARED MEMORY OVERVIEW ! 96: ! 97: PERSPECTIVE ! 98: The ev driver and PostScript share at least one page of wired memory. ! 99: This memory contains the low-level event queue which ev deposits events ! 100: into and PostScript reads events from. Also, this memory contains other ! 101: important data such as wait cursor state and some general cursor state. ! 102: This memory is critical for speed. That is, we avoid having to make ! 103: system calls for common operations. ! 104: ! 105: SHARED MEMORY REGIONS ! 106: There are currently three "regions" or "zones" delineated within this ! 107: shared memory. The first zone is the EvOffsets structure. This structure ! 108: contains two offsets from the beginning of shared memory. The first offset ! 109: is to the second zone, EvGlobals. The second offset is to the third ! 110: zone, private shmem for drivers. ! 111: ! 112: INITIALIZATION OF SHARED MEMORY ! 113: When the WindowServer starts up, it finds all screens that will be active. ! 114: It then opens the ev driver and calls the EVIOSSCR ioctl repeatedly for ! 115: each screen in use. This lets the ev driver set up the evScreen array ! 116: and fill in each element. This ioctl also returns to PostScript a running ! 117: total shared memory size with which to allocate. PostScript then allocates ! 118: a region of memory this size and calls evmmap to "map in" this shared ! 119: region. Evmmap initializes and fills in the EvOffsets and EvGlobals. ! 120: Next the WindowServer calls each screen in turn to register itself with ! 121: the ev driver in the same sequence as presented to EVIOSSCR. Each screen ! 122: driver calls ev_register_screen() which among other things allocates a ! 123: part of the private shmem (of the third shared memory zone) for the driver. ! 124: ! 125: DEBUGGING NOTES ! 126: You can easily display and set this shared memory from kgdb, but usually ! 127: cannot do so from within PostScript. Gdb (or some weird interaction ! 128: between gdb and the os) chokes on this shmem. So if you read or write ! 129: this area of memory, copy-on-write will occur and you'll get a completely ! 130: new page for PostScript. This will render the shared memory scheme ! 131: useless and you will have to restart PostScript. It was my understanding ! 132: that before, we were able to "read" this area from PS, but not write to ! 133: it (the idea behind copy-on-WRITE). However, this seems to be broken ! 134: in 2.0. We think this is a kernel bug. ! 135: ******************************************************************************/ ! 136: ! 137: typedef volatile struct _evOffsets { ! 138: int evGlobalsOffset; /* Offset to EvGlobals structure */ ! 139: int evShmemOffset; /* Offset to private shmem regions */ ! 140: } EvOffsets; ! 141: ! 142: /****************************************************************************** ! 143: EvGlobals ! 144: This structures defines the portion of the events driver data structure ! 145: that is exported to the PostScript server. It contains the event queue ! 146: which is in memory shared between the driver and the PostScript server. ! 147: All the variables necessary to read and process events from the queue are ! 148: contained here. ! 149: ******************************************************************************/ ! 150: ! 151: typedef volatile struct _evGlobals { ! 152: ev_lock_data_t cursorSema; /* set to disable periodic code */ ! 153: int LLEHead; /* The next event to be read */ ! 154: int LLETail; /* Where the next event will go */ ! 155: int LLELast; /* The last event entered */ ! 156: int eNum; /* Unique id for mouse events */ ! 157: int buttons; /* State of the mouse buttons 1==down, 0==up */ ! 158: int eventFlags; /* The current value of event.flags */ ! 159: int VertRetraceClock; /* The current value of event.time */ ! 160: IOGPoint cursorLoc; /* The current location of the cursor */ ! 161: int frame; /* current cursor frame */ ! 162: IOGBounds workBounds; /* bounding box of all screens */ ! 163: IOGBounds mouseRect; /* Rect for mouse-exited events */ ! 164: int version; /* for run time checks */ ! 165: int structSize; /* for run time checks */ ! 166: #if EVENT_SYSTEM_VERSION > 1 ! 167: unsigned int reservedA[32]; ! 168: #endif ! 169: unsigned reserved:27; ! 170: unsigned wantPressure:1; /* pressure in current mouseRect? */ ! 171: unsigned wantPrecision:1; /* precise coordinates in current mouseRect? */ ! 172: unsigned dontWantCoalesce:1;/* coalesce within the current mouseRect? */ ! 173: unsigned dontCoalesce:1; /* actual flag which determines coalescing */ ! 174: unsigned mouseRectValid:1; /* If nonzero, post a mouse-exited ! 175: whenever mouse outside mouseRect. */ ! 176: int movedMask; /* This contains an event mask for the ! 177: three events MOUSEMOVED, ! 178: LMOUSEDRAGGED, and RMOUSEDRAGGED. ! 179: It says whether driver should ! 180: generate those events. */ ! 181: int AALastEventSent; /* timestamp for wait cursor */ ! 182: int AALastEventConsumed; /* timestamp for wait cursor */ ! 183: ev_lock_data_t waitCursorSema; /* protects wait cursor fields */ ! 184: int waitCursorUp; /* Is wait cursor up? */ ! 185: char ctxtTimedOut; /* Has wait cursor timer expired? */ ! 186: char waitCursorEnabled; /* Play wait cursor game (per ctxt)? */ ! 187: char globalWaitCursorEnabled; /* Play wait cursor game (global)? */ ! 188: int waitThreshold; /* time before wait cursor appears */ ! 189: NXEQElement lleq[LLEQSIZE]; /* The event queue itself */ ! 190: } EvGlobals; ! 191: ! 192: ! 193: /* These evio structs are used in various calls supported by the ev driver. */ ! 194: ! 195: struct evioLLEvent { ! 196: int setCursor; ! 197: int type; ! 198: IOGPoint location; ! 199: NXEventData data; ! 200: int setFlags; ! 201: int flags; ! 202: }; ! 203: ! 204: typedef struct evioLLEvent _NXLLEvent; ! 205: ! 206: #ifdef mach3xxx ! 207: ! 208: /* ! 209: * On a keypress of a VOL UP or VOL DOWN key, we send a message to the ! 210: * sound server to notify it of the volume change. The message includes ! 211: * a flag to indicate which key was pressed, and the machine independant ! 212: * flag bits to indicate which modifier keys were pressed. ! 213: */ ! 214: ! 215: struct evioSpecialKeyMsg ! 216: { ! 217: msg_header_t Head; ! 218: msg_type_t keyType; ! 219: int key; // special key number, from bsd/dev/ev_keymap.h ! 220: msg_type_t directionType; ! 221: int direction; // NX_KEYDOWN, NX_KEYUP from event.h ! 222: msg_type_t flagsType; ! 223: int flags; // device independant flags from event.h ! 224: msg_type_t levelType; ! 225: int level; // EV_AUDIO_MIN_VOLUME to EV_AUDIO_MAX_VOLUME ! 226: }; ! 227: #else ! 228: struct evioSpecialKeyMsg ! 229: { ! 230: mach_msg_header_t Head; ! 231: int key; // special key number, from bsd/dev/ev_keymap.h ! 232: int direction; // NX_KEYDOWN, NX_KEYUP from event.h ! 233: int flags; // device independant flags from event.h ! 234: int level; // EV_AUDIO_MIN_VOLUME to EV_AUDIO_MAX_VOLUME ! 235: }; ! 236: #endif ! 237: ! 238: #define EV_SPECIAL_KEY_MSG_ID (('S'<<24) | ('k'<<16) | ('e'<<8) | ('y')) ! 239: typedef struct evioSpecialKeyMsg *evioSpecialKeyMsg_t; ! 240: ! 241: /* ! 242: * Volume ranges ! 243: */ ! 244: #define EV_AUDIO_MIN_VOLUME 0 ! 245: #define EV_AUDIO_MAX_VOLUME 64 ! 246: ! 247: #define kIOHIDSystemClass "IOHIDSystem" ! 248: #define kIOHIKeyboardClass "IOHIKeyboard" ! 249: #define kIOHIPointingClass "IOHIPointing" ! 250: ! 251: #define IOHIDSYSTEM_CONFORMSTO kIOHIDSystemClass ! 252: ! 253: enum { ! 254: kIOHIDCurrentShmemVersion = 2, ! 255: kIOHIDServerConnectType = 0, ! 256: kIOHIDParamConnectType = 1, ! 257: kIOHIDGlobalMemory = 0, ! 258: kIOHIDEventNotification = 0 ! 259: }; ! 260: ! 261: #ifndef KERNEL ! 262: #ifndef _IOKIT_IOHIDLIB_H ! 263: #include <IOKit/hidsystem/IOHIDLib.h> ! 264: #endif ! 265: #endif /* !KERNEL */ ! 266: ! 267: __END_DECLS ! 268: ! 269: ! 270: #endif /* !_DEV_EVIO_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.