aboutsummaryrefslogtreecommitdiffstats
path: root/components/servo/examples
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2025-02-19 11:35:56 +0100
committerGitHub <noreply@github.com>2025-02-19 10:35:56 +0000
commite5c9a0365db39eaba109132b8d545ef4732ed16e (patch)
tree357a57bc5d89d0e575dff778a03107d7a72eecff /components/servo/examples
parent56840e0a3509f017f745a002332c6125431260a6 (diff)
downloadservo-e5c9a0365db39eaba109132b8d545ef4732ed16e.tar.gz
servo-e5c9a0365db39eaba109132b8d545ef4732ed16e.zip
libservo: Rework and clarify the rendering model of the `WebView` (#35522)
Make the rendering model of the `WebView` clearer: 1. `WebViewDelegate::notify_new_frame_ready()` indicates that the WebView has become dirty and needs to be repainted. 2. `WebView::paint()` asks Servo to paint the contents of the `WebView` into the `RenderingContext`. 3. `RenderingContext::present()` does a buffer swap if the `RenderingContext` is actually double-buffered. This is documented and all in-tree embedders are updated to work with this new model. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Ngo Iok Ui (Wu Yu Wei) <yuweiwu@pm.me> Co-authored-by: Mukilan Thiyagarajan <mukilan@igalia.com>
Diffstat (limited to 'components/servo/examples')
-rw-r--r--components/servo/examples/winit_minimal.rs17
1 files changed, 10 insertions, 7 deletions
diff --git a/components/servo/examples/winit_minimal.rs b/components/servo/examples/winit_minimal.rs
index 2b15acc8e02..388b9a6b749 100644
--- a/components/servo/examples/winit_minimal.rs
+++ b/components/servo/examples/winit_minimal.rs
@@ -8,7 +8,7 @@ use std::rc::Rc;
use compositing::windowing::{AnimationState, EmbedderMethods, WindowMethods};
use euclid::{Point2D, Scale, Size2D};
-use servo::{RenderingContext, Servo, TouchEventAction, WebView, WindowRenderingContext};
+use servo::{RenderingContext, Servo, TouchEventType, WebView, WindowRenderingContext};
use servo_geometry::DeviceIndependentPixel;
use tracing::warn;
use url::Url;
@@ -44,6 +44,7 @@ fn main() -> Result<(), Box<dyn Error>> {
struct AppState {
window_delegate: Rc<WindowDelegate>,
servo: Servo,
+ rendering_context: Rc<WindowRenderingContext>,
webviews: RefCell<Vec<WebView>>,
}
@@ -93,9 +94,10 @@ impl ApplicationHandler<WakerEvent> for App {
.expect("Failed to create winit Window");
let window_handle = window.window_handle().expect("Failed to get window handle");
- let rendering_context =
+ let rendering_context = Rc::new(
WindowRenderingContext::new(display_handle, window_handle, &window.inner_size())
- .expect("Could not create RenderingContext for window.");
+ .expect("Could not create RenderingContext for window."),
+ );
let window_delegate = Rc::new(WindowDelegate::new(window));
let _ = rendering_context.make_current();
@@ -103,7 +105,7 @@ impl ApplicationHandler<WakerEvent> for App {
let servo = Servo::new(
Default::default(),
Default::default(),
- Rc::new(rendering_context),
+ rendering_context.clone(),
Box::new(EmbedderDelegate {
waker: waker.clone(),
}),
@@ -116,6 +118,7 @@ impl ApplicationHandler<WakerEvent> for App {
let app_state = Rc::new(AppState {
window_delegate,
servo,
+ rendering_context,
webviews: Default::default(),
});
@@ -152,8 +155,8 @@ impl ApplicationHandler<WakerEvent> for App {
},
WindowEvent::RedrawRequested => {
if let Self::Running(state) = self {
- state.webviews.borrow().last().unwrap().paint_immediately();
- state.servo.present();
+ state.webviews.borrow().last().unwrap().paint();
+ state.rendering_context.present();
}
},
WindowEvent::MouseWheel { delta, .. } => {
@@ -170,7 +173,7 @@ impl ApplicationHandler<WakerEvent> for App {
webview.notify_scroll_event(
ScrollLocation::Delta(moved_by),
DeviceIntPoint::new(10, 10),
- TouchEventAction::Down,
+ TouchEventType::Down,
);
}
}