/*++ Copyright (c) 1989 Microsoft Corporation Module Name: Event.h Abstract: Prototypes for functions & macros in in event.c Author: Michael Jarus (mjarus) 5-Nov-1991 Environment: User Mode Only Revision History: --*/ #include "monitor.h" /* * event to sync access to monitor chain */ HANDLE MonitorEvent; /* * abort flag indicator */ BOOL EventLoop; /* * state for the monitor queue: open, reg & read */ #define MON_STAT_OPEN 0 #define MON_STAT_REG 1 #define MON_STAT_READ 2 /* * Last keyboard pressed: for KBD_MULTIMAKE bit of monitor */ WORD KbdLastKey; BOOL KbdLastKeyDown; KBDREQUEST KbdRequestSaveArea; BOOL KbdAsciiMode; PTRLOC MouPtrLoc; /* * Monitor Header for all devices * ------------------------------ * 0. Save ares for proposed relpies (pointed by MemoryStartAddress) * * 1. device type * 2. MonReg info (exclude the MONITOR_SPECIEL) & the MONITOR_SPECIEL * 3. Status of monitor (as define above) * 4. flag to indicate if there is waiting request on empty queue * 5. handle of semaphore to sync between direct MonRead & ReadThread * 6. pointer for next MonReg for the same MonOpen * 7. pointer for the next MonReg in the device */ typedef struct _MON_HEADER { // UCHAR ReadPortMessage[32]; // BUGBUG // UCHAR WritePortMessage[32]; // BUGBUG MONDEVNUMBER DevType; MON_REG MonReg; ULONG Flag; // 1 - for MONITOR_SPECIEL Position USHORT MonStat; ULONG WaitForEvent; CRITICAL_SECTION SyncCriticalSection; PVOID MemoryStartAddress; struct _MON_HEADER *NextMon; struct _MON_HEADER *NextQueue; } MON_HEADER, *PMON_HEADER; typedef struct _KEYEVENTINFO { WORD wRepeatCount; KBD_MON_PACKAGE KeyInfo[1]; } KEYEVENTINFO, *PKEYEVENTINFO; /* * Queue for all devices * --------------------- * 1. Monitor header * 2. Semaphore to wait on for first data (when empty) * 3. In/Out/End pointer to data for Read/Write/Queue-End * 4. Info - depends on the device * 5. LastData which was not used and flag for it * 6. Data records */ typedef struct _KEY_EVENT_QUEUE { MON_HEADER MonHdr; PKEYEVENTINFO In; PKEYEVENTINFO Out; PKEYEVENTINFO End; KBDINFO Setup; UCHAR bNlsShift; USHORT Count; USHORT Cp; BOOL LastKeyFlag; KEYEVENTINFO LastKey; KEYEVENTINFO Event[1]; } KEY_EVENT_QUEUE, *PKEY_EVENT_QUEUE; PKEY_EVENT_QUEUE KbdQueue, PhyKbdQueue, KbdMonQueue, MonQueue, LastKbdMon; typedef struct _MOU_EVENT_QUEUE { MON_HEADER MonHdr; // semaphore to wait on PMOU_MON_PACKAGE In; PMOU_MON_PACKAGE Out; PMOU_MON_PACKAGE End; BOOL LastMouFlag; MOU_MON_PACKAGE LastEvent; MOU_MON_PACKAGE Event[1]; } MOU_EVENT_QUEUE, *PMOU_EVENT_QUEUE; PMOU_EVENT_QUEUE MouQueue, MouMonQueue, LastMouMon; #define HANDLE_HEAP_SIZE 64*1024 // Initial size of heap is 64K #define KEYBOARD_QUEUE_LENGTH 257 #define KEYBOARD_QUEUE_SIZE (sizeof(KEY_EVENT_QUEUE) + sizeof(KEYEVENTINFO) * (KEYBOARD_QUEUE_LENGTH-1)) #define MOUSE_QUEUE_LENGTH 11 #define MOUSE_QUEUE_SIZE (sizeof(MOU_EVENT_QUEUE) + sizeof(MOU_MON_PACKAGE) * (MOUSE_QUEUE_LENGTH-1)) /* * flags for GetKeyboardInput */ #define WAIT_MASK 0x01 #define ENABLE_KEY_DOWN 0x02 #define ENABLE_NON_ASCII_KEY 0x04 #define ENABLE_LN_EDITOR_KEY 0x08 #define ENABLE_KEYS_ON_KEY 0x10 DWORD KbdInit(IN VOID); DWORD MouInit(IN VOID); DWORD InitMonitor(IN VOID); DWORD InitVio(IN VOID); DWORD InitQueue(IN PKEY_EVENT_QUEUE *pKbdQueue); DWORD InitMouQueue(IN PMOU_EVENT_QUEUE *pMouQueue); DWORD CheckForBreakEvent(IN PKEYEVENTINFO KbdEvent); DWORD GetOs2MouEvent(IN USHORT WaitFlag, OUT PMOUEVENTINFO Event, IN PVOID pMsg, OUT PULONG pReply); DWORD GetKeyboardInput(IN ULONG Flag, OUT PKEYEVENTINFO Event, IN PVOID pMsg, OUT PULONG pReply); DWORD KbdHandlePackage(IN PKEY_EVENT_QUEUE NextKbdMon, IN PKBD_MON_PACKAGE MonPackage); DWORD KbdCheckPackage(IN PKBD_MON_PACKAGE KbdPackage); /* * Read/Write Monitor event from/to the device queue */ DWORD GetMonInput(IN USHORT MaxLength, IN PKEY_EVENT_QUEUE KbdMon, IN OUT PMON_RW rwParms, IN PVOID pMsg, OUT PULONG pReply); DWORD PutMonInput(IN USHORT MaxLength, IN PKEY_EVENT_QUEUE KbdMon, IN WORD RepeatCount, //IN OUT PMON_RW rwParms, IN PKBD_MON_PACKAGE MonPackage, IN PVOID pMsg, OUT PULONG pReply); DWORD MapWin2Os2KbdInfo(IN PKEY_EVENT_RECORD WinKey, OUT PKEYEVENTINFO Os2Key); DWORD NewKbdQueue(IN PKEY_EVENT_QUEUE NewKbdQueue); USHORT MouNumber; USHORT MouLastEvent; DWORD MouEventMask; ULONG MouDevStatus; #ifdef DBCS // MSKK Jun.15.1992 KazuM // MSKK Aug.10.1992 V-AKihiS ULONG MapWinToOs2KbdNlsChar(IN PKEY_EVENT_RECORD WinKey, OUT PKBD_MON_PACKAGE Os2KeyInfo); #endif