Annotation of kernel/bsd/dev/evio.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /******************************************************************************
                     26: 
                     27:     evio.h
                     28:     Ioctl calls for the events driver
                     29:     Leovitch 02Jan88
                     30:     
                     31:     Copyright 1988 NeXT, Inc.
                     32:     
                     33:        CAUTION: Developers should stick to the API exported in
                     34:                <drivers/event_status_driver.h> to guarantee
                     35:                binary compatability of their applications in future
                     36:                releases.
                     37: 
                     38:     Modified:
                     39:     
                     40:     09Dec88 Leo  Broken out from evsio.h
                     41:     24Aug89 Ted  ANSI function prototyping.
                     42:     19Feb90 Ted  Major revision for multiple driver support.
                     43:     26Feb90 Ted  New evioScreen structure and EVIOST ioctl.
                     44:     12Mar90 Ted  New ev_unregister_screen function, SCREENTOKEN constant.
                     45:     06May90 Ted  Added AALastEventSent and AALastEventConsumed to EvVars.
                     46:     22May90 Trey More wait cursor vars in EvVars.
                     47:     13Jun90 Ted  NXCursorData structure.
                     48:     18Jun90 Ted  Default wait cursor constants.
                     49:     26Sep90 Ted  Enhanced cursor system to support intelligent drivers.
                     50:     26Nov90 Ted  Removed NXSaveCursor and NXCursorData structures
                     51:     28Nov90 Ted  Remove EvVars, rolled into EventGlobals
                     52:     28Nov90 Ted  Renamed EventGlobals -> EvGlobals, eventGlobals -> evg
                     53:     05May92 Mike Reworked for NRW driver architecture.
                     54: 
                     55: ******************************************************************************/
                     56: 
                     57: #ifdef DRIVER_PRIVATE
                     58: 
                     59: #ifndef _DEV_EVIO_
                     60: #define _DEV_EVIO_
                     61: #import <mach/port.h>
                     62: #import <mach/message.h>
                     63: #import <bsd/dev/ev_types.h>
                     64: #import <bsd/dev/event.h>
                     65: #import <driverkit/generalFuncs.h>
                     66: #import <mach/boolean.h>
                     67: 
                     68: /*
                     69:  * Identify this driver as one that uses the new driverkit and messaging API
                     70:  */
                     71: #ifndef _NeXT_MACH_EVENT_DRIVER_
                     72: #define _NeXT_MACH_EVENT_DRIVER_       (1)
                     73: #endif /* _NeXT_MACH_EVENT_DRIVER_ */
                     74: 
                     75: 
                     76: /*
                     77:  * Time sources, in ticks and milliseconds.  These work in both
                     78:  * the kernel and user environments, as long as the driverkit is
                     79:  * linked in.  The tick time is on the same order as the old vertical blanking
                     80:  * counter, but is derived from the nanosecond timer timebase.
                     81:  */
                     82: #if defined(_KERNEL)
                     83: extern void IOGetTimestamp(ns_time_t *nsp);    // Can not include generalFuncs.h
                     84:                                                // due to PS conflicts with
                     85:                                                // Adobe code.
                     86:        
                     87:  static inline unsigned
                     88: EvTickTimeValue()
                     89: {
                     90:        ns_time_t       ns_time;
                     91:        unsigned        tick;
                     92:        IOGetTimestamp(&ns_time);
                     93:        // Convert nanosec => ticks and return
                     94:        tick = EV_NS_TO_TICK(ns_time);
                     95:        if ( tick == 0 )
                     96:                tick = 1;       // No zero values allowed!
                     97:        return tick;
                     98: }
                     99: 
                    100:  static inline unsigned
                    101: EvMsecTimeValue()
                    102: {
                    103:        ns_time_t       ns_time;
                    104:        
                    105:        IOGetTimestamp(&ns_time);
                    106:        // Convert nanosec => millisec and return
                    107:        return (unsigned)(ns_time /= 1000000ULL);
                    108: }
                    109: #endif /* _KERNEL */
                    110: /* Pressure Constants */
                    111: #define MINPRESSURE EV_MINPRESSURE
                    112: #define MAXPRESSURE EV_MAXPRESSURE
                    113: 
                    114: #define        LLEQSIZE 80     /* Entries in low-level event queue */
                    115: 
                    116: typedef struct _NXEQElStruct {
                    117:     int        next;           /* Slot of lleq for next event */
                    118:     ev_lock_data_t sema; /* Is high-level code reading this event now? */
                    119:     NXEvent event;     /* The event itself */
                    120: } NXEQElement;
                    121: 
                    122: 
                    123: /******************************************************************************
                    124:     SHARED MEMORY OVERVIEW
                    125:     
                    126:     PERSPECTIVE
                    127:     The ev driver and PostScript share at least one page of wired memory.
                    128:     This memory contains the low-level event queue which ev deposits events
                    129:     into and PostScript reads events from. Also, this memory contains other
                    130:     important data such as wait cursor state and some general cursor state.
                    131:     This memory is critical for speed.  That is, we avoid having to make
                    132:     system calls for common operations.
                    133:     
                    134:     SHARED MEMORY REGIONS
                    135:     There are currently three "regions" or "zones" delineated within this
                    136:     shared memory.  The first zone is the EvOffsets structure. This structure
                    137:     contains two offsets from the beginning of shared memory. The first offset
                    138:     is to the second zone, EvGlobals. The second offset is to the third
                    139:     zone, private shmem for drivers.
                    140:     
                    141:     INITIALIZATION OF SHARED MEMORY
                    142:     When the WindowServer starts up, it finds all screens that will be active.
                    143:     It then opens the ev driver and calls the EVIOSSCR ioctl repeatedly for
                    144:     each screen in use. This lets the ev driver set up the evScreen array
                    145:     and fill in each element. This ioctl also returns to PostScript a running
                    146:     total shared memory size with which to allocate. PostScript then allocates
                    147:     a region of memory this size and calls evmmap to "map in" this shared
                    148:     region.  Evmmap initializes and fills in the EvOffsets and EvGlobals.
                    149:     Next the WindowServer calls each screen in turn to register itself with
                    150:     the ev driver in the same sequence as presented to EVIOSSCR.  Each screen
                    151:     driver calls ev_register_screen() which among other things allocates a
                    152:     part of the private shmem (of the third shared memory zone) for the driver.
                    153:     
                    154:     DEBUGGING NOTES
                    155:     You can easily display and set this shared memory from kgdb, but usually
                    156:     cannot do so from within PostScript.  Gdb (or some weird interaction
                    157:     between gdb and the os) chokes on this shmem.  So if you read or write
                    158:     this area of memory, copy-on-write will occur and you'll get a completely
                    159:     new page for PostScript.  This will render the shared memory scheme
                    160:     useless and you will have to restart PostScript.  It was my understanding
                    161:     that before, we were able to "read" this area from PS, but not write to
                    162:     it (the idea behind copy-on-WRITE).  However, this seems to be broken
                    163:     in 2.0.  We think this is a kernel bug.
                    164: ******************************************************************************/
                    165: 
                    166: typedef volatile struct _evOffsets {
                    167:     int        evGlobalsOffset;        /* Offset to EvGlobals structure */
                    168:     int evShmemOffset;         /* Offset to private shmem regions */
                    169: } EvOffsets;
                    170: 
                    171: /******************************************************************************
                    172:     EvGlobals
                    173:     This structures defines the portion of the events driver data structure
                    174:     that is exported to the PostScript server. It contains the event queue
                    175:     which is in memory shared between the driver and the PostScript server.
                    176:     All the variables necessary to read and process events from the queue are
                    177:     contained here.
                    178: ******************************************************************************/
                    179: 
                    180: typedef volatile struct _evGlobals {
                    181:     short LLEHead;             /* The next event to be read */
                    182:     short LLETail;             /* Where the next event will go */
                    183:     short LLELast;             /* The last event entered */
                    184:     short eNum;                        /* Unique id for mouse events */
                    185:     int buttons;               /* State of the mouse buttons 1==down, 0==up */
                    186:     int eventFlags;            /* The current value of event.flags */
                    187:     int VertRetraceClock;      /* The current value of event.time */
                    188:     ev_lock_data_t cursorSema;         /* set to disable periodic code */
                    189:     Point cursorLoc;           /* The current location of the cursor */
                    190:     int frame;                 /* current cursor frame */
                    191:     Bounds workBounds;         /* bounding box of all screens */
                    192:     Bounds mouseRect;          /* Rect for mouse-exited events */
                    193:     unsigned reserved:27;
                    194:     unsigned wantPressure:1;   /* pressure in current mouseRect? */
                    195:     unsigned wantPrecision:1;  /* precise coordinates in current mouseRect? */
                    196:     unsigned dontWantCoalesce:1;/* coalesce within the current mouseRect? */
                    197:     unsigned dontCoalesce:1;   /* actual flag which determines coalescing */
                    198:     unsigned mouseRectValid:1; /* If nonzero, post a mouse-exited
                    199:                                   whenever mouse outside mouseRect. */
                    200:     int movedMask;             /* This contains an event mask for the
                    201:                                   three events MOUSEMOVED,
                    202:                                   LMOUSEDRAGGED,  and RMOUSEDRAGGED.
                    203:                                   It says whether driver should
                    204:                                   generate those events. */
                    205:     int AALastEventSent;       /* timestamp for wait cursor */
                    206:     int AALastEventConsumed;   /* timestamp for wait cursor */ 
                    207:     ev_lock_data_t waitCursorSema; /* protects wait cursor fields */
                    208:     int waitCursorUp;          /* Is wait cursor up? */
                    209:     char ctxtTimedOut;         /* Has wait cursor timer expired? */
                    210:     char waitCursorEnabled;    /* Play wait cursor game (per ctxt)? */
                    211:     char globalWaitCursorEnabled; /* Play wait cursor game (global)? */
                    212:     short waitThreshold;       /* time before wait cursor appears */
                    213:     NXEQElement lleq[LLEQSIZE];        /* The event queue itself */
                    214: } EvGlobals;
                    215: 
                    216: 
                    217: /* These evio structs are used in various calls supported by the ev driver. */
                    218: 
                    219: struct evioLLEvent {
                    220:     int type;
                    221:     Point location;
                    222:     NXEventData data;
                    223: };
                    224: 
                    225: typedef struct evioLLEvent _NXLLEvent;
                    226: 
                    227: /*
                    228:  * On a keypress of a VOL UP or VOL DOWN key, we send a message to the 
                    229:  * sound server to notify it of the volume change.  The message includes
                    230:  * a flag to indicate which key was pressed, and the machine independant
                    231:  * flag bits to indicate which modifier keys were pressed.
                    232:  */
                    233: struct evioSpecialKeyMsg
                    234: {
                    235:        msg_header_t Head;
                    236:        msg_type_t keyType;
                    237:        int key;                // special key number, from bsd/dev/ev_keymap.h
                    238:        msg_type_t directionType;
                    239:        int direction;          // NX_KEYDOWN, NX_KEYUP from event.h
                    240:        msg_type_t flagsType;
                    241:        int flags;              // device independant flags from event.h
                    242:        msg_type_t levelType;
                    243:        int level;              // EV_AUDIO_MIN_VOLUME to EV_AUDIO_MAX_VOLUME
                    244: };
                    245: 
                    246: #define EV_SPECIAL_KEY_MSG_ID  (('S'<<24) | ('k'<<16) | ('e'<<8) | ('y'))
                    247: typedef struct evioSpecialKeyMsg *evioSpecialKeyMsg_t;
                    248: 
                    249: /*
                    250:  * Volume ranges
                    251:  */
                    252: #define EV_AUDIO_MIN_VOLUME    0
                    253: #define EV_AUDIO_MAX_VOLUME    64
                    254: 
                    255: /*
                    256:  * Get and Set parameter calls for the Event driver and associated filters.
                    257:  */
                    258: 
                    259: #define EV_PREFIX      "Ev_"   /* All EV calls start with this string */
                    260: 
                    261: /* _NXEvSetParameterInt() calls */
                    262: #define EVIOLLPE       "Ev_LLPostEvent"
                    263: #define EVIOPTRLLPE    "Ev_PointerLLPostEvent"
                    264: /* EventData packed as an array of ints. */
                    265: typedef union
                    266: {
                    267:     NXEventData        data;
                    268:     unsigned idata[(sizeof(NXEventData)+sizeof(unsigned)-1)/sizeof(unsigned)];
                    269: } _NX_packed_event_t;
                    270: 
                    271: typedef enum {
                    272:        EVIOLLPE_TYPE,
                    273:        EVIOLLPE_LOC_X,
                    274:        EVIOLLPE_LOC_Y,
                    275:        EVIOLLPE_DATA0,
                    276:        EVIOLLPE_DATA1,
                    277:        EVIOLLPE_DATA2
                    278: } evioLLPEIndices;
                    279: #define EVIOLLPE_SIZE  (EVIOLLPE_DATA2 + 1)
                    280: 
                    281: #define EVIOSM "Ev_MousePosition"              
                    282: typedef enum {
                    283:        EVIOSM_LOC_X,
                    284:        EVIOSM_LOC_Y
                    285: } evioSMIndices;
                    286: #define EVIOSM_SIZE    (EVIOSM_LOC_Y + 1)
                    287: 
                    288: #define EVIOST "Ev_StartCursor"
                    289: #define EVIOST_SIZE    1
                    290: 
                    291: #define EVIOSETSCREEN  "Ev_SetScreen"
                    292: typedef enum {
                    293:        EVIOSETSCREEN_TOTALSCREENS,
                    294:        EVIOSETSCREEN_INDEX,
                    295:        EVIOSETSCREEN_SHMEMSIZE,
                    296:        EVIOSETSCREEN_MINX,
                    297:        EVIOSETSCREEN_MAXX,
                    298:        EVIOSETSCREEN_MINY,
                    299:        EVIOSETSCREEN_MAXY
                    300: }evioSETSCREENIndices;
                    301: #define EVIOSETSCREEN_SIZE     (EVIOSETSCREEN_MAXY + 1)
                    302: 
                    303: 
                    304: /* _NXEvGetParameterInt() calls */
                    305: #define EVIOEVNUM              "Ev_ButtonEventNums"    /* Mouse driver */
                    306: typedef enum {
                    307:        EVIOEVNUM_LEFT,
                    308:        EVIOEVNUM_RIGHT
                    309: } evioEVNUMIndices;
                    310: #define EVIOEVNUM_SIZE (EVIOEVNUM_RIGHT + 1)
                    311: 
                    312: #define EVIOSHMEMSIZE  "Ev_ShmemSize"
                    313: #define EVIOSHMEMSIZE_SIZE     1
                    314: 
                    315: typedef char EVString[64];
                    316: typedef char EVParameterName[64];
                    317: typedef int EVIntParameter[64];
                    318: typedef char EVCharParameter[4096];
                    319: typedef unsigned int EVObjectNumber;
                    320: 
                    321: #endif /* _DEV_EVIO_ */
                    322: 
                    323: #endif /* DRIVER_PRIVATE */
                    324: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.