From 8e85a0bae03d961dc3dfb475811f1ddc1a2bf1c4 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Mon, 8 Mar 2004 06:01:07 +0000 Subject: [PATCH] single-window --- Cxbx.dsp | 2 +- Cxbx.opt | Bin 62976 -> 60928 bytes Doc/Todo.txt | 2 + Include/Win32/Cxbx/EmuExe.h | 3 +- Include/Win32/Cxbx/ResCxbx.h | 3 +- Include/Win32/Cxbx/WndMain.h | 15 ++++- Include/Win32/CxbxKrnl/Emu.h | 2 +- Resource/Cxbx.rc | 7 ++- Source/Win32/Cxbx/EmuExe.cpp | 5 +- Source/Win32/Cxbx/Prolog.cpp | 1 + Source/Win32/Cxbx/WinMain.cpp | 2 +- Source/Win32/Cxbx/Wnd.cpp | 2 +- Source/Win32/Cxbx/WndMain.cpp | 97 ++++++++++++++++++++++++++---- Source/Win32/CxbxKrnl/Emu.cpp | 28 ++++++--- Source/Win32/CxbxKrnl/EmuD3D8.cpp | 54 +++++++++++------ 15 files changed, 175 insertions(+), 48 deletions(-) diff --git a/Cxbx.dsp b/Cxbx.dsp index a5fccb120..ea8516f77 100644 --- a/Cxbx.dsp +++ b/Cxbx.dsp @@ -83,7 +83,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# ADD LINK32 libjpeg.lib d3d8.lib dinput8.lib dxguid.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /map /debug /machine:I386 /pdbtype:sept /libpath:"Lib" +# ADD LINK32 libjpeg.lib d3d8.lib dinput8.lib dxguid.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /map /debug /machine:I386 /nodefaultlib:"libc" /pdbtype:sept /libpath:"Lib" # SUBTRACT LINK32 /pdb:none !ENDIF diff --git a/Cxbx.opt b/Cxbx.opt index 6f6b0d9f73836b40f4ce2e3a1619a60ba2cc7d06..9eaffe79f70030889920cf79dc9d0a584015bcf3 100644 GIT binary patch literal 60928 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 // ****************************************************************** // * class : EmuExe @@ -45,7 +46,7 @@ class EmuExe : public Exe // ****************************************************************** // * Construct via Xbe file object // ****************************************************************** - EmuExe(class Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename); + EmuExe(class Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename, HWND hwndParent = NULL); }; #endif diff --git a/Include/Win32/Cxbx/ResCxbx.h b/Include/Win32/Cxbx/ResCxbx.h index 95cc5e0b5..040a52bfc 100644 --- a/Include/Win32/Cxbx/ResCxbx.h +++ b/Include/Win32/Cxbx/ResCxbx.h @@ -93,13 +93,14 @@ #define ID_SETTINGS_GENXP 40078 #define ID_SETTINGS_GENWT 40079 #define ID_SETTINGS_GENMA 40080 +#define ID_EMULATION_STOP 40082 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 119 -#define _APS_NEXT_COMMAND_VALUE 40082 +#define _APS_NEXT_COMMAND_VALUE 40083 #define _APS_NEXT_CONTROL_VALUE 1050 #define _APS_NEXT_SYMED_VALUE 104 #endif diff --git a/Include/Win32/Cxbx/WndMain.h b/Include/Win32/Cxbx/WndMain.h index 449ee7976..5c0dec9d4 100644 --- a/Include/Win32/Cxbx/WndMain.h +++ b/Include/Win32/Cxbx/WndMain.h @@ -80,12 +80,17 @@ class WndMain : public Wnd // * Exe operations // ****************************************************************** void ImportExe(const char *x_filename); - bool ConvertToExe(const char *x_filename, bool x_bVerifyIfExists); + bool ConvertToExe(const char *x_filename, bool x_bVerifyIfExists, HWND hwndParent); // ****************************************************************** // * start emulation (converting to .exe if not done already) // ****************************************************************** - void StartEmulation(EnumAutoConvert x_bAutoConvert); + void StartEmulation(EnumAutoConvert x_bAutoConvert, HWND hwndParent); + + // ****************************************************************** + // * stop emulation (close existing child window) + // ****************************************************************** + void StopEmulation(); // ****************************************************************** // * accessor @@ -144,6 +149,7 @@ class WndMain : public Wnd // ****************************************************************** bool m_bXbeChanged; bool m_bExeChanged; + bool m_bCanStart; // ****************************************************************** // * cached filenames @@ -151,6 +157,11 @@ class WndMain : public Wnd char *m_XbeFilename; char *m_ExeFilename; + // ****************************************************************** + // * cached child window handle + // ****************************************************************** + HWND m_hwndChild; + // ****************************************************************** // * should emulation always auto-create the .exe? // ****************************************************************** diff --git a/Include/Win32/CxbxKrnl/Emu.h b/Include/Win32/CxbxKrnl/Emu.h index 2fdd81236..2cbaedb92 100644 --- a/Include/Win32/CxbxKrnl/Emu.h +++ b/Include/Win32/CxbxKrnl/Emu.h @@ -50,7 +50,7 @@ extern "C" CXBXKRNL_API bool NTAPI EmuVerifyVersion(const char *szVersion); extern "C" CXBXKRNL_API void NTAPI EmuCleanThread(); // initialize emulation -extern "C" CXBXKRNL_API void NTAPI EmuInit(void *pTLSData, Xbe::TLS *pTLS, Xbe::LibraryVersion *LibraryVersion, DebugMode DbgMode, char *szDebugFilename, Xbe::Header *XbeHeader, uint32 XbeHeaderSize, void (*Entry)()); +extern "C" CXBXKRNL_API void NTAPI EmuInit(HWND hwndParent, void *pTLSData, Xbe::TLS *pTLS, Xbe::LibraryVersion *LibraryVersion, DebugMode DbgMode, char *szDebugFilename, Xbe::Header *XbeHeader, uint32 XbeHeaderSize, void (*Entry)()); // print out a warning message to the kernel debug log file #ifdef _DEBUG_WARNINGS diff --git a/Resource/Cxbx.rc b/Resource/Cxbx.rc index 5026f6972..7dd1eaa67 100644 --- a/Resource/Cxbx.rc +++ b/Resource/Cxbx.rc @@ -169,6 +169,7 @@ BEGIN POPUP "E&mulation" BEGIN MENUITEM "&Start\tF5", ID_EMULATION_START, GRAYED + MENUITEM "S&top\tF6", ID_EMULATION_STOP, GRAYED END POPUP "&Help" BEGIN @@ -266,10 +267,10 @@ BEGIN WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_VC_VIDEO_RESOLUTION,76,49,173,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Start in Fullscreen",IDC_CV_FULLSCREEN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,76,71,73,10 + CONTROL "Use Hardware Video Mode",IDC_CV_FULLSCREEN,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,76,71,98,10 CONTROL "Force VSync",IDC_CV_VSYNC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,154,71,65,10 + WS_TABSTOP,182,71,65,10 PUSHBUTTON "Cancel",IDC_VC_CANCEL,146,92,50,14,BS_FLAT PUSHBUTTON "Accept",IDC_VC_ACCEPT,203,92,50,14,BS_FLAT GROUPBOX "Direct3D Configuration",IDC_STATIC,4,1,250,87,BS_CENTER diff --git a/Source/Win32/Cxbx/EmuExe.cpp b/Source/Win32/Cxbx/EmuExe.cpp index 212617764..557a2d50e 100644 --- a/Source/Win32/Cxbx/EmuExe.cpp +++ b/Source/Win32/Cxbx/EmuExe.cpp @@ -40,7 +40,7 @@ // ****************************************************************** // * constructor // ****************************************************************** -EmuExe::EmuExe(Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename) : Exe() +EmuExe::EmuExe(Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename, HWND hwndParent) : Exe() { ConstructorInit(); @@ -578,6 +578,9 @@ EmuExe::EmuExe(Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename) : Exe *(uint32 *)((uint32)m_bzSection[i] + 41) = 0; } + // Param 0 : hwndParent + *(uint32 *)((uint32)m_bzSection[i] + 46) = (uint32)hwndParent; + printf("OK\n"); } } diff --git a/Source/Win32/Cxbx/Prolog.cpp b/Source/Win32/Cxbx/Prolog.cpp index 55dac5ccc..be3ff0de8 100644 --- a/Source/Win32/Cxbx/Prolog.cpp +++ b/Source/Win32/Cxbx/Prolog.cpp @@ -63,6 +63,7 @@ __declspec(allocate(".cxbxplg")) uint08 Prolog[] = 0x68, 0xC3, 0xC3, 0xC3, 0xC3, // push 0xC3C3C3C3 0x68, 0xC3, 0xC3, 0xC3, 0xC3, // push 0xC3C3C3C3 0x68, 0xC3, 0xC3, 0xC3, 0xC3, // push 0xC3C3C3C3 + 0x68, 0xC3, 0xC3, 0xC3, 0xC3, // push 0xC3C3C3C3 0xFF, 0xD6, // call esi 0xC3 // ret }; diff --git a/Source/Win32/Cxbx/WinMain.cpp b/Source/Win32/Cxbx/WinMain.cpp index d84e6ea82..5131a1a16 100644 --- a/Source/Win32/Cxbx/WinMain.cpp +++ b/Source/Win32/Cxbx/WinMain.cpp @@ -58,7 +58,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine { MainWindow->OpenXbe(__argv[1]); - MainWindow->StartEmulation(AUTO_CONVERT_WINDOWS_TEMP); + MainWindow->StartEmulation(AUTO_CONVERT_WINDOWS_TEMP, MainWindow->GetHwnd()); } while(MainWindow->GetError() == 0 && MainWindow->ProcessMessages()) diff --git a/Source/Win32/Cxbx/Wnd.cpp b/Source/Win32/Cxbx/Wnd.cpp index fc841336e..1ab9b0c25 100644 --- a/Source/Win32/Cxbx/Wnd.cpp +++ b/Source/Win32/Cxbx/Wnd.cpp @@ -47,7 +47,7 @@ Wnd::Wnd(HINSTANCE x_hInstance) : m_hInstance(x_hInstance) m_h = 240; m_parent = NULL; m_clsstyle = CS_HREDRAW | CS_VREDRAW; - m_wndstyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE; + m_wndstyle = WS_CLIPCHILDREN | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE; m_background = (HBRUSH)GetStockObject(BLACK_BRUSH); m_initialized = false; diff --git a/Source/Win32/Cxbx/WndMain.cpp b/Source/Win32/Cxbx/WndMain.cpp index 2ef78702c..678ce1760 100644 --- a/Source/Win32/Cxbx/WndMain.cpp +++ b/Source/Win32/Cxbx/WndMain.cpp @@ -42,7 +42,7 @@ #include -WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m_Xbe(0), m_Exe(0), m_bExeChanged(false), m_bXbeChanged(false), m_AutoConvertToExe(AUTO_CONVERT_WINDOWS_TEMP), m_KrnlDebug(DM_NONE), m_CxbxDebug(DM_NONE), m_dwRecentXbe(0), m_dwRecentExe(0) +WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m_Xbe(0), m_Exe(0), m_bExeChanged(false), m_bXbeChanged(false), m_bCanStart(true), m_hwndChild(NULL), m_AutoConvertToExe(AUTO_CONVERT_WINDOWS_TEMP), m_KrnlDebug(DM_NONE), m_CxbxDebug(DM_NONE), m_dwRecentXbe(0), m_dwRecentExe(0) { // initialize members { @@ -297,6 +297,42 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP } break; + case WM_PARENTNOTIFY: + { + switch(LOWORD(wParam)) + { + case WM_CREATE: + { + m_hwndChild = GetWindow(hwnd, GW_CHILD); + + char AsciiTitle[255]; + + sprintf(AsciiTitle, "Cxbx : Emulating %s...", m_Xbe->m_szAsciiTitle); + + SetWindowText(m_hwnd, AsciiTitle); + + RefreshMenus(); + } + break; + + case WM_DESTROY: + { + m_hwndChild = NULL; + SetWindowText(m_hwnd, "Cxbx " _CXBX_VERSION); + RefreshMenus(); + } + break; + } + }; + + case WM_SYSKEYDOWN: + { + if(m_hwndChild != 0) + { + SendMessage(m_hwndChild, uMsg, wParam, lParam); + } + }; + case WM_PAINT: { static bool s_bInitMenu = true; @@ -366,10 +402,30 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP { case VK_F5: { - if(m_Xbe != 0) - StartEmulation(m_AutoConvertToExe); + if(m_Xbe != 0 && (m_hwndChild == NULL) && m_bCanStart) + { + m_bCanStart = false; + StartEmulation(m_AutoConvertToExe, hwnd); + } } break; + + case VK_F6: + { + if(m_hwndChild != NULL && !m_bCanStart) + { + StopEmulation(); + } + } + break; + + default: + { + if(m_hwndChild != 0) + { + SendMessage(m_hwndChild, uMsg, wParam, lParam); + } + } } } break; @@ -458,7 +514,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP break; case ID_FILE_EXPORTTOEXE: - ConvertToExe(NULL, true); + ConvertToExe(NULL, true, hwnd); break; case ID_FILE_RXBE_0: @@ -1004,7 +1060,11 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP break; case ID_EMULATION_START: - StartEmulation(m_AutoConvertToExe); + StartEmulation(m_AutoConvertToExe, hwnd); + break; + + case ID_EMULATION_STOP: + StopEmulation(); break; case ID_SETTINGS_GENWT: @@ -1320,7 +1380,10 @@ void WndMain::RefreshMenus() HMENU emul_menu = GetSubMenu(menu, 4); // enable emulation start - EnableMenuItem(emul_menu, ID_EMULATION_START, MF_BYCOMMAND | (m_Xbe == 0) ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(emul_menu, ID_EMULATION_START, MF_BYCOMMAND | (m_Xbe == 0 || (m_hwndChild != NULL)) ? MF_GRAYED : MF_ENABLED); + + // enable emulation stop + EnableMenuItem(emul_menu, ID_EMULATION_STOP, MF_BYCOMMAND | (m_hwndChild == NULL) ? MF_GRAYED : MF_ENABLED); } } } @@ -1513,6 +1576,8 @@ void WndMain::OpenXbe(const char *x_filename) // close xbe file void WndMain::CloseXbe() { + StopEmulation(); + if(m_bXbeChanged) { int ret = MessageBox(m_hwnd, "Changes have been made, do you wish to save?", "Cxbx", MB_ICONQUESTION | MB_YESNOCANCEL); @@ -1689,7 +1754,7 @@ void WndMain::ImportExe(const char *x_filename) } // convert to exe file -bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists) +bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists, HWND hwndParent) { char filename[260] = "default.exe"; @@ -1733,7 +1798,7 @@ bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists) // convert file { - EmuExe i_EmuExe(m_Xbe, m_KrnlDebug, m_KrnlDebugFilename); + EmuExe i_EmuExe(m_Xbe, m_KrnlDebug, m_KrnlDebugFilename, hwndParent); i_EmuExe.Export(filename); @@ -1756,7 +1821,7 @@ bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists) } // start emulation -void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert) +void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert, HWND hwndParent) { char szBuffer[260]; @@ -1782,19 +1847,19 @@ void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert) strcat(szTempPath, &szBuffer[c]); - if(!ConvertToExe(szTempPath, false)) + if(!ConvertToExe(szTempPath, false, hwndParent)) return; } else if(x_AutoConvert == AUTO_CONVERT_XBE_PATH) { SuggestFilename(m_XbeFilename, szBuffer, ".exe"); - if(!ConvertToExe(szBuffer, false)) + if(!ConvertToExe(szBuffer, false, hwndParent)) return; } else { - if(!ConvertToExe(NULL, true)) + if(!ConvertToExe(NULL, true, hwndParent)) return; } } @@ -1820,6 +1885,7 @@ void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert) if((int)ShellExecute(NULL, "open", m_ExeFilename, NULL, szBuffer, SW_SHOWDEFAULT) <= 32) { + m_bCanStart = true; MessageBox(m_hwnd, "Emulation failed.\n\nTry converting again. If this message repeats, the Xbe is not supported.", "Cxbx", MB_ICONSTOP | MB_OK); printf("WndMain: %s shell failed.\n", m_Xbe->m_szAsciiTitle); @@ -1830,3 +1896,10 @@ void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert) } } } + +// stop emulation +void WndMain::StopEmulation() +{ + SendMessage(m_hwndChild, WM_CLOSE, 0, 0); + m_bCanStart = true; +} diff --git a/Source/Win32/CxbxKrnl/Emu.cpp b/Source/Win32/CxbxKrnl/Emu.cpp index 0416446ed..f1784c752 100644 --- a/Source/Win32/CxbxKrnl/Emu.cpp +++ b/Source/Win32/CxbxKrnl/Emu.cpp @@ -63,6 +63,7 @@ namespace XTL // Ugly Global Pull-In extern HWND g_hEmuWindow; // rendering window +extern HWND g_hEmuParent; // rendering window parent // Global Variable(s) extern Xbe::TLS *g_pTLS = NULL; @@ -140,6 +141,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuCleanThread() // initialize emulation extern "C" CXBXKRNL_API void NTAPI EmuInit ( + HWND hwndParent, void *pTLSData, Xbe::TLS *pTLS, Xbe::LibraryVersion *pLibraryVersion, @@ -153,8 +155,9 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit g_pTLS = pTLS; g_pTLSData = pTLSData; g_pXbeHeader = pXbeHeader; + g_hEmuParent = hwndParent; - // For Unicode Conversions + // For Unicode Conversions setlocale(LC_ALL, "English"); // debug console allocation (if configured) @@ -198,6 +201,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit printf("EmuMain (0x%X): EmuInit\n" "(\n" + " hwndParent : 0x%.08X\n" " pTLSData : 0x%.08X\n" " pTLS : 0x%.08X\n" " pLibraryVersion : 0x%.08X\n" @@ -207,7 +211,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit " pXBEHeaderSize : 0x%.08X\n" " Entry : 0x%.08X\n" ");\n", - GetCurrentThreadId(), pTLSData, pTLS, pLibraryVersion, DbgMode, szDebugFilename, pXbeHeader, dwXbeHeaderSize, Entry); + GetCurrentThreadId(), hwndParent, pTLSData, pTLS, pLibraryVersion, DbgMode, szDebugFilename, pXbeHeader, dwXbeHeaderSize, Entry); #else printf("EmuMain (0x%X): Debug Trace Disabled.\n", GetCurrentThreadId()); @@ -559,7 +563,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit // _USE_XGMATH Disabled in mesh :[ // halo : dword_0_2E2D18 // halo : 1744F0 (bink) - _asm int 3 + //_asm int 3 Entry(); @@ -653,6 +657,8 @@ extern "C" CXBXKRNL_API void NTAPI EmuCleanup(const char *szErrorMessage, ...) freopen("nul", "w", stdout); } + SendMessage(g_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0); + TerminateProcess(GetCurrentProcess(), 0); return; @@ -717,10 +723,10 @@ extern "C" CXBXKRNL_API void NTAPI EmuSuspend() { char szBuffer[256]; - GetWindowText(g_hEmuWindow, szBuffer, 255 - 10); + GetWindowText(g_hEmuParent, szBuffer, 255 - 10); strcat(szBuffer, " (paused)"); - SetWindowText(g_hEmuWindow, szBuffer); + SetWindowText(g_hEmuParent, szBuffer); } g_bEmuSuspended = TRUE; @@ -736,11 +742,11 @@ extern "C" CXBXKRNL_API void NTAPI EmuResume() { char szBuffer[256]; - GetWindowText(g_hEmuWindow, szBuffer, 255); + GetWindowText(g_hEmuParent, szBuffer, 255); szBuffer[strlen(szBuffer)-9] = '\0'; - SetWindowText(g_hEmuWindow, szBuffer); + SetWindowText(g_hEmuParent, szBuffer); } for(int v=0;vGetXBVideo(&g_XBVideo); + if(g_XBVideo.GetFullscreen()) + g_hEmuParent = NULL; + // cache XbeHeader and size of XbeHeader g_XbeHeader = XbeHeader; g_XbeHeaderSize = XbeHeaderSize; @@ -265,7 +269,7 @@ static BOOL WINAPI EmuEnumDisplayDevices(GUID FAR *lpGUID, LPSTR lpDriverDescrip } // window message processing thread -static DWORD WINAPI EmuRenderWindow(LPVOID) +static DWORD WINAPI EmuRenderWindow(LPVOID lpVoid) { char AsciiTitle[50]; @@ -317,7 +321,7 @@ static DWORD WINAPI EmuRenderWindow(LPVOID) // create the window { - DWORD dwStyle = WS_OVERLAPPEDWINDOW; + DWORD dwStyle = g_XBVideo.GetFullscreen() ? WS_OVERLAPPEDWINDOW : WS_CHILD; int nTitleHeight = GetSystemMetrics(SM_CYCAPTION); int nBorderWidth = GetSystemMetrics(SM_CXSIZEFRAME); @@ -336,17 +340,29 @@ static DWORD WINAPI EmuRenderWindow(LPVOID) dwStyle = WS_POPUP; } + HWND hwndParent = GetDesktopWindow(); + + if(!g_XBVideo.GetFullscreen()) + { + hwndParent = g_hEmuParent; + } + g_hEmuWindow = CreateWindow ( "CxbxRender", AsciiTitle, dwStyle, x, y, nWidth, nHeight, - GetDesktopWindow(), NULL, GetModuleHandle(NULL), NULL + hwndParent, NULL, GetModuleHandle(NULL), NULL ); } - ShowWindow(g_hEmuWindow, SW_SHOWDEFAULT); + ShowWindow(g_hEmuWindow, g_XBVideo.GetFullscreen() ? SW_SHOWDEFAULT : SW_SHOWMAXIMIZED); UpdateWindow(g_hEmuWindow); + if(!g_XBVideo.GetFullscreen()) + { + SetFocus(g_hEmuParent); + } + // initialize direct input if(!XTL::EmuDInputInit()) EmuCleanup("Could not initialize DirectInput!"); @@ -387,25 +403,20 @@ void ToggleFauxFullscreen(HWND hWnd) return; static bool bIsNormal = true; - static LONG lRestore = 0, lRestoreEx = 0; - static RECT Rect; if(bIsNormal) { - lRestore = GetWindowLong(hWnd, GWL_STYLE); - lRestoreEx = GetWindowLong(hWnd, GWL_EXSTYLE); - + SetParent(hWnd, NULL); SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); - GetWindowRect(hWnd, &Rect); ShowWindow(hWnd, SW_MAXIMIZE); } else { - SetWindowLong(hWnd, GWL_STYLE, lRestore); - SetWindowLong(hWnd, GWL_EXSTYLE, lRestoreEx); - ShowWindow(hWnd, SW_RESTORE); - SetWindowPos(hWnd, HWND_NOTOPMOST, Rect.left, Rect.top, Rect.right - Rect.left, Rect.bottom - Rect.top, 0); + SetParent(hWnd, g_hEmuParent); + SetWindowLong(hWnd, GWL_STYLE, WS_CHILD); + ShowWindow(hWnd, SW_MAXIMIZE); + SetFocus(g_hEmuParent); } bIsNormal = !bIsNormal; @@ -498,6 +509,15 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar DestroyWindow(hWnd); break; + case WM_SETFOCUS: + { + if(g_hEmuParent != NULL) + { + SetFocus(g_hEmuParent); + } + } + break; + case WM_SETCURSOR: { if(g_XBVideo.GetFullscreen()) @@ -4928,9 +4948,9 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_UpdateOverlay RECT SourRect = {0, 0, g_dwOverlayW, g_dwOverlayH}, DestRect; MONITORINFO MonitorInfo = {0}; - int nTitleHeight = GetSystemMetrics(SM_CYCAPTION); - int nBorderWidth = GetSystemMetrics(SM_CXSIZEFRAME); - int nBorderHeight = GetSystemMetrics(SM_CYSIZEFRAME); + int nTitleHeight = 0;//GetSystemMetrics(SM_CYCAPTION); + int nBorderWidth = 0;//GetSystemMetrics(SM_CXSIZEFRAME); + int nBorderHeight = 0;//GetSystemMetrics(SM_CYSIZEFRAME); MonitorInfo.cbSize = sizeof(MONITORINFO); GetMonitorInfo(g_hMonitor, &MonitorInfo);