aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2020-03-27 12:58:48 -0700
committerManish Goregaokar <manishsmail@gmail.com>2020-03-31 13:42:03 -0700
commit1ba606b919360266054f7af3c2ac7e1b5750a3e5 (patch)
tree2a91793bbe3f6715b75800e94ca7b8fcc99bd8a9
parent3aa15e3fa30194e465c8bbb21c07d5239a6ac9f8 (diff)
downloadservo-1ba606b919360266054f7af3c2ac7e1b5750a3e5.tar.gz
servo-1ba606b919360266054f7af3c2ac7e1b5750a3e5.zip
Pass context menu callbacks down to the openxr device
-rw-r--r--Cargo.lock4
-rw-r--r--components/compositing/windowing.rs3
-rw-r--r--components/servo/lib.rs3
-rw-r--r--ports/glutin/embedder.rs5
-rw-r--r--ports/libsimpleservo/api/src/lib.rs51
5 files changed, 57 insertions, 9 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 0e1d21bb7b2..a9938cdf075 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6680,7 +6680,7 @@ dependencies = [
[[package]]
name = "webxr"
version = "0.0.1"
-source = "git+https://github.com/servo/webxr#72b30f2b70ff7b40dc0ffdeefce1116b24041f3d"
+source = "git+https://github.com/servo/webxr#412f385483ad502320f94d98fe5beabf53d14de7"
dependencies = [
"bindgen",
"crossbeam-channel",
@@ -6702,7 +6702,7 @@ dependencies = [
[[package]]
name = "webxr-api"
version = "0.0.1"
-source = "git+https://github.com/servo/webxr#72b30f2b70ff7b40dc0ffdeefce1116b24041f3d"
+source = "git+https://github.com/servo/webxr#412f385483ad502320f94d98fe5beabf53d14de7"
dependencies = [
"euclid",
"ipc-channel",
diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs
index a27473ca0f1..1e7a7b30b8d 100644
--- a/components/compositing/windowing.rs
+++ b/components/compositing/windowing.rs
@@ -5,7 +5,7 @@
//! Abstract windowing methods. The concrete implementations of these can be found in `platform/`.
use canvas::{SurfaceProviders, WebGlExecutor};
-use embedder_traits::EventLoopWaker;
+use embedder_traits::{EmbedderProxy, EventLoopWaker};
use euclid::Scale;
#[cfg(feature = "gl")]
use gleam::gl;
@@ -190,6 +190,7 @@ pub trait EmbedderMethods {
_: &mut webxr::MainThreadRegistry,
_: WebGlExecutor,
_: SurfaceProviders,
+ _: EmbedderProxy,
) {
}
}
diff --git a/components/servo/lib.rs b/components/servo/lib.rs
index a71a1e708ba..69bba795d87 100644
--- a/components/servo/lib.rs
+++ b/components/servo/lib.rs
@@ -481,6 +481,7 @@ where
&mut webxr_main_thread,
webgl_executor,
webxr_surface_providers,
+ embedder_proxy.clone(),
);
}
}
@@ -521,7 +522,7 @@ where
let (constellation_chan, sw_senders) = create_constellation(
opts.user_agent.clone(),
opts.config_dir.clone(),
- embedder_proxy.clone(),
+ embedder_proxy,
compositor_proxy.clone(),
time_profiler_chan.clone(),
mem_profiler_chan.clone(),
diff --git a/ports/glutin/embedder.rs b/ports/glutin/embedder.rs
index af65d4c34a1..b5240a36e78 100644
--- a/ports/glutin/embedder.rs
+++ b/ports/glutin/embedder.rs
@@ -14,7 +14,7 @@ use glutin::EventsLoopClosed;
use rust_webvr::GlWindowVRService;
use servo::canvas::{SurfaceProviders, WebGlExecutor};
use servo::compositing::windowing::EmbedderMethods;
-use servo::embedder_traits::EventLoopWaker;
+use servo::embedder_traits::{EmbedderProxy, EventLoopWaker};
use servo::servo_config::{opts, pref};
use servo::webvr::VRServiceManager;
use servo::webvr_traits::WebVRMainThreadHeartbeat;
@@ -94,7 +94,8 @@ impl EmbedderMethods for EmbedderCallbacks {
&mut self,
xr: &mut webxr::MainThreadRegistry,
_executor: WebGlExecutor,
- _surface_provider_registration: SurfaceProviders
+ _surface_provider_registration: SurfaceProviders,
+ _embedder_proxy: EmbedderProxy,
) {
if pref!(dom.webxr.test) {
xr.register_mock(webxr::headless::HeadlessMockDiscovery::new());
diff --git a/ports/libsimpleservo/api/src/lib.rs b/ports/libsimpleservo/api/src/lib.rs
index 0c14dbf3851..65531644734 100644
--- a/ports/libsimpleservo/api/src/lib.rs
+++ b/ports/libsimpleservo/api/src/lib.rs
@@ -20,7 +20,9 @@ use servo::compositing::windowing::{
WindowMethods,
};
use servo::embedder_traits::resources::{self, Resource, ResourceReaderMethods};
-use servo::embedder_traits::{EmbedderMsg, MediaSessionEvent, PromptDefinition, PromptOrigin};
+use servo::embedder_traits::{
+ EmbedderMsg, EmbedderProxy, MediaSessionEvent, PromptDefinition, PromptOrigin,
+};
use servo::euclid::{Point2D, Rect, Scale, Size2D, Vector2D};
use servo::keyboard_types::{Key, KeyState, KeyboardEvent};
use servo::msg::constellation_msg::TraversalDirection;
@@ -764,7 +766,10 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
registry: &mut webxr::MainThreadRegistry,
executor: WebGlExecutor,
surface_providers: SurfaceProviders,
+ embedder_proxy: EmbedderProxy,
) {
+ use ipc_channel::ipc::{self, IpcReceiver};
+ use webxr::openxr;
debug!("EmbedderMethods::register_xr");
assert!(
self.xr_discovery.is_none(),
@@ -772,15 +777,53 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
);
struct ProviderRegistration(SurfaceProviders);
- impl webxr::openxr::SurfaceProviderRegistration for ProviderRegistration {
+ impl openxr::SurfaceProviderRegistration for ProviderRegistration {
fn register(&self, id: webxr_api::SessionId, provider: servo::canvas::SurfaceProvider) {
self.0.lock().unwrap().insert(id, provider);
}
- fn clone(&self) -> Box<dyn webxr::openxr::SurfaceProviderRegistration> {
+ fn clone(&self) -> Box<dyn openxr::SurfaceProviderRegistration> {
Box::new(ProviderRegistration(self.0.clone()))
}
}
+ #[derive(Clone)]
+ struct ContextMenuCallback(EmbedderProxy);
+
+ struct ContextMenuFuture(IpcReceiver<ContextMenuResult>);
+
+ impl openxr::ContextMenuProvider for ContextMenuCallback {
+ fn open_context_menu(&self) -> Box<dyn openxr::ContextMenuFuture> {
+ let (sender, receiver) = ipc::channel().unwrap();
+ self.0.send((
+ None,
+ EmbedderMsg::ShowContextMenu(
+ sender,
+ Some("Would you like to exit the XR session?".into()),
+ vec!["Exit".into()],
+ ),
+ ));
+
+ Box::new(ContextMenuFuture(receiver))
+ }
+ fn clone_object(&self) -> Box<dyn openxr::ContextMenuProvider> {
+ Box::new(self.clone())
+ }
+ }
+
+ impl openxr::ContextMenuFuture for ContextMenuFuture {
+ fn poll(&self) -> openxr::ContextMenuResult {
+ if let Ok(result) = self.0.try_recv() {
+ if let ContextMenuResult::Selected(0) = result {
+ openxr::ContextMenuResult::ExitSession
+ } else {
+ openxr::ContextMenuResult::Dismissed
+ }
+ } else {
+ openxr::ContextMenuResult::Pending
+ }
+ }
+ }
+
struct GlThread(WebGlExecutor);
impl webxr::openxr::GlThread for GlThread {
fn execute(&self, runnable: Box<dyn FnOnce() + Send>) {
@@ -794,6 +837,7 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
let discovery = webxr::openxr::OpenXrDiscovery::new(
Box::new(GlThread(executor)),
Box::new(ProviderRegistration(surface_providers)),
+ Box::new(ContextMenuCallback(embedder_proxy)),
);
registry.register(discovery);
}
@@ -804,6 +848,7 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
registry: &mut webxr::MainThreadRegistry,
_executor: WebGlExecutor,
_surface_provider_registration: SurfaceProviders,
+ _embedder_proxy: EmbedderProxy,
) {
debug!("EmbedderMethods::register_xr");
if let Some(discovery) = self.xr_discovery.take() {