From a3345ea942c975ceaaccf9b7bf7a4121411cba41 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Sun, 6 Sep 2009 13:36:05 +0000 Subject: [PATCH] GUI: Fixed a double keydown event in the main frame, the double click in the video window (didn't know about CS_DBLCLKS) OpenGL: Fixed the live resolution setting git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4211 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/DebuggerWX/Src/CodeWindow.cpp | 7 +- Source/Core/DolphinWX/Src/Frame.cpp | 119 ++++++------------ Source/Core/DolphinWX/Src/FrameTools.cpp | 15 +-- Source/PluginSpecs/PluginSpecs.h | 1 + Source/Plugins/Plugin_VideoOGL/Src/Config.cpp | 4 +- Source/Plugins/Plugin_VideoOGL/Src/Config.h | 2 +- .../Src/FramebufferManager.cpp | 13 +- Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp | 6 +- .../Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp | 8 +- .../Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp | 92 +++++++------- Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 25 ++-- 11 files changed, 128 insertions(+), 164 deletions(-) diff --git a/Source/Core/DebuggerWX/Src/CodeWindow.cpp b/Source/Core/DebuggerWX/Src/CodeWindow.cpp index 87ac941a74..bb06ddaa19 100644 --- a/Source/Core/DebuggerWX/Src/CodeWindow.cpp +++ b/Source/Core/DebuggerWX/Src/CodeWindow.cpp @@ -194,10 +194,9 @@ wxAuiToolBar *CCodeWindow::GetToolBar() void CCodeWindow::OnKeyDown(wxKeyEvent& event) { - if ((event.GetKeyCode() == WXK_SPACE) && Parent->IsActive()) - SingleCPUStep(); - else - event.Skip(); + event.Skip(); + + if ((event.GetKeyCode() == WXK_SPACE) && Parent->IsActive()) SingleCPUStep(); } void CCodeWindow::OnHostMessage(wxCommandEvent& event) diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 5ed7982b33..d6387176c8 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -16,11 +16,11 @@ // http://code.google.com/p/dolphin-emu/ -//CFrame is the main parent window. Inside CFrame there is an m_Panel that is the parent for -//the rendering window (when we render to the main window). In Windows the rendering window is -//created by giving CreateWindow() m_Panel->GetHandle() as parent window and creating a new -//child window to m_Panel. The new child window handle that is returned by CreateWindow() can -//be accessed from Core::GetWindowHandle(). +// CFrame is the main parent window. Inside CFrame there is an m_Panel that is the parent for +// the rendering window (when we render to the main window). In Windows the rendering window is +// created by giving CreateWindow() m_Panel->GetHandle() as parent window and creating a new +// child window to m_Panel. The new child window handle that is returned by CreateWindow() can +// be accessed from Core::GetWindowHandle(). // ---------- // Includes @@ -72,7 +72,7 @@ extern "C" { }; -//--------------- +// --------------- // Windows functions. Setting the cursor with wxSetCursor() did not work in this instance. // Probably because it's somehow reset from the WndProc() in the child window #ifdef _WIN32 @@ -103,8 +103,8 @@ HWND MSWGetParent_(HWND Parent) } #endif -//--------------- -//The CPanel class to receive MSWWindowProc messages from the video plugin. +// --------------- +// The CPanel class to receive MSWWindowProc messages from the video plugin. extern CFrame* main_frame; @@ -141,15 +141,17 @@ int abc = 0; { switch (nMsg) { - //case WM_LBUTTONDOWN: - //case WM_LBUTTONUP: - //case WM_MOUSEMOVE: - // break; + /* + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_MOUSEMOVE: + break; + case WM_LBUTTONDBLCLK: + break; + */ - // This doesn't work, strange - //case WM_LBUTTONDBLCLK: - //PanicAlert("Double click"); - //break; + //case WM_KEYDOWN: + // break; case WM_USER: switch(wParam) @@ -469,7 +471,7 @@ CFrame::CFrame(wxFrame* parent, wxAuiManagerEventHandler(CFrame::OnManagerResize), (wxObject*)0, this); - wxTheApp->Connect(wxID_ANY, wxEVT_LEFT_DOWN, + wxTheApp->Connect(wxID_ANY, wxEVT_LEFT_DCLICK, wxMouseEventHandler(CFrame::OnDoubleClick), (wxObject*)0, this); wxTheApp->Connect(wxID_ANY, wxEVT_MOTION, @@ -646,38 +648,19 @@ void CFrame::OnGameListCtrl_ItemActivated(wxListEvent& WXUNUSED (event)) void CFrame::OnKeyDown(wxKeyEvent& event) { - // Don't block other events - event.Skip(); + // In this case event.Skip() cause a double posting to this function + if (! (Core::GetState() == Core::CORE_RUN && bRenderToMain && event.GetEventObject() == this)) + event.Skip(); - // Escape key turn off fullscreen then Stop emulation in windowed mode - if (event.GetKeyCode() == WXK_ESCAPE) + // Toggle fullscreen + if (event.GetKeyCode() == WXK_ESCAPE || (event.GetKeyCode() == WXK_RETURN && event.GetModifiers() == wxMOD_ALT)) { - // Temporary solution to double esc keydown. When the OpenGL plugin is running all esc keydowns are duplicated - // I'm guessing it's coming from the OpenGL plugin but I couldn't find the source of it so I added this until - // the source of the problem surfaces. - static double Time = 0; - if (Common::Timer::GetDoubleTime()-1 < Time) return; - Time = Common::Timer::GetDoubleTime(); - - DoFullscreen(!IsFullScreen()); - if (IsFullScreen()) - { - #ifdef _WIN32 - MSWSetCursor(true); - #endif - } - //UpdateGUI(); - } - if (event.GetKeyCode() == WXK_RETURN && event.GetModifiers() == wxMOD_ALT) - { - // For some reasons, wxWidget doesn't proccess the Alt+Enter event there on windows. - // But still, pressing Alt+Enter make it Fullscreen, So this is for other OS... :P DoFullscreen(!IsFullScreen()); } #ifdef _WIN32 if(event.GetKeyCode() == 'M', '3', '4', '5', '6') // Send this to the video plugin WndProc { - PostMessage((HWND)Core::GetWindowHandle(), WM_KEYDOWN, event.GetKeyCode(), 0); + PostMessage((HWND)Core::GetWindowHandle(), WM_USER, OPENGL_WM_USER_KEYDOWN, event.GetKeyCode()); } #endif @@ -696,13 +679,14 @@ void CFrame::OnKeyDown(wxKeyEvent& event) void CFrame::OnKeyUp(wxKeyEvent& event) { + event.Skip(); + if(Core::GetState() != Core::CORE_UNINITIALIZED) CPluginManager::GetInstance().GetPad(0)->PAD_Input(event.GetKeyCode(), 0); // 0 = Up - event.Skip(); } // --------------- -// Detect double click. Kind of, for some reason we have to manually create the double click for now. +// Detect double click void CFrame::OnDoubleClick(wxMouseEvent& event) { @@ -713,38 +697,9 @@ void CFrame::OnDoubleClick(wxMouseEvent& event) if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) return; // Only detect double clicks in the rendering window, and only use this when a game is running - if(Core::GetState() == Core::CORE_UNINITIALIZED || event.GetId() != IDM_MPANEL) return; + if (! (Core::GetState() == Core::CORE_RUN && bRenderToMain && event.GetEventObject() == m_Panel)) return; - // For first click just save the time - if(m_fLastClickTime == 0) { m_fLastClickTime = Common::Timer::GetDoubleTime(); return; } - - // ------------------------------------------- - /* Manually detect double clicks since both wxEVT_LEFT_DCLICK and WM_LBUTTONDBLCLK stops - working after the child window is created by the plugin */ - // ---------------------- - double TmpTime = Common::Timer::GetDoubleTime(); - int Elapsed = (TmpTime - m_fLastClickTime) * 1000; - - // Get the double click time, if avaliable - int DoubleClickTime; - #ifdef _WIN32 - DoubleClickTime = GetDoubleClickTime(); - #else - DoubleClickTime = 500; // The default in Windows - #endif - - m_fLastClickTime = TmpTime; // Save the click time - - if (Elapsed < DoubleClickTime) - { - DoFullscreen(!IsFullScreen()); - #ifdef _WIN32 - MSWSetCursor(true); // Show the cursor again, in case it was hidden - #endif - m_fLastClickTime -= 10; // Don't treat repeated clicks as double clicks - } - - UpdateGUI(); + DoFullscreen(!IsFullScreen()); } @@ -842,10 +797,10 @@ wxAuiNotebook* CFrame::CreateEmptyNotebook() } -void CFrame::DoFullscreen(bool _F) +void CFrame::DoFullscreen(bool bF) { - ShowFullScreen(_F); - if (_F) + ShowFullScreen(bF); + if (bF) { // Save the current mode before going to fullscreen AuiCurrent = m_Mgr->SavePerspective(); @@ -856,6 +811,14 @@ void CFrame::DoFullscreen(bool _F) // Restore saved perspective m_Mgr->LoadPerspective(AuiCurrent, true); } + + // Show the cursor again, in case it was hidden + if (IsFullScreen()) + { + #ifdef _WIN32 + MSWSetCursor(true); + #endif + } } // Debugging, show loose windows diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index d72397c200..b99e3d8d88 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -599,16 +599,13 @@ void CFrame::OnBootDrive(wxCommandEvent& event) // Refresh the file list and browse for a favorites directory void CFrame::OnRefresh(wxCommandEvent& WXUNUSED (event)) { - if (m_GameListCtrl) - { - m_GameListCtrl->Update(); - } + if (m_GameListCtrl) m_GameListCtrl->Update(); } void CFrame::OnBrowse(wxCommandEvent& WXUNUSED (event)) { - m_GameListCtrl->BrowseForDirectory(); + if (m_GameListCtrl) m_GameListCtrl->BrowseForDirectory(); } // Create screenshot @@ -764,8 +761,7 @@ void CFrame::OnLoadWiiMenu(wxCommandEvent& WXUNUSED (event)) // the entire screen (when we render to the main window). void CFrame::OnToggleFullscreen(wxCommandEvent& WXUNUSED (event)) { - DoFullscreen(true); - UpdateGUI(); + DoFullscreen(!IsFullScreen()); } void CFrame::OnToggleDualCore(wxCommandEvent& WXUNUSED (event)) @@ -995,10 +991,7 @@ void CFrame::GameListChanged(wxCommandEvent& event) break; } - if (m_GameListCtrl) - { - m_GameListCtrl->Update(); - } + if (m_GameListCtrl) m_GameListCtrl->Update(); } // Enable and disable the toolbar diff --git a/Source/PluginSpecs/PluginSpecs.h b/Source/PluginSpecs/PluginSpecs.h index d30d125a1b..94fb6d70ca 100644 --- a/Source/PluginSpecs/PluginSpecs.h +++ b/Source/PluginSpecs/PluginSpecs.h @@ -26,6 +26,7 @@ enum PLUGIN_COMM // Begin at 10 in case there is already messages with wParam = 0, 1, 2 and so on OPENGL_WM_USER_STOP = 10, OPENGL_WM_USER_CREATE, + OPENGL_WM_USER_KEYDOWN, NJOY_RELOAD, // Reload nJoy if DirectInput has failed WIIMOTE_RECONNECT, // Reconnect the Wiimote if it has disconnected INPUT_FRAME_COUNTER, // Wind back the frame counter for rerecording diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp index 83b39ea0d9..bfcfa206fd 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp @@ -42,7 +42,7 @@ void Config::Load() iniFile.Get("Hardware", "Fullscreen", &bFullscreen, 0); // Hardware iniFile.Get("Hardware", "VSync", &bVSync, 0); // Hardware - iniFile.Get("Hardware", "RenderToMainframe", &renderToMainframe, false); + iniFile.Get("Hardware", "RenderToMainframe", &RenderToMainframe, false); iniFile.Get("Settings", "StretchToFit", &bNativeResolution, true); iniFile.Get("Settings", "2xResolution", &b2xResolution, false); iniFile.Get("Settings", "wideScreenHack", &bWidescreenHack, false); @@ -136,7 +136,7 @@ void Config::Save() iniFile.Set("Hardware", "FullscreenRes", iFSResolution); iniFile.Set("Hardware", "Fullscreen", bFullscreen); iniFile.Set("Hardware", "VSync", bVSync); - iniFile.Set("Hardware", "RenderToMainframe", renderToMainframe); + iniFile.Set("Hardware", "RenderToMainframe", RenderToMainframe); iniFile.Set("Settings", "StretchToFit", bNativeResolution); iniFile.Set("Settings", "2xResolution", b2xResolution); iniFile.Set("Settings", "KeepAR_4_3", bKeepAR43); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Config.h b/Source/Plugins/Plugin_VideoOGL/Src/Config.h index 09614165e0..65ea2198b7 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Config.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/Config.h @@ -52,7 +52,7 @@ struct Config // General bool bFullscreen; bool bHideCursor; - bool renderToMainframe; + bool RenderToMainframe; bool bVSync; // Resolution control diff --git a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp index e55923f401..9aed4c6459 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp @@ -20,6 +20,7 @@ #include "TextureConverter.h" #include "XFB.h" +#include "Render.h" extern bool s_bHaveFramebufferBlit; // comes from Render.cpp @@ -264,10 +265,10 @@ GLuint FramebufferManager::GetEFBDepthTexture(const EFBRectangle& sourceRc) cons TargetRectangle FramebufferManager::ConvertEFBRectangle(const EFBRectangle& rc) const { TargetRectangle result; - result.left = rc.left * m_targetWidth / EFB_WIDTH; - result.top = m_targetHeight - (rc.top * m_targetHeight / EFB_HEIGHT); - result.right = rc.right * m_targetWidth / EFB_WIDTH; - result.bottom = m_targetHeight - (rc.bottom * m_targetHeight / EFB_HEIGHT); + result.left = rc.left * Renderer::GetTargetWidth() / EFB_WIDTH; + result.top = Renderer::GetTargetHeight() - (rc.top * Renderer::GetTargetHeight() / EFB_HEIGHT); + result.right = rc.right * Renderer::GetTargetWidth() / EFB_WIDTH; + result.bottom = Renderer::GetTargetHeight() - (rc.bottom * Renderer::GetTargetHeight() / EFB_HEIGHT); return result; } @@ -317,8 +318,8 @@ void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight it->xfbWidth = fbWidth; it->xfbHeight = fbHeight; - it->xfbSource.texWidth = m_targetWidth; - it->xfbSource.texHeight = m_targetHeight; + it->xfbSource.texWidth = Renderer::GetTargetWidth(); + it->xfbSource.texHeight = Renderer::GetTargetHeight(); it->xfbSource.sourceRc = ConvertEFBRectangle(sourceRc); xfbTexture = it->xfbSource.texture; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index 676fa7523b..b152d3c1c3 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -199,7 +199,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight int args[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0}; wxSize size(_iwidth, _iheight); - if (!g_Config.renderToMainframe || + if (!g_Config.RenderToMainframe || g_VideoInitialize.pWindowHandle == NULL) { GLWin.frame = new wxFrame((wxWindow *)g_VideoInitialize.pWindowHandle, -1, _("Dolphin"), wxPoint(50,50), size); @@ -233,7 +233,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight // ---------------------- // Create a separate window - if (!g_Config.renderToMainframe || g_VideoInitialize.pWindowHandle == NULL) + if (!g_Config.RenderToMainframe || g_VideoInitialize.pWindowHandle == NULL) g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create(NULL, g_hInstance, _T("Please wait...")); // Create a child window else @@ -282,7 +282,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight ChangeDisplaySettings(NULL, 0); } - if (g_Config.bFullscreen && !g_Config.renderToMainframe) + if (g_Config.bFullscreen && !g_Config.RenderToMainframe) { // Hide the cursor ShowCursor(FALSE); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp index 329ce9b4cc..b31187e0d8 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp @@ -177,7 +177,7 @@ void GFXConfigDialogOGL::CreateGUIControls() // General Display Settings sbBasic = new wxStaticBoxSizer(wxVERTICAL, m_PageGeneral, wxT("Basic Display Settings")); m_RenderToMainWindow = new wxCheckBox(m_PageGeneral, ID_RENDERTOMAINWINDOW, wxT("Render to main window"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); - m_RenderToMainWindow->SetValue(g_Config.renderToMainframe); + m_RenderToMainWindow->SetValue(g_Config.RenderToMainframe); m_NativeResolution = new wxCheckBox(m_PageGeneral, ID_NATIVERESOLUTION, wxT("Native"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_2xResolution = new wxCheckBox(m_PageGeneral, ID_2X_RESOLUTION, wxT("2x"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_WidescreenHack = new wxCheckBox(m_PageGeneral, ID_WIDESCREEN_HACK, wxT("Wide Screen Hack"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); @@ -582,7 +582,7 @@ void GFXConfigDialogOGL::GeneralSettingsChanged(wxCommandEvent& event) g_Config.bFullscreen = m_Fullscreen->IsChecked(); break; case ID_RENDERTOMAINWINDOW: - g_Config.renderToMainframe = m_RenderToMainWindow->IsChecked(); + g_Config.RenderToMainframe = m_RenderToMainWindow->IsChecked(); g_Config.bFullscreen = false; break; case ID_NATIVERESOLUTION: @@ -772,8 +772,8 @@ void GFXConfigDialogOGL::UpdateGUI() m_AutoScale->Enable(!g_Config.bUseXFB); // These options are for the separate rendering window - m_Fullscreen->Enable(!g_Config.renderToMainframe); - if (g_Config.renderToMainframe) m_Fullscreen->SetValue(false); + m_Fullscreen->Enable(!g_Config.RenderToMainframe); + if (g_Config.RenderToMainframe) m_Fullscreen->SetValue(false); // Disable the internal resolution option if it's set to native m_WindowResolutionCB->Enable(!(g_Config.bNativeResolution || g_Config.b2xResolution)); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp index 67dfc72ba6..170b16c602 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp @@ -86,6 +86,7 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle extern bool gShowDebugger; int OSDChoice = 0, OSDTime = 0, OSDInternalW = 0, OSDInternalH = 0; + // --------------------------------------------------------------------- // OSD Menu // ŻŻŻŻŻŻŻŻŻŻŻŻŻ @@ -100,8 +101,8 @@ void OSDMenu(WPARAM wParam) // Toggle native resolution if (!(g_Config.bNativeResolution || g_Config.b2xResolution)) g_Config.bNativeResolution = true; - else if (g_Config.bNativeResolution && g_Config.bAllow2xResolution) - { g_Config.bNativeResolution = false; g_Config.b2xResolution = true; } + else if (g_Config.bNativeResolution) + { g_Config.bNativeResolution = false; if (g_Config.bAllow2xResolution) {g_Config.b2xResolution = true;} } else g_Config.b2xResolution = false; break; @@ -139,7 +140,7 @@ namespace EmuWindow { HWND m_hWnd = NULL; // The new window that is created here -HWND m_hParent = NULL; +HWND m_hParent = NULL; // The main wxFrame HWND m_hMain = NULL; // The main CPanel HINSTANCE m_hInstance = NULL; @@ -165,12 +166,10 @@ HWND GetWnd() { return m_hWnd; } - HWND GetParentWnd() { return m_hParent; } - HWND GetChildParentWnd() { return m_hMain; @@ -235,7 +234,38 @@ void FreeLookInput( UINT iMsg, WPARAM wParam ) } } -LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) +// --------------------------------------------------------------------- +// KeyDown events +// ŻŻŻŻŻŻŻŻŻŻŻŻŻ +void OnKeyDown(WPARAM wParam) +{ + switch (LOWORD( wParam )) + { + case VK_ESCAPE: + if (g_Config.bFullscreen && !g_Config.RenderToMainframe) + { + // Pressing Esc switch to Windowed in Fullscreen mode + ToggleFullscreen(m_hWnd); + return; + } + else if (!g_Config.RenderToMainframe) + { + // And stops the emulation when already in Windowed mode + PostMessage(m_hMain, WM_USER, OPENGL_WM_USER_STOP, 0); + } + break; + case '3': // OSD keys + case '4': + case '5': + case '6': + OSDMenu(wParam); + break; + } + g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0); +} +// --------------------------------------------------------------------- + +LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; @@ -255,7 +285,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) { case VK_RETURN: // Pressing Alt+Enter switch FullScreen/Windowed - if (m_hParent == NULL && !g_Config.renderToMainframe) + if (m_hParent == NULL && !g_Config.RenderToMainframe) { ToggleFullscreen(hWnd); return 0; @@ -265,31 +295,18 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) break; case WM_KEYDOWN: - switch( LOWORD( wParam )) - { - case VK_ESCAPE: - if (g_Config.bFullscreen) - { - // Pressing Esc switch to Windowed in Fullscreen mode - ToggleFullscreen(hWnd); - return 0; - } - else if (!g_Config.renderToMainframe) - { - // And stops the emulation when already in Windowed mode - PostMessage(m_hMain, WM_USER, OPENGL_WM_USER_STOP, 0); - } - break; - case '3': // OSD keys - case '4': - case '5': - case '6': - OSDMenu(wParam); - break; - } - g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0); + // Don't process this as a child window to avoid double events + if (!g_Config.RenderToMainframe) OnKeyDown(wParam); break; + /* Post thes mouse events to the main window, it's nessesary becase 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(GetChildParentWnd(), iMsg, wParam, lParam); + break; + /* The reason we pick up the WM_MOUSEMOVE is to be able to change this option during gameplay. The alternative is to load one of the cursors when the plugin is loaded and go with that. This should only produce a minimal performance hit @@ -309,25 +326,16 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) only let it pass through Dolphin > Frame.cpp to determine if it should be on or off and coordinate it with the other settings if nessesary */ case WM_USER: - /* I set wParam to 10 just in case there are other WM_USER events. If we want more - WM_USER cases we would start making wParam or lParam cases */ - if (wParam == 10) + if (wParam == OPENGL_WM_USER_STOP) { if (lParam) SetCursor(hCursor); else SetCursor(hCursorBlank); } + if (wParam == OPENGL_WM_USER_KEYDOWN) OnKeyDown(lParam); break; - /* Post thes mouse events to the main window, it's nessesary becase in difference to the - keyboard inputs these events only appear here, not in the main WndProc() */ - case WM_LBUTTONDOWN: - 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: if (m_hParent == NULL) @@ -364,7 +372,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) 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; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 497fd884ab..936eda1734 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -99,7 +99,6 @@ static int s_MSAACoverageSamples = 0; bool s_bHaveFramebufferBlit = false; // export to FramebufferManager.cpp static bool s_bHaveCoverageMSAA = false; static u32 s_blendMode; -static bool s_bNativeResolution = false; static volatile bool s_bScreenshot = false; static Common::Thread *scrshotThread = 0; @@ -183,7 +182,6 @@ bool Renderer::Init() bool bSuccess = true; s_blendMode = 0; s_MSAACoverageSamples = 0; - s_bNativeResolution = g_Config.bNativeResolution; switch (g_Config.iMultisampleMode) { case MULTISAMPLE_OFF: s_MSAASamples = 1; break; @@ -304,16 +302,14 @@ bool Renderer::Init() { // The size of the framebuffer targets should really NOT be the size of the OpenGL viewport. // The EFB is larger than 640x480 - in fact, it's 640x528, give or take a couple of lines. - // So the below is wrong. - // This should really be grabbed from config rather than from OpenGL. - s_targetwidth = (640 >= W) ? 640 : W; + s_targetwidth = (EFB_WIDTH >= W) ? EFB_WIDTH : W; s_targetheight = (480 >= H) ? 480 : H; - // Compensate height of render target for scaling, so that we get something close to the correct number of - // vertical pixels. + // Adjust all heights with this ratio, the resulting height will be the same as H or EFB_HEIGHT. I.e. + // 768 (-1) for 1024x768 etc. s_targetheight *= 528.0 / 480.0; - // Ensure a minimum target size so that the native res target always fits. + // Ensure a minimum target size so that the native res target always fits if (s_targetwidth < EFB_WIDTH) s_targetwidth = EFB_WIDTH; if (s_targetheight < EFB_HEIGHT) s_targetheight = EFB_HEIGHT; } @@ -327,6 +323,10 @@ bool Renderer::Init() // Initialize the FramebufferManager g_framebufferManager.Init(s_targetwidth, s_targetheight, s_MSAASamples, s_MSAACoverageSamples); + // Save the custom resolution + s_targetwidth = (int)OpenGL_GetBackbufferWidth(); + s_targetheight = (int)OpenGL_GetBackbufferHeight(); + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); if (GL_REPORT_ERROR() != GL_NO_ERROR) @@ -435,12 +435,14 @@ void Renderer::Shutdown(void) // Return the rendering window width and height int Renderer::GetTargetWidth() { - return s_targetwidth; + return (g_Config.bNativeResolution || g_Config.b2xResolution) ? + (g_Config.bNativeResolution ? EFB_WIDTH : EFB_WIDTH * 2) : s_targetwidth; } int Renderer::GetTargetHeight() { - return s_targetheight; + return (g_Config.bNativeResolution || g_Config.b2xResolution) ? + (g_Config.bNativeResolution ? EFB_HEIGHT : EFB_HEIGHT * 2) : s_targetheight; } float Renderer::GetTargetScaleX() @@ -1018,9 +1020,6 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) // Place messages on the picture, then copy it to the screen SwapBuffers(); - // Why save this as s_bNativeResolution if we updated it every frame? - s_bNativeResolution = g_Config.bNativeResolution; - RestoreAPIState(); GL_REPORT_ERRORD();