You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
500 lines
11 KiB
500 lines
11 KiB
/* MOU.C */
|
|
|
|
//#define WINVER 0x0300
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include "windows.h"
|
|
//#include "winstric.h" /* added for win 3.1 compatibility 1/92 */
|
|
#include "vars.h"
|
|
#include "gide.h"
|
|
#include "mou.h"
|
|
#include "kbd.h"
|
|
#include "sk_ex.h" // Serial Keys Interface Routines
|
|
#include "w95trace.h"
|
|
|
|
#if 0
|
|
#define SF_MOVEMENT 0x0001
|
|
#define SF_B1_DOWN 0x0002
|
|
#define SF_B1_UP 0x0004
|
|
#define SF_B2_DOWN 0x0008
|
|
#define SF_B2_UP 0x0010
|
|
#define SF_ABSOLUTE 0x8000
|
|
#else
|
|
#define SF_MOVEMENT MOUSEEVENTF_MOVE
|
|
#define SF_B1_DOWN MOUSEEVENTF_LEFTDOWN
|
|
#define SF_B1_UP MOUSEEVENTF_LEFTUP
|
|
#define SF_B2_DOWN MOUSEEVENTF_RIGHTDOWN
|
|
#define SF_B2_UP MOUSEEVENTF_RIGHTUP
|
|
#define SF_ABSOLUTE MOUSEEVENTF_ABSOLUTE
|
|
#endif
|
|
|
|
void pressMouseButtonDown(void);
|
|
void pressMouseButtonUp(void);
|
|
void setTheMouseAbsolute(int PosX,int PosY);
|
|
|
|
BOOL bmouseanchored = FALSE; /* flag, if false, mouse not pinned to a point */
|
|
POINT mouseanchor;
|
|
|
|
#ifndef SPI_GETMOUSESPEED
|
|
#define SPI_GETMOUSESPEED 112
|
|
#endif
|
|
|
|
void SendMouseToQueue(MOUSEKEYSPARAM *p)
|
|
{
|
|
SkEx_SendMouse(p);
|
|
}
|
|
|
|
void processMouReset(unsigned char cGideiCode)
|
|
{
|
|
if (cGideiCode == TERMCODE)
|
|
{
|
|
// mouse_event treats button parameters as state changes not as state
|
|
// setting; when resetting, only release a button if it is already down
|
|
|
|
mouData.Status = SF_ABSOLUTE | SF_MOVEMENT;
|
|
if(GetAsyncKeyState(VK_LBUTTON) > 1)
|
|
mouData.Status |= GetSystemMetrics(SM_SWAPBUTTON) ? SF_B2_UP : SF_B1_UP;
|
|
if(GetAsyncKeyState(VK_RBUTTON) > 1)
|
|
mouData.Status |= GetSystemMetrics(SM_SWAPBUTTON) ? SF_B1_UP : SF_B2_UP;
|
|
|
|
mouData.Delta_Y = 0;
|
|
mouData.Delta_X = 0;
|
|
|
|
SendMouseToQueue(mouseDataPtr);
|
|
mouseX = mouseY = 0;
|
|
}
|
|
else
|
|
{
|
|
handleErrorReport();
|
|
commandVector = noOpRoutine;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void moveTheMouseAbsolute(void)
|
|
{
|
|
short tempX, tempY;
|
|
|
|
tempX = tempList.list[1];
|
|
tempX = (tempX << 8) + tempList.list[0];
|
|
tempY = tempList.list[3];
|
|
tempY = (tempY << 8) + tempList.list[2];
|
|
|
|
mouseX = tempX;
|
|
mouseY = tempY;
|
|
setTheMouseAbsolute(tempX, tempY);
|
|
return;
|
|
}
|
|
|
|
void setTheMouseAbsolute(int PosX,int PosY)
|
|
{
|
|
mouData.Status = SF_ABSOLUTE | SF_MOVEMENT;
|
|
mouData.Delta_Y = (int) 0;
|
|
mouData.Delta_X = (int) 0;
|
|
SendMouseToQueue(mouseDataPtr);
|
|
|
|
mouData.Status = SF_MOVEMENT;
|
|
mouData.Delta_Y = (int) PosY;
|
|
mouData.Delta_X = (int) PosX;
|
|
SendMouseToQueue(mouseDataPtr);
|
|
return;
|
|
}
|
|
|
|
void moveTheMouseRelative(void)
|
|
{
|
|
short xDist, yDist, newX, newY;
|
|
|
|
xDist = tempList.list[1];
|
|
xDist = (xDist << 8) + tempList.list[0];
|
|
yDist = tempList.list[3];
|
|
yDist = (yDist << 8) + tempList.list[2];
|
|
newX = mouseX + xDist;
|
|
newY = mouseY + yDist;
|
|
if (newX < 0) newX = 0;
|
|
if (newY < 0) newY = 0;
|
|
mouseX = newX;
|
|
mouseY = newY;
|
|
mouData.Status = SF_MOVEMENT;
|
|
mouData.Delta_Y = (int) yDist;
|
|
mouData.Delta_X = (int) xDist;
|
|
SendMouseToQueue(mouseDataPtr);
|
|
return;
|
|
}
|
|
|
|
|
|
void processMouAnchor(unsigned char cGideiCode)
|
|
{
|
|
switch (cGideiCode) {
|
|
case TERMCODE:
|
|
|
|
// if (tempList.len < 4)
|
|
// for ( ; tempList.len >= 4; tempList.list[tempList.len++] = 0);
|
|
|
|
if (bmouseanchored) /* if true, need to release mouse */
|
|
{
|
|
bmouseanchored = FALSE;
|
|
if (SkEx_GetAnchor(&mouseanchor))
|
|
{
|
|
setTheMouseAbsolute(mouseanchor.x,mouseanchor.y);
|
|
mouseX = mouseanchor.x;
|
|
mouseY = mouseanchor.y;
|
|
}
|
|
else
|
|
SkEx_SendBeep();
|
|
|
|
}
|
|
else /* if false, need to pin the mouse */
|
|
{
|
|
SkEx_SetAnchor();
|
|
bmouseanchored = TRUE;
|
|
}
|
|
|
|
tempList.len = 0;
|
|
beginOK = TRUE;
|
|
break;
|
|
// case INTEGERCODE:
|
|
// commandVector = collectGotoInteger;
|
|
// beginOK = FALSE;
|
|
// break;
|
|
default:
|
|
handleFatalError();
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void collectGotoInteger(unsigned char moveByte)
|
|
{
|
|
if (tempList.len >= 4) handleFatalError();
|
|
else {
|
|
tempList.list[tempList.len++] = moveByte;
|
|
if ((tempList.len == 2) || (tempList.len == 4)) commandVector = processMouGoto;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void collectGotoByte(unsigned char moveByte)
|
|
{
|
|
if (tempList.len >= 4) handleFatalError();
|
|
else
|
|
{
|
|
tempList.list[tempList.len++] = moveByte;
|
|
if (moveByte >127)
|
|
{
|
|
tempList.list[tempList.len++] = 0xFF;
|
|
}
|
|
else
|
|
{
|
|
tempList.list[tempList.len++] = 0;
|
|
}
|
|
commandVector = processMouGoto;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void processMouGoto(unsigned char cGideiCode)
|
|
{
|
|
switch (cGideiCode) {
|
|
case TERMCODE:
|
|
if (tempList.len < 4)
|
|
for ( ; tempList.len >= 4; tempList.list[tempList.len++] = 0);
|
|
moveTheMouseAbsolute();
|
|
tempList.len = 0;
|
|
beginOK = TRUE;
|
|
break;
|
|
case BYTECODE:
|
|
commandVector = collectGotoByte;
|
|
beginOK = FALSE;
|
|
break;
|
|
case INTEGERCODE:
|
|
commandVector = collectGotoInteger;
|
|
beginOK = FALSE;
|
|
break;
|
|
default:
|
|
handleFatalError();
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void collectMoveInteger(unsigned char moveByte)
|
|
{
|
|
if (tempList.len >= 4)
|
|
{
|
|
handleFatalError();
|
|
}
|
|
else
|
|
{
|
|
tempList.list[tempList.len++] = moveByte;
|
|
if ((tempList.len == 2) || (tempList.len == 4))
|
|
{
|
|
commandVector = processMouMove;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
void collectMoveByte(unsigned char moveByte)
|
|
{
|
|
if (tempList.len >= 4)
|
|
{
|
|
handleFatalError();
|
|
}
|
|
else
|
|
{
|
|
tempList.list[tempList.len++] = moveByte;
|
|
if (moveByte >127)
|
|
{
|
|
tempList.list[tempList.len++] = 0xFF;
|
|
}
|
|
else
|
|
{
|
|
tempList.list[tempList.len++] = 0;
|
|
}
|
|
commandVector = processMouMove;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void processMouMove(unsigned char cGideiCode)
|
|
{
|
|
switch (cGideiCode) {
|
|
case TERMCODE:
|
|
if (tempList.len < 4)
|
|
for ( ; tempList.len >= 4; tempList.list[tempList.len++] = 0);
|
|
moveTheMouseRelative();
|
|
tempList.len = 0;
|
|
beginOK = TRUE;
|
|
break;
|
|
case BYTECODE:
|
|
commandVector = collectMoveByte;
|
|
beginOK = FALSE;
|
|
break;
|
|
case INTEGERCODE:
|
|
commandVector = collectMoveInteger;
|
|
beginOK = FALSE;
|
|
break;
|
|
default:
|
|
handleFatalError();
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void pressMouseButtonDown()
|
|
{
|
|
mouData.Status = 0;
|
|
if (requestButton1) {
|
|
if (!button1Status) {
|
|
mouData.Status += SF_B1_DOWN;
|
|
button1Status = TRUE;
|
|
}
|
|
}
|
|
if (requestButton2) {
|
|
if (!button2Status) {
|
|
mouData.Status += SF_B2_DOWN;
|
|
button2Status = TRUE;
|
|
}
|
|
}
|
|
if (mouData.Status != 0)
|
|
{
|
|
SendMouseToQueue(mouseDataPtr);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void pressMouseButtonUp()
|
|
{
|
|
mouData.Status = 0;
|
|
if (requestButton1) {
|
|
if (button1Status) {
|
|
mouData.Status += SF_B1_UP;
|
|
button1Status = FALSE;
|
|
}
|
|
}
|
|
if (requestButton2) {
|
|
if (button2Status) {
|
|
mouData.Status += SF_B2_UP;
|
|
button2Status = FALSE;
|
|
}
|
|
}
|
|
if (mouData.Status != 0)
|
|
{
|
|
SendMouseToQueue(mouseDataPtr);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void processMouRel(unsigned char cGideiCode)
|
|
{
|
|
switch (cGideiCode) {
|
|
case TERMCODE:
|
|
if ((!requestButton1) && (!requestButton2) && (!requestButton3))
|
|
requestButton1 = requestButton2 = requestButton3 = TRUE;
|
|
pressMouseButtonUp();
|
|
requestButton1 = requestButton2 = requestButton3 = FALSE;
|
|
beginOK = TRUE;
|
|
break;
|
|
case UNKNOWNCODE:
|
|
handleErrorReport();
|
|
commandVector = noOpRoutine;
|
|
break;
|
|
case DEFAULTCODE:
|
|
case LEFTBUTTONCODE:
|
|
requestButton1 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
case RIGHTBUTTONCODE:
|
|
requestButton2 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
default:
|
|
if (cGideiCode >= LOWESTGIDEICODE)
|
|
{
|
|
handleFatalError();
|
|
break;
|
|
}
|
|
requestButton3 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void processMouLock(unsigned char cGideiCode)
|
|
{
|
|
switch (cGideiCode)
|
|
{
|
|
case TERMCODE:
|
|
if ((!requestButton1) && (!requestButton2) && (!requestButton3))
|
|
requestButton1 = TRUE;
|
|
pressMouseButtonDown();
|
|
requestButton1 = requestButton2 = requestButton3 = FALSE;
|
|
beginOK = TRUE;
|
|
break;
|
|
case UNKNOWNCODE:
|
|
handleErrorReport();
|
|
commandVector = noOpRoutine;
|
|
break;
|
|
case DEFAULTCODE:
|
|
case LEFTBUTTONCODE:
|
|
requestButton1 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
case RIGHTBUTTONCODE:
|
|
requestButton2 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
default:
|
|
if (cGideiCode >= LOWESTGIDEICODE)
|
|
{
|
|
handleFatalError();
|
|
break;
|
|
}
|
|
requestButton3 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void processMouDoubleClick(unsigned char cGideiCode)
|
|
{
|
|
if (cGideiCode == TERMCODE) {
|
|
if ((!requestButton1) && (!requestButton2) && (!requestButton3 ))
|
|
requestButton1 = TRUE;
|
|
mouData.Status = 0;
|
|
if ((requestButton1) && (button1Status)) {
|
|
mouData.Status += SF_B1_UP;
|
|
button1Status = FALSE;
|
|
}
|
|
if ((requestButton2) && (button2Status)) {
|
|
mouData.Status += SF_B2_UP;
|
|
button2Status = FALSE;
|
|
}
|
|
if (!mouData.Status)
|
|
{
|
|
SendMouseToQueue(mouseDataPtr);
|
|
}
|
|
pressMouseButtonDown();
|
|
pressMouseButtonUp();
|
|
pressMouseButtonDown();
|
|
pressMouseButtonUp();
|
|
requestButton1 = requestButton2 = requestButton3 = FALSE;
|
|
beginOK = TRUE;
|
|
}
|
|
else
|
|
processMouClick(cGideiCode);
|
|
return;
|
|
}
|
|
|
|
void processMouClick(unsigned char cGideiCode)
|
|
{
|
|
switch (cGideiCode)
|
|
{
|
|
case TERMCODE:
|
|
if ((!requestButton1) && (!requestButton2) && (!requestButton3 ))
|
|
requestButton1 = TRUE;
|
|
mouData.Status = 0;
|
|
if ((requestButton1) && (button1Status)) {
|
|
mouData.Status += SF_B1_UP;
|
|
button1Status = FALSE;
|
|
}
|
|
if ((requestButton2) && (button2Status)) {
|
|
mouData.Status += SF_B2_UP;
|
|
button2Status = FALSE;
|
|
}
|
|
if (!mouData.Status)
|
|
{
|
|
SendMouseToQueue(mouseDataPtr);
|
|
}
|
|
pressMouseButtonDown();
|
|
pressMouseButtonUp();
|
|
requestButton1 = requestButton2 = requestButton3 = FALSE;
|
|
beginOK = TRUE;
|
|
break;
|
|
case UNKNOWNCODE:
|
|
handleErrorReport();
|
|
commandVector = noOpRoutine;
|
|
break;
|
|
case DEFAULTCODE:
|
|
case LEFTBUTTONCODE:
|
|
requestButton1 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
case RIGHTBUTTONCODE:
|
|
requestButton2 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
default:
|
|
if (cGideiCode >= LOWESTGIDEICODE)
|
|
{
|
|
handleFatalError();
|
|
break;
|
|
}
|
|
requestButton3 = TRUE;
|
|
beginOK = FALSE;
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void processMou(unsigned char cGideiCode)
|
|
{
|
|
switch (cGideiCode) {
|
|
case UNKNOWNCODE:
|
|
handleErrorReport();
|
|
commandVector = noOpRoutine;
|
|
beginOK = TRUE;
|
|
break;
|
|
default:
|
|
if (cGideiCode < LOWESTGIDEICODE) {
|
|
handleErrorReport();
|
|
commandVector = noOpRoutine;
|
|
beginOK = TRUE;
|
|
}
|
|
else handleFatalError();
|
|
}
|
|
return;
|
|
}
|