aboutsummaryrefslogtreecommitdiffstats
path: root/support/hololens/ServoApp/ServoControl/ServoControl.h
blob: dbc9e91ca924d94dab5dc054821c63aaa36dc815 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#pragma once
#include "ServoControl.g.h"
#include "OpenGLES.h"
#include "Servo.h"
#include "DefaultUrl.h"

using namespace winrt::Windows::Foundation::Collections;

namespace winrt::ServoApp::implementation {
struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {

  ServoControl();

  void GoBack();
  void GoForward();
  void Reload();
  void Stop();
  void ChangeVisibility(bool);
  void Shutdown();
  hstring LoadURIOrSearch(hstring);
  void SendMediaSessionAction(int32_t);

  void OnLoaded(IInspectable const &,
                Windows::UI::Xaml::RoutedEventArgs const &);

  winrt::event_token
  OnURLChanged(Windows::Foundation::EventHandler<hstring> const &handler) {
    return mOnURLChangedEvent.add(handler);
  };
  void OnURLChanged(winrt::event_token const &token) noexcept {
    mOnURLChangedEvent.remove(token);
  }

  winrt::event_token
  OnTitleChanged(Windows::Foundation::EventHandler<hstring> const &handler) {
    return mOnTitleChangedEvent.add(handler);
  };
  void OnTitleChanged(winrt::event_token const &token) noexcept {
    mOnTitleChangedEvent.remove(token);
  }

  winrt::event_token OnHistoryChanged(HistoryChangedDelegate const &handler) {
    return mOnHistoryChangedEvent.add(handler);
  };
  void OnHistoryChanged(winrt::event_token const &token) noexcept {
    mOnHistoryChangedEvent.remove(token);
  }

  winrt::event_token
  OnDevtoolsStatusChanged(DevtoolsStatusChangedDelegate const &handler) {
    return mOnDevtoolsStatusChangedEvent.add(handler);
  };
  void OnDevtoolsStatusChanged(winrt::event_token const &token) noexcept {
    mOnDevtoolsStatusChangedEvent.remove(token);
  }

  winrt::event_token OnLoadStarted(EventDelegate const &handler) {
    return mOnLoadStartedEvent.add(handler);
  };
  void OnLoadStarted(winrt::event_token const &token) noexcept {
    mOnLoadStartedEvent.remove(token);
  }

  winrt::event_token OnLoadEnded(EventDelegate const &handler) {
    return mOnLoadEndedEvent.add(handler);
  };
  void OnLoadEnded(winrt::event_token const &token) noexcept {
    mOnLoadEndedEvent.remove(token);
  }

  winrt::event_token OnCaptureGesturesStarted(EventDelegate const &handler) {
    return mOnCaptureGesturesStartedEvent.add(handler);
  };
  void OnCaptureGesturesStarted(winrt::event_token const &token) noexcept {
    mOnCaptureGesturesStartedEvent.remove(token);
  }

  winrt::event_token OnCaptureGesturesEnded(EventDelegate const &handler) {
    return mOnCaptureGesturesEndedEvent.add(handler);
  };
  void OnCaptureGesturesEnded(winrt::event_token const &token) noexcept {
    mOnCaptureGesturesEndedEvent.remove(token);
  }

  winrt::event_token
  OnMediaSessionMetadata(MediaSessionMetadataDelegate const &handler) {
    return mOnMediaSessionMetadataEvent.add(handler);
  };
  void OnMediaSessionMetadata(winrt::event_token const &token) noexcept {
    mOnMediaSessionMetadataEvent.remove(token);
  }

  winrt::event_token OnMediaSessionPlaybackStateChange(
      Windows::Foundation::EventHandler<int> const &handler) {
    return mOnMediaSessionPlaybackStateChangeEvent.add(handler);
  };
  void
  OnMediaSessionPlaybackStateChange(winrt::event_token const &token) noexcept {
    mOnMediaSessionPlaybackStateChangeEvent.remove(token);
  }

  void SetTransientMode(bool transient) { mTransient = transient; }

  void SetArgs(hstring args) { mArgs = args; }

  virtual void WakeUp();
  virtual void OnServoLoadStarted();
  virtual void OnServoLoadEnded();
  virtual void OnServoHistoryChanged(bool, bool);
  virtual void OnServoShutdownComplete();
  virtual void OnServoTitleChanged(winrt::hstring);
  virtual void OnServoURLChanged(winrt::hstring);
  virtual bool OnServoAllowNavigation(winrt::hstring);
  virtual void OnServoAnimatingChanged(bool);
  virtual void OnServoIMEStateChanged(bool);
  virtual void OnServoMediaSessionMetadata(winrt::hstring, winrt::hstring,
                                           winrt::hstring);
  virtual void OnServoMediaSessionPlaybackStateChange(int);
  virtual void OnServoPromptAlert(winrt::hstring, bool);
  virtual void OnServoShowContextMenu(std::optional<winrt::hstring>,
                                      std::vector<winrt::hstring>);
  virtual servo::Servo::PromptResult OnServoPromptOkCancel(winrt::hstring,
                                                           bool);
  virtual servo::Servo::PromptResult OnServoPromptYesNo(winrt::hstring, bool);
  virtual std::optional<hstring> OnServoPromptInput(winrt::hstring,
                                                    winrt::hstring, bool);
  virtual void OnServoDevtoolsStarted(bool, const unsigned int);

  DevtoolsStatus GetDevtoolsStatus();

private:
  winrt::event<Windows::Foundation::EventHandler<hstring>> mOnURLChangedEvent;
  winrt::event<Windows::Foundation::EventHandler<hstring>> mOnTitleChangedEvent;
  winrt::event<HistoryChangedDelegate> mOnHistoryChangedEvent;
  winrt::event<DevtoolsStatusChangedDelegate> mOnDevtoolsStatusChangedEvent;
  winrt::event<EventDelegate> mOnLoadStartedEvent;
  winrt::event<EventDelegate> mOnLoadEndedEvent;
  winrt::event<EventDelegate> mOnCaptureGesturesStartedEvent;
  winrt::event<EventDelegate> mOnCaptureGesturesEndedEvent;
  winrt::event<MediaSessionMetadataDelegate> mOnMediaSessionMetadataEvent;
  winrt::event<Windows::Foundation::EventHandler<int>>
      mOnMediaSessionPlaybackStateChangeEvent;

  CRITICAL_SECTION mDialogLock;
  CONDITION_VARIABLE mDialogCondVar;

  std::tuple<Windows::UI::Xaml::Controls::ContentDialogResult,
             std::optional<hstring>>
  PromptSync(hstring title, hstring message, hstring primaryButton,
             std::optional<hstring> secondaryButton,
             std::optional<hstring> input);

  int mPanelHeight = 0;
  int mPanelWidth = 0;
  float mDPI = 1;
  hstring mInitialURL = DEFAULT_URL;
  hstring mCurrentUrl = L"";
  bool mTransient = false;

  Windows::UI::Xaml::Controls::SwapChainPanel ServoControl::Panel();
  void CreateNativeWindow();
  EGLNativeWindowType GetNativeWindow();
  void RecoverFromLostDevice();

  void StartRenderLoop();
  void StopRenderLoop();
  void Loop();

  void OnSurfaceTapped(IInspectable const &,
                       Windows::UI::Xaml::Input::TappedRoutedEventArgs const &);

  void OnSurfacePointerPressed(
      IInspectable const &,
      Windows::UI::Xaml::Input::PointerRoutedEventArgs const &, bool);

  void OnSurfacePointerCanceled(
      IInspectable const &,
      Windows::UI::Xaml::Input::PointerRoutedEventArgs const &);

  void OnSurfacePointerExited(
      IInspectable const &,
      Windows::UI::Xaml::Input::PointerRoutedEventArgs const &);

  void OnSurfacePointerLost(
      IInspectable const &,
      Windows::UI::Xaml::Input::PointerRoutedEventArgs const &);

  void OnSurfacePointerMoved(
      IInspectable const &,
      Windows::UI::Xaml::Input::PointerRoutedEventArgs const &);

  void OnSurfaceWheelChanged(
      IInspectable const &,
      Windows::UI::Xaml::Input::PointerRoutedEventArgs const &);

  void OnSurfaceManipulationDelta(
      IInspectable const &,
      Windows::UI::Xaml::Input::ManipulationDeltaRoutedEventArgs const &);

  void OnSurfaceResized(IInspectable const &,
                        Windows::UI::Xaml::SizeChangedEventArgs const &);

  template <typename Callable> void RunOnUIThread(Callable);
  void RunOnGLThread(std::function<void()>);

  void TryLoadUri(hstring);

  std::unique_ptr<servo::Servo> mServo;
  PropertySet mNativeWindowProperties;
  OpenGLES mOpenGLES;
  bool mAnimating = false;
  bool mLooping = false;
  std::vector<std::function<void()>> mTasks;
  CRITICAL_SECTION mGLLock;
  CONDITION_VARIABLE mGLCondVar;
  std::unique_ptr<Concurrency::task<void>> mLoopTask;
  hstring mArgs;

  std::optional<servo::Servo::MouseButton> mPressedMouseButton = {};
};
} // namespace winrt::ServoApp::implementation

namespace winrt::ServoApp::factory_implementation {
struct ServoControl
    : ServoControlT<ServoControl, implementation::ServoControl> {};
} // namespace winrt::ServoApp::factory_implementation