diff --git a/ports/servoshell/desktop/headed_window.rs b/ports/servoshell/desktop/headed_window.rs index ee08b7c3ddb..203ca2c261d 100644 --- a/ports/servoshell/desktop/headed_window.rs +++ b/ports/servoshell/desktop/headed_window.rs @@ -62,6 +62,9 @@ pub struct Window { monitor: winit::monitor::MonitorHandle, webview_relative_mouse_point: Cell>, last_pressed: Cell)>>, + /// The inner size of the window in physical pixels which excludes OS decorations. + /// It equals viewport size + (0, toolbar height). + inner_size: Cell>, /// A map of winit's key codes to key values that are interpreted from /// winit's ReceivedChar events. keys_down: RefCell>, @@ -73,7 +76,10 @@ pub struct Window { /// The `RenderingContext` of Servo itself. This is used to render Servo results /// temporarily until they can be blitted into the egui scene. rendering_context: Rc, - + /// The RenderingContext that renders directly onto the Window. This is used as + /// the target of egui rendering and also where Servo rendering results are finally + /// blitted. + window_rendering_context: Rc, // Keep this as the last field of the struct to ensure that the rendering context is // dropped first. // (https://github.com/servo/servo/issues/36711) @@ -158,12 +164,14 @@ impl Window { last_pressed: Cell::new(None), keys_down: RefCell::new(HashMap::new()), fullscreen: Cell::new(false), + inner_size: Cell::new(inner_size), monitor, screen_size, device_pixel_ratio_override: servoshell_preferences.device_pixel_ratio_override, xr_window_poses: RefCell::new(vec![]), modifiers_state: Cell::new(ModifiersState::empty()), toolbar_height: Cell::new(Default::default()), + window_rendering_context, rendering_context, } } @@ -677,6 +685,13 @@ impl WindowPortsMethods for Window { winit::window::Theme::Dark => Theme::Dark, }); }, + WindowEvent::Resized(new_inner_size) => { + if self.inner_size.get() != new_inner_size { + // This should always be set to inner size. + // See https://github.com/servo/servo/issues/38369#issuecomment-3138378527 + self.window_rendering_context.resize(new_inner_size); + } + }, WindowEvent::Ime(ime) => match ime { Ime::Enabled => { webview.notify_input_event(InputEvent::Ime(ImeEvent::Composition( diff --git a/ports/servoshell/desktop/minibrowser.rs b/ports/servoshell/desktop/minibrowser.rs index 1dd30539dfe..812fc711c0d 100644 --- a/ports/servoshell/desktop/minibrowser.rs +++ b/ports/servoshell/desktop/minibrowser.rs @@ -409,6 +409,9 @@ impl Minibrowser { let rect = Box2D::from_origin_and_size(Point2D::origin(), size); if rect != webview.rect() { webview.move_resize(rect); + // `rect` is sized to just the WebView viewport, which is required by + // `OffscreenRenderingContext` See: + // webview.resize(PhysicalSize::new(size.width as u32, size.height as u32)) }