From 49535f8823f03dff0dd7fad8eca259dce244f68b Mon Sep 17 00:00:00 2001 From: pjgat09 Date: Fri, 8 Aug 2014 23:51:46 +0000 Subject: [PATCH] N64: Eliminate the need for a separate window for jabo by using GetDesktopWindow --- .../mupen64plus-video-jabo/main.cpp | 75 +----------------- output/dll/mupen64plus-video-jabo.dll | Bin 27648 -> 26624 bytes 2 files changed, 1 insertion(+), 74 deletions(-) diff --git a/libmupen64plus/mupen64plus-video-jabo/main.cpp b/libmupen64plus/mupen64plus-video-jabo/main.cpp index 205334b3da..a693d7f98a 100644 --- a/libmupen64plus/mupen64plus-video-jabo/main.cpp +++ b/libmupen64plus/mupen64plus-video-jabo/main.cpp @@ -59,7 +59,6 @@ static void *l_DebugCallContext = NULL; static int l_PluginInit = 0; HMODULE JaboDLL; -HWND hWnd_jabo; HANDLE window_thread = NULL; @@ -355,7 +354,6 @@ EXPORT void CALL ChangeWindow (void) // NOTE: NEW GFX_INFO vs old EXPORT int CALL InitiateGFX(GFX_INFO Gfx_Info) { - while(hWnd_jabo == NULL) { Sleep(1); } LOG("API WRAPPER:\t InitiateGFX") Config_Open(); @@ -430,7 +428,7 @@ EXPORT int CALL InitiateGFX(GFX_INFO Gfx_Info) OldAPI::GFX_INFO blah; - blah.hWnd = hWnd_jabo; + blah.hWnd = GetDesktopWindow(); blah.hStatusBar = NULL; blah.MemoryBswaped = true; @@ -553,74 +551,3 @@ EXPORT void CALL FBGetFrameBufferInfo(void *p) LOG("API WRAPPER:\t FBGetFrameBufferInfo") //FrameBufferInfo * pinfo = (FrameBufferInfo *)p; } - - - -/* Simple Window code */ - -HINSTANCE inj_hModule; //Injected Modules Handle - -//WndProc for the new window -LRESULT CALLBACK DLLWindowProc (HWND, UINT, WPARAM, LPARAM); - -//Register our windows Class -BOOL RegisterDLLWindowClass(char szClassName[]) -{ - WNDCLASSEX wc; - - ZeroMemory(&wc, sizeof(WNDCLASSEX)); - - wc.cbSize = sizeof (WNDCLASSEX); - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = DLLWindowProc; - wc.hInstance = inj_hModule; - wc.hCursor = LoadCursor (NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH) COLOR_WINDOW; - wc.lpszClassName = szClassName; - - if (!RegisterClassEx (&wc)) - return 0; - - return 0; -} - -//The new thread -DWORD WINAPI ThreadProc( LPVOID lpParam ) -{ - MSG messages; - char *pString = (char *)(lpParam); - RegisterDLLWindowClass("InjectedDLLWindowClass"); - hWnd_jabo = CreateWindowEx (0, "InjectedDLLWindowClass", pString, WS_OVERLAPPEDWINDOW, 300, 300, 400, 300, NULL, NULL,inj_hModule, NULL ); - ShowWindow (hWnd_jabo, SW_HIDE); - while (GetMessage (&messages, NULL, 0, 0)) - { - TranslateMessage(&messages); - DispatchMessage(&messages); - } - return 1; -} - -//Our new windows proc -LRESULT CALLBACK DLLWindowProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_COMMAND: - break; - case WM_DESTROY: - PostQuitMessage (0); - break; - default: - return DefWindowProc (hwnd, message, wParam, lParam); - } - return 0; -} - -BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,LPVOID lpReserved) -{ - if(ul_reason_for_call==DLL_PROCESS_ATTACH) { - inj_hModule = hModule; - window_thread = CreateThread(0, NULL, ThreadProc, (LPVOID)"Window Title", NULL, NULL); - } - return TRUE; -} diff --git a/output/dll/mupen64plus-video-jabo.dll b/output/dll/mupen64plus-video-jabo.dll index 8e0378ceb6c6868d6b1d3bcbf54441f6f6010e0c..2a99251be3d12f9b9df2efc517bcc4423a514f4b 100644 GIT binary patch delta 8682 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 L8&&u