#pragma once #include "ServoControl.g.h" #include "OpenGLES.h" #include "Servo.h" namespace winrt::ServoApp::implementation { struct ServoControl : ServoControlT, 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 const &handler){ return mOnURLChangedEvent.add(handler); }; void OnURLChanged(winrt::event_token const& token) noexcept { mOnURLChangedEvent.remove(token); } winrt::event_token OnTitleChanged(Windows::Foundation::EventHandler 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> mOnURLChangedEvent; winrt::event> mOnTitleChangedEvent; winrt::event mOnHistoryChangedEvent; winrt::event mOnLoadStartedEvent; winrt::event mOnLoadEndedEvent; hstring mInitialURL = L"https://servo.org"; Windows::UI::Xaml::Controls::SwapChainPanel ServoControl::Panel(); void CreateRenderSurface(); void DestroyRenderSurface(); void RecoverFromLostDevice(); void StartRenderLoop(); void StopRenderLoop(); void Loop(); std::optional TryParseURI(hstring input) { try { return Windows::Foundation::Uri(input); } catch (hresult_invalid_argument const &) { return {}; } } void OnSurfaceClicked(IInspectable const &, Windows::UI::Xaml::Input::PointerRoutedEventArgs const &); void OnSurfaceManipulationDelta( IInspectable const &, Windows::UI::Xaml::Input::ManipulationDeltaRoutedEventArgs const &e); template void RunOnUIThread(Callable); void RunOnGLThread(std::function); std::unique_ptr mServo; EGLSurface mRenderSurface{EGL_NO_SURFACE}; OpenGLES mOpenGLES; bool mAnimating = false; bool mLooping = false; std::vector> mTasks; CRITICAL_SECTION mGLLock; CONDITION_VARIABLE mGLCondVar; std::unique_ptr> mLoopTask; }; } // namespace winrt::ServoApp::implementation namespace winrt::ServoApp::factory_implementation { struct ServoControl : ServoControlT {}; } // namespace winrt::ServoApp::factory_implementation