#pragma once #include "ServoControl.g.h" #include "Pref.g.h" #include "OpenGLES.h" #include "Servo.h" using namespace winrt::Windows::Foundation::Collections; namespace winrt::ServoApp::implementation { struct Pref : PrefT { public: Pref(hstring key, IInspectable value, bool isDefault) { mKey = key; mValue = value; mIsDefault = isDefault; }; IInspectable Value() { return mValue; } hstring Key() { return mKey; } bool IsDefault() { return mIsDefault; } private: hstring mKey; IInspectable mValue; bool mIsDefault; }; struct L10NStrings { hstring ContextMenuTitle; hstring PromptTitle; hstring PromptOk; hstring PromptCancel; hstring PromptYes; hstring PromptNo; hstring URINotValid; }; struct ServoControl : ServoControlT, public servo::ServoDelegate { ServoControl(); IVector Preferences(); void GoBack(); void GoForward(); void Reload(); void Stop(); void ChangeVisibility(bool); void Shutdown(); hstring LoadURIOrSearch(hstring); void GoHome(); void SendMediaSessionAction(int32_t); ServoApp::Pref SetBoolPref(hstring aKey, bool aVal) { auto [key, val, isDefault] = servo::Servo::SetBoolPref(aKey, aVal); return ServoApp::Pref(key, val, isDefault); } ServoApp::Pref SetStringPref(hstring aKey, hstring aVal) { auto [key, val, isDefault] = servo::Servo::SetStringPref(aKey, aVal); return ServoApp::Pref(key, val, isDefault); } ServoApp::Pref SetIntPref(hstring aKey, int64_t aVal) { auto [key, val, isDefault] = servo::Servo::SetIntPref(aKey, aVal); return ServoApp::Pref(key, val, isDefault); } ServoApp::Pref SetFloatPref(hstring aKey, double aVal) { auto [key, val, isDefault] = servo::Servo::SetFloatPref(aKey, aVal); return ServoApp::Pref(key, val, isDefault); } ServoApp::Pref ResetPref(hstring aKey) { auto [key, val, isDefault] = servo::Servo::ResetPref(aKey); return ServoApp::Pref(key, val, isDefault); } ServoApp::Pref GetPref(hstring aKey) { auto [key, val, isDefault] = servo::Servo::GetPref(aKey); return ServoApp::Pref(key, val, isDefault); } 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 OnServoPanic(Windows::Foundation::EventHandler const &handler) { return mOnServoPanic.add(handler); }; void OnServoPanic(winrt::event_token const &token) noexcept { mOnServoPanic.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 OnMediaSessionPosition(MediaSessionPositionDelegate const &handler) { return mOnMediaSessionPositionEvent.add(handler); }; void OnMediaSessionPosition(winrt::event_token const &token) noexcept { mOnMediaSessionPositionEvent.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 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 OnServoPanic(hstring); virtual void OnServoIMEHide(); virtual void OnServoIMEShow(hstring text, int32_t, int32_t, int32_t, int32_t); virtual void OnServoMediaSessionMetadata(winrt::hstring, winrt::hstring, winrt::hstring); virtual void OnServoMediaSessionPlaybackStateChange(int); virtual void OnServoMediaSessionPosition(double, double, double); virtual void OnServoPromptAlert(winrt::hstring, bool); virtual void OnServoShowContextMenu(std::optional, std::vector); virtual servo::Servo::PromptResult OnServoPromptOkCancel(winrt::hstring, bool); virtual servo::Servo::PromptResult OnServoPromptYesNo(winrt::hstring, bool); virtual std::optional OnServoPromptInput(winrt::hstring, winrt::hstring, bool); virtual void OnServoDevtoolsStarted(bool, const unsigned int, winrt::hstring); DevtoolsStatus GetDevtoolsStatus(); private: winrt::event> mOnURLChangedEvent; winrt::event> mOnTitleChangedEvent; winrt::event> mOnServoPanic; winrt::event mOnHistoryChangedEvent; winrt::event mOnDevtoolsStatusChangedEvent; winrt::event mOnLoadStartedEvent; winrt::event mOnLoadEndedEvent; winrt::event mOnCaptureGesturesStartedEvent; winrt::event mOnCaptureGesturesEndedEvent; winrt::event mOnMediaSessionMetadataEvent; winrt::event mOnMediaSessionPositionEvent; winrt::event> mOnMediaSessionPlaybackStateChangeEvent; CRITICAL_SECTION mDialogLock; CONDITION_VARIABLE mDialogCondVar; std::tuple> PromptSync(hstring title, hstring message, hstring primaryButton, std::optional secondaryButton, std::optional input); int mPanelHeight = 0; int mPanelWidth = 0; float mDPI = 1; hstring mCurrentUrl = L""; bool mTransient = false; std::optional mInitUrl = {}; Windows::UI::Xaml::Controls::SwapChainPanel 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 void RunOnUIThread(Callable); void RunOnGLThread(std::function); void TryLoadUri(hstring); void InitializeTextController(); std::unique_ptr mServo; PropertySet mNativeWindowProperties; OpenGLES mOpenGLES; bool mAnimating = false; bool mLooping = false; std::vector> mTasks; CRITICAL_SECTION mGLLock; CONDITION_VARIABLE mGLCondVar; std::unique_ptr> mLoopTask; hstring mArgs; std::optional mPressedMouseButton = {}; std::unique_ptr mL10NStrings = nullptr; std::optional mEditContext; std::optional mInputPane; std::optional mFocusedInputRect; std::optional mFocusedInputText; }; } // namespace winrt::ServoApp::implementation namespace winrt::ServoApp::factory_implementation { struct ServoControl : ServoControlT {}; struct Pref : PrefT {}; } // namespace winrt::ServoApp::factory_implementation