mirror of
https://github.com/servo/servo.git
synced 2025-09-27 23:30:08 +01:00
libservo: Make zooming and HiDPI scaling work per-WebView
(#36419)
libservo: Make zooming and HiDPI scaling work per-`WebView` This change moves all zooming and HiDPI scaling to work per-`WebView` in both libservo and Compositor. This means that you can pinch zoom one `WebView` and it should now work independently of other `WebView`s. This is accomplished by making each `WebView` in the WebRender scene have its own scaling reference frame. All WebViews are now expected to manage their HiDPI scaling factor and this can be set independently of other WebViews. Perhaps in the future this will become a Servo-wide setting. This allows full removal of the `WindowMethods` trait from Servo. Testing: There are not yet any tests for the WebView API, but I hope to add those soon. Co-authored-by: Shubham Gupta <shubham13297@gmail.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Shubham Gupta <shubham13297@gmail.com>
This commit is contained in:
parent
f1417c4e75
commit
c6dc7c83a8
17 changed files with 415 additions and 385 deletions
|
@ -11,16 +11,12 @@ use std::rc::Rc;
|
|||
use std::time::Instant;
|
||||
use std::{env, fs};
|
||||
|
||||
use euclid::Scale;
|
||||
use log::{info, trace, warn};
|
||||
use servo::compositing::windowing::WindowMethods;
|
||||
use servo::config::opts::Opts;
|
||||
use servo::config::prefs::Preferences;
|
||||
use servo::servo_config::pref;
|
||||
use servo::servo_geometry::DeviceIndependentPixel;
|
||||
use servo::servo_url::ServoUrl;
|
||||
use servo::user_content_manager::{UserContentManager, UserScript};
|
||||
use servo::webrender_api::units::DevicePixel;
|
||||
use servo::webxr::glwindow::GlWindowDiscovery;
|
||||
#[cfg(target_os = "windows")]
|
||||
use servo::webxr::openxr::{AppInfo, OpenXrDiscovery};
|
||||
|
@ -139,15 +135,6 @@ impl App {
|
|||
// Implements embedder methods, used by libservo and constellation.
|
||||
let embedder = Box::new(EmbedderCallbacks::new(self.waker.clone(), xr_discovery));
|
||||
|
||||
// TODO: Remove this once dyn upcasting coercion stabilises
|
||||
// <https://github.com/rust-lang/rust/issues/65991>
|
||||
struct UpcastedWindow(Rc<dyn WindowPortsMethods>);
|
||||
impl WindowMethods for UpcastedWindow {
|
||||
fn hidpi_factor(&self) -> Scale<f32, DeviceIndependentPixel, DevicePixel> {
|
||||
self.0.hidpi_factor()
|
||||
}
|
||||
}
|
||||
|
||||
let mut user_content_manager = UserContentManager::new();
|
||||
for script in load_userscripts(self.servoshell_preferences.userscripts_directory.as_deref())
|
||||
.expect("Loading userscripts failed")
|
||||
|
@ -160,7 +147,6 @@ impl App {
|
|||
self.preferences.clone(),
|
||||
window.rendering_context(),
|
||||
embedder,
|
||||
Rc::new(UpcastedWindow(window.clone())),
|
||||
user_content_manager,
|
||||
);
|
||||
servo.setup_logging();
|
||||
|
@ -358,7 +344,7 @@ impl ApplicationHandler<WakerEvent> for App {
|
|||
// Intercept any ScaleFactorChanged events away from EguiGlow::on_window_event, so
|
||||
// we can use our own logic for calculating the scale factor and set egui’s
|
||||
// scale factor to that value manually.
|
||||
let desired_scale_factor = window.hidpi_factor().get();
|
||||
let desired_scale_factor = window.hidpi_scale_factor().get();
|
||||
let effective_egui_zoom_factor = desired_scale_factor / scale_factor as f32;
|
||||
|
||||
info!(
|
||||
|
@ -371,6 +357,8 @@ impl ApplicationHandler<WakerEvent> for App {
|
|||
.egui_ctx
|
||||
.set_zoom_factor(effective_egui_zoom_factor);
|
||||
|
||||
state.hidpi_scale_factor_changed();
|
||||
|
||||
// Request a winit redraw event, so we can recomposite, update and paint
|
||||
// the minibrowser, and present the new frame.
|
||||
window.winit_window().unwrap().request_redraw();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue