Console mode DOS programs now receive mouse events.
Replaced GetMessage with PeekMessage, since MsgWaitForMultipleObjects is allowed to return spontaneously.
This commit is contained in:
parent
5333872105
commit
a65ef56101
|
@ -24,6 +24,7 @@
|
||||||
#include "wine/windef16.h"
|
#include "wine/windef16.h"
|
||||||
#include "winbase.h" /* for LPSTARTUPINFO32A */
|
#include "winbase.h" /* for LPSTARTUPINFO32A */
|
||||||
#include "winnt.h" /* for PCONTEXT */
|
#include "winnt.h" /* for PCONTEXT */
|
||||||
|
#include "wincon.h" /* for MOUSE_EVENT_RECORD */
|
||||||
|
|
||||||
struct _DOSEVENT;
|
struct _DOSEVENT;
|
||||||
|
|
||||||
|
@ -105,6 +106,7 @@ extern void WINAPI DOSVM_Int31Handler(CONTEXT86*);
|
||||||
/* int33.c */
|
/* int33.c */
|
||||||
extern void WINAPI DOSVM_Int33Handler(CONTEXT86*);
|
extern void WINAPI DOSVM_Int33Handler(CONTEXT86*);
|
||||||
extern void WINAPI DOSVM_Int33Message(UINT,WPARAM,LPARAM);
|
extern void WINAPI DOSVM_Int33Message(UINT,WPARAM,LPARAM);
|
||||||
|
extern void WINAPI DOSVM_Int33Console(MOUSE_EVENT_RECORD*);
|
||||||
|
|
||||||
/* int67.c */
|
/* int67.c */
|
||||||
extern void WINAPI DOSVM_Int67Handler(CONTEXT86*);
|
extern void WINAPI DOSVM_Int67Handler(CONTEXT86*);
|
||||||
|
|
|
@ -245,8 +245,20 @@ static void DOSVM_ProcessConsole(void)
|
||||||
}
|
}
|
||||||
DOSVM_Int09SendScan(scan,msg.Event.KeyEvent.uChar.AsciiChar);
|
DOSVM_Int09SendScan(scan,msg.Event.KeyEvent.uChar.AsciiChar);
|
||||||
break;
|
break;
|
||||||
|
case MOUSE_EVENT:
|
||||||
|
DOSVM_Int33Console(&msg.Event.MouseEvent);
|
||||||
|
break;
|
||||||
|
case WINDOW_BUFFER_SIZE_EVENT:
|
||||||
|
FIXME("unhandled WINDOW_BUFFER_SIZE_EVENT.\n");
|
||||||
|
break;
|
||||||
|
case MENU_EVENT:
|
||||||
|
FIXME("unhandled MENU_EVENT.\n");
|
||||||
|
break;
|
||||||
|
case FOCUS_EVENT:
|
||||||
|
FIXME("unhandled FOCUS_EVENT.\n");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("unhandled console event: %d\n", msg.EventType);
|
FIXME("unknown console event: %d\n", msg.EventType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -358,40 +370,44 @@ DWORD WINAPI DOSVM_Loop( LPVOID lpExtra )
|
||||||
DWORD waitret;
|
DWORD waitret;
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
TRACE_(int)("waiting for action\n");
|
TRACE_(int)("waiting for action\n");
|
||||||
waitret = MsgWaitForMultipleObjects(1, &obj, FALSE, INFINITE, QS_ALLINPUT);
|
waitret = MsgWaitForMultipleObjects(1, &obj, FALSE, INFINITE, QS_ALLINPUT);
|
||||||
if (waitret == WAIT_OBJECT_0) {
|
if (waitret == WAIT_OBJECT_0) {
|
||||||
DOSVM_ProcessConsole();
|
DOSVM_ProcessConsole();
|
||||||
}
|
}
|
||||||
else if (waitret == WAIT_OBJECT_0 + 1) {
|
else if (waitret == WAIT_OBJECT_0 + 1) {
|
||||||
GetMessageA(&msg, 0, 0, 0);
|
while (PeekMessageA(&msg,0,0,0,PM_REMOVE)) {
|
||||||
if (msg.hwnd) {
|
if (msg.hwnd) {
|
||||||
/* it's a window message */
|
/* it's a window message */
|
||||||
DOSVM_ProcessMessage(&msg);
|
DOSVM_ProcessMessage(&msg);
|
||||||
DispatchMessageA(&msg);
|
DispatchMessageA(&msg);
|
||||||
} else {
|
} else {
|
||||||
/* it's a thread message */
|
/* it's a thread message */
|
||||||
switch (msg.message) {
|
switch (msg.message) {
|
||||||
case WM_QUIT:
|
case WM_QUIT:
|
||||||
/* stop this madness!! */
|
/* stop this madness!! */
|
||||||
return 0;
|
return 0;
|
||||||
case WM_USER:
|
case WM_USER:
|
||||||
/* run passed procedure in this thread */
|
/* run passed procedure in this thread */
|
||||||
/* (sort of like APC, but we signal the completion) */
|
/* (sort of like APC, but we signal the completion) */
|
||||||
{
|
{
|
||||||
DOS_SPC *spc = (DOS_SPC *)msg.lParam;
|
DOS_SPC *spc = (DOS_SPC *)msg.lParam;
|
||||||
TRACE_(int)("calling %p with arg %08x\n", spc->proc, spc->arg);
|
TRACE_(int)("calling %p with arg %08x\n", spc->proc, spc->arg);
|
||||||
(spc->proc)(spc->arg);
|
(spc->proc)(spc->arg);
|
||||||
TRACE_(int)("done, signalling event %d\n", msg.wParam);
|
TRACE_(int)("done, signalling event %d\n", msg.wParam);
|
||||||
SetEvent(msg.wParam);
|
SetEvent(msg.wParam);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ERR_(int)("MsgWaitForMultipleObjects returned unexpected value.\n");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else break;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static WINE_EXCEPTION_FILTER(exception_handler)
|
static WINE_EXCEPTION_FILTER(exception_handler)
|
||||||
|
|
|
@ -65,7 +65,8 @@ void WINAPI DOSVM_Int33Handler( CONTEXT86 *context )
|
||||||
FIXME("Hide mouse cursor\n");
|
FIXME("Hide mouse cursor\n");
|
||||||
break;
|
break;
|
||||||
case 0x03:
|
case 0x03:
|
||||||
TRACE("Return mouse position and button status\n");
|
TRACE("Return mouse position and button status: (%ld,%ld) and %ld\n",
|
||||||
|
mouse_info.x, mouse_info.y, mouse_info.but);
|
||||||
BX_reg(context) = mouse_info.but;
|
BX_reg(context) = mouse_info.but;
|
||||||
CX_reg(context) = mouse_info.x;
|
CX_reg(context) = mouse_info.x;
|
||||||
DX_reg(context) = mouse_info.y;
|
DX_reg(context) = mouse_info.y;
|
||||||
|
@ -148,56 +149,45 @@ static void MouseRelay(CONTEXT86 *context,void *mdata)
|
||||||
DPMI_CallRMProc(&ctx, NULL, 0, 0);
|
DPMI_CallRMProc(&ctx, NULL, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WINAPI DOSVM_Int33Message(UINT message,WPARAM wParam,LPARAM lParam)
|
static void QueueMouseRelay(DWORD mx, DWORD my, WORD mask)
|
||||||
{
|
{
|
||||||
WORD mask = 0;
|
mouse_info.x = mx;
|
||||||
unsigned Height, Width, SX=1, SY=1;
|
mouse_info.y = my;
|
||||||
|
|
||||||
if (!VGA_GetMode(&Height,&Width,NULL)) {
|
/* Left button down */
|
||||||
/* may need to do some coordinate scaling */
|
if(mask & 0x02) {
|
||||||
if (Width)
|
|
||||||
SX = 640/Width;
|
|
||||||
if (!SX) SX=1;
|
|
||||||
}
|
|
||||||
mouse_info.x = LOWORD(lParam) * SX;
|
|
||||||
mouse_info.y = HIWORD(lParam) * SY;
|
|
||||||
switch (message) {
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
mask |= 0x01;
|
|
||||||
break;
|
|
||||||
case WM_LBUTTONDOWN:
|
|
||||||
case WM_LBUTTONDBLCLK:
|
|
||||||
mouse_info.but |= 0x01;
|
mouse_info.but |= 0x01;
|
||||||
mask |= 0x02;
|
mouse_info.llastx = mx;
|
||||||
mouse_info.llastx = mouse_info.x;
|
mouse_info.llasty = my;
|
||||||
mouse_info.llasty = mouse_info.y;
|
|
||||||
mouse_info.lbcount++;
|
mouse_info.lbcount++;
|
||||||
break;
|
}
|
||||||
case WM_LBUTTONUP:
|
|
||||||
|
/* Left button up */
|
||||||
|
if(mask & 0x04) {
|
||||||
mouse_info.but &= ~0x01;
|
mouse_info.but &= ~0x01;
|
||||||
mask |= 0x04;
|
}
|
||||||
break;
|
|
||||||
case WM_RBUTTONDOWN:
|
/* Right button down */
|
||||||
case WM_RBUTTONDBLCLK:
|
if(mask & 0x08) {
|
||||||
mouse_info.but |= 0x02;
|
mouse_info.but |= 0x02;
|
||||||
mask |= 0x08;
|
mouse_info.rlastx = mx;
|
||||||
mouse_info.rlastx = mouse_info.x;
|
mouse_info.rlasty = my;
|
||||||
mouse_info.rlasty = mouse_info.y;
|
|
||||||
mouse_info.rbcount++;
|
mouse_info.rbcount++;
|
||||||
break;
|
}
|
||||||
case WM_RBUTTONUP:
|
|
||||||
|
/* Right button up */
|
||||||
|
if(mask & 0x10) {
|
||||||
mouse_info.but &= ~0x02;
|
mouse_info.but &= ~0x02;
|
||||||
mask |= 0x10;
|
}
|
||||||
break;
|
|
||||||
case WM_MBUTTONDOWN:
|
/* Middle button down */
|
||||||
case WM_MBUTTONDBLCLK:
|
if(mask & 0x20) {
|
||||||
mouse_info.but |= 0x04;
|
mouse_info.but |= 0x04;
|
||||||
mask |= 0x20;
|
}
|
||||||
break;
|
|
||||||
case WM_MBUTTONUP:
|
/* Middle button up */
|
||||||
|
if(mask & 0x40) {
|
||||||
mouse_info.but &= ~0x04;
|
mouse_info.but &= ~0x04;
|
||||||
mask |= 0x40;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mask & mouse_info.callmask) && mouse_info.callback) {
|
if ((mask & mouse_info.callmask) && mouse_info.callback) {
|
||||||
|
@ -210,3 +200,80 @@ void WINAPI DOSVM_Int33Message(UINT message,WPARAM wParam,LPARAM lParam)
|
||||||
DOSVM_QueueEvent(-1, DOS_PRIORITY_MOUSE, MouseRelay, data);
|
DOSVM_QueueEvent(-1, DOS_PRIORITY_MOUSE, MouseRelay, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WINAPI DOSVM_Int33Message(UINT message,WPARAM wParam,LPARAM lParam)
|
||||||
|
{
|
||||||
|
WORD mask = 0;
|
||||||
|
unsigned Height, Width, SX=1, SY=1;
|
||||||
|
|
||||||
|
if (!VGA_GetMode(&Height,&Width,NULL)) {
|
||||||
|
/* may need to do some coordinate scaling */
|
||||||
|
if (Width)
|
||||||
|
SX = 640/Width;
|
||||||
|
if (!SX) SX=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (message) {
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
mask |= 0x01;
|
||||||
|
break;
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
case WM_LBUTTONDBLCLK:
|
||||||
|
mask |= 0x02;
|
||||||
|
break;
|
||||||
|
case WM_LBUTTONUP:
|
||||||
|
mask |= 0x04;
|
||||||
|
break;
|
||||||
|
case WM_RBUTTONDOWN:
|
||||||
|
case WM_RBUTTONDBLCLK:
|
||||||
|
mask |= 0x08;
|
||||||
|
break;
|
||||||
|
case WM_RBUTTONUP:
|
||||||
|
mask |= 0x10;
|
||||||
|
break;
|
||||||
|
case WM_MBUTTONDOWN:
|
||||||
|
case WM_MBUTTONDBLCLK:
|
||||||
|
mask |= 0x20;
|
||||||
|
break;
|
||||||
|
case WM_MBUTTONUP:
|
||||||
|
mask |= 0x40;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
QueueMouseRelay(LOWORD(lParam) * SX,
|
||||||
|
HIWORD(lParam) * SY,
|
||||||
|
mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WINAPI DOSVM_Int33Console(MOUSE_EVENT_RECORD *record)
|
||||||
|
{
|
||||||
|
unsigned Height, Width;
|
||||||
|
WORD mask = 0;
|
||||||
|
BOOL newLeftButton = record->dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED;
|
||||||
|
BOOL oldLeftButton = mouse_info.but & 0x01;
|
||||||
|
BOOL newRightButton = record->dwButtonState & RIGHTMOST_BUTTON_PRESSED;
|
||||||
|
BOOL oldRightButton = mouse_info.but & 0x02;
|
||||||
|
BOOL newMiddleButton = record->dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED;
|
||||||
|
BOOL oldMiddleButton = mouse_info.but & 0x04;
|
||||||
|
|
||||||
|
if(newLeftButton && !oldLeftButton)
|
||||||
|
mask |= 0x02;
|
||||||
|
else if(!newLeftButton && oldLeftButton)
|
||||||
|
mask |= 0x04;
|
||||||
|
|
||||||
|
if(newRightButton && !oldRightButton)
|
||||||
|
mask |= 0x08;
|
||||||
|
else if(!newRightButton && oldRightButton)
|
||||||
|
mask |= 0x10;
|
||||||
|
|
||||||
|
if(newMiddleButton && !oldMiddleButton)
|
||||||
|
mask |= 0x20;
|
||||||
|
else if(!newMiddleButton && oldMiddleButton)
|
||||||
|
mask |= 0x40;
|
||||||
|
|
||||||
|
VGA_GetAlphaMode(&Width, &Height);
|
||||||
|
|
||||||
|
QueueMouseRelay(640 / Width * record->dwMousePosition.X,
|
||||||
|
200 / Height * record->dwMousePosition.Y,
|
||||||
|
mask);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue