mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Refactoring of the Glutin port in preparation of the compositor refactoring.
This commit is contained in:
parent
d58ea974ba
commit
21ed7653f4
30 changed files with 1287 additions and 1067 deletions
|
@ -103,7 +103,7 @@ impl FrameTreeId {
|
|||
enum LayerPixel {}
|
||||
|
||||
/// NB: Never block on the constellation, because sometimes the constellation blocks on us.
|
||||
pub struct IOCompositor<Window: WindowMethods> {
|
||||
pub struct IOCompositor<Window: WindowMethods + ?Sized> {
|
||||
/// The application window.
|
||||
pub window: Rc<Window>,
|
||||
|
||||
|
@ -258,7 +258,7 @@ enum CompositeTarget {
|
|||
PngFile,
|
||||
}
|
||||
|
||||
impl<Window: WindowMethods> IOCompositor<Window> {
|
||||
impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
|
||||
fn new(window: Rc<Window>, state: InitialCompositorState) -> Self {
|
||||
let composite_target = match opts::get().output_file {
|
||||
Some(_) => CompositeTarget::PngFile,
|
||||
|
|
|
@ -148,8 +148,6 @@ pub trait WindowMethods {
|
|||
/// Return the GL function pointer trait.
|
||||
#[cfg(feature = "gl")]
|
||||
fn gl(&self) -> Rc<dyn gl::Gl>;
|
||||
/// Returns a thread-safe object to wake up the window's event loop.
|
||||
fn create_event_loop_waker(&self) -> Box<dyn EventLoopWaker>;
|
||||
/// Get the coordinates of the native window, the screen and the framebuffer.
|
||||
fn get_coordinates(&self) -> EmbedderCoordinates;
|
||||
/// Set whether the application is currently animating.
|
||||
|
@ -157,6 +155,11 @@ pub trait WindowMethods {
|
|||
/// will want to avoid blocking on UI events, and just
|
||||
/// run the event loop at the vsync interval.
|
||||
fn set_animation_state(&self, _state: AnimationState);
|
||||
}
|
||||
|
||||
pub trait EmbedderMethods {
|
||||
/// Returns a thread-safe object to wake up the window's event loop.
|
||||
fn create_event_loop_waker(&self) -> Box<dyn EventLoopWaker>;
|
||||
/// Register services with a VRServiceManager.
|
||||
fn register_vr_services(
|
||||
&self,
|
||||
|
|
|
@ -67,7 +67,7 @@ use canvas::webgl_thread::WebGLThreads;
|
|||
use compositing::compositor_thread::{
|
||||
CompositorProxy, CompositorReceiver, InitialCompositorState, Msg,
|
||||
};
|
||||
use compositing::windowing::{WindowEvent, WindowMethods};
|
||||
use compositing::windowing::{EmbedderMethods, WindowEvent, WindowMethods};
|
||||
use compositing::{CompositingReason, IOCompositor, ShutdownState};
|
||||
#[cfg(all(
|
||||
not(target_os = "windows"),
|
||||
|
@ -148,7 +148,7 @@ type MediaBackend = media_platform::MediaBackend;
|
|||
/// application Servo is embedded in. Clients then create an event
|
||||
/// loop to pump messages between the embedding application and
|
||||
/// various browser components.
|
||||
pub struct Servo<Window: WindowMethods + 'static> {
|
||||
pub struct Servo<Window: WindowMethods + 'static + ?Sized> {
|
||||
compositor: IOCompositor<Window>,
|
||||
constellation_chan: Sender<ConstellationMsg>,
|
||||
embedder_receiver: EmbedderReceiver,
|
||||
|
@ -197,9 +197,9 @@ impl webrender_api::RenderNotifier for RenderNotifier {
|
|||
|
||||
impl<Window> Servo<Window>
|
||||
where
|
||||
Window: WindowMethods + 'static,
|
||||
Window: WindowMethods + 'static + ?Sized,
|
||||
{
|
||||
pub fn new(window: Rc<Window>) -> Servo<Window> {
|
||||
pub fn new(embedder: Box<EmbedderMethods>, window: Rc<Window>) -> Servo<Window> {
|
||||
// Global configuration options, parsed from the command line.
|
||||
let opts = opts::get();
|
||||
|
||||
|
@ -218,9 +218,9 @@ where
|
|||
// messages to client may need to pump a platform-specific event loop
|
||||
// to deliver the message.
|
||||
let (compositor_proxy, compositor_receiver) =
|
||||
create_compositor_channel(window.create_event_loop_waker());
|
||||
create_compositor_channel(embedder.create_event_loop_waker());
|
||||
let (embedder_proxy, embedder_receiver) =
|
||||
create_embedder_channel(window.create_event_loop_waker());
|
||||
create_embedder_channel(embedder.create_event_loop_waker());
|
||||
let time_profiler_chan = profile_time::Profiler::create(
|
||||
&opts.time_profiling,
|
||||
opts.time_profiler_trace_path.clone(),
|
||||
|
@ -288,7 +288,7 @@ where
|
|||
let webvr_services = if pref!(dom.webvr.enabled) {
|
||||
let mut services = VRServiceManager::new();
|
||||
services.register_defaults();
|
||||
window.register_vr_services(&mut services, &mut webvr_heartbeats);
|
||||
embedder.register_vr_services(&mut services, &mut webvr_heartbeats);
|
||||
Some(services)
|
||||
} else {
|
||||
None
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue