Skip to content

Commit 164b58a

Browse files
servo: Improve Code (#10119)
1 parent a119b71 commit 164b58a

File tree

7 files changed

+75
-126
lines changed

7 files changed

+75
-126
lines changed

examples/servo/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/servo/src/adapter.rs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ pub fn upgrade_adapter(weak_ref: &Weak<SlintServoAdapter>) -> Rc<SlintServoAdapt
2323
/// Bridge between Slint UI and Servo browser engine.
2424
/// Manages the lifecycle and communication between the UI and browser components.
2525
pub struct SlintServoAdapter {
26-
app: slint::Weak<MyApp>,
2726
/// Channel sender to wake the event loop
2827
waker_sender: Sender<()>,
2928
/// Channel receiver for event loop wake signals
@@ -33,7 +32,6 @@ pub struct SlintServoAdapter {
3332
}
3433

3534
pub struct SlintServoAdapterInner {
36-
scale_factor: f32,
3735
webview: Option<WebView>,
3836
rendering_adapter: Option<Rc<Box<dyn ServoRenderingAdapter>>>,
3937
#[cfg(not(target_os = "android"))]
@@ -44,20 +42,17 @@ pub struct SlintServoAdapterInner {
4442

4543
impl SlintServoAdapter {
4644
pub fn new(
47-
app: slint::Weak<MyApp>,
4845
waker_sender: Sender<()>,
4946
waker_receiver: Receiver<()>,
5047
#[cfg(not(target_os = "android"))] device: wgpu::Device,
5148
#[cfg(not(target_os = "android"))] queue: wgpu::Queue,
5249
) -> Self {
5350
Self {
54-
app,
5551
waker_sender,
5652
waker_receiver,
5753
servo: RefCell::new(None),
5854
inner: RefCell::new(SlintServoAdapterInner {
5955
webview: None,
60-
scale_factor: 1.0,
6156
rendering_adapter: None,
6257
#[cfg(not(target_os = "android"))]
6358
device: device,
@@ -75,10 +70,6 @@ impl SlintServoAdapter {
7570
self.inner.borrow_mut()
7671
}
7772

78-
pub fn app(&self) -> MyApp {
79-
self.app.upgrade().expect("Failed to upgrade MyApp")
80-
}
81-
8273
pub fn waker_sender(&self) -> Sender<()> {
8374
self.waker_sender.clone()
8475
}
@@ -87,10 +78,6 @@ impl SlintServoAdapter {
8778
self.waker_receiver.clone()
8879
}
8980

90-
pub fn scale_factor(&self) -> f32 {
91-
self.inner().scale_factor
92-
}
93-
9481
#[cfg(not(target_os = "android"))]
9582
pub fn wgpu_device(&self) -> wgpu::Device {
9683
self.inner().device.clone()
@@ -109,30 +96,23 @@ impl SlintServoAdapter {
10996
&self,
11097
servo: Servo,
11198
webview: WebView,
112-
scale_factor: f32,
11399
rendering_adapter: Rc<Box<dyn ServoRenderingAdapter>>,
114100
) {
115101
*self.servo.borrow_mut() = Some(servo);
116102
let mut inner = self.inner_mut();
117103
inner.webview = Some(webview);
118-
inner.scale_factor = scale_factor;
119104
inner.rendering_adapter = Some(rendering_adapter);
120105
}
121106

122107
/// Captures the current Servo framebuffer and updates the Slint UI with the rendered content.
123108
/// This bridges the rendering output from Servo to the Slint display surface.
124-
pub fn update_web_content_with_latest_frame(&self) {
109+
pub fn update_web_content_with_latest_frame(&self, app: &MyApp) {
125110
let inner = self.inner();
126111
let rendering_adapter = inner.rendering_adapter.as_ref().unwrap();
127112

128113
// Convert framebuffer to Slint image format
129114
let slint_image = rendering_adapter.current_framebuffer_as_image();
130115

131-
let app = self
132-
.app
133-
.upgrade()
134-
.expect("Application reference is no longer valid - UI may have been destroyed");
135-
136116
app.global::<WebviewLogic>().set_web_content(slint_image);
137117
app.window().request_redraw();
138118
}

examples/servo/src/delegate.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@ use std::rc::Rc;
55

66
use servo::{WebView, WebViewDelegate};
77

8-
use crate::adapter::SlintServoAdapter;
8+
use crate::{MyApp, adapter::SlintServoAdapter};
99

1010
pub struct AppDelegate {
1111
pub state: Rc<SlintServoAdapter>,
12+
pub app: slint::Weak<MyApp>,
1213
}
1314

1415
impl AppDelegate {
15-
pub fn new(state: Rc<SlintServoAdapter>) -> Self {
16-
Self { state }
16+
pub fn new(state: Rc<SlintServoAdapter>, app: slint::Weak<MyApp>) -> Self {
17+
Self { state, app }
1718
}
1819
}
1920

@@ -22,6 +23,8 @@ impl WebViewDelegate for AppDelegate {
2223
/// Triggers painting and updates the Slint UI with the new frame.
2324
fn notify_new_frame_ready(&self, webview: WebView) {
2425
webview.paint();
25-
self.state.update_web_content_with_latest_frame();
26+
if let Some(app) = self.app.upgrade() {
27+
self.state.update_web_content_with_latest_frame(&app);
28+
}
2629
}
2730
}

examples/servo/src/lib.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,14 @@ pub fn main() {
6262
let url = "https://slint.dev";
6363

6464
#[cfg(not(target_os = "android"))]
65-
let _adapter = init_servo(app.clone_strong(), url.into(), device, queue);
66-
67-
#[cfg(target_os = "android")]
68-
let _adapter = init_servo(app.clone_strong(), url.into());
65+
let _adapter = init_servo(
66+
app.clone_strong(),
67+
url.into(),
68+
#[cfg(not(target_os = "android"))]
69+
device,
70+
#[cfg(not(target_os = "android"))]
71+
queue,
72+
);
6973

7074
app.run().expect("Application failed to run - check for runtime errors");
7175
}

examples/servo/src/on_events.rs

Lines changed: 31 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::rc::Rc;
66
use url::Url;
77
use winit::dpi::PhysicalSize;
88

9-
use euclid::{Box2D, Point2D, Size2D};
9+
use euclid::{Box2D, Point2D, Scale, Size2D};
1010

1111
use i_slint_core::items::{ColorScheme, PointerEvent, PointerEventKind};
1212
use slint::{ComponentHandle, platform::PointerEventButton};
@@ -18,24 +18,21 @@ use servo::{
1818
};
1919

2020
use crate::{
21-
WebviewLogic,
21+
MyApp, WebviewLogic,
2222
adapter::{SlintServoAdapter, upgrade_adapter},
2323
};
2424

25-
pub fn on_app_callbacks(adapter: Rc<SlintServoAdapter>) {
26-
on_url(adapter.clone());
27-
on_theme(adapter.clone());
28-
on_resize(adapter.clone());
29-
on_scroll(adapter.clone());
30-
on_buttons(adapter.clone());
31-
on_pointer(adapter.clone());
25+
pub fn on_app_callbacks(app: &MyApp, adapter: Rc<SlintServoAdapter>) {
26+
on_url(app, adapter.clone());
27+
on_theme(app, adapter.clone());
28+
on_resize(app, adapter.clone());
29+
on_scroll(app, adapter.clone());
30+
on_buttons(app, adapter.clone());
31+
on_pointer(app, adapter.clone());
3232
}
3333

34-
fn on_url(adapter: Rc<SlintServoAdapter>) {
35-
let app = adapter.app();
36-
34+
fn on_url(app: &MyApp, adapter: Rc<SlintServoAdapter>) {
3735
let adapter_weak = Rc::downgrade(&adapter);
38-
3936
app.global::<WebviewLogic>().on_loadUrl(move |url| {
4037
let adapter = upgrade_adapter(&adapter_weak);
4138
let webview = adapter.webview();
@@ -44,36 +41,38 @@ fn on_url(adapter: Rc<SlintServoAdapter>) {
4441
});
4542
}
4643

47-
fn on_theme(adapter: Rc<SlintServoAdapter>) {
48-
let app = adapter.app();
49-
44+
fn on_theme(app: &MyApp, adapter: Rc<SlintServoAdapter>) {
5045
let adapter_weak = Rc::downgrade(&adapter);
51-
5246
app.global::<WebviewLogic>().on_theme(move |color_scheme| {
5347
let theme = if color_scheme == ColorScheme::Dark { Theme::Dark } else { Theme::Light };
5448

5549
let adapter = upgrade_adapter(&adapter_weak);
5650

5751
let webview = adapter.webview();
5852

59-
// Theme not updating its the issue with servo itself until mouse move over it
53+
// Theme not updating until mouse move over it
6054
// https://github.com/servo/servo/issues/40268
6155
webview.notify_theme_change(theme);
6256
});
6357
}
6458

65-
fn on_resize(adapter: Rc<SlintServoAdapter>) {
66-
let app = adapter.app();
67-
59+
// This will always called when slint window show first time and when resize so set scale factor here
60+
fn on_resize(app: &MyApp, adapter: Rc<SlintServoAdapter>) {
6861
let adapter_weak = Rc::downgrade(&adapter);
62+
let app_weak = app.as_weak();
6963
app.global::<WebviewLogic>().on_resize(move |width, height| {
7064
let adapter = upgrade_adapter(&adapter_weak);
7165

7266
let webview = adapter.webview();
7367

74-
let scale_factor = adapter.scale_factor();
68+
let scale_factor =
69+
app_weak.upgrade().expect("Failed to upgrade app").window().scale_factor();
70+
71+
let scale = Scale::new(scale_factor);
7572

76-
let size = Size2D::new(width, height) * scale_factor;
73+
webview.set_hidpi_scale_factor(scale);
74+
75+
let size = Size2D::new(width, height);
7776

7877
let physical_size = PhysicalSize::new(size.width as u32, size.height as u32);
7978

@@ -84,18 +83,14 @@ fn on_resize(adapter: Rc<SlintServoAdapter>) {
8483
});
8584
}
8685

87-
fn on_scroll(adapter: Rc<SlintServoAdapter>) {
88-
let app = adapter.app();
89-
86+
fn on_scroll(app: &MyApp, adapter: Rc<SlintServoAdapter>) {
9087
let adapter_weak = Rc::downgrade(&adapter);
9188
app.global::<WebviewLogic>().on_scroll(move |initial_x, initial_y, delta_x, delta_y| {
9289
let adapter = upgrade_adapter(&adapter_weak);
9390

9491
let webview = adapter.webview();
9592

96-
let scale_factor = adapter.scale_factor();
97-
98-
let point = DevicePoint::new(initial_x * scale_factor, initial_y * scale_factor);
93+
let point = DevicePoint::new(initial_x, initial_y);
9994

10095
let moved_by = DeviceVector2D::new(delta_x, delta_y);
10196

@@ -106,9 +101,7 @@ fn on_scroll(adapter: Rc<SlintServoAdapter>) {
106101
});
107102
}
108103

109-
fn on_buttons(adapter: Rc<SlintServoAdapter>) {
110-
let app = adapter.app();
111-
104+
fn on_buttons(app: &MyApp, adapter: Rc<SlintServoAdapter>) {
112105
let adapter_weak = Rc::downgrade(&adapter);
113106
app.on_back(move || {
114107
let adapter = upgrade_adapter(&adapter_weak);
@@ -137,18 +130,14 @@ fn on_buttons(adapter: Rc<SlintServoAdapter>) {
137130
});
138131
}
139132

140-
fn on_pointer(adapter: Rc<SlintServoAdapter>) {
141-
let app = adapter.app();
142-
133+
fn on_pointer(app: &MyApp, adapter: Rc<SlintServoAdapter>) {
143134
let adapter_weak = Rc::downgrade(&adapter);
144135
app.global::<WebviewLogic>().on_pointer(move |pointer_event, x, y| {
145136
let adapter = upgrade_adapter(&adapter_weak);
146137

147138
let webview = adapter.webview();
148139

149-
let scale_factor = adapter.scale_factor();
150-
151-
let point = DevicePoint::new(x * scale_factor, y * scale_factor);
140+
let point = DevicePoint::new(x, y);
152141

153142
let input_event =
154143
convert_slint_pointer_event_to_servo_input_event(&pointer_event, point.into());
@@ -166,7 +155,7 @@ fn convert_slint_pointer_event_to_servo_input_event(
166155
if pointer_event.is_touch {
167156
handle_touch_events(pointer_event, point)
168157
} else {
169-
_handle_mouse_events(pointer_event, point)
158+
handle_mouse_events(pointer_event, point)
170159
}
171160
}
172161

@@ -180,8 +169,8 @@ fn handle_touch_events(pointer_event: &PointerEvent, point: WebViewPoint) -> Inp
180169
InputEvent::Touch(touch_event)
181170
}
182171

183-
fn _handle_mouse_events(pointer_event: &PointerEvent, point: WebViewPoint) -> InputEvent {
184-
let button = _get_mouse_button(pointer_event);
172+
fn handle_mouse_events(pointer_event: &PointerEvent, point: WebViewPoint) -> InputEvent {
173+
let button = get_mouse_button(pointer_event);
185174
match pointer_event.kind {
186175
PointerEventKind::Down => {
187176
let mouse_event = MouseButtonEvent::new(MouseButtonAction::Down, button, point);
@@ -195,7 +184,7 @@ fn _handle_mouse_events(pointer_event: &PointerEvent, point: WebViewPoint) -> In
195184
}
196185
}
197186

198-
fn _get_mouse_button(point_event: &PointerEvent) -> MouseButton {
187+
fn get_mouse_button(point_event: &PointerEvent) -> MouseButton {
199188
match point_event.button {
200189
PointerEventButton::Left => MouseButton::Left,
201190
PointerEventButton::Right => MouseButton::Right,

0 commit comments

Comments
 (0)