aboutsummaryrefslogtreecommitdiffstats
path: root/support/hololens/ServoApp/ServoControl/ServoControl.h
diff options
context:
space:
mode:
Diffstat (limited to 'support/hololens/ServoApp/ServoControl/ServoControl.h')
-rw-r--r--support/hololens/ServoApp/ServoControl/ServoControl.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/support/hololens/ServoApp/ServoControl/ServoControl.h b/support/hololens/ServoApp/ServoControl/ServoControl.h
new file mode 100644
index 00000000000..e5448a7f9ae
--- /dev/null
+++ b/support/hololens/ServoApp/ServoControl/ServoControl.h
@@ -0,0 +1,110 @@
+#pragma once
+#include "ServoControl.g.h"
+#include "OpenGLES.h"
+#include "Servo.h"
+
+namespace winrt::ServoApp::implementation {
+struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
+
+ ServoControl();
+
+ void GoBack();
+ void GoForward();
+ void Reload();
+ void Stop();
+ void Shutdown();
+ Windows::Foundation::Uri LoadURIOrSearch(hstring);
+
+ 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 OnLoadStarted(LoadStatusChangedDelegate const &handler){
+ return mOnLoadStartedEvent.add(handler);
+ };
+ void OnLoadStarted(winrt::event_token const& token) noexcept { mOnLoadStartedEvent.remove(token); }
+
+ winrt::event_token OnLoadEnded(LoadStatusChangedDelegate const &handler){
+ return mOnLoadEndedEvent.add(handler);
+ };
+ void OnLoadEnded(winrt::event_token const& token) noexcept { mOnLoadEndedEvent.remove(token); }
+
+ virtual void WakeUp();
+ virtual void OnServoLoadStarted();
+ virtual void OnServoLoadEnded();
+ virtual void OnServoHistoryChanged(bool, bool);
+ virtual void OnServoShutdownComplete();
+ virtual void OnServoTitleChanged(winrt::hstring);
+ virtual void OnServoAlert(winrt::hstring);
+ virtual void OnServoURLChanged(winrt::hstring);
+ virtual void Flush();
+ virtual void MakeCurrent();
+ virtual bool OnServoAllowNavigation(winrt::hstring);
+ virtual void OnServoAnimatingChanged(bool);
+
+private:
+ winrt::event<Windows::Foundation::EventHandler<hstring>> mOnURLChangedEvent;
+ winrt::event<Windows::Foundation::EventHandler<hstring>> mOnTitleChangedEvent;
+ winrt::event<HistoryChangedDelegate> mOnHistoryChangedEvent;
+ winrt::event<LoadStatusChangedDelegate> mOnLoadStartedEvent;
+ winrt::event<LoadStatusChangedDelegate> mOnLoadEndedEvent;
+
+ Windows::UI::Xaml::Controls::SwapChainPanel ServoControl::Panel();
+ void CreateRenderSurface();
+ void DestroyRenderSurface();
+ void RecoverFromLostDevice();
+
+ void StartRenderLoop();
+ void StopRenderLoop();
+ void Loop();
+
+ std::optional<Windows::Foundation::Uri> TryParseURI(hstring input) {
+ try {
+ return Windows::Foundation::Uri(input);
+ } catch (hresult_invalid_argument const &e) {
+ return {};
+ }
+ }
+
+ void
+ OnSurfaceClicked(IInspectable const &,
+ Windows::UI::Xaml::Input::PointerRoutedEventArgs const &);
+
+ void OnSurfaceManipulationDelta(
+ IInspectable const &,
+ Windows::UI::Xaml::Input::ManipulationDeltaRoutedEventArgs const &e);
+
+ template <typename Callable> void RunOnUIThread(Callable);
+ void RunOnGLThread(std::function<void()>);
+
+ std::unique_ptr<servo::Servo> mServo;
+ EGLSurface mRenderSurface{EGL_NO_SURFACE};
+ 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;
+};
+} // namespace winrt::ServoApp::implementation
+
+namespace winrt::ServoApp::factory_implementation {
+struct ServoControl
+ : ServoControlT<ServoControl, implementation::ServoControl> {};
+} // namespace winrt::ServoApp::factory_implementation