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
This commit is contained in:
John Peterson 2009-09-06 13:36:05 +00:00
parent 49e849dc94
commit a3345ea942
11 changed files with 128 additions and 164 deletions

View File

@ -194,10 +194,9 @@ wxAuiToolBar *CCodeWindow::GetToolBar()
void CCodeWindow::OnKeyDown(wxKeyEvent& event) 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) void CCodeWindow::OnHostMessage(wxCommandEvent& event)

View File

@ -16,11 +16,11 @@
// http://code.google.com/p/dolphin-emu/ // 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 // 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 // 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 // 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 // child window to m_Panel. The new child window handle that is returned by CreateWindow() can
//be accessed from Core::GetWindowHandle(). // be accessed from Core::GetWindowHandle().
// ---------- // ----------
// Includes // Includes
@ -72,7 +72,7 @@ extern "C" {
}; };
//--------------- // ---------------
// Windows functions. Setting the cursor with wxSetCursor() did not work in this instance. // 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 // Probably because it's somehow reset from the WndProc() in the child window
#ifdef _WIN32 #ifdef _WIN32
@ -103,8 +103,8 @@ HWND MSWGetParent_(HWND Parent)
} }
#endif #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; extern CFrame* main_frame;
@ -141,15 +141,17 @@ int abc = 0;
{ {
switch (nMsg) switch (nMsg)
{ {
//case WM_LBUTTONDOWN: /*
//case WM_LBUTTONUP: case WM_LBUTTONDOWN:
//case WM_MOUSEMOVE: case WM_LBUTTONUP:
// break; case WM_MOUSEMOVE:
break;
case WM_LBUTTONDBLCLK:
break;
*/
// This doesn't work, strange //case WM_KEYDOWN:
//case WM_LBUTTONDBLCLK: // break;
//PanicAlert("Double click");
//break;
case WM_USER: case WM_USER:
switch(wParam) switch(wParam)
@ -469,7 +471,7 @@ CFrame::CFrame(wxFrame* parent,
wxAuiManagerEventHandler(CFrame::OnManagerResize), wxAuiManagerEventHandler(CFrame::OnManagerResize),
(wxObject*)0, this); (wxObject*)0, this);
wxTheApp->Connect(wxID_ANY, wxEVT_LEFT_DOWN, wxTheApp->Connect(wxID_ANY, wxEVT_LEFT_DCLICK,
wxMouseEventHandler(CFrame::OnDoubleClick), wxMouseEventHandler(CFrame::OnDoubleClick),
(wxObject*)0, this); (wxObject*)0, this);
wxTheApp->Connect(wxID_ANY, wxEVT_MOTION, wxTheApp->Connect(wxID_ANY, wxEVT_MOTION,
@ -646,38 +648,19 @@ void CFrame::OnGameListCtrl_ItemActivated(wxListEvent& WXUNUSED (event))
void CFrame::OnKeyDown(wxKeyEvent& event) void CFrame::OnKeyDown(wxKeyEvent& event)
{ {
// Don't block other events // In this case event.Skip() cause a double posting to this function
if (! (Core::GetState() == Core::CORE_RUN && bRenderToMain && event.GetEventObject() == this))
event.Skip(); event.Skip();
// Escape key turn off fullscreen then Stop emulation in windowed mode // Toggle fullscreen
if (event.GetKeyCode() == WXK_ESCAPE) 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()); DoFullscreen(!IsFullScreen());
} }
#ifdef _WIN32 #ifdef _WIN32
if(event.GetKeyCode() == 'M', '3', '4', '5', '6') // Send this to the video plugin WndProc 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 #endif
@ -696,13 +679,14 @@ void CFrame::OnKeyDown(wxKeyEvent& event)
void CFrame::OnKeyUp(wxKeyEvent& event) void CFrame::OnKeyUp(wxKeyEvent& event)
{ {
event.Skip();
if(Core::GetState() != Core::CORE_UNINITIALIZED) if(Core::GetState() != Core::CORE_UNINITIALIZED)
CPluginManager::GetInstance().GetPad(0)->PAD_Input(event.GetKeyCode(), 0); // 0 = Up 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) void CFrame::OnDoubleClick(wxMouseEvent& event)
{ {
@ -713,38 +697,9 @@ void CFrame::OnDoubleClick(wxMouseEvent& event)
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) return; if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) return;
// Only detect double clicks in the rendering window, and only use this when a game is running // 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()); 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();
} }
@ -842,10 +797,10 @@ wxAuiNotebook* CFrame::CreateEmptyNotebook()
} }
void CFrame::DoFullscreen(bool _F) void CFrame::DoFullscreen(bool bF)
{ {
ShowFullScreen(_F); ShowFullScreen(bF);
if (_F) if (bF)
{ {
// Save the current mode before going to fullscreen // Save the current mode before going to fullscreen
AuiCurrent = m_Mgr->SavePerspective(); AuiCurrent = m_Mgr->SavePerspective();
@ -856,6 +811,14 @@ void CFrame::DoFullscreen(bool _F)
// Restore saved perspective // Restore saved perspective
m_Mgr->LoadPerspective(AuiCurrent, true); 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 // Debugging, show loose windows

View File

@ -599,16 +599,13 @@ void CFrame::OnBootDrive(wxCommandEvent& event)
// Refresh the file list and browse for a favorites directory // Refresh the file list and browse for a favorites directory
void CFrame::OnRefresh(wxCommandEvent& WXUNUSED (event)) void CFrame::OnRefresh(wxCommandEvent& WXUNUSED (event))
{ {
if (m_GameListCtrl) if (m_GameListCtrl) m_GameListCtrl->Update();
{
m_GameListCtrl->Update();
}
} }
void CFrame::OnBrowse(wxCommandEvent& WXUNUSED (event)) void CFrame::OnBrowse(wxCommandEvent& WXUNUSED (event))
{ {
m_GameListCtrl->BrowseForDirectory(); if (m_GameListCtrl) m_GameListCtrl->BrowseForDirectory();
} }
// Create screenshot // Create screenshot
@ -764,8 +761,7 @@ void CFrame::OnLoadWiiMenu(wxCommandEvent& WXUNUSED (event))
// the entire screen (when we render to the main window). // the entire screen (when we render to the main window).
void CFrame::OnToggleFullscreen(wxCommandEvent& WXUNUSED (event)) void CFrame::OnToggleFullscreen(wxCommandEvent& WXUNUSED (event))
{ {
DoFullscreen(true); DoFullscreen(!IsFullScreen());
UpdateGUI();
} }
void CFrame::OnToggleDualCore(wxCommandEvent& WXUNUSED (event)) void CFrame::OnToggleDualCore(wxCommandEvent& WXUNUSED (event))
@ -995,10 +991,7 @@ void CFrame::GameListChanged(wxCommandEvent& event)
break; break;
} }
if (m_GameListCtrl) if (m_GameListCtrl) m_GameListCtrl->Update();
{
m_GameListCtrl->Update();
}
} }
// Enable and disable the toolbar // Enable and disable the toolbar

View File

@ -26,6 +26,7 @@ enum PLUGIN_COMM
// Begin at 10 in case there is already messages with wParam = 0, 1, 2 and so on // 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_STOP = 10,
OPENGL_WM_USER_CREATE, OPENGL_WM_USER_CREATE,
OPENGL_WM_USER_KEYDOWN,
NJOY_RELOAD, // Reload nJoy if DirectInput has failed NJOY_RELOAD, // Reload nJoy if DirectInput has failed
WIIMOTE_RECONNECT, // Reconnect the Wiimote if it has disconnected WIIMOTE_RECONNECT, // Reconnect the Wiimote if it has disconnected
INPUT_FRAME_COUNTER, // Wind back the frame counter for rerecording INPUT_FRAME_COUNTER, // Wind back the frame counter for rerecording

View File

@ -42,7 +42,7 @@ void Config::Load()
iniFile.Get("Hardware", "Fullscreen", &bFullscreen, 0); // Hardware iniFile.Get("Hardware", "Fullscreen", &bFullscreen, 0); // Hardware
iniFile.Get("Hardware", "VSync", &bVSync, 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", "StretchToFit", &bNativeResolution, true);
iniFile.Get("Settings", "2xResolution", &b2xResolution, false); iniFile.Get("Settings", "2xResolution", &b2xResolution, false);
iniFile.Get("Settings", "wideScreenHack", &bWidescreenHack, false); iniFile.Get("Settings", "wideScreenHack", &bWidescreenHack, false);
@ -136,7 +136,7 @@ void Config::Save()
iniFile.Set("Hardware", "FullscreenRes", iFSResolution); iniFile.Set("Hardware", "FullscreenRes", iFSResolution);
iniFile.Set("Hardware", "Fullscreen", bFullscreen); iniFile.Set("Hardware", "Fullscreen", bFullscreen);
iniFile.Set("Hardware", "VSync", bVSync); iniFile.Set("Hardware", "VSync", bVSync);
iniFile.Set("Hardware", "RenderToMainframe", renderToMainframe); iniFile.Set("Hardware", "RenderToMainframe", RenderToMainframe);
iniFile.Set("Settings", "StretchToFit", bNativeResolution); iniFile.Set("Settings", "StretchToFit", bNativeResolution);
iniFile.Set("Settings", "2xResolution", b2xResolution); iniFile.Set("Settings", "2xResolution", b2xResolution);
iniFile.Set("Settings", "KeepAR_4_3", bKeepAR43); iniFile.Set("Settings", "KeepAR_4_3", bKeepAR43);

View File

@ -52,7 +52,7 @@ struct Config
// General // General
bool bFullscreen; bool bFullscreen;
bool bHideCursor; bool bHideCursor;
bool renderToMainframe; bool RenderToMainframe;
bool bVSync; bool bVSync;
// Resolution control // Resolution control

View File

@ -20,6 +20,7 @@
#include "TextureConverter.h" #include "TextureConverter.h"
#include "XFB.h" #include "XFB.h"
#include "Render.h"
extern bool s_bHaveFramebufferBlit; // comes from Render.cpp 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 FramebufferManager::ConvertEFBRectangle(const EFBRectangle& rc) const
{ {
TargetRectangle result; TargetRectangle result;
result.left = rc.left * m_targetWidth / EFB_WIDTH; result.left = rc.left * Renderer::GetTargetWidth() / EFB_WIDTH;
result.top = m_targetHeight - (rc.top * m_targetHeight / EFB_HEIGHT); result.top = Renderer::GetTargetHeight() - (rc.top * Renderer::GetTargetHeight() / EFB_HEIGHT);
result.right = rc.right * m_targetWidth / EFB_WIDTH; result.right = rc.right * Renderer::GetTargetWidth() / EFB_WIDTH;
result.bottom = m_targetHeight - (rc.bottom * m_targetHeight / EFB_HEIGHT); result.bottom = Renderer::GetTargetHeight() - (rc.bottom * Renderer::GetTargetHeight() / EFB_HEIGHT);
return result; return result;
} }
@ -317,8 +318,8 @@ void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight
it->xfbWidth = fbWidth; it->xfbWidth = fbWidth;
it->xfbHeight = fbHeight; it->xfbHeight = fbHeight;
it->xfbSource.texWidth = m_targetWidth; it->xfbSource.texWidth = Renderer::GetTargetWidth();
it->xfbSource.texHeight = m_targetHeight; it->xfbSource.texHeight = Renderer::GetTargetHeight();
it->xfbSource.sourceRc = ConvertEFBRectangle(sourceRc); it->xfbSource.sourceRc = ConvertEFBRectangle(sourceRc);
xfbTexture = it->xfbSource.texture; xfbTexture = it->xfbSource.texture;

View File

@ -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}; int args[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0};
wxSize size(_iwidth, _iheight); wxSize size(_iwidth, _iheight);
if (!g_Config.renderToMainframe || if (!g_Config.RenderToMainframe ||
g_VideoInitialize.pWindowHandle == NULL) { g_VideoInitialize.pWindowHandle == NULL) {
GLWin.frame = new wxFrame((wxWindow *)g_VideoInitialize.pWindowHandle, GLWin.frame = new wxFrame((wxWindow *)g_VideoInitialize.pWindowHandle,
-1, _("Dolphin"), wxPoint(50,50), size); -1, _("Dolphin"), wxPoint(50,50), size);
@ -233,7 +233,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight
// ---------------------- // ----------------------
// Create a separate window // 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...")); g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create(NULL, g_hInstance, _T("Please wait..."));
// Create a child window // Create a child window
else else
@ -282,7 +282,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight
ChangeDisplaySettings(NULL, 0); ChangeDisplaySettings(NULL, 0);
} }
if (g_Config.bFullscreen && !g_Config.renderToMainframe) if (g_Config.bFullscreen && !g_Config.RenderToMainframe)
{ {
// Hide the cursor // Hide the cursor
ShowCursor(FALSE); ShowCursor(FALSE);

View File

@ -177,7 +177,7 @@ void GFXConfigDialogOGL::CreateGUIControls()
// General Display Settings // General Display Settings
sbBasic = new wxStaticBoxSizer(wxVERTICAL, m_PageGeneral, wxT("Basic 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 = 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_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_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); 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(); g_Config.bFullscreen = m_Fullscreen->IsChecked();
break; break;
case ID_RENDERTOMAINWINDOW: case ID_RENDERTOMAINWINDOW:
g_Config.renderToMainframe = m_RenderToMainWindow->IsChecked(); g_Config.RenderToMainframe = m_RenderToMainWindow->IsChecked();
g_Config.bFullscreen = false; g_Config.bFullscreen = false;
break; break;
case ID_NATIVERESOLUTION: case ID_NATIVERESOLUTION:
@ -772,8 +772,8 @@ void GFXConfigDialogOGL::UpdateGUI()
m_AutoScale->Enable(!g_Config.bUseXFB); m_AutoScale->Enable(!g_Config.bUseXFB);
// These options are for the separate rendering window // These options are for the separate rendering window
m_Fullscreen->Enable(!g_Config.renderToMainframe); m_Fullscreen->Enable(!g_Config.RenderToMainframe);
if (g_Config.renderToMainframe) m_Fullscreen->SetValue(false); if (g_Config.RenderToMainframe) m_Fullscreen->SetValue(false);
// Disable the internal resolution option if it's set to native // Disable the internal resolution option if it's set to native
m_WindowResolutionCB->Enable(!(g_Config.bNativeResolution || g_Config.b2xResolution)); m_WindowResolutionCB->Enable(!(g_Config.bNativeResolution || g_Config.b2xResolution));

View File

@ -86,6 +86,7 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
extern bool gShowDebugger; extern bool gShowDebugger;
int OSDChoice = 0, OSDTime = 0, OSDInternalW = 0, OSDInternalH = 0; int OSDChoice = 0, OSDTime = 0, OSDInternalW = 0, OSDInternalH = 0;
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// OSD Menu // OSD Menu
// ¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯
@ -100,8 +101,8 @@ void OSDMenu(WPARAM wParam)
// Toggle native resolution // Toggle native resolution
if (!(g_Config.bNativeResolution || g_Config.b2xResolution)) if (!(g_Config.bNativeResolution || g_Config.b2xResolution))
g_Config.bNativeResolution = true; g_Config.bNativeResolution = true;
else if (g_Config.bNativeResolution && g_Config.bAllow2xResolution) else if (g_Config.bNativeResolution)
{ g_Config.bNativeResolution = false; g_Config.b2xResolution = true; } { g_Config.bNativeResolution = false; if (g_Config.bAllow2xResolution) {g_Config.b2xResolution = true;} }
else else
g_Config.b2xResolution = false; g_Config.b2xResolution = false;
break; break;
@ -139,7 +140,7 @@ namespace EmuWindow
{ {
HWND m_hWnd = NULL; // The new window that is created here 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 HWND m_hMain = NULL; // The main CPanel
HINSTANCE m_hInstance = NULL; HINSTANCE m_hInstance = NULL;
@ -165,12 +166,10 @@ HWND GetWnd()
{ {
return m_hWnd; return m_hWnd;
} }
HWND GetParentWnd() HWND GetParentWnd()
{ {
return m_hParent; return m_hParent;
} }
HWND GetChildParentWnd() HWND GetChildParentWnd()
{ {
return m_hMain; 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; HDC hdc;
PAINTSTRUCT ps; PAINTSTRUCT ps;
@ -255,7 +285,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
{ {
case VK_RETURN: case VK_RETURN:
// Pressing Alt+Enter switch FullScreen/Windowed // Pressing Alt+Enter switch FullScreen/Windowed
if (m_hParent == NULL && !g_Config.renderToMainframe) if (m_hParent == NULL && !g_Config.RenderToMainframe)
{ {
ToggleFullscreen(hWnd); ToggleFullscreen(hWnd);
return 0; return 0;
@ -265,29 +295,16 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
break; break;
case WM_KEYDOWN: case WM_KEYDOWN:
switch( LOWORD( wParam )) // Don't process this as a child window to avoid double events
{ if (!g_Config.RenderToMainframe) OnKeyDown(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; break;
case '3': // OSD keys
case '4': /* Post thes mouse events to the main window, it's nessesary becase in difference to the
case '5': keyboard inputs these events only appear here, not in the parent window or any other WndProc()*/
case '6': case WM_LBUTTONDOWN:
OSDMenu(wParam); case WM_LBUTTONUP:
break; case WM_LBUTTONDBLCLK:
} PostMessage(GetChildParentWnd(), iMsg, wParam, lParam);
g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0);
break; break;
/* The reason we pick up the WM_MOUSEMOVE is to be able to change this option /* The reason we pick up the WM_MOUSEMOVE is to be able to change this option
@ -309,23 +326,14 @@ 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 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 */ and coordinate it with the other settings if nessesary */
case WM_USER: case WM_USER:
/* I set wParam to 10 just in case there are other WM_USER events. If we want more if (wParam == OPENGL_WM_USER_STOP)
WM_USER cases we would start making wParam or lParam cases */
if (wParam == 10)
{ {
if (lParam) if (lParam)
SetCursor(hCursor); SetCursor(hCursor);
else else
SetCursor(hCursorBlank); SetCursor(hCursorBlank);
} }
break; if (wParam == OPENGL_WM_USER_KEYDOWN) OnKeyDown(lParam);
/* 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; break;
// This is called when we close the window when we render to a separate window // This is called when we close the window when we render to a separate window
@ -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) HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const TCHAR *title)
{ {
wndClass.cbSize = sizeof( wndClass ); wndClass.cbSize = sizeof( wndClass );
wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wndClass.lpfnWndProc = WndProc; wndClass.lpfnWndProc = WndProc;
wndClass.cbClsExtra = 0; wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0; wndClass.cbWndExtra = 0;

View File

@ -99,7 +99,6 @@ static int s_MSAACoverageSamples = 0;
bool s_bHaveFramebufferBlit = false; // export to FramebufferManager.cpp bool s_bHaveFramebufferBlit = false; // export to FramebufferManager.cpp
static bool s_bHaveCoverageMSAA = false; static bool s_bHaveCoverageMSAA = false;
static u32 s_blendMode; static u32 s_blendMode;
static bool s_bNativeResolution = false;
static volatile bool s_bScreenshot = false; static volatile bool s_bScreenshot = false;
static Common::Thread *scrshotThread = 0; static Common::Thread *scrshotThread = 0;
@ -183,7 +182,6 @@ bool Renderer::Init()
bool bSuccess = true; bool bSuccess = true;
s_blendMode = 0; s_blendMode = 0;
s_MSAACoverageSamples = 0; s_MSAACoverageSamples = 0;
s_bNativeResolution = g_Config.bNativeResolution;
switch (g_Config.iMultisampleMode) switch (g_Config.iMultisampleMode)
{ {
case MULTISAMPLE_OFF: s_MSAASamples = 1; break; 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 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. // The EFB is larger than 640x480 - in fact, it's 640x528, give or take a couple of lines.
// So the below is wrong. s_targetwidth = (EFB_WIDTH >= W) ? EFB_WIDTH : W;
// This should really be grabbed from config rather than from OpenGL.
s_targetwidth = (640 >= W) ? 640 : W;
s_targetheight = (480 >= H) ? 480 : H; s_targetheight = (480 >= H) ? 480 : H;
// Compensate height of render target for scaling, so that we get something close to the correct number of // Adjust all heights with this ratio, the resulting height will be the same as H or EFB_HEIGHT. I.e.
// vertical pixels. // 768 (-1) for 1024x768 etc.
s_targetheight *= 528.0 / 480.0; 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_targetwidth < EFB_WIDTH) s_targetwidth = EFB_WIDTH;
if (s_targetheight < EFB_HEIGHT) s_targetheight = EFB_HEIGHT; if (s_targetheight < EFB_HEIGHT) s_targetheight = EFB_HEIGHT;
} }
@ -327,6 +323,10 @@ bool Renderer::Init()
// Initialize the FramebufferManager // Initialize the FramebufferManager
g_framebufferManager.Init(s_targetwidth, s_targetheight, s_MSAASamples, s_MSAACoverageSamples); 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); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
if (GL_REPORT_ERROR() != GL_NO_ERROR) if (GL_REPORT_ERROR() != GL_NO_ERROR)
@ -435,12 +435,14 @@ void Renderer::Shutdown(void)
// Return the rendering window width and height // Return the rendering window width and height
int Renderer::GetTargetWidth() 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() 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() 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 // Place messages on the picture, then copy it to the screen
SwapBuffers(); SwapBuffers();
// Why save this as s_bNativeResolution if we updated it every frame?
s_bNativeResolution = g_Config.bNativeResolution;
RestoreAPIState(); RestoreAPIState();
GL_REPORT_ERRORD(); GL_REPORT_ERRORD();