diff options
-rw-r--r-- | support/hololens/ServoApp/BrowserPage.cpp | 61 | ||||
-rw-r--r-- | support/hololens/ServoApp/BrowserPage.h | 12 | ||||
-rw-r--r-- | support/hololens/ServoApp/Servo.cpp | 1 |
3 files changed, 19 insertions, 55 deletions
diff --git a/support/hololens/ServoApp/BrowserPage.cpp b/support/hololens/ServoApp/BrowserPage.cpp index 1b4844d40bc..d6681375d11 100644 --- a/support/hololens/ServoApp/BrowserPage.cpp +++ b/support/hololens/ServoApp/BrowserPage.cpp @@ -36,7 +36,7 @@ void BrowserPage::Shutdown() { // shutdown event to Servo. } else { HANDLE hEvent = ::CreateEventA(nullptr, FALSE, FALSE, sShutdownEvent); - SendEventToServo({{Event::SHUTDOWN}}); + RunOnGLThread([=] {mServo->RequestShutdown();}); log("Waiting for Servo to shutdown"); ::WaitForSingleObject(hEvent, INFINITE); StopRenderLoop(); @@ -132,39 +132,12 @@ void BrowserPage::Loop(cancellation_token cancel) { if (!mAnimating) { ::WaitForSingleObject(hEvent, INFINITE); } - mEventsMutex.lock(); - for (auto &&e : mEvents) { - switch (e.type) { - case Event::CLICK: { - auto [x, y] = e.clickCoords; - mServo->Click(x, y); - break; - } - case Event::SCROLL: { - auto [x, y, dx, dy] = e.scrollCoords; - mServo->Scroll(x, y, dx, dy); - break; - } - case Event::FORWARD: - mServo->GoForward(); - break; - case Event::BACK: - mServo->GoBack(); - break; - case Event::RELOAD: - mServo->Reload(); - break; - case Event::STOP: - mServo->Stop(); - break; - case Event::SHUTDOWN: - log("Requesting Servo to shutdown"); - mServo->RequestShutdown(); - break; - } + mTasksMutex.lock(); + for (auto &&task : mTasks) { + task(); } - mEvents.clear(); - mEventsMutex.unlock(); + mTasks.clear(); + mTasksMutex.unlock(); mServo->PerformUpdates(); } log("Leaving loop"); @@ -271,22 +244,22 @@ template <typename Callable> void BrowserPage::RunOnUIThread(Callable cb) { void BrowserPage::OnBackButtonClicked(IInspectable const &, RoutedEventArgs const &) { - SendEventToServo({{Event::BACK}}); + RunOnGLThread([=] { mServo->GoBack(); }); } void BrowserPage::OnForwardButtonClicked(IInspectable const &, RoutedEventArgs const &) { - SendEventToServo({{Event::FORWARD}}); + RunOnGLThread([=] { mServo->GoForward(); }); } void BrowserPage::OnReloadButtonClicked(IInspectable const &, RoutedEventArgs const &) { - SendEventToServo({{Event::RELOAD}}); + RunOnGLThread([=] { mServo->Reload(); }); } void BrowserPage::OnStopButtonClicked(IInspectable const &, RoutedEventArgs const &) { - SendEventToServo({{Event::STOP}}); + RunOnGLThread([=] { mServo->Stop(); }); } void BrowserPage::OnImmersiveButtonClicked(IInspectable const &, @@ -313,9 +286,7 @@ void BrowserPage::OnSurfaceManipulationDelta( auto y = e.Position().Y; auto dx = e.Delta().Translation.X; auto dy = e.Delta().Translation.Y; - Event event = {{Event::SCROLL}}; - event.scrollCoords = {dx, dy, x, y}; - SendEventToServo(event); + RunOnGLThread([=] { mServo->Scroll(x, y, dx, dy); }); e.Handled(true); } @@ -324,14 +295,14 @@ void BrowserPage::OnSurfaceClicked(IInspectable const &, auto coords = e.GetCurrentPoint(swapChainPanel()); auto x = coords.Position().X; auto y = coords.Position().Y; - SendEventToServo({{Event::CLICK}, {x, y}}); + RunOnGLThread([=] { mServo->Click(x, y); }); e.Handled(true); } -void BrowserPage::SendEventToServo(Event event) { - mEventsMutex.lock(); - mEvents.push_back(event); - mEventsMutex.unlock(); +void BrowserPage::RunOnGLThread(std::function<void()> task) { + mTasksMutex.lock(); + mTasks.push_back(task); + mTasksMutex.unlock(); WakeUp(); } diff --git a/support/hololens/ServoApp/BrowserPage.h b/support/hololens/ServoApp/BrowserPage.h index efa27ea4215..ac8f017422a 100644 --- a/support/hololens/ServoApp/BrowserPage.h +++ b/support/hololens/ServoApp/BrowserPage.h @@ -14,12 +14,6 @@ namespace winrt::ServoApp::implementation { static char sWakeupEvent[] = "SIGNAL_WAKEUP"; static char sShutdownEvent[] = "SIGNAL_SHUTDOWN"; -struct Event { - enum { CLICK, SCROLL, BACK, FORWARD, RELOAD, STOP, SHUTDOWN } type; - std::tuple<float, float> clickCoords; - std::tuple<float, float, float, float> scrollCoords; -}; - struct BrowserPage : BrowserPageT<BrowserPage>, public servo::ServoDelegate { public: @@ -44,6 +38,7 @@ public: Windows::UI::Xaml::Input::ManipulationDeltaRoutedEventArgs const &e); template <typename Callable> void RunOnUIThread(Callable); + void RunOnGLThread(std::function<void()>); void Shutdown(); virtual void WakeUp(); @@ -80,9 +75,8 @@ private: EGLSurface mRenderSurface{EGL_NO_SURFACE}; std::unique_ptr<servo::Servo> mServo; - void BrowserPage::SendEventToServo(Event event); - std::vector<Event> mEvents; - std::mutex mEventsMutex; + std::vector<std::function<void()>> mTasks; + std::mutex mTasksMutex; OpenGLES mOpenGLES; // FIXME: shared pointer diff --git a/support/hololens/ServoApp/Servo.cpp b/support/hololens/ServoApp/Servo.cpp index 5cb35650c72..afe72c2d2af 100644 --- a/support/hololens/ServoApp/Servo.cpp +++ b/support/hololens/ServoApp/Servo.cpp @@ -1,7 +1,6 @@ #include "pch.h" #include "Servo.h" -// FIXME: rename mozilla to something else namespace servo { void on_load_started() { sServo->Delegate().OnLoadStarted(); } |