Corrige la gestion des evenements

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@4679 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 2002-04-16 10:00:33 +00:00
parent 756a91f939
commit 21cb8b301b
3 changed files with 57 additions and 104 deletions

View File

@ -433,8 +433,7 @@ void gr_enqueue_char(unsigned char c)
#define Key_pressed 4
#define Mouse_motion 8
#define Poll 16
int InspectMessages;
MSG msg;
MSG * InspectMessages = NULL;
CAMLprim value gr_wait_event(value eventlist)
{
@ -446,7 +445,7 @@ CAMLprim value gr_wait_event(value eventlist)
int r,i,stop;
unsigned int modifiers;
POINT pt;
unsigned char keystate[256];
MSG msg;
gr_check_open();
mask = 0;
@ -477,107 +476,37 @@ CAMLprim value gr_wait_event(value eventlist)
key = -1;
if (poll) {
// Poll uses peek message
r = 0;
if (mask & Button_down) {
r |= PeekMessage(&msg,grwindow.hwnd,WM_LBUTTONDOWN,WM_LBUTTONDOWN,PM_REMOVE);
if (r)
button = 1;
else {
r |= PeekMessage(&msg,grwindow.hwnd,WM_MBUTTONDOWN,WM_LBUTTONDOWN,PM_REMOVE);
if (r)
button = 2;
else {
r |= PeekMessage(&msg,grwindow.hwnd,WM_RBUTTONDOWN,WM_LBUTTONDOWN,PM_REMOVE);
}
if (r)
button = 3;
}
}
if (mask & Button_up) {
r |= PeekMessage(&msg,grwindow.hwnd,WM_LBUTTONUP,WM_LBUTTONUP,PM_REMOVE);
if (r)
button = 1;
else {
r |= PeekMessage(&msg,grwindow.hwnd,WM_MBUTTONUP,WM_LBUTTONUP,PM_REMOVE);
if (r)
button = 2;
else {
r |= PeekMessage(&msg,grwindow.hwnd,WM_RBUTTONUP,WM_LBUTTONUP,PM_REMOVE);
}
if (r)
button = 3;
}
}
if (mask & Mouse_motion) {
r |= PeekMessage(&msg,grwindow.hwnd,WM_MOUSEMOVE,WM_MOUSEMOVE,PM_REMOVE);
}
if (r) {
pt = msg.pt;
MapWindowPoints(HWND_DESKTOP,grwindow.hwnd,&pt,1);
mouse_x = pt.x;
mouse_y = grwindow.height-pt.y;
}
if (mask & Key_pressed) {
r = PeekMessage(&msg,grwindow.hwnd,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE);
if (r) {
GetKeyboardState(keystate);
for (i=0; i<256;i++) {
if (keystate[i]&(~1)) {
key = i;
break;
}
}
}
}
// Poll uses info on last event stored in global variables
mouse_x = MouseLastX;
mouse_y = MouseLastY;
button = MouseLbuttonDown | MouseMbuttonDown | MouseRbuttonDown;
key = LastKey;
}
else { // Not polled. Block for a message
InspectMessages = 1;
InspectMessages = &msg;
while (1) {
WaitForSingleObject(EventHandle,INFINITE);
stop = 0;
if (msg.message == WM_LBUTTONDOWN && (mask&Button_down)) {
stop = 1;
switch (msg.message) {
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
button = 1;
}
if (msg.message == WM_MBUTTONDOWN && (mask&Button_down)) {
stop = 1;
button = 2;
}
if (msg.message == WM_RBUTTONDOWN && (mask&Button_down)) {
stop = 1;
button = 3;
}
if (mask&Button_up) {
if (msg.message == WM_LBUTTONUP) {
stop = 1;
button = 1;
}
if (msg.message == WM_MBUTTONUP) {
stop = 1;
button = 2;
}
if (msg.message == WM_RBUTTONUP) {
stop = 1;
button = 3;
}
}
if (mask&Mouse_motion) {
if (msg.message == WM_MOUSEMOVE) {
stop = 1;
}
}
if (mask&Key_pressed) {
if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST) {
stop = 1;
GetKeyboardState(keystate);
for (i=0; i<256;i++) {
if (keystate[i]&(~1)) {
key = i;
break;
}
}
}
if (mask&Button_down) stop = 1;
break;
case WM_LBUTTONUP:
case WM_MBUTTONUP:
case WM_RBUTTONUP:
button = 0;
if (mask&Button_up) stop = 1;
break;
case WM_MOUSEMOVE:
if (mask&Mouse_motion) stop = 1;
break;
case WM_CHAR:
key = msg.wParam & 0xFF;
if (mask&Key_pressed) stop = 1;
break;
}
if (stop) {
pt = msg.pt;
@ -589,7 +518,7 @@ CAMLprim value gr_wait_event(value eventlist)
if (msg.message == WM_CLOSE)
break;
}
InspectMessages = 0;
InspectMessages = NULL;
}
res = alloc_small(5, 0);
Field(res, 0) = Val_int(mouse_x);

View File

@ -15,6 +15,7 @@
#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
struct canvas {
int w, h; /* Dimensions of the drawable */
@ -103,6 +104,8 @@ extern GR_WINDOW grwindow;
HFONT CreationFont(char *name);
extern int MouseLbuttonDown,MouseMbuttonDown,MouseRbuttonDown;
extern HANDLE EventHandle;
extern int InspectMessages;
extern MSG msg;
extern MSG * InspectMessages;
extern int MouseLbuttonDown,MouseMbuttonDown,MouseRbuttonDown;
extern int MouseLastX, MouseLastY;
extern int LastKey;

View File

@ -19,6 +19,8 @@
#include <windows.h>
static value gr_reset(void);
int MouseLbuttonDown,MouseMbuttonDown,MouseRbuttonDown;
int MouseLastX, MouseLastY;
int LastKey = -1;
static long tid;
static HANDLE threadHandle;
HWND grdisplay = NULL;
@ -73,6 +75,7 @@ static LRESULT CALLBACK GraphicsWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM
{
PAINTSTRUCT ps;
HDC hdc;
switch (msg) {
// Create the MDI client invisible window
case WM_CREATE:
@ -113,7 +116,23 @@ static LRESULT CALLBACK GraphicsWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM
case WM_MBUTTONUP:
MouseMbuttonDown = 0;
break;
default:
case WM_CHAR:
LastKey = wParam & 0xFF;
break;
case WM_KEYUP:
LastKey = -1;
break;
case WM_MOUSEMOVE:
#if 0
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
MapWindowPoints(HWND_DESKTOP,grwindow.hwnd,&pt,1);
MouseLastX = pt.x;
MouseLastY = grwindow.height - 1 - pt.y;
#else
MouseLastX = GET_X_LPARAM(lParam);
MouseLastY = grwindow.height - 1 - GET_Y_LPARAM(lParam);
#endif
break;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
@ -201,7 +220,8 @@ static DWORD WINAPI gr_open_graph_internal(value arg)
int screenx,screeny;
int attributes;
static int registered;
MSG msg;
gr_initialized = TRUE;
hInst = GetModuleHandle(NULL);
x = y = w = h = CW_USEDEFAULT;
@ -255,7 +275,8 @@ static DWORD WINAPI gr_open_graph_internal(value arg)
/* Enter the message handling loop */
while (GetMessage(&msg,NULL,0,0)) {
if (InspectMessages) {
if (InspectMessages != NULL) {
*InspectMessages = msg;
SetEvent(EventHandle);
Sleep(10);
}