mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
This is the last big change necessary to create the `constellation_traits` crate. This moves the data structure for messages that originate from the `ScriptThread` and are sent to the `Contellation` to `constellation_traits`, effectively splitting `script_traits` in half. Before, `script_traits` was responsible for exposing the API of both the `ScriptThread` and the `Constellation` to the rest of Servo. - Data structures that are used by `ScriptToConstellationMsg` are moved to `constellation_traits`. The dependency graph looks a bit like this: `script_layout_interface` depends on `script_traits` depends on `constellation_traits` depends on `embedder_traits`. - Data structures that are used in the embedding layer (`UntrustedNodeAddress`, `CompositorHitTestResult`, `TouchEventResult` and `AnimationState`) are moved to embedder_traits, to avoid a dependency cycle between `webrender_traits` and `constellation_traits`. - Types dealing with MessagePorts and serialization are moved to `constellation_traits::message_port`. Testing: This is covered by existing tests as it just moves types around. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com>
113 lines
4.3 KiB
Rust
113 lines
4.3 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
//! The interface to the `compositing` crate.
|
|
|
|
use std::fmt::{Debug, Error, Formatter};
|
|
|
|
use base::id::{PipelineId, WebViewId};
|
|
use crossbeam_channel::{Receiver, Sender};
|
|
use embedder_traits::{
|
|
AnimationState, EventLoopWaker, MouseButton, MouseButtonAction, TouchEventResult,
|
|
};
|
|
use euclid::Rect;
|
|
use ipc_channel::ipc::IpcSender;
|
|
use log::warn;
|
|
use pixels::Image;
|
|
use strum_macros::IntoStaticStr;
|
|
use style_traits::CSSPixel;
|
|
use webrender_api::DocumentId;
|
|
use webrender_traits::{CrossProcessCompositorApi, CrossProcessCompositorMessage};
|
|
|
|
/// Sends messages to the compositor.
|
|
#[derive(Clone)]
|
|
pub struct CompositorProxy {
|
|
pub sender: Sender<CompositorMsg>,
|
|
/// Access to [`Self::sender`] that is possible to send across an IPC
|
|
/// channel. These messages are routed via the router thread to
|
|
/// [`Self::sender`].
|
|
pub cross_process_compositor_api: CrossProcessCompositorApi,
|
|
pub event_loop_waker: Box<dyn EventLoopWaker>,
|
|
}
|
|
|
|
impl CompositorProxy {
|
|
pub fn send(&self, msg: CompositorMsg) {
|
|
if let Err(err) = self.sender.send(msg) {
|
|
warn!("Failed to send response ({:?}).", err);
|
|
}
|
|
self.event_loop_waker.wake();
|
|
}
|
|
}
|
|
|
|
/// The port that the compositor receives messages on.
|
|
pub struct CompositorReceiver {
|
|
pub receiver: Receiver<CompositorMsg>,
|
|
}
|
|
|
|
impl CompositorReceiver {
|
|
pub fn try_recv_compositor_msg(&mut self) -> Option<CompositorMsg> {
|
|
self.receiver.try_recv().ok()
|
|
}
|
|
pub fn recv_compositor_msg(&mut self) -> CompositorMsg {
|
|
self.receiver.recv().unwrap()
|
|
}
|
|
}
|
|
|
|
/// Messages from (or via) the constellation thread to the compositor.
|
|
#[derive(IntoStaticStr)]
|
|
pub enum CompositorMsg {
|
|
/// Alerts the compositor that the given pipeline has changed whether it is running animations.
|
|
ChangeRunningAnimationsState(WebViewId, PipelineId, AnimationState),
|
|
/// Create or update a webview, given its frame tree.
|
|
CreateOrUpdateWebView(SendableFrameTree),
|
|
/// Remove a webview.
|
|
RemoveWebView(WebViewId),
|
|
/// Script has handled a touch event, and either prevented or allowed default actions.
|
|
TouchEventProcessed(WebViewId, TouchEventResult),
|
|
/// Composite to a PNG file and return the Image over a passed channel.
|
|
CreatePng(Option<Rect<f32, CSSPixel>>, IpcSender<Option<Image>>),
|
|
/// A reply to the compositor asking if the output image is stable.
|
|
IsReadyToSaveImageReply(bool),
|
|
/// Set whether to use less resources by stopping animations.
|
|
SetThrottled(WebViewId, PipelineId, bool),
|
|
/// WebRender has produced a new frame. This message informs the compositor that
|
|
/// the frame is ready. It contains a bool to indicate if it needs to composite and the
|
|
/// `DocumentId` of the new frame.
|
|
NewWebRenderFrameReady(DocumentId, bool),
|
|
/// A pipeline was shut down.
|
|
// This message acts as a synchronization point between the constellation,
|
|
// when it shuts down a pipeline, to the compositor; when the compositor
|
|
// sends a reply on the IpcSender, the constellation knows it's safe to
|
|
// tear down the other threads associated with this pipeline.
|
|
PipelineExited(WebViewId, PipelineId, IpcSender<()>),
|
|
/// The load of a page has completed
|
|
LoadComplete(WebViewId),
|
|
/// WebDriver mouse button event
|
|
WebDriverMouseButtonEvent(WebViewId, MouseButtonAction, MouseButton, f32, f32),
|
|
/// WebDriver mouse move event
|
|
WebDriverMouseMoveEvent(WebViewId, f32, f32),
|
|
|
|
/// Messages forwarded to the compositor by the constellation from other crates. These
|
|
/// messages are mainly passed on from the compositor to WebRender.
|
|
CrossProcess(CrossProcessCompositorMessage),
|
|
}
|
|
|
|
pub struct SendableFrameTree {
|
|
pub pipeline: CompositionPipeline,
|
|
pub children: Vec<SendableFrameTree>,
|
|
}
|
|
|
|
/// The subset of the pipeline that is needed for layer composition.
|
|
#[derive(Clone)]
|
|
pub struct CompositionPipeline {
|
|
pub id: PipelineId,
|
|
pub webview_id: WebViewId,
|
|
}
|
|
|
|
impl Debug for CompositorMsg {
|
|
fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> {
|
|
let string: &'static str = self.into();
|
|
write!(formatter, "{string}")
|
|
}
|
|
}
|