mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
Try to introduce better window message handling and management, most probably needs fixing
This commit is contained in:
parent
f02ef15bc4
commit
3c79b4aa4b
109
main.c
109
main.c
@ -168,7 +168,6 @@ HRESULT __stdcall ddraw_RestoreDisplayMode(IDirectDrawImpl *This)
|
|||||||
|
|
||||||
if(!ddraw->windowed)
|
if(!ddraw->windowed)
|
||||||
{
|
{
|
||||||
This->mode.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFLAGS|DM_DISPLAYFREQUENCY|DM_POSITION;
|
|
||||||
ChangeDisplaySettings(&This->mode, 0);
|
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)
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
RECT rc = { 0, 0, ddraw->render.width, ddraw->render.height };
|
RECT rc = { 0, 0, ddraw->render.width, ddraw->render.height };
|
||||||
POINT pt;
|
|
||||||
|
|
||||||
switch(uMsg)
|
switch(uMsg)
|
||||||
{
|
{
|
||||||
case WM_DESTROY:
|
/* Carmageddon stops the main loop when it sees these, DefWindowProc is also bad */
|
||||||
return ddraw->WndProc(hWnd, uMsg, wParam, lParam);
|
case WM_WINDOWPOSCHANGING:
|
||||||
|
case WM_WINDOWPOSCHANGED:
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* C&C and RA really don't want to close down */
|
||||||
case WM_SYSCOMMAND:
|
case WM_SYSCOMMAND:
|
||||||
if(wParam == SC_CLOSE)
|
if (wParam == SC_CLOSE)
|
||||||
{
|
{
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
break;
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||||
case WM_SIZE:
|
|
||||||
if(wParam == SIZE_RESTORED)
|
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)
|
else if (wParam == WA_INACTIVE)
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
}
|
|
||||||
|
|
||||||
if(!ddraw->windowed)
|
/* minimize our window on defocus when in fullscreen */
|
||||||
{
|
if (!ddraw->windowed)
|
||||||
if(wParam == FALSE)
|
|
||||||
{
|
{
|
||||||
|
ChangeDisplaySettings(&ddraw->mode, 0);
|
||||||
ShowWindow(ddraw->hWnd, SW_MINIMIZE);
|
ShowWindow(ddraw->hWnd, SW_MINIMIZE);
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
return 0;
|
||||||
ShowWindow(ddraw->hWnd, SW_RESTORE);
|
|
||||||
}
|
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;
|
break;
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
if(wParam == VK_CONTROL || wParam == VK_TAB)
|
if(wParam == VK_CONTROL || wParam == VK_TAB)
|
||||||
{
|
{
|
||||||
if(GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(VK_TAB) & 0x8000)
|
if(GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(VK_TAB) & 0x8000)
|
||||||
{
|
{
|
||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef HAVE_LIBPNG
|
#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)
|
if(GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(0x53) & 0x8000)
|
||||||
{
|
{
|
||||||
screenshot(ddraw->primary);
|
screenshot(ddraw->primary);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
case WM_KEYUP:
|
break;
|
||||||
case WM_SYSKEYDOWN:
|
|
||||||
case WM_SYSKEYUP:
|
/* button up messages reactivate cursor lock */
|
||||||
case WM_CHAR: /* for StarCraft and general support */
|
|
||||||
return ddraw->WndProc(hWnd, uMsg, wParam, lParam);
|
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
case WM_RBUTTONUP:
|
case WM_RBUTTONUP:
|
||||||
|
case WM_MBUTTONUP:
|
||||||
if (ddraw->mhack && !ddraw->locked)
|
if (ddraw->mhack && !ddraw->locked)
|
||||||
{
|
{
|
||||||
ddraw->cursor.x = LOWORD(lParam) * ((float)ddraw->width / ddraw->render.width);
|
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();
|
mouse_lock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/* fall through for lParam */
|
||||||
|
|
||||||
|
/* down messages are ignored if we have no cursor lock */
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
case WM_RBUTTONDOWN:
|
case WM_RBUTTONDOWN:
|
||||||
/* rest for StarCraft and general support */
|
|
||||||
case WM_MBUTTONDOWN:
|
case WM_MBUTTONDOWN:
|
||||||
case WM_MBUTTONUP:
|
case WM_MOUSEMOVE:
|
||||||
case WM_MBUTTONDBLCLK:
|
if (ddraw->mhack)
|
||||||
case WM_LBUTTONDBLCLK:
|
|
||||||
case WM_RBUTTONDBLCLK:
|
|
||||||
if(ddraw->mhack)
|
|
||||||
{
|
{
|
||||||
if (!ddraw->locked)
|
if (!ddraw->locked)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fake_GetCursorPos(NULL); /* update our own cursor */
|
||||||
lParam = MAKELPARAM(ddraw->cursor.x, ddraw->cursor.y);
|
lParam = MAKELPARAM(ddraw->cursor.x, ddraw->cursor.y);
|
||||||
}
|
}
|
||||||
case 1129: /* this somehow triggers network activity in C&C in WCHAT mode */
|
break;
|
||||||
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);
|
|
||||||
|
|
||||||
/* for StarCraft and general support */
|
/* make sure we redraw when WM_PAINT is requested */
|
||||||
case WM_MOUSEMOVE:
|
case WM_PAINT:
|
||||||
case WM_NCMOUSEMOVE:
|
EnterCriticalSection(&ddraw->cs);
|
||||||
if(ddraw->mhack)
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
{
|
LeaveCriticalSection(&ddraw->cs);
|
||||||
fake_GetCursorPos(&pt);
|
break;
|
||||||
return ddraw->WndProc(hWnd, uMsg, wParam, MAKELPARAM(pt.x, pt.y));
|
|
||||||
}
|
|
||||||
return ddraw->WndProc(hWnd, uMsg, wParam, lParam);
|
|
||||||
|
|
||||||
case WM_ERASEBKGND:
|
case WM_ERASEBKGND:
|
||||||
EnterCriticalSection(&ddraw->cs);
|
EnterCriticalSection(&ddraw->cs);
|
||||||
FillRect(ddraw->render.hDC, &rc, (HBRUSH) GetStockObject(BLACK_BRUSH));
|
FillRect(ddraw->render.hDC, &rc, (HBRUSH) GetStockObject(BLACK_BRUSH));
|
||||||
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
LeaveCriticalSection(&ddraw->cs);
|
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)
|
HRESULT __stdcall ddraw_SetCooperativeLevel(IDirectDrawImpl *This, HWND hWnd, DWORD dwFlags)
|
||||||
|
2
render.c
2
render.c
@ -87,7 +87,7 @@ DWORD WINAPI render_main(void)
|
|||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
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_w = (float)ddraw->width/tex_width;
|
||||||
scale_h = (float)ddraw->height/tex_height;
|
scale_h = (float)ddraw->height/tex_height;
|
||||||
|
@ -66,7 +66,7 @@ DWORD WINAPI render_soft_main(void)
|
|||||||
frame_len = 1000.0f / ddraw->render.maxfps;
|
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)
|
if(ddraw->render.maxfps > 0)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user