summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinWX/Frame.cpp
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2014-07-26 13:22:11 +0200
committerPierre Bourdon <delroth@gmail.com>2014-07-26 13:22:11 +0200
commit8e865f38489f204ea2fabf2cee3acad1a215deff (patch)
tree892e604be56a09cd0ce2abe75cd960f1a5821b7b /Source/Core/DolphinWX/Frame.cpp
parent906b05cb1c1a88c2af3d83c2cd422822abe143fe (diff)
parent06b13f12d3c7ef9946dfba6d8aa91e9f6b1ed7d6 (diff)
Merge pull request #506 from Armada651/d3dfullscreen
D3D: Add exclusive fullscreen support.
Diffstat (limited to 'Source/Core/DolphinWX/Frame.cpp')
-rw-r--r--Source/Core/DolphinWX/Frame.cpp129
1 files changed, 69 insertions, 60 deletions
diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp
index b57f18ad69..43d5185ee3 100644
--- a/Source/Core/DolphinWX/Frame.cpp
+++ b/Source/Core/DolphinWX/Frame.cpp
@@ -78,57 +78,6 @@ extern "C" {
#include "DolphinWX/resources/Dolphin.c" // NOLINT: Dolphin icon
};
-#ifdef _WIN32
-// I could not use FindItemByHWND() instead of this, it crashed on that occasion I used it */
-HWND MSWGetParent_(HWND Parent)
-{
- return GetParent(Parent);
-}
-#endif
-
-// ---------------
-// The CPanel class to receive MSWWindowProc messages from the video backend.
-
-BEGIN_EVENT_TABLE(CPanel, wxPanel)
-END_EVENT_TABLE()
-
-CPanel::CPanel(
- wxWindow *parent,
- wxWindowID id
- )
- : wxPanel(parent, id, wxDefaultPosition, wxDefaultSize, 0) // disables wxTAB_TRAVERSAL because it was breaking hotkeys
-{
-}
-
-#ifdef _WIN32
- WXLRESULT CPanel::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
- {
- switch (nMsg)
- {
- case WM_USER:
- switch (wParam)
- {
- case WM_USER_STOP:
- main_frame->DoStop();
- break;
-
- case WM_USER_SETCURSOR:
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor &&
- main_frame->RendererHasFocus() && Core::GetState() == Core::CORE_RUN)
- SetCursor(wxCURSOR_BLANK);
- else
- SetCursor(wxNullCursor);
- break;
- }
- break;
-
- default:
- // By default let wxWidgets do what it normally does with this event
- return wxPanel::MSWWindowProc(nMsg, wParam, lParam);
- }
- return 0;
- }
-#endif
CRenderFrame::CRenderFrame(wxFrame* parent, wxWindowID id, const wxString& title,
const wxPoint& pos, const wxSize& size, long style)
@@ -213,6 +162,23 @@ WXLRESULT CRenderFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPa
}
break;
+ case WM_USER:
+ switch (wParam)
+ {
+ case WM_USER_STOP:
+ main_frame->DoStop();
+ break;
+
+ case WM_USER_SETCURSOR:
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor &&
+ main_frame->RendererHasFocus() && Core::GetState() == Core::CORE_RUN)
+ SetCursor(wxCURSOR_BLANK);
+ else
+ SetCursor(wxNullCursor);
+ break;
+ }
+ break;
+
case WM_CLOSE:
// Let Core finish initializing before accepting any WM_CLOSE messages
if (!Core::IsRunning()) break;
@@ -350,7 +316,7 @@ CFrame::CFrame(wxFrame* parent,
, m_LogWindow(nullptr), m_LogConfigWindow(nullptr)
, m_FifoPlayerDlg(nullptr), UseDebugger(_UseDebugger)
, m_bBatchMode(_BatchMode), m_bEdit(false), m_bTabSplit(false), m_bNoDocking(false)
- , m_bGameLoading(false), m_bClosing(false)
+ , m_bGameLoading(false), m_bClosing(false), m_confirmStop(false)
{
for (int i = 0; i <= IDM_CODEWINDOW - IDM_LOGWINDOW; i++)
bFloatWindow[i] = false;
@@ -384,7 +350,7 @@ CFrame::CFrame(wxFrame* parent,
// ---------------
// Main panel
// This panel is the parent for rendering and it holds the gamelistctrl
- m_Panel = new CPanel(this, IDM_MPANEL);
+ m_Panel = new wxPanel(this, IDM_MPANEL, wxDefaultPosition, wxDefaultSize, 0);
m_GameListCtrl = new CGameListCtrl(m_Panel, LIST_CTRL,
wxDefaultPosition, wxDefaultSize,
@@ -484,7 +450,7 @@ bool CFrame::RendererIsFullscreen()
if (Core::GetState() == Core::CORE_RUN || Core::GetState() == Core::CORE_PAUSE)
{
- fullscreen = m_RenderFrame->IsFullScreen();
+ fullscreen = m_RenderFrame->IsFullScreen() && g_Config.bFullscreen;
}
#if defined(__APPLE__)
@@ -674,6 +640,21 @@ void CFrame::OnHostMessage(wxCommandEvent& event)
}
break;
+ case IDM_FULLSCREENREQUEST:
+ {
+ bool enable_fullscreen = event.GetInt() == 0 ? false : true;
+ ToggleDisplayMode(enable_fullscreen);
+ if (m_RenderFrame != nullptr)
+ m_RenderFrame->ShowFullScreen(enable_fullscreen);
+
+ // If the stop dialog initiated this fullscreen switch then we need
+ // to pause the emulator after we've completed the switch.
+ // TODO: Allow the renderer to switch fullscreen modes while paused.
+ if (m_confirmStop)
+ Core::SetState(Core::CORE_PAUSE);
+ }
+ break;
+
case WM_USER_CREATE:
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor)
m_RenderParent->SetCursor(wxCURSOR_BLANK);
@@ -756,7 +737,11 @@ bool CFrame::RendererHasFocus()
if (m_RenderParent == nullptr)
return false;
#ifdef _WIN32
- if (m_RenderParent->GetParent()->GetHWND() == GetForegroundWindow())
+ HWND window = GetForegroundWindow();
+ if (window == nullptr)
+ return false;
+
+ if (m_RenderFrame->GetHWND() == window)
return true;
#else
wxWindow *window = wxWindow::FindFocus();
@@ -1202,25 +1187,47 @@ void CFrame::OnMouse(wxMouseEvent& event)
event.Skip();
}
-void CFrame::DoFullscreen(bool bF)
+void CFrame::DoFullscreen(bool enable_fullscreen)
{
- ToggleDisplayMode(bF);
+ if (!g_Config.bBorderlessFullscreen &&
+ !SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain &&
+ Core::GetState() != Core::CORE_RUN)
+ {
+ // A responsive renderer is required for exclusive fullscreen, but the
+ // renderer can only respond in the running state. Therefore we ignore
+ // fullscreen switches if we support exclusive fullscreen, but the
+ // renderer is not running.
+ // TODO: Allow the renderer to switch fullscreen modes while paused.
+ return;
+ }
+
+ ToggleDisplayMode(enable_fullscreen);
#if defined(__APPLE__)
NSView *view = (NSView *) m_RenderFrame->GetHandle();
NSWindow *window = [view window];
- if (bF != RendererIsFullscreen())
+ if (enable_fullscreen != RendererIsFullscreen())
{
[window toggleFullScreen:nil];
}
#else
- m_RenderFrame->ShowFullScreen(bF, wxFULLSCREEN_ALL);
+ if (enable_fullscreen)
+ {
+ m_RenderFrame->ShowFullScreen(true, wxFULLSCREEN_ALL);
+ }
+ else if (g_Config.bBorderlessFullscreen ||
+ SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain)
+ {
+ // Exiting exclusive fullscreen should be done from a Renderer callback.
+ // Therefore we don't exit fullscreen from here if we support exclusive mode.
+ m_RenderFrame->ShowFullScreen(false, wxFULLSCREEN_ALL);
+ }
#endif
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain)
{
- if (bF)
+ if (enable_fullscreen)
{
// Save the current mode before going to fullscreen
AuiCurrent = m_Mgr->SavePerspective();
@@ -1236,6 +1243,8 @@ void CFrame::DoFullscreen(bool bF)
{
m_RenderFrame->Raise();
}
+
+ g_Config.bFullscreen = enable_fullscreen;
}
const CGameListCtrl *CFrame::GetGameListCtrl() const