From 3732bc224d952f508bdbcb37fe29deb9416962e6 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Tue, 31 Mar 2015 11:12:01 -0700 Subject: [PATCH] added back button support. Check if rendering thread has been cancelled --- .../win8.1-universal/OpenGLESPage.xaml.cpp | 35 +++++++++++++++---- .../win8.1-universal/OpenGLESPage.xaml.h | 3 ++ .../js-moonwarriors.Shared.vcxitems.filters | 4 +-- .../js-tests.Shared.vcxitems.filters | 4 +-- .../App.Shared/OpenGLESPage.xaml.cpp | 35 +++++++++++++++---- .../App.Shared/OpenGLESPage.xaml.h | 3 ++ 6 files changed, 68 insertions(+), 16 deletions(-) diff --git a/frameworks/js-bindings/external/win8.1-universal/OpenGLESPage.xaml.cpp b/frameworks/js-bindings/external/win8.1-universal/OpenGLESPage.xaml.cpp index 8f810b771f..5f12e22a94 100644 --- a/frameworks/js-bindings/external/win8.1-universal/OpenGLESPage.xaml.cpp +++ b/frameworks/js-bindings/external/win8.1-universal/OpenGLESPage.xaml.cpp @@ -36,6 +36,10 @@ using namespace Windows::UI::Xaml::Input; using namespace Windows::UI::Xaml::Media; using namespace Windows::UI::Xaml::Navigation; +#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) +using namespace Windows::Phone::UI::Input; +#endif + OpenGLESPage::OpenGLESPage() : OpenGLESPage(nullptr) { @@ -77,6 +81,7 @@ OpenGLESPage::OpenGLESPage(OpenGLES* openGLES) : #if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) Windows::UI::ViewManagement::StatusBar::GetForCurrentView()->HideAsync(); + HardwareButtons::BackPressed += ref new EventHandler(this, &OpenGLESPage::OnBackButtonPressed); #else // Disable all pointer visual feedback for better performance when touching. // This is not supported on Windows Phone applications. @@ -165,6 +170,21 @@ void OpenGLESPage::OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Wi } } +#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) +void OpenGLESPage::OnBackButtonPressed(Object^ sender, BackPressedEventArgs^ args) +{ + bool myAppCanNavigate = false; + if (myAppCanNavigate) + { + args->Handled = true; + } + else { + // Do nothing. Leave args->Handled set to the current value, false. + } +} +#endif + + void OpenGLESPage::OnSwapChainPanelSizeChanged(Object^ sender, Windows::UI::Xaml::SizeChangedEventArgs^ e) { // Size change events occur outside of the render thread. A lock is required when updating @@ -251,13 +271,17 @@ void OpenGLESPage::StartRenderLoop() m_renderer->Resume(); - while (action->Status == Windows::Foundation::AsyncStatus::Started && !m_deviceLost) + while (action->Status == Windows::Foundation::AsyncStatus::Started) { if (!m_visible) { m_renderer->Pause(); while (!m_visible) { + if (action->Status != Windows::Foundation::AsyncStatus::Started) + { + return; + } Sleep(500); } m_renderer->Resume(); @@ -280,6 +304,10 @@ void OpenGLESPage::StartRenderLoop() while(m_deviceLost) { + if (action->Status != Windows::Foundation::AsyncStatus::Started) + { + return; + } Sleep(500); } mOpenGLES->MakeCurrent(mRenderSurface); @@ -299,9 +327,4 @@ void OpenGLESPage::StopRenderLoop() mRenderLoopWorker->Cancel(); mRenderLoopWorker = nullptr; } - - if (m_renderer) - { - m_renderer->Pause(); - } } \ No newline at end of file diff --git a/frameworks/js-bindings/external/win8.1-universal/OpenGLESPage.xaml.h b/frameworks/js-bindings/external/win8.1-universal/OpenGLESPage.xaml.h index f8736e619e..daddd59e23 100644 --- a/frameworks/js-bindings/external/win8.1-universal/OpenGLESPage.xaml.h +++ b/frameworks/js-bindings/external/win8.1-universal/OpenGLESPage.xaml.h @@ -40,6 +40,9 @@ namespace cocos2d void OnPageLoaded(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); void OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args); void OnSwapChainPanelSizeChanged(Platform::Object^ sender, Windows::UI::Xaml::SizeChangedEventArgs^ e); +#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) + void OnBackButtonPressed(Platform::Object^ sender, Windows::Phone::UI::Input::BackPressedEventArgs^ args); +#endif void GetSwapChainPanelSize(GLsizei* width, GLsizei* height); void CreateRenderSurface(); void DestroyRenderSurface(); diff --git a/samples/js-moonwarriors/project/proj.win8.1-universal/App.Shared/js-moonwarriors.Shared.vcxitems.filters b/samples/js-moonwarriors/project/proj.win8.1-universal/App.Shared/js-moonwarriors.Shared.vcxitems.filters index 37f67ba148..c84fc7b68e 100644 --- a/samples/js-moonwarriors/project/proj.win8.1-universal/App.Shared/js-moonwarriors.Shared.vcxitems.filters +++ b/samples/js-moonwarriors/project/proj.win8.1-universal/App.Shared/js-moonwarriors.Shared.vcxitems.filters @@ -9,7 +9,7 @@ - + @@ -26,7 +26,7 @@ - + diff --git a/samples/js-tests/project/proj.win8.1-universal/App.Shared/js-tests.Shared.vcxitems.filters b/samples/js-tests/project/proj.win8.1-universal/App.Shared/js-tests.Shared.vcxitems.filters index 551ca50370..a03f57a132 100644 --- a/samples/js-tests/project/proj.win8.1-universal/App.Shared/js-tests.Shared.vcxitems.filters +++ b/samples/js-tests/project/proj.win8.1-universal/App.Shared/js-tests.Shared.vcxitems.filters @@ -16,7 +16,7 @@ - + @@ -38,7 +38,7 @@ - + diff --git a/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml.cpp b/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml.cpp index 8f810b771f..5f12e22a94 100644 --- a/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml.cpp +++ b/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml.cpp @@ -36,6 +36,10 @@ using namespace Windows::UI::Xaml::Input; using namespace Windows::UI::Xaml::Media; using namespace Windows::UI::Xaml::Navigation; +#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) +using namespace Windows::Phone::UI::Input; +#endif + OpenGLESPage::OpenGLESPage() : OpenGLESPage(nullptr) { @@ -77,6 +81,7 @@ OpenGLESPage::OpenGLESPage(OpenGLES* openGLES) : #if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) Windows::UI::ViewManagement::StatusBar::GetForCurrentView()->HideAsync(); + HardwareButtons::BackPressed += ref new EventHandler(this, &OpenGLESPage::OnBackButtonPressed); #else // Disable all pointer visual feedback for better performance when touching. // This is not supported on Windows Phone applications. @@ -165,6 +170,21 @@ void OpenGLESPage::OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Wi } } +#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) +void OpenGLESPage::OnBackButtonPressed(Object^ sender, BackPressedEventArgs^ args) +{ + bool myAppCanNavigate = false; + if (myAppCanNavigate) + { + args->Handled = true; + } + else { + // Do nothing. Leave args->Handled set to the current value, false. + } +} +#endif + + void OpenGLESPage::OnSwapChainPanelSizeChanged(Object^ sender, Windows::UI::Xaml::SizeChangedEventArgs^ e) { // Size change events occur outside of the render thread. A lock is required when updating @@ -251,13 +271,17 @@ void OpenGLESPage::StartRenderLoop() m_renderer->Resume(); - while (action->Status == Windows::Foundation::AsyncStatus::Started && !m_deviceLost) + while (action->Status == Windows::Foundation::AsyncStatus::Started) { if (!m_visible) { m_renderer->Pause(); while (!m_visible) { + if (action->Status != Windows::Foundation::AsyncStatus::Started) + { + return; + } Sleep(500); } m_renderer->Resume(); @@ -280,6 +304,10 @@ void OpenGLESPage::StartRenderLoop() while(m_deviceLost) { + if (action->Status != Windows::Foundation::AsyncStatus::Started) + { + return; + } Sleep(500); } mOpenGLES->MakeCurrent(mRenderSurface); @@ -299,9 +327,4 @@ void OpenGLESPage::StopRenderLoop() mRenderLoopWorker->Cancel(); mRenderLoopWorker = nullptr; } - - if (m_renderer) - { - m_renderer->Pause(); - } } \ No newline at end of file diff --git a/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml.h b/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml.h index f8736e619e..daddd59e23 100644 --- a/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml.h +++ b/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml.h @@ -40,6 +40,9 @@ namespace cocos2d void OnPageLoaded(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); void OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args); void OnSwapChainPanelSizeChanged(Platform::Object^ sender, Windows::UI::Xaml::SizeChangedEventArgs^ e); +#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) + void OnBackButtonPressed(Platform::Object^ sender, Windows::Phone::UI::Input::BackPressedEventArgs^ args); +#endif void GetSwapChainPanelSize(GLsizei* width, GLsizei* height); void CreateRenderSurface(); void DestroyRenderSurface();