aboutsummaryrefslogtreecommitdiffstats
path: root/support/hololens/ServoApp/App.cpp
blob: 9f6495c49e1eab2796d3c3167efa191b7c6f686b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

#include "pch.h"
#include "App.h"
#include "BrowserPage.h"

using namespace winrt::Windows::ApplicationModel;
using namespace winrt::Windows::ApplicationModel::Activation;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::UI::Xaml;
using namespace winrt::Windows::UI::Xaml::Controls;
using namespace winrt::Windows::UI::Xaml::Navigation;
using namespace winrt::ServoApp;
using namespace winrt::ServoApp::implementation;

App::App() {
  InitializeComponent();
  Suspending({this, &App::OnSuspending});

#if defined _DEBUG &&                                                          \
    !defined DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
  UnhandledException(
      [this](IInspectable const &, UnhandledExceptionEventArgs const &e) {
        if (IsDebuggerPresent()) {
          auto errorMessage = e.Message();
          __debugbreak();
        }
      });
#endif
}

void App::OnLaunched(LaunchActivatedEventArgs const &e) {
  Frame rootFrame{nullptr};
  auto content = Window::Current().Content();
  if (content) {
    rootFrame = content.try_as<Frame>();
  }

  if (rootFrame == nullptr) {
    rootFrame = Frame();

    rootFrame.NavigationFailed({this, &App::OnNavigationFailed});

    if (e.PrelaunchActivated() == false) {
      if (rootFrame.Content() == nullptr) {
        rootFrame.Navigate(xaml_typename<ServoApp::BrowserPage>(),
                           box_value(e.Arguments()));
      }
      Window::Current().Content(rootFrame);
      Window::Current().Activate();
    }
  } else {
    if (e.PrelaunchActivated() == false) {
      if (rootFrame.Content() == nullptr) {
        rootFrame.Navigate(xaml_typename<ServoApp::BrowserPage>(),
                           box_value(e.Arguments()));
      }
      Window::Current().Activate();
    }
  }
}

void App::OnSuspending([[maybe_unused]] IInspectable const &sender,
                       [[maybe_unused]] SuspendingEventArgs const &e) {
  auto content = Window::Current().Content();
  Frame rootFrame = content.try_as<Frame>();
  auto page = rootFrame.Content().try_as<BrowserPage>();
  page->Shutdown();
}

void App::OnNavigationFailed(IInspectable const &,
                             NavigationFailedEventArgs const &e) {
  throw hresult_error(E_FAIL, hstring(L"Failed to load Page ") +
                                  e.SourcePageType().Name);
}