home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NeXTSTEP 3.2 (Developer)
/
NS_dev_3.2.iso
/
NextDeveloper
/
Headers
/
bsd
/
dev
/
m68k
/
evio.h
< prev
next >
Wrap
Text File
|
1993-10-19
|
11KB
|
247 lines
/******************************************************************************
evio.h
Ioctl calls for the events driver
Leovitch 02Jan88
Copyright 1988 NeXT, Inc.
Modified:
09Dec88 Leo Broken out from evsio.h
24Aug89 Ted ANSI function prototyping.
19Feb90 Ted Major revision for multiple driver support.
26Feb90 Ted New evioScreen structure and EVIOST ioctl.
12Mar90 Ted New ev_unregister_screen function, SCREENTOKEN constant.
06May90 Ted Added AALastEventSent and AALastEventConsumed to EvVars.
22May90 Trey More wait cursor vars in EvVars.
13Jun90 Ted NXCursorData structure.
18Jun90 Ted Default wait cursor constants.
26Sep90 Ted Enhanced cursor system to support intelligent drivers.
26Nov90 Ted Removed NXSaveCursor and NXCursorData structures
28Nov90 Ted Remove EvVars, rolled into EventGlobals
28Nov90 Ted Renamed EventGlobals -> EvGlobals, eventGlobals -> evg
******************************************************************************/
#ifndef _M68K_DEV_EVIO_
#define _M68K_DEV_EVIO_
#import <sys/ioctl.h>
#import <mach/port.h>
#import <mach/message.h>
#import <bsd/dev/ev_types.h>
#import <bsd/dev/m68k/event.h>
/* Default Wait Cursor Contants (in 68Hz ticks) */
#define DefaultWCSustain 20 /* 0.3 seconds */
#define DefaultWCFrameRate 5 /* 13.6 frames/second */
#define DefaultWCThreshold 80 /* 1.2 seconds */
/* Pressure Constants */
#define MINPRESSURE 0
#define MAXPRESSURE 255
/* Mouse Button Constants */
#define RB (0x01)
#define LB (0x04)
#define MOUSEBUTTONMASK (LB | RB)
#ifndef MAXMOUSESCALINGS
/* Maximum length of SetMouseScaling arrays */
#define MAXMOUSESCALINGS NX_MAXMOUSESCALINGS
#endif MAXMOUSESCALINGS
#define SCREENTOKEN 256 /* Some non-zero token to or with screen number */
#define LLEQSIZE 80 /* Entries in low-level event queue */
typedef struct _NXEQElStruct {
short next; /* Slot of lleq for next event */
short sema; /* Is high-level code is reading this event now? */
NXEvent event; /* The event itself */
} NXEQElement;
/* The following typedefs are defined here for compatibility with PostScript */
#if !defined(__Point__) && !defined(BINTREE_H)
#define __Point__
typedef struct { short x, y; } Point;
#endif
#if !defined(__Bounds__) && !defined(BINTREE_H)
#define __Bounds__
typedef struct { short minx, maxx, miny, maxy; } Bounds;
#endif
typedef struct _evRetry {
unsigned level:1;
unsigned cursor:2;
unsigned :29;
} EvRetry;
/******************************************************************************
EvScreen
This structure is used both by the ev driver and screen drivers.
It holds information about a single screen: how much private shmem it owns,
where its private shmem region starts, its global bounds and four procedure
vectors. This structure is allocated by the ev driver and is filled in
when a driver calls ev_register_screen(). This structure is correspondingly
passed to each procedure vector as the first argument to allow a driver to
know which screen the call refers to (in the case a driver controls more
than one screen for instance).
The priv field is the only field a driver is permitted to modify at any
given time. Every other field is off limits. This structure may grow
in length, but the field order will not change.
The procedure vectors allow the kernel to direct cursor activity and
delegate responsibility for drawing, erasing, and moving the cursor to
screen drivers. (See video.c for the MegaPixel driver's implementation).
Each procedure must return an error status. Returning "0" means that
a procedure successfully processed the given message. Returning "1"
signifies that it wasn't successful in processing the message and should
be retried at a later time. This should releave most error conditions that
might arrive and prevents drivers from (god for bin) having to spin within
time-critical interrupt periods. Usually a retry is requested if a driver's
cursor semaphore or lock is busy.
******************************************************************************/
typedef volatile struct _evScreen {
void *priv; /* Driver's private use */
void *shmemPtr; /* Ptr to private shmem (if non-zero size) */
int shmemSize; /* Size of private shmem */
Bounds bounds; /* Screen's bounds in device coordinates */
EvRetry retry; /* private to ev driver */
int (*hide)(struct _evScreen *esp);
int (*move)(struct _evScreen *esp, Point loc, int frame);
int (*show)(struct _evScreen *esp, Point loc, int frame);
int (*level)(struct _evScreen *esp, int brightness);
} EvScreen;
/******************************************************************************
SHARED MEMORY OVERVIEW
PERSPECTIVE
The ev driver and PostScript share at least one page of wired memory.
This memory contains the low-level event queue which ev deposits events
into and PostScript reads events from. Also, this memory contains other
important data such as wait cursor state and some general cursor state.
This memory is critical for speed. That is, we avoid having to make
system calls for common operations.
SHARED MEMORY REGIONS
There are currently three "regions" or "zones" delineated within this
shared memory. The first zone is the EvOffsets structure. This structure
contains two offsets from the beginning of shared memory. The first offset
is to the second zone, EvGlobals. The second offset is to the third
zone, private shmem for drivers.
INITIALIZATION OF SHARED MEMORY
When the WindowServer starts up, it finds all screens that will be active.
It then opens the ev driver and calls the EVIOSSCR ioctl repeatedly for
each screen in use. This lets the ev driver set up the evScreen array
and fill in each element. This ioctl also returns to PostScript a running
total shared memory size with which to allocate. PostScript then allocates
a region of memory this size and calls evmmap to "map in" this shared
region. Evmmap initializes and fills in the EvOffsets and EvGlobals.
Next the WindowServer calls each screen in turn to register itself with
the ev driver in the same sequence as presented to EVIOSSCR. Each screen
driver calls ev_register_screen() which among other things allocates a
part of the private shmem (of the third shared memory zone) for the driver.
DEBUGGING NOTES
You can easily display and set this shared memory from kgdb, but usually
cannot do so from within PostScript. Gdb (or some weird interaction
between gdb and the os) chokes on this shmem. So if you read or write
this area of memory, copy-on-write will occur and you'll get a completely
new page for PostScript. This will render the shared memory scheme
useless and you will have to restart PostScript. It was my understanding
that before, we were able to "read" this area from PS, but not write to
it (the idea behind copy-on-WRITE). However, this seems to be broken
in 2.0. We think this is a kernel bug.
******************************************************************************/
typedef volatile struct _evOffsets {
int evGlobalsOffset; /* Offset to EvGlobals structure */
int evShmemOffset; /* Offset to private shmem regions */
} EvOffsets;
/******************************************************************************
EvGlobals
This structures defines the portion of the events driver data structure
that is exported to the PostScript server. It contains the event queue
which is in memory shared between the driver and the PostScript server.
All the variables necessary to read and process events from the queue are
contained here.
******************************************************************************/
typedef volatile struct _evGlobals {
short LLEHead; /* The next event to be read */
short LLETail; /* Where the next event will go */
short LLELast; /* The last event entered */
short eNum; /* Unique id for mouse events */
int buttons; /* State of the mouse buttons 1==down, 0==up */
int eventFlags; /* The current value of event.flags */
int VertRetraceClock; /* The current value of event.time */
int cursorSema; /* set to disable interrupt code */
Point cursorLoc; /* The current location of the cursor */
int frame; /* current cursor frame */
Bounds workBounds; /* bounding box of all screens */
Bounds mouseRect; /* Rect for mouse-exited events */
unsigned reserved:27;
unsigned wantPressure:1; /* pressure in current mouseRect? */
unsigned wantPrecision:1; /* precise coordinates in current mouseRect? */
unsigned dontWantCoalesce:1;/* coalesce within the current mouseRect? */
unsigned dontCoalesce:1; /* actual flag which determines coalescing */
unsigned mouseRectValid:1; /* If nonzero, post a mouse-exited
whenever mouse outside mouseRect. */
int movedMask; /* This contains an event mask for the
three events MOUSEMOVED,
LMOUSEDRAGGED, and RMOUSEDRAGGED.
It says whether driver should
generate those events. */
int AALastEventSent; /* timestamp for wait cursor */
int AALastEventConsumed; /* timestamp for wait cursor */
int waitCursorUp; /* Is wait cursor up? */
char ctxtTimedOut; /* Has wait cursor timer expired? */
char waitCursorEnabled; /* Play wait cursor game (per ctxt)? */
char globalWaitCursorEnabled; /* Play wait cursor game (global)? */
char waitCursorSema; /* protects wait cursor fields */
short waitThreshold; /* time before wait cursor appears */
NXEQElement lleq[LLEQSIZE]; /* The event queue itself */
} EvGlobals;
/* These evio structs are used in various ioctls supported by the ev driver. */
struct evioLLEvent {
int type;
Point location;
NXEventData data;
};
/* This structure is used privately by the WindowServer */
struct evioSetScreen {
int totalShmemSize; /* out: returned size of shmem to allocate */
int totalScreens; /* in: number of screens in the screen list */
int screenIndex; /* in: this screen (0..totalScreens) */
int screenShmemSize; /* in: this screen's desired shmem size */
Bounds screenBounds; /* in: this screen's global bounds */
};
/* General ioctls */
#define EVIOSEP _IOW('e', 1, port_t) /* Set event port */
#define EVIOLLPE _IOW('e', 2, struct evioLLEvent) /* Low-level Post Event */
#define EVIOMM _IOR('e', 3, void) /* mini_mon (gone) */
#define EVIOSSCR _IOWR('e', 4, struct evioSetScreen) /* set up screens */
/* Mouse-related ioctls */
#define EVIOSD _IOWR('e', 66, int) /* StillDown */
#define EVIORSD _IOWR('e', 67, int) /* RightStillDown */
#define EVIOSM _IOW('e', 68, Point) /* SetMouse */
#define EVIOCM _IOR('e', 69, Point) /* CurrentMouse */
#define EVIOST _IO('e', 70) /* StartCursor */
#endif _M68K_DEV_EVIO_