blob: 06c2180ceb34a254038a05ba6f52f4d63e9a1a9d [file] [log] [blame]
/****************************************************************************
*
* SciTech OS Portability Manager Library
*
* ========================================================================
*
* The contents of this file are subject to the SciTech MGL Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.scitechsoft.com/mgl-license.txt
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
*
* The Initial Developer of the Original Code is SciTech Software, Inc.
* All Rights Reserved.
*
* ========================================================================
*
* Language: ANSI C
* Environment: Any
*
* Description: Test program to test out the cross platform event handling
* library.
*
****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "pmapi.h"
#include "event.h"
/* Translation table for key codes */
typedef struct {
int code;
char *name;
} KeyEntry;
KeyEntry ASCIICodes[] = {
{ASCII_ctrlA ,"ASCII_ctrlA"},
{ASCII_ctrlB ,"ASCII_ctrlB"},
{ASCII_ctrlC ,"ASCII_ctrlC"},
{ASCII_ctrlD ,"ASCII_ctrlD"},
{ASCII_ctrlE ,"ASCII_ctrlE"},
{ASCII_ctrlF ,"ASCII_ctrlF"},
{ASCII_ctrlG ,"ASCII_ctrlG"},
{ASCII_backspace ,"ASCII_backspace"},
{ASCII_ctrlH ,"ASCII_ctrlH"},
{ASCII_tab ,"ASCII_tab"},
{ASCII_ctrlI ,"ASCII_ctrlI"},
{ASCII_ctrlJ ,"ASCII_ctrlJ"},
{ASCII_ctrlK ,"ASCII_ctrlK"},
{ASCII_ctrlL ,"ASCII_ctrlL"},
{ASCII_enter ,"ASCII_enter"},
{ASCII_ctrlM ,"ASCII_ctrlM"},
{ASCII_ctrlN ,"ASCII_ctrlN"},
{ASCII_ctrlO ,"ASCII_ctrlO"},
{ASCII_ctrlP ,"ASCII_ctrlP"},
{ASCII_ctrlQ ,"ASCII_ctrlQ"},
{ASCII_ctrlR ,"ASCII_ctrlR"},
{ASCII_ctrlS ,"ASCII_ctrlS"},
{ASCII_ctrlT ,"ASCII_ctrlT"},
{ASCII_ctrlU ,"ASCII_ctrlU"},
{ASCII_ctrlV ,"ASCII_ctrlV"},
{ASCII_ctrlW ,"ASCII_ctrlW"},
{ASCII_ctrlX ,"ASCII_ctrlX"},
{ASCII_ctrlY ,"ASCII_ctrlY"},
{ASCII_ctrlZ ,"ASCII_ctrlZ"},
{ASCII_esc ,"ASCII_esc"},
{ASCII_space ,"ASCII_space"},
{ASCII_exclamation ,"ASCII_exclamation"},
{ASCII_quote ,"ASCII_quote"},
{ASCII_pound ,"ASCII_pound"},
{ASCII_dollar ,"ASCII_dollar"},
{ASCII_percent ,"ASCII_percent"},
{ASCII_ampersand ,"ASCII_ampersand"},
{ASCII_apostrophe ,"ASCII_apostrophe"},
{ASCII_leftBrace ,"ASCII_leftBrace"},
{ASCII_rightBrace ,"ASCII_rightBrace"},
{ASCII_times ,"ASCII_times"},
{ASCII_plus ,"ASCII_plus"},
{ASCII_comma ,"ASCII_comma"},
{ASCII_minus ,"ASCII_minus"},
{ASCII_period ,"ASCII_period"},
{ASCII_divide ,"ASCII_divide"},
{ASCII_0 ,"ASCII_0"},
{ASCII_1 ,"ASCII_1"},
{ASCII_2 ,"ASCII_2"},
{ASCII_3 ,"ASCII_3"},
{ASCII_4 ,"ASCII_4"},
{ASCII_5 ,"ASCII_5"},
{ASCII_6 ,"ASCII_6"},
{ASCII_7 ,"ASCII_7"},
{ASCII_8 ,"ASCII_8"},
{ASCII_9 ,"ASCII_9"},
{ASCII_colon ,"ASCII_colon"},
{ASCII_semicolon ,"ASCII_semicolon"},
{ASCII_lessThan ,"ASCII_lessThan"},
{ASCII_equals ,"ASCII_equals"},
{ASCII_greaterThan ,"ASCII_greaterThan"},
{ASCII_question ,"ASCII_question"},
{ASCII_at ,"ASCII_at"},
{ASCII_A ,"ASCII_A"},
{ASCII_B ,"ASCII_B"},
{ASCII_C ,"ASCII_C"},
{ASCII_D ,"ASCII_D"},
{ASCII_E ,"ASCII_E"},
{ASCII_F ,"ASCII_F"},
{ASCII_G ,"ASCII_G"},
{ASCII_H ,"ASCII_H"},
{ASCII_I ,"ASCII_I"},
{ASCII_J ,"ASCII_J"},
{ASCII_K ,"ASCII_K"},
{ASCII_L ,"ASCII_L"},
{ASCII_M ,"ASCII_M"},
{ASCII_N ,"ASCII_N"},
{ASCII_O ,"ASCII_O"},
{ASCII_P ,"ASCII_P"},
{ASCII_Q ,"ASCII_Q"},
{ASCII_R ,"ASCII_R"},
{ASCII_S ,"ASCII_S"},
{ASCII_T ,"ASCII_T"},
{ASCII_U ,"ASCII_U"},
{ASCII_V ,"ASCII_V"},
{ASCII_W ,"ASCII_W"},
{ASCII_X ,"ASCII_X"},
{ASCII_Y ,"ASCII_Y"},
{ASCII_Z ,"ASCII_Z"},
{ASCII_leftSquareBrace ,"ASCII_leftSquareBrace"},
{ASCII_backSlash ,"ASCII_backSlash"},
{ASCII_rightSquareBrace ,"ASCII_rightSquareBrace"},
{ASCII_caret ,"ASCII_caret"},
{ASCII_underscore ,"ASCII_underscore"},
{ASCII_leftApostrophe ,"ASCII_leftApostrophe"},
{ASCII_a ,"ASCII_a"},
{ASCII_b ,"ASCII_b"},
{ASCII_c ,"ASCII_c"},
{ASCII_d ,"ASCII_d"},
{ASCII_e ,"ASCII_e"},
{ASCII_f ,"ASCII_f"},
{ASCII_g ,"ASCII_g"},
{ASCII_h ,"ASCII_h"},
{ASCII_i ,"ASCII_i"},
{ASCII_j ,"ASCII_j"},
{ASCII_k ,"ASCII_k"},
{ASCII_l ,"ASCII_l"},
{ASCII_m ,"ASCII_m"},
{ASCII_n ,"ASCII_n"},
{ASCII_o ,"ASCII_o"},
{ASCII_p ,"ASCII_p"},
{ASCII_q ,"ASCII_q"},
{ASCII_r ,"ASCII_r"},
{ASCII_s ,"ASCII_s"},
{ASCII_t ,"ASCII_t"},
{ASCII_u ,"ASCII_u"},
{ASCII_v ,"ASCII_v"},
{ASCII_w ,"ASCII_w"},
{ASCII_x ,"ASCII_x"},
{ASCII_y ,"ASCII_y"},
{ASCII_z ,"ASCII_z"},
{ASCII_leftCurlyBrace ,"ASCII_leftCurlyBrace"},
{ASCII_verticalBar ,"ASCII_verticalBar"},
{ASCII_rightCurlyBrace ,"ASCII_rightCurlyBrace"},
{ASCII_tilde ,"ASCII_tilde"},
{0 ,"ASCII_unknown"},
};
KeyEntry ScanCodes[] = {
{KB_padEnter ,"KB_padEnter"},
{KB_padMinus ,"KB_padMinus"},
{KB_padPlus ,"KB_padPlus"},
{KB_padTimes ,"KB_padTimes"},
{KB_padDivide ,"KB_padDivide"},
{KB_padLeft ,"KB_padLeft"},
{KB_padRight ,"KB_padRight"},
{KB_padUp ,"KB_padUp"},
{KB_padDown ,"KB_padDown"},
{KB_padInsert ,"KB_padInsert"},
{KB_padDelete ,"KB_padDelete"},
{KB_padHome ,"KB_padHome"},
{KB_padEnd ,"KB_padEnd"},
{KB_padPageUp ,"KB_padPageUp"},
{KB_padPageDown ,"KB_padPageDown"},
{KB_padCenter ,"KB_padCenter"},
{KB_F1 ,"KB_F1"},
{KB_F2 ,"KB_F2"},
{KB_F3 ,"KB_F3"},
{KB_F4 ,"KB_F4"},
{KB_F5 ,"KB_F5"},
{KB_F6 ,"KB_F6"},
{KB_F7 ,"KB_F7"},
{KB_F8 ,"KB_F8"},
{KB_F9 ,"KB_F9"},
{KB_F10 ,"KB_F10"},
{KB_F11 ,"KB_F11"},
{KB_F12 ,"KB_F12"},
{KB_left ,"KB_left"},
{KB_right ,"KB_right"},
{KB_up ,"KB_up"},
{KB_down ,"KB_down"},
{KB_insert ,"KB_insert"},
{KB_delete ,"KB_delete"},
{KB_home ,"KB_home"},
{KB_end ,"KB_end"},
{KB_pageUp ,"KB_pageUp"},
{KB_pageDown ,"KB_pageDown"},
{KB_capsLock ,"KB_capsLock"},
{KB_numLock ,"KB_numLock"},
{KB_scrollLock ,"KB_scrollLock"},
{KB_leftShift ,"KB_leftShift"},
{KB_rightShift ,"KB_rightShift"},
{KB_leftCtrl ,"KB_leftCtrl"},
{KB_rightCtrl ,"KB_rightCtrl"},
{KB_leftAlt ,"KB_leftAlt"},
{KB_rightAlt ,"KB_rightAlt"},
{KB_leftWindows ,"KB_leftWindows"},
{KB_rightWindows ,"KB_rightWindows"},
{KB_menu ,"KB_menu"},
{KB_sysReq ,"KB_sysReq"},
{KB_esc ,"KB_esc"},
{KB_1 ,"KB_1"},
{KB_2 ,"KB_2"},
{KB_3 ,"KB_3"},
{KB_4 ,"KB_4"},
{KB_5 ,"KB_5"},
{KB_6 ,"KB_6"},
{KB_7 ,"KB_7"},
{KB_8 ,"KB_8"},
{KB_9 ,"KB_9"},
{KB_0 ,"KB_0"},
{KB_minus ,"KB_minus"},
{KB_equals ,"KB_equals"},
{KB_backSlash ,"KB_backSlash"},
{KB_backspace ,"KB_backspace"},
{KB_tab ,"KB_tab"},
{KB_Q ,"KB_Q"},
{KB_W ,"KB_W"},
{KB_E ,"KB_E"},
{KB_R ,"KB_R"},
{KB_T ,"KB_T"},
{KB_Y ,"KB_Y"},
{KB_U ,"KB_U"},
{KB_I ,"KB_I"},
{KB_O ,"KB_O"},
{KB_P ,"KB_P"},
{KB_leftSquareBrace ,"KB_leftSquareBrace"},
{KB_rightSquareBrace ,"KB_rightSquareBrace"},
{KB_enter ,"KB_enter"},
{KB_A ,"KB_A"},
{KB_S ,"KB_S"},
{KB_D ,"KB_D"},
{KB_F ,"KB_F"},
{KB_G ,"KB_G"},
{KB_H ,"KB_H"},
{KB_J ,"KB_J"},
{KB_K ,"KB_K"},
{KB_L ,"KB_L"},
{KB_semicolon ,"KB_semicolon"},
{KB_apostrophe ,"KB_apostrophe"},
{KB_Z ,"KB_Z"},
{KB_X ,"KB_X"},
{KB_C ,"KB_C"},
{KB_V ,"KB_V"},
{KB_B ,"KB_B"},
{KB_N ,"KB_N"},
{KB_M ,"KB_M"},
{KB_comma ,"KB_comma"},
{KB_period ,"KB_period"},
{KB_divide ,"KB_divide"},
{KB_space ,"KB_space"},
{KB_tilde ,"KB_tilde"},
{0 ,"KB_unknown"},
};
/****************************************************************************
PARAMETERS:
x - X coordinate of the mouse cursor position (screen coordinates)
y - Y coordinate of the mouse cursor position (screen coordinates)
REMARKS:
This gets called periodically to move the mouse. It will get called when
the mouse may not have actually moved, so check if it has before redrawing
it.
****************************************************************************/
void EVTAPI moveMouse(
int x,
int y)
{
}
/****************************************************************************
PARAMETERS:
code - Code to translate
keys - Table of translation key values to look up
REMARKS:
Simple function to look up the printable name for the keyboard code.
****************************************************************************/
KeyEntry *FindKey(
int code,
KeyEntry *keys)
{
KeyEntry *key;
for (key = keys; key->code != 0; key++) {
if (key->code == code)
break;
}
return key;
}
/****************************************************************************
PARAMETERS:
evt - Event to display modifiers for
REMARKS:
Function to display shift modifiers flags
****************************************************************************/
void DisplayModifiers(
event_t *evt)
{
if (evt->modifiers & EVT_LEFTBUT)
printf(", LBUT");
if (evt->modifiers & EVT_RIGHTBUT)
printf(", RBUT");
if (evt->modifiers & EVT_MIDDLEBUT)
printf(", MBUT");
if (evt->modifiers & EVT_SHIFTKEY) {
if (evt->modifiers & EVT_LEFTSHIFT)
printf(", LSHIFT");
if (evt->modifiers & EVT_RIGHTSHIFT)
printf(", RSHIFT");
}
if (evt->modifiers & EVT_CTRLSTATE) {
if (evt->modifiers & EVT_LEFTCTRL)
printf(", LCTRL");
if (evt->modifiers & EVT_RIGHTCTRL)
printf(", RCTRL");
}
if (evt->modifiers & EVT_ALTSTATE) {
if (evt->modifiers & EVT_LEFTALT)
printf(", LALT");
if (evt->modifiers & EVT_RIGHTALT)
printf(", RALT");
}
}
/****************************************************************************
PARAMETERS:
msg - Message to display for type of event
evt - Event to display
REMARKS:
Function to display the status of the keyboard event to the screen.
****************************************************************************/
void DisplayKey(
char *msg,
event_t *evt)
{
KeyEntry *ascii,*scan;
char ch = EVT_asciiCode(evt->message);
ascii = FindKey(ch,ASCIICodes);
scan = FindKey(EVT_scanCode(evt->message),ScanCodes);
printf("%s: 0x%04X -> %s, %s, '%c'",
msg, (int)evt->message & 0xFFFF, scan->name, ascii->name, isprint(ch) ? ch : ' ');
DisplayModifiers(evt);
printf("\n");
}
/****************************************************************************
PARAMETERS:
msg - Message to display for type of event
evt - Event to display
REMARKS:
Function to display the status of the mouse event to the screen.
****************************************************************************/
void DisplayMouse(
char *msg,
event_t *evt)
{
printf("%s: ", msg);
if (evt->message & EVT_LEFTBMASK)
printf("LEFT ");
if (evt->message & EVT_RIGHTBMASK)
printf("RIGHT ");
if (evt->message & EVT_MIDDLEBMASK)
printf("MIDDLE ");
printf("abs(%d,%d), rel(%d,%d)", evt->where_x, evt->where_y, evt->relative_x, evt->relative_y);
DisplayModifiers(evt);
if (evt->message & EVT_DBLCLICK)
printf(", DBLCLICK");
printf("\n");
}
/****************************************************************************
PARAMETERS:
msg - Message to display for type of event
evt - Event to display
REMARKS:
Function to display the status of the joystick event to the screen.
****************************************************************************/
void DisplayJoy(
char *msg,
event_t *evt)
{
printf("%s: Joy1(%4d,%4d,%c%c), Joy2(%4d,%4d,%c%c)\n", msg,
evt->where_x,evt->where_y,
(evt->message & EVT_JOY1_BUTTONA) ? 'A' : 'a',
(evt->message & EVT_JOY1_BUTTONB) ? 'B' : 'b',
evt->relative_x,evt->relative_y,
(evt->message & EVT_JOY2_BUTTONA) ? 'A' : 'a',
(evt->message & EVT_JOY2_BUTTONB) ? 'B' : 'b');
}
/****************************************************************************
REMARKS:
Joystick calibration routine
****************************************************************************/
void CalibrateJoy(void)
{
event_t evt;
if(EVT_joyIsPresent()){
printf("Joystick Calibration\nMove the joystick to the upper left corner and press any button.\n");
EVT_halt(&evt, EVT_JOYCLICK);
EVT_halt(&evt, EVT_JOYCLICK);
EVT_joySetUpperLeft();
printf("Move the joystick to the lower right corner and press any button.\n");
EVT_halt(&evt, EVT_JOYCLICK);
EVT_halt(&evt, EVT_JOYCLICK);
EVT_joySetLowerRight();
printf("Move the joystick to center position and press any button.\n");
EVT_halt(&evt, EVT_JOYCLICK);
EVT_halt(&evt, EVT_JOYCLICK);
EVT_joySetCenter();
printf("Joystick calibrated\n");
}
}
/****************************************************************************
REMARKS:
Main program entry point
****************************************************************************/
int main(void)
{
event_t evt;
ibool done = false;
PM_HWND hwndConsole;
hwndConsole = PM_openConsole(0,0,0,0,0,true);
EVT_init(&moveMouse);
EVT_setMouseRange(1024,768);
CalibrateJoy();
do {
EVT_pollJoystick();
if (EVT_getNext(&evt,EVT_EVERYEVT)) {
switch (evt.what) {
case EVT_KEYDOWN:
DisplayKey("EVT_KEYDOWN ", &evt);
if (EVT_scanCode(evt.message) == KB_esc)
done = true;
break;
case EVT_KEYREPEAT:
DisplayKey("EVT_KEYREPEAT", &evt);
break;
case EVT_KEYUP:
DisplayKey("EVT_KEYUP ", &evt);
break;
case EVT_MOUSEDOWN:
DisplayMouse("EVT_MOUSEDOWN", &evt);
break;
case EVT_MOUSEAUTO:
DisplayMouse("EVT_MOUSEAUTO", &evt);
break;
case EVT_MOUSEUP:
DisplayMouse("EVT_MOUSEUP ", &evt);
break;
case EVT_MOUSEMOVE:
DisplayMouse("EVT_MOUSEMOVE", &evt);
break;
case EVT_JOYCLICK:
DisplayJoy("EVT_JOYCLICK ", &evt);
break;
case EVT_JOYMOVE:
DisplayJoy("EVT_JOYMOVE ", &evt);
break;
}
}
} while (!done);
EVT_exit();
PM_closeConsole(hwndConsole);
return 0;
}