1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

Try to introduce better window message handling and management, most probably needs fixing

This commit is contained in:
Toni Spets 2011-09-11 19:12:07 +03:00
parent f02ef15bc4
commit 3c79b4aa4b
3 changed files with 56 additions and 57 deletions

109
main.c
View File

@ -168,7 +168,6 @@ HRESULT __stdcall ddraw_RestoreDisplayMode(IDirectDrawImpl *This)
if(!ddraw->windowed)
{
This->mode.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFLAGS|DM_DISPLAYFREQUENCY|DM_POSITION;
ChangeDisplaySettings(&This->mode, 0);
}
@ -309,57 +308,62 @@ LRESULT CALLBACK dummy_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RECT rc = { 0, 0, ddraw->render.width, ddraw->render.height };
POINT pt;
switch(uMsg)
{
case WM_DESTROY:
return ddraw->WndProc(hWnd, uMsg, wParam, lParam);
/* Carmageddon stops the main loop when it sees these, DefWindowProc is also bad */
case WM_WINDOWPOSCHANGING:
case WM_WINDOWPOSCHANGED:
return 0;
/* C&C and RA really don't want to close down */
case WM_SYSCOMMAND:
if(wParam == SC_CLOSE)
if (wParam == SC_CLOSE)
{
exit(0);
}
break;
case WM_SIZE:
if(wParam == SIZE_RESTORED)
return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_ACTIVATE:
if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE)
{
ddraw_SetDisplayMode(ddraw, ddraw->width, ddraw->height, ddraw->bpp);
if (wParam == WA_ACTIVE)
{
mouse_lock();
}
if (!ddraw->windowed)
{
ChangeDisplaySettings(&ddraw->render.mode, CDS_FULLSCREEN);
}
}
if(wParam == SIZE_MINIMIZED)
{
ddraw_RestoreDisplayMode(ddraw);
}
/* disallow maximize, C&C does that when WCHAT DDE is used */
if(wParam == SIZE_MAXIMIZED)
{
ShowWindow(ddraw->hWnd, SW_RESTORE);
}
break;
case WM_NCACTIVATE:
if(wParam == FALSE)
else if (wParam == WA_INACTIVE)
{
mouse_unlock();
}
if(!ddraw->windowed)
{
if(wParam == FALSE)
/* minimize our window on defocus when in fullscreen */
if (!ddraw->windowed)
{
ChangeDisplaySettings(&ddraw->mode, 0);
ShowWindow(ddraw->hWnd, SW_MINIMIZE);
}
else
{
ShowWindow(ddraw->hWnd, SW_RESTORE);
}
}
return 0;
case WM_ACTIVATEAPP:
/* C&C and RA stop drawing when they receive this with FALSE wParam, disable in windowed mode */
if (ddraw->windowed)
{
return 0;
}
break;
case WM_KEYDOWN:
if(wParam == VK_CONTROL || wParam == VK_TAB)
{
if(GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(VK_TAB) & 0x8000)
{
mouse_unlock();
return 0;
}
}
#ifdef HAVE_LIBPNG
@ -368,16 +372,16 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if(GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(0x53) & 0x8000)
{
screenshot(ddraw->primary);
return 0;
}
}
#endif
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_CHAR: /* for StarCraft and general support */
return ddraw->WndProc(hWnd, uMsg, wParam, lParam);
break;
/* button up messages reactivate cursor lock */
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
if (ddraw->mhack && !ddraw->locked)
{
ddraw->cursor.x = LOWORD(lParam) * ((float)ddraw->width / ddraw->render.width);
@ -385,46 +389,41 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
mouse_lock();
return 0;
}
/* fall through for lParam */
/* down messages are ignored if we have no cursor lock */
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
/* rest for StarCraft and general support */
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MBUTTONDBLCLK:
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
if(ddraw->mhack)
case WM_MOUSEMOVE:
if (ddraw->mhack)
{
if (!ddraw->locked)
{
return 0;
}
fake_GetCursorPos(NULL); /* update our own cursor */
lParam = MAKELPARAM(ddraw->cursor.x, ddraw->cursor.y);
}
case 1129: /* this somehow triggers network activity in C&C in WCHAT mode */
case 1139: /* this somehow triggers network activity in RA, investigate */
case 2024: /* this somehow allows RA edwin to work, investigate */
return ddraw->WndProc(hWnd, uMsg, wParam, lParam);
break;
/* for StarCraft and general support */
case WM_MOUSEMOVE:
case WM_NCMOUSEMOVE:
if(ddraw->mhack)
{
fake_GetCursorPos(&pt);
return ddraw->WndProc(hWnd, uMsg, wParam, MAKELPARAM(pt.x, pt.y));
}
return ddraw->WndProc(hWnd, uMsg, wParam, lParam);
/* make sure we redraw when WM_PAINT is requested */
case WM_PAINT:
EnterCriticalSection(&ddraw->cs);
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
LeaveCriticalSection(&ddraw->cs);
break;
case WM_ERASEBKGND:
EnterCriticalSection(&ddraw->cs);
FillRect(ddraw->render.hDC, &rc, (HBRUSH) GetStockObject(BLACK_BRUSH));
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
LeaveCriticalSection(&ddraw->cs);
return TRUE;
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
return ddraw->WndProc(hWnd, uMsg, wParam, lParam);
}
HRESULT __stdcall ddraw_SetCooperativeLevel(IDirectDrawImpl *This, HWND hWnd, DWORD dwFlags)

View File

@ -87,7 +87,7 @@ DWORD WINAPI render_main(void)
glEnable(GL_TEXTURE_2D);
while(ddraw->render.run && WaitForSingleObject(ddraw->render.sem, 100) != WAIT_FAILED)
while(ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
{
scale_w = (float)ddraw->width/tex_width;
scale_h = (float)ddraw->height/tex_height;

View File

@ -66,7 +66,7 @@ DWORD WINAPI render_soft_main(void)
frame_len = 1000.0f / ddraw->render.maxfps;
}
while (ddraw->render.run && WaitForSingleObject(ddraw->render.sem, 100) != WAIT_FAILED)
while (ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
{
if(ddraw->render.maxfps > 0)
{