Fixed jump. Added MultiMouse button support [pagefault]. Improved mouse handling. Fixed issue in ManyMouse library when no mice are detected (Windows crash fix).

This commit is contained in:
n-a-c-h
2006-03-24 14:54:04 +00:00
parent 4dbb188f58
commit ea826c3112
4 changed files with 72 additions and 65 deletions

View File

@@ -54,11 +54,15 @@ int ManyMouse_Init(void)
for (i = 0; mice_drivers[i]; i++) for (i = 0; mice_drivers[i]; i++)
{ {
int mice = mice_drivers[i]->init(); int mice = mice_drivers[i]->init();
if (mice >= 0) if (mice > 0)
{ {
driver = mice_drivers[i]; driver = mice_drivers[i];
return(mice); return(mice);
} /* if */ } /* if */
else
{
return(0);
}
} /* for */ } /* for */
return(-1); return(-1);

View File

@@ -447,10 +447,13 @@ void DisplayBatteryStatus()
#ifndef __MSDOS__ #ifndef __MSDOS__
int MouseCount = 0; int MouseCount = 0;
int Mouse1MoveX = 0;
int Mouse2MoveX = 0; unsigned short MouseMoveX[2];
int Mouse1MoveY = 0; unsigned short MouseMoveY[2];
int Mouse2MoveY = 0; unsigned short MouseButton[2];
bool MouseWaiting[2];
ManyMouseEvent MouseEvent[2];
void MultiMouseShutdown() void MultiMouseShutdown()
{ {
@@ -464,6 +467,10 @@ void MultiMouseInit()
printf("ManyMouse: %d mice detected.\n", MouseCount); printf("ManyMouse: %d mice detected.\n", MouseCount);
if (MouseCount > 1) if (MouseCount > 1)
{ {
MouseMoveX[0] = MouseMoveX[1] = 0;
MouseMoveY[0] = MouseMoveY[1] = 0;
MouseButton[0] = MouseButton[1] = 0;
MouseWaiting[0] = MouseWaiting[1] = false;
atexit(MultiMouseShutdown); atexit(MultiMouseShutdown);
} }
else else
@@ -472,42 +479,36 @@ void MultiMouseInit()
} }
} }
bool Mouse1Waiting = false, Mouse2Waiting = false; #define BIT(x) (1 << (x))
ManyMouseEvent Mouse1Event,Mouse2Event; #define MOUSE_BUTTON_HANDLE(mouse, bit, value) \
if (value) { mouse |= BIT(bit); } \
else { mouse &= ~BIT(bit); }
unsigned char mouse;
void MultiMouseProcess(unsigned int mouse) void MultiMouseProcess()
{ {
ManyMouseEvent event; ManyMouseEvent event;
event.device = ~0; event.device = ~0;
Mouse1MoveX = Mouse1MoveY = Mouse2MoveX = Mouse2MoveY = 0; MouseMoveX[mouse] = 0;
MouseMoveY[mouse] = 0;
//MouseButton[mouse] = 0;
if (mouse == 1) if (MouseWaiting[mouse])
{ {
if (Mouse1Waiting) if (MouseEvent[mouse].type == MANYMOUSE_EVENT_RELMOTION)
{ {
if (Mouse1Event.type == MANYMOUSE_EVENT_RELMOTION) if (MouseEvent[mouse].item == 0) { MouseMoveX[mouse] = MouseEvent[mouse].value; }
{ else { MouseMoveY[mouse] = MouseEvent[mouse].value; }
if (Mouse1Event.item == 0) { Mouse1MoveX = Mouse1Event.value; } else { Mouse1MoveY = Mouse1Event.value; }
} }
Mouse1Waiting = false; else if (MouseEvent[mouse].type == MANYMOUSE_EVENT_BUTTON)
{
if (MouseEvent[mouse].item == 0) { MOUSE_BUTTON_HANDLE(MouseButton[mouse], 0, MouseEvent[mouse].value); }
else if (MouseEvent[mouse].item == 1) { MOUSE_BUTTON_HANDLE(MouseButton[mouse], 1, MouseEvent[mouse].value); }
}
MouseWaiting[mouse] = false;
return; return;
} }
}
if (mouse == 2)
{
if (Mouse2Waiting)
{
if (Mouse2Event.type == MANYMOUSE_EVENT_RELMOTION)
{
if (Mouse2Event.item == 1) { Mouse2MoveX = Mouse2Event.value; } else { Mouse2MoveY = Mouse2Event.value; }
}
Mouse2Waiting = false;
return;
}
}
while ((event.device != 0) && (event.device != 1)) while ((event.device != 0) && (event.device != 1))
{ {
@@ -516,31 +517,23 @@ void MultiMouseProcess(unsigned int mouse)
return; return;
} }
if ((mouse == 1) && event.device == 1) if (event.device == (mouse^1))
{ {
Mouse2Event = event; MouseEvent[event.device] = event;
Mouse2Waiting = true; MouseWaiting[event.device] = true;
event.device = ~0;
}
if ((mouse == 2) && event.device == 0)
{
Mouse1Event = event;
Mouse1Waiting = true;
event.device = ~0; event.device = ~0;
} }
} }
if (event.type == MANYMOUSE_EVENT_RELMOTION) if (event.type == MANYMOUSE_EVENT_RELMOTION)
{ {
if (event.device == 0) if (event.item == 0) { MouseMoveX[mouse] = event.value; }
{ else { MouseMoveY[mouse] = event.value; }
if (event.item == 0) { Mouse1MoveX = event.value; } else { Mouse1MoveY = event.value; }
return;
} }
if (event.device == 1) else if (event.type == MANYMOUSE_EVENT_BUTTON)
{ {
if (event.item == 0) { Mouse2MoveX = event.value; } else { Mouse2MoveY = event.value; } if (event.item == 0) { MOUSE_BUTTON_HANDLE(MouseButton[mouse], 0, event.value); }
} else if (event.item == 1) { MOUSE_BUTTON_HANDLE(MouseButton[mouse], 1, event.value); }
} }
} }

View File

@@ -518,7 +518,7 @@ NEWSYM cachevideo
.nospeedreset .nospeedreset
mov eax,[KeyResetAll] mov eax,[KeyResetAll]
test byte[pressed+eax],1 test byte[pressed+eax],1
je .nodis6 je near .nodis6
mov byte[pressed+eax],2 mov byte[pressed+eax],2
mov byte[Voice0Disable],1 mov byte[Voice0Disable],1
mov byte[Voice1Disable],1 mov byte[Voice1Disable],1

View File

@@ -42,7 +42,7 @@ EXTSYM MovieDisplayFrame
EXTSYM MouseCount,device2 EXTSYM MouseCount,device2
%ifndef __MSDOS__ %ifndef __MSDOS__
EXTSYM Mouse1MoveX,Mouse1MoveY,Mouse2MoveX,Mouse2MoveY,MultiMouseProcess EXTSYM MouseMoveX,MouseMoveY,MouseButton,MultiMouseProcess,mouse
%endif %endif
%ifdef __MSDOS__ %ifdef __MSDOS__
@@ -153,20 +153,22 @@ NEWSYM processmouse1
push edi push edi
push edx push edx
push ebx push ebx
call Get_MouseData
mov [mousebuttons],bx
%ifndef __MSDOS__ %ifndef __MSDOS__
cmp byte[MouseCount],1 cmp byte[MouseCount],1
jle .nomultimouse jle .nomultimouse
pushad pushad
mov eax,1 mov byte[mouse],0
call MultiMouseProcess call MultiMouseProcess
popad popad
mov cx,[Mouse1MoveX] mov bx,[MouseButton]
mov dx,[Mouse1MoveY] mov [mousebuttons],bx
mov cx,[MouseMoveX]
mov dx,[MouseMoveY]
jmp .mousestuff jmp .mousestuff
.nomultimouse .nomultimouse
%endif %endif
call Get_MouseData
mov [mousebuttons],bx
call Get_MousePositionDisplacement call Get_MousePositionDisplacement
.mousestuff .mousestuff
mov word[mousexpos],0 mov word[mousexpos],0
@@ -203,7 +205,19 @@ NEWSYM processmouse2
push edi push edi
push edx push edx
push ebx push ebx
%ifndef __MSDOS__
cmp byte[MouseCount],1
jle .nomultimouse
pushad
mov byte[mouse],1
call MultiMouseProcess
popad
mov bx,[MouseButton+2]
jmp .mousestuff
.nomultimouse
%endif
call Get_MouseData call Get_MouseData
.mousestuff
mov [mousebuttons],bx mov [mousebuttons],bx
cmp byte[device2],2 cmp byte[device2],2
jne .ss jne .ss
@@ -226,18 +240,14 @@ NEWSYM processmouse2
.ss .ss
%ifndef __MSDOS__ %ifndef __MSDOS__
cmp byte[MouseCount],1 cmp byte[MouseCount],1
jle .nomultimouse jle .nomultimouse2
pushad mov cx,[MouseMoveX+2]
mov eax,2 mov dx,[MouseMoveY+2]
call MultiMouseProcess jmp .mousestuff2
popad .nomultimouse2
mov cx,[Mouse2MoveX]
mov dx,[Mouse2MoveY]
jmp .mousestuff
.nomultimouse
%endif %endif
call Get_MousePositionDisplacement call Get_MousePositionDisplacement
.mousestuff .mousestuff2
cmp byte[device2],3 cmp byte[device2],3
je .le je .le
cmp byte[device2],4 cmp byte[device2],4