diff options
author | Martin Robinson <mrobinson@igalia.com> | 2025-02-19 11:35:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-19 10:35:56 +0000 |
commit | e5c9a0365db39eaba109132b8d545ef4732ed16e (patch) | |
tree | 357a57bc5d89d0e575dff778a03107d7a72eecff /components/servo/examples | |
parent | 56840e0a3509f017f745a002332c6125431260a6 (diff) | |
download | servo-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.rs | 17 |
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, ); } } |