Skip to content

Commit

Permalink
Pass context menu callbacks down to the openxr device
Browse files Browse the repository at this point in the history
  • Loading branch information
Manishearth committed Mar 31, 2020
1 parent 3aa15e3 commit 1ba606b
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 9 deletions.
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion components/compositing/windowing.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -190,6 +190,7 @@ pub trait EmbedderMethods {
_: &mut webxr::MainThreadRegistry,
_: WebGlExecutor,
_: SurfaceProviders,
_: EmbedderProxy,
) {
}
}
Expand Down
3 changes: 2 additions & 1 deletion components/servo/lib.rs
Expand Up @@ -481,6 +481,7 @@ where
&mut webxr_main_thread,
webgl_executor,
webxr_surface_providers,
embedder_proxy.clone(),
);
}
}
Expand Down Expand Up @@ -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(),
Expand Down
5 changes: 3 additions & 2 deletions ports/glutin/embedder.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand Down
51 changes: 48 additions & 3 deletions ports/libsimpleservo/api/src/lib.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -764,23 +766,64 @@ 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(),
"UWP builds should not be initialized with a WebXR Discovery object"
);

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>) {
Expand All @@ -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);
}
Expand All @@ -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() {
Expand Down

0 comments on commit 1ba606b

Please sign in to comment.