diff --git a/Source/Core/VideoCommon/CMakeLists.txt b/Source/Core/VideoCommon/CMakeLists.txt index 5013ea07da..e50317cece 100644 --- a/Source/Core/VideoCommon/CMakeLists.txt +++ b/Source/Core/VideoCommon/CMakeLists.txt @@ -39,6 +39,10 @@ set(SRCS Src/BPMemory.cpp Src/XFStructs.cpp Src/OpenCL/OCLTextureDecoder.cpp) +if(wxWidgets_FOUND AND WIN32) + set(SRCS ${SRCS} Src/EmuWindow.cpp) +endif() + if(LIBAV_FOUND OR WIN32) set(SRCS ${SRCS} Src/AVIDump.cpp) endif() diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp b/Source/Core/VideoCommon/Src/EmuWindow.cpp similarity index 70% rename from Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp rename to Source/Core/VideoCommon/Src/EmuWindow.cpp index a4781c5d06..62882c48e6 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp +++ b/Source/Core/VideoCommon/Src/EmuWindow.cpp @@ -17,125 +17,29 @@ #include -#include -#include -#include -#include -#include - -#include "../Globals.h" #include "VideoConfig.h" -#include "main.h" -#include "Win32.h" -#include "OnScreenDisplay.h" +#include "EmuWindow.h" +#include "Fifo.h" #include "VertexShaderManager.h" -#include "Render.h" - -#include "StringUtil.h" +#include "RenderBase.h" -HINSTANCE g_hInstance; +int OSDChoice = 0 , OSDTime = 0, OSDInternalW = 0, OSDInternalH = 0; -#if defined(HAVE_WX) && HAVE_WX -class wxDLLApp : public wxApp -{ - bool OnInit() - { - return true; - } -}; -IMPLEMENT_APP_NO_MAIN(wxDLLApp) -WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); -#endif -// ------------------ - -BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle - DWORD dwReason, // reason called - LPVOID lpvReserved) // reserved -{ - switch (dwReason) - { - case DLL_PROCESS_ATTACH: - { -#if defined(HAVE_WX) && HAVE_WX - wxSetInstance((HINSTANCE)hinstDLL); - wxInitialize(); -#endif - } - break; - - case DLL_PROCESS_DETACH: -#if defined(HAVE_WX) && HAVE_WX - wxUninitialize(); -#endif - break; - } - - g_hInstance = hinstDLL; - return TRUE; -} - -extern bool gShowDebugger; - -// --------------------------------------------------------------------- -// OSD Menu -// ------------- -// Let's begin with 3 since 1 and 2 are default Wii keys -// ------------- -void OSDMenu(WPARAM wParam) -{ - switch( LOWORD( wParam )) - { - case '3': - OSDChoice = 1; - // Toggle native resolution - g_Config.iEFBScale = g_Config.iEFBScale + 1; - if (g_Config.iEFBScale > 4) g_Config.iEFBScale = 0; - break; - case '4': - OSDChoice = 2; - // Toggle aspect ratio - g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; - break; - case '5': - OSDChoice = 3; - // Toggle EFB copy - if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) - { - g_Config.bEFBCopyEnable ^= true; - g_Config.bCopyEFBToTexture = false; - } - else - { - g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; - } - break; - case '6': - OSDChoice = 4; - g_Config.bDisableFog = !g_Config.bDisableFog; - break; - case '7': - OSDChoice = 5; - g_Config.bDisableLighting = !g_Config.bDisableLighting; - break; - } -} -// --------------------------------------------------------------------- - - -// --------------------------------------------------------------------- -// The rendering window -// ---------------------- namespace EmuWindow { - -HWND m_hWnd = NULL; // The new window that is created here +HWND m_hWnd = NULL; HWND m_hParent = NULL; - HINSTANCE m_hInstance = NULL; WNDCLASSEX wndClass; const TCHAR m_szClassName[] = _T("DolphinEmuWnd"); int g_winstyle; +static volatile bool s_sizing; + +bool IsSizing() +{ + return s_sizing; +} HWND GetWnd() { @@ -147,6 +51,25 @@ HWND GetParentWnd() return m_hParent; } +// --------------------------------------------------------------------- +// KeyDown events +// ------------- +void OnKeyDown(WPARAM wParam) +{ + switch (LOWORD( wParam )) + { + case '3': // OSD keys + case '4': + case '5': + case '6': + case '7': + if (g_Config.bOSDHotKey) + OSDMenu(wParam); + break; + } +} +// --------------------------------------------------------------------- + void FreeLookInput( UINT iMsg, WPARAM wParam ) { static float debugSpeed = 1.0f; @@ -154,11 +77,11 @@ void FreeLookInput( UINT iMsg, WPARAM wParam ) static bool mouseMoveEnabled = false; static float lastMouse[2]; POINT point; - switch( iMsg ) + switch(iMsg) { case WM_USER_KEYDOWN: case WM_KEYDOWN: - switch( LOWORD( wParam )) + switch (LOWORD(wParam)) { case '9': debugSpeed /= 2.0f; @@ -221,32 +144,13 @@ void FreeLookInput( UINT iMsg, WPARAM wParam ) } } -// --------------------------------------------------------------------- -// KeyDown events -// ------------- -void OnKeyDown(WPARAM wParam) -{ - switch (LOWORD( wParam )) - { - case '3': // OSD keys - case '4': - case '5': - case '6': - case '7': - if (g_Config.bOSDHotKey) - OSDMenu(wParam); - break; - } -} -// --------------------------------------------------------------------- -// Should really take a look at the mouse stuff in here - some of it is weird. -LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) { - if (g_Config.bFreeLook) + if (g_ActiveConfig.bFreeLook) FreeLookInput( iMsg, wParam ); - switch (iMsg) + switch( iMsg ) { case WM_PAINT: { @@ -257,17 +161,40 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) } break; - case WM_KEYDOWN: + case WM_ENTERSIZEMOVE: + s_sizing = true; break; - /* Post these mouse events to the main window, it's nessesary becase in difference to the + case WM_EXITSIZEMOVE: + s_sizing = false; + break; + + /* Post the mouse events to the main window, it's nessesary because in difference to the keyboard inputs these events only appear here, not in the parent window or any other WndProc()*/ case WM_LBUTTONDOWN: + if(g_ActiveConfig.backend_info.bSupports3DVision && g_ActiveConfig.b3DVision) + { + // This basically throws away the left button down input when b3DVision is activated so WX + // can't get access to it, stopping focus pulling on mouse click. + // (Input plugins use a different system so it doesn't cause any weirdness) + break; + } case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: PostMessage(GetParentWnd(), iMsg, wParam, lParam); break; + // This is called when we close the window when we render to a separate window + case WM_CLOSE: + // When the user closes the window, we post an event to the main window to call Stop() + // Which then handles all the necessary steps to Shutdown the core + the plugins + if (m_hParent == NULL) + { + // Stop the game + PostMessage(m_hParent, WM_USER, WM_USER_STOP, 0); + } + break; + case WM_USER: if (wParam == WM_USER_KEYDOWN) { @@ -280,19 +207,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) } break; - // This is called when we close the window when we render to a separate window - case WM_CLOSE: - if (m_hParent == NULL) - { - // Stop the game - PostMessage(m_hParent, WM_USER, WM_USER_STOP, 0); - } - break; - - case WM_DESTROY: - Shutdown(); - break; - // Called when a screensaver wants to show up while this window is active case WM_SYSCOMMAND: switch (wParam) @@ -307,19 +221,70 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) case WM_SETCURSOR: PostMessage(m_hParent, WM_USER, WM_USER_SETCURSOR, 0); return true; + + case WM_DESTROY: + Shutdown(); break; default: return DefWindowProc(hWnd, iMsg, wParam, lParam); } return 0; - } -// This is called from Create() +// --------------------------------------------------------------------- +// OSD Menu +// ------------- +// Let's begin with 3 since 1 and 2 are default Wii keys +// ------------- +void OSDMenu(WPARAM wParam) +{ + switch( LOWORD( wParam )) + { + case '3': + OSDChoice = 1; + // Toggle native resolution + g_Config.iEFBScale = g_Config.iEFBScale + 1; + if (g_Config.iEFBScale > 4) g_Config.iEFBScale = 0; + break; + case '4': + OSDChoice = 2; + // Toggle aspect ratio + g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; + break; + case '5': + OSDChoice = 3; + // Toggle EFB copy + if (!g_Config.bEFBCopyEnable) + { + g_Config.bEFBCopyEnable = true; + g_Config.bCopyEFBToTexture = false; + } + else if (!g_Config.bCopyEFBToTexture) + { + g_Config.bCopyEFBToTexture = true; + } + else + { + g_Config.bEFBCopyEnable = false; + g_Config.bCopyEFBToTexture = false; + } + break; + case '6': + OSDChoice = 4; + g_Config.bDisableFog = !g_Config.bDisableFog; + break; + case '7': + // TODO: Not implemented in the D3D backends, yet + OSDChoice = 5; + g_Config.bDisableLighting = !g_Config.bDisableLighting; + break; + } +} + HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const TCHAR *title) { wndClass.cbSize = sizeof( wndClass ); - wndClass.style = CS_HREDRAW | CS_VREDRAW; + wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; @@ -334,11 +299,10 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T m_hInstance = hInstance; RegisterClassEx( &wndClass ); - // Create child window m_hParent = parent; - m_hWnd = CreateWindow(m_szClassName, title, WS_CHILD, - 0, 0, width, height, parent, NULL, hInstance, NULL); + m_hWnd = CreateWindow(m_szClassName, title, (g_ActiveConfig.backend_info.bSupports3DVision && g_ActiveConfig.b3DVision) ? WS_EX_TOPMOST | WS_POPUP : WS_CHILD, + 0, 0, width, height, m_hParent, NULL, hInstance, NULL); return m_hWnd; } @@ -349,23 +313,26 @@ void Show() BringWindowToTop(m_hWnd); UpdateWindow(m_hWnd); SetFocus(m_hParent); - - // gShowDebugger from main.cpp is forgotten between the Dolphin-Debugger is opened and a game is - // started so we have to use an ini file setting here - /* - bool bVideoWindow = false; - IniFile ini; - ini.Load(File::GetUserPath(F_DEBUGGERCONFIG_IDX)); - ini.Get("ShowOnStart", "VideoWindow", &bVideoWindow, false); - if(bVideoWindow) DoDllDebugger(); - */ } HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) { + // TODO: + // 1. Remove redundant window manipulation, + // 2. Make DX9 in fullscreen can be overlapped by other dialogs + // 3. Request window sizes which actually make the client area map to a common resolution + HWND Ret; int x=0, y=0, width=640, height=480; g_VideoInitialize.pRequestWindowSize(x, y, width, height); - return OpenWindow(hParent, hInstance, width, height, title); + + // TODO: Don't show if fullscreen + Ret = OpenWindow(hParent, hInstance, width, height, title); + + if (Ret) + { + Show(); + } + return Ret; } void Close() @@ -375,24 +342,20 @@ void Close() UnregisterClass(m_szClassName, m_hInstance); } -// ------------------------------------------ -// Set the size of the child or main window -// ------------------------------------------ void SetSize(int width, int height) { RECT rc = {0, 0, width, height}; - DWORD dwStyle = GetWindowLong(m_hWnd, GWL_STYLE); - AdjustWindowRect(&rc, dwStyle, false); + DWORD style = GetWindowLong(m_hWnd, GWL_STYLE); + AdjustWindowRect(&rc, style, false); int w = rc.right - rc.left; int h = rc.bottom - rc.top; - // Move and resize the window rc.left = (1280 - w)/2; rc.right = rc.left + w; rc.top = (1024 - h)/2; rc.bottom = rc.top + h; - MoveWindow(m_hWnd, rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top, TRUE); + MoveWindow(m_hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE); } -} // EmuWindow +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.h b/Source/Core/VideoCommon/Src/EmuWindow.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.h rename to Source/Core/VideoCommon/Src/EmuWindow.h diff --git a/Source/Core/VideoCommon/VideoCommon.vcproj b/Source/Core/VideoCommon/VideoCommon.vcproj index 45505c64a4..7685d1bba8 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcproj +++ b/Source/Core/VideoCommon/VideoCommon.vcproj @@ -742,6 +742,14 @@ RelativePath=".\Src\Debugger.h" > + + + + diff --git a/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcproj b/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcproj index 01acc3edef..3f5ff8364d 100644 --- a/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcproj +++ b/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcproj @@ -647,18 +647,6 @@ - - - - - - diff --git a/Source/Plugins/Plugin_VideoDX11/Src/EmuWindow.cpp b/Source/Plugins/Plugin_VideoDX11/Src/EmuWindow.cpp deleted file mode 100644 index ab8e295f60..0000000000 --- a/Source/Plugins/Plugin_VideoDX11/Src/EmuWindow.cpp +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright (C) 2003 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#include - -#include "VideoConfig.h" -#include "main.h" -#include "EmuWindow.h" -#include "D3DBase.h" -#include "Fifo.h" - - -int OSDChoice = 0 , OSDTime = 0, OSDInternalW = 0, OSDInternalH = 0; - -namespace EmuWindow -{ -HWND m_hWnd = NULL; -HWND m_hParent = NULL; -HINSTANCE m_hInstance = NULL; -WNDCLASSEX wndClass; -const TCHAR m_szClassName[] = _T("DolphinEmuWnd"); -int g_winstyle; -static volatile bool s_sizing; - -bool IsSizing() -{ - return s_sizing; -} - -HWND GetWnd() -{ - return m_hWnd; -} - -HWND GetParentWnd() -{ - return m_hParent; -} - -// --------------------------------------------------------------------- -// KeyDown events -// ------------- -void OnKeyDown(WPARAM wParam) -{ - switch (LOWORD( wParam )) - { - case '3': // OSD keys - case '4': - case '5': - case '6': - case '7': - if (g_Config.bOSDHotKey) - OSDMenu(wParam); - break; - } -} -// --------------------------------------------------------------------- - -LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) -{ - switch( iMsg ) - { - case WM_PAINT: - { - HDC hdc; - PAINTSTRUCT ps; - hdc = BeginPaint(hWnd, &ps); - EndPaint(hWnd, &ps); - } - break; - - case WM_ENTERSIZEMOVE: - s_sizing = true; - break; - - case WM_EXITSIZEMOVE: - s_sizing = false; - break; - - /* Post thes mouse events to the main window, it's nessesary because in difference to the - keyboard inputs these events only appear here, not in the parent window or any other WndProc()*/ - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_LBUTTONDBLCLK: - PostMessage(GetParentWnd(), iMsg, wParam, lParam); - break; - - case WM_CLOSE: - // When the user closes the window, we post an event to the main window to call Stop() - // Which then handles all the necessary steps to Shutdown the core + the plugins - if (m_hParent == NULL) - PostMessage(m_hParent, WM_USER, WM_USER_STOP, 0); - break; - - case WM_USER: - if (wParam == WM_USER_KEYDOWN) - OnKeyDown(lParam); - else if (wParam == WIIMOTE_DISCONNECT) - PostMessage(m_hParent, WM_USER, wParam, lParam); - break; - - case WM_SYSCOMMAND: - switch (wParam) - { - case SC_SCREENSAVE: - case SC_MONITORPOWER: - break; - default: - return DefWindowProc(hWnd, iMsg, wParam, lParam); - } - break; - case WM_SETCURSOR: - PostMessage(m_hParent, WM_USER, WM_USER_SETCURSOR, 0); - return true; - break; - default: - return DefWindowProc(hWnd, iMsg, wParam, lParam); - } - return 0; -} - -// --------------------------------------------------------------------- -// OSD Menu -// ------------- -// Let's begin with 3 since 1 and 2 are default Wii keys -// ------------- -void OSDMenu(WPARAM wParam) -{ - switch( LOWORD( wParam )) - { - case '3': - OSDChoice = 1; - // Toggle native resolution - OSDInternalW = D3D::GetBackBufferWidth(); - OSDInternalH = D3D::GetBackBufferHeight(); - break; - case '4': - OSDChoice = 2; - // Toggle aspect ratio - g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; - break; - case '5': - OSDChoice = 3; - PanicAlert("Toggling EFB copy not implemented!\n"); - break; - case '6': - OSDChoice = 4; - g_Config.bDisableFog = !g_Config.bDisableFog; - break; - case '7': - OSDChoice = 5; - g_Config.bDisableLighting = !g_Config.bDisableLighting; - break; - } -} - -HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const TCHAR *title) -{ - wndClass.cbSize = sizeof( wndClass ); - wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; - wndClass.lpfnWndProc = WndProc; - wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 0; - wndClass.hInstance = hInstance; - wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); - wndClass.hCursor = NULL; - wndClass.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); - wndClass.lpszMenuName = NULL; - wndClass.lpszClassName = m_szClassName; - wndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); - - m_hInstance = hInstance; - RegisterClassEx( &wndClass ); - - m_hParent = parent; - - m_hWnd = CreateWindow(m_szClassName, title, WS_CHILD, - 0, 0, width, height, m_hParent, NULL, hInstance, NULL); - - return m_hWnd; -} - -void Show() -{ - ShowWindow(m_hWnd, SW_SHOW); - BringWindowToTop(m_hWnd); - UpdateWindow(m_hWnd); - SetFocus(m_hParent); -} - -HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) -{ - // TODO: - // 1. Remove redundant window manipulation, - // 2. Make DX11 in fullscreen can be overlapped by other dialogs - // 3. Request window sizes which actually make the client area map to a common resolution - HWND Ret; - int x=0, y=0, width=640, height=480; - g_VideoInitialize.pRequestWindowSize(x, y, width, height); - - Ret = OpenWindow(hParent, hInstance, width, height, title); - - if (Ret) - { - Show(); - } - return Ret; -} - -void Close() -{ - if (m_hParent == NULL) - DestroyWindow(m_hWnd); - UnregisterClass(m_szClassName, m_hInstance); -} - -void SetSize(int width, int height) -{ - RECT rc = {0, 0, width, height}; - DWORD style = GetWindowLong(m_hWnd, GWL_STYLE); - AdjustWindowRect(&rc, style, false); - - int w = rc.right - rc.left; - int h = rc.bottom - rc.top; - - rc.left = (1280 - w)/2; - rc.right = rc.left + w; - rc.top = (1024 - h)/2; - rc.bottom = rc.top + h; - MoveWindow(m_hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE); -} - -} diff --git a/Source/Plugins/Plugin_VideoDX11/Src/EmuWindow.h b/Source/Plugins/Plugin_VideoDX11/Src/EmuWindow.h deleted file mode 100644 index 8f925527da..0000000000 --- a/Source/Plugins/Plugin_VideoDX11/Src/EmuWindow.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _EMUWINDOW_H -#define _EMUWINDOW_H - -#include - -namespace EmuWindow -{ - -HWND GetWnd(); -HWND GetParentWnd(); -HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR* title); -void Show(); -void Close(); -void SetSize(int displayWidth, int displayHeight); -bool IsSizing(); -void OSDMenu(WPARAM wParam); - -} - -#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcproj b/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcproj index 94b00494ce..a40ae00c81 100644 --- a/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcproj +++ b/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcproj @@ -659,22 +659,6 @@ - - - - - - - - diff --git a/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp b/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp deleted file mode 100644 index c35c984758..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (C) 2003 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#include - -#include "VideoConfig.h" -#include "main.h" -#include "EmuWindow.h" -#include "D3DBase.h" -#include "Fifo.h" - - -int OSDChoice = 0 , OSDTime = 0, OSDInternalW = 0, OSDInternalH = 0; - -namespace EmuWindow -{ -HWND m_hWnd = NULL; -HWND m_hParent = NULL; -HINSTANCE m_hInstance = NULL; -WNDCLASSEX wndClass; -const TCHAR m_szClassName[] = _T("DolphinEmuWnd"); -int g_winstyle; -static volatile bool s_sizing; - -bool IsSizing() -{ - return s_sizing; -} - -HWND GetWnd() -{ - return m_hWnd; -} - -HWND GetParentWnd() -{ - return m_hParent; -} - -// --------------------------------------------------------------------- -// KeyDown events -// ------------- -void OnKeyDown(WPARAM wParam) -{ - switch (LOWORD( wParam )) - { - case '3': // OSD keys - case '4': - case '5': - case '6': - case '7': - if (g_Config.bOSDHotKey) - OSDMenu(wParam); - break; - } -} -// --------------------------------------------------------------------- - -LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) -{ - switch( iMsg ) - { - case WM_PAINT: - { - HDC hdc; - PAINTSTRUCT ps; - hdc = BeginPaint(hWnd, &ps); - EndPaint(hWnd, &ps); - } - break; - - case WM_ENTERSIZEMOVE: - s_sizing = true; - break; - - case WM_EXITSIZEMOVE: - s_sizing = false; - break; - - /* Post the mouse events to the main window, it's nessesary because in difference to the - keyboard inputs these events only appear here, not in the parent window or any other WndProc()*/ - case WM_LBUTTONDOWN: - if(g_Config.b3DVision) - { - // This basically throws away the left button down input when b3DVision is activated so WX - // can't get access to it, stopping focus pulling on mouse click. - // (Input plugins use a different system so it doesn't cause any weirdness) - break; - } - case WM_LBUTTONUP: - case WM_LBUTTONDBLCLK: - PostMessage(GetParentWnd(), iMsg, wParam, lParam); - break; - - case WM_CLOSE: - // When the user closes the window, we post an event to the main window to call Stop() - // Which then handles all the necessary steps to Shutdown the core + the plugins - if (m_hParent == NULL) - PostMessage(m_hParent, WM_USER, WM_USER_STOP, 0); - break; - - case WM_USER: - if (wParam == WM_USER_KEYDOWN) - OnKeyDown(lParam); - else if (wParam == WIIMOTE_DISCONNECT) - PostMessage(m_hParent, WM_USER, wParam, lParam); - break; - - case WM_SYSCOMMAND: - switch (wParam) - { - case SC_SCREENSAVE: - case SC_MONITORPOWER: - break; - default: - return DefWindowProc(hWnd, iMsg, wParam, lParam); - } - break; - case WM_SETCURSOR: - PostMessage(m_hParent, WM_USER, WM_USER_SETCURSOR, 0); - return true; - break; - default: - return DefWindowProc(hWnd, iMsg, wParam, lParam); - } - return 0; -} - -// --------------------------------------------------------------------- -// OSD Menu -// ------------- -// Let's begin with 3 since 1 and 2 are default Wii keys -// ------------- -void OSDMenu(WPARAM wParam) -{ - switch( LOWORD( wParam )) - { - case '3': - OSDChoice = 1; - // Toggle native resolution - g_Config.iEFBScale = g_Config.iEFBScale + 1; - if (g_Config.iEFBScale > 4) g_Config.iEFBScale = 0; - break; - case '4': - OSDChoice = 2; - // Toggle aspect ratio - g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; - break; - case '5': - OSDChoice = 3; - // Toggle EFB copy - if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) - { - g_Config.bEFBCopyEnable ^= true; - g_Config.bCopyEFBToTexture = false; - } - else - { - g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; - } - break; - case '6': - OSDChoice = 4; - g_Config.bDisableFog = !g_Config.bDisableFog; - break; - case '7': - OSDChoice = 5; - g_Config.bDisableLighting = !g_Config.bDisableLighting; - break; - } -} - -HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const TCHAR *title) -{ - wndClass.cbSize = sizeof( wndClass ); - wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; - wndClass.lpfnWndProc = WndProc; - wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 0; - wndClass.hInstance = hInstance; - wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); - wndClass.hCursor = NULL; - wndClass.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); - wndClass.lpszMenuName = NULL; - wndClass.lpszClassName = m_szClassName; - wndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); - - m_hInstance = hInstance; - RegisterClassEx( &wndClass ); - - m_hParent = parent; - - m_hWnd = CreateWindow(m_szClassName, title, g_ActiveConfig.b3DVision ? WS_EX_TOPMOST | WS_POPUP : WS_CHILD, - 0, 0, width, height, m_hParent, NULL, hInstance, NULL); - - return m_hWnd; -} - -void Show() -{ - ShowWindow(m_hWnd, SW_SHOW); - BringWindowToTop(m_hWnd); - UpdateWindow(m_hWnd); - SetFocus(m_hParent); -} - -HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) -{ - // TODO: - // 1. Remove redundant window manipulation, - // 2. Make DX9 in fullscreen can be overlapped by other dialogs - // 3. Request window sizes which actually make the client area map to a common resolution - HWND Ret; - int x=0, y=0, width=640, height=480; - g_VideoInitialize.pRequestWindowSize(x, y, width, height); - - Ret = OpenWindow(hParent, hInstance, width, height, title); - - if (Ret) - { - Show(); - } - return Ret; -} - -void Close() -{ - if (m_hParent == NULL) - DestroyWindow(m_hWnd); - UnregisterClass(m_szClassName, m_hInstance); -} - -void SetSize(int width, int height) -{ - RECT rc = {0, 0, width, height}; - DWORD style = GetWindowLong(m_hWnd, GWL_STYLE); - AdjustWindowRect(&rc, style, false); - - int w = rc.right - rc.left; - int h = rc.bottom - rc.top; - - rc.left = (1280 - w)/2; - rc.right = rc.left + w; - rc.top = (1024 - h)/2; - rc.bottom = rc.top + h; - MoveWindow(m_hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE); -} - -} diff --git a/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt b/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt index 472ed98afd..1a9c788398 100644 --- a/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt +++ b/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt @@ -24,8 +24,6 @@ endif(wxWidgets_FOUND) if((${CMAKE_SYSTEM_NAME} MATCHES "Darwin") AND NOT wxWidgets_FOUND) set(SRCS ${SRCS} Src/cocoaGL.m) -elseif(WIN32) - set(SRCS ${SRCS} Src/OS/Win32.cpp) endif() if(APPLE OR WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "Linux") diff --git a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj index f5764570cc..dc6d44c717 100644 --- a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj +++ b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj @@ -654,66 +654,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index 46331acd74..8a75a522a1 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -25,7 +25,7 @@ #include "GLUtil.h" #if defined(_WIN32) -#include "OS/Win32.h" +#include "EmuWindow.h" static HDC hDC = NULL; // Private GDI Device Context static HGLRC hRC = NULL; // Permanent Rendering Context extern HINSTANCE g_hInstance; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.h b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.h deleted file mode 100644 index 762f7958c7..0000000000 --- a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (C) 2003 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _WIN32_H_ -#define _WIN32_H_ - -#pragma once - -#include "stdafx.h" - -namespace EmuWindow -{ - extern int g_winstyle; - - HWND GetWnd(); - HWND GetParentWnd(); - HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title); - void Show(); - void Close(); - void SetSize(int displayWidth, int displayHeight); - void ToggleDisplayMode(int bFullscreen); -} - -#endif // _WIN32_H_ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index a796afa306..a0fb488349 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -61,7 +61,7 @@ #include "main.h" // Local #ifdef _WIN32 -#include "OS/Win32.h" +#include "EmuWindow.h" #endif #if defined _WIN32 || defined HAVE_LIBAV #include "AVIDump.h" @@ -101,7 +101,7 @@ static u32 s_blendMode; static Common::Thread *scrshotThread = 0; #endif -int OSDChoice = 0 , OSDTime = 0, OSDInternalW = 0, OSDInternalH = 0; +extern int OSDChoice, OSDTime, OSDInternalW, OSDInternalH; namespace { diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SConscript b/Source/Plugins/Plugin_VideoOGL/Src/SConscript index a72a24cbe4..fc8a14f255 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SConscript +++ b/Source/Plugins/Plugin_VideoOGL/Src/SConscript @@ -25,8 +25,6 @@ libs = [ 'videocommon', 'videouicommon', 'GLEW', 'SOIL', 'common' ] if sys.platform == 'darwin' and not env['HAVE_WX']: files += [ 'cocoaGL.m' ] -elif sys.platform == 'win32': - files += [ 'OS/Win32.cpp' ] elif not sys.platform == 'darwin' and env['HAVE_OPENCL']: libs += [ 'OpenCL' ] diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index 142e99ccf0..25ee75b1f7 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -57,7 +57,7 @@ Make AA apply instantly during gameplay if possible #include #ifdef _WIN32 -#include "OS/Win32.h" +#include "EmuWindow.h" #endif #if defined(HAVE_WX) && HAVE_WX @@ -97,18 +97,53 @@ Make AA apply instantly during gameplay if possible // Logging int GLScissorX, GLScissorY, GLScissorW, GLScissorH; +#ifdef _WIN32 +HINSTANCE g_hInstance; + +#if defined(HAVE_WX) && HAVE_WX +class wxDLLApp : public wxApp +{ + bool OnInit() + { + return true; + } +}; +IMPLEMENT_APP_NO_MAIN(wxDLLApp) +WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); +#endif +// ------------------ + +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID lpvReserved) // reserved +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + { +#if defined(HAVE_WX) && HAVE_WX + wxSetInstance((HINSTANCE)hinstDLL); + wxInitialize(); +#endif + } + break; + + case DLL_PROCESS_DETACH: +#if defined(HAVE_WX) && HAVE_WX + wxUninitialize(); +#endif + break; + } + + g_hInstance = hinstDLL; + return TRUE; +} +#endif // _WIN32 + #if defined(HAVE_X11) && HAVE_X11 static volatile u32 s_doStateRequested = FALSE; #endif -// This is used for the functions right below here which use wxwidgets -#if defined(HAVE_WX) && HAVE_WX -#ifdef _WIN32 - WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); - extern HINSTANCE g_hInstance; -#endif -#endif - void GetDllInfo(PLUGIN_INFO* _PluginInfo) { _PluginInfo->Version = 0x0100;