Skip to content

Commit 672d112

Browse files
tmp
1 parent d1b0d72 commit 672d112

File tree

7 files changed

+88
-29
lines changed

7 files changed

+88
-29
lines changed

desktop/src/cef.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,22 @@ impl ViewInfo {
7777
pub(crate) fn scale(&self) -> f64 {
7878
self.scale
7979
}
80-
pub(crate) fn scaled_width(&self) -> usize {
80+
pub(crate) fn zoom(&self) -> f64 {
81+
self.scale.ln() / 1.2f64.ln()
82+
}
83+
pub(crate) fn logical_width(&self) -> usize {
8184
(self.width as f64 / self.scale).round() as usize
8285
}
83-
pub(crate) fn scaled_height(&self) -> usize {
86+
pub(crate) fn logical_height(&self) -> usize {
8487
(self.height as f64 / self.scale).round() as usize
8588
}
89+
90+
pub(crate) fn physical_width(&self) -> usize {
91+
self.width
92+
}
93+
pub(crate) fn physical_height(&self) -> usize {
94+
self.height
95+
}
8696
}
8797
impl Default for ViewInfo {
8898
fn default() -> Self {

desktop/src/cef/context/builder.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ fn create_browser<H: CefEventHandler>(event_handler: H, instance_dir: PathBuf, d
197197

198198
if let Some(browser) = browser {
199199
Ok(SingleThreadedCefContext {
200+
event_handler,
200201
browser,
201202
input_state: InputState::default(),
202203
instance_dir,

desktop/src/cef/context/multithreaded.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use cef::{Task, ThreadId, post_task};
33
use std::cell::RefCell;
44
use winit::event::WindowEvent;
55

6+
use crate::cef::CefEventHandler;
67
use crate::cef::internal::task::ClosureTask;
78

89
use super::CefContext;

desktop/src/cef/context/singlethreaded.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use cef::{Browser, ImplBrowser};
22
use winit::event::WindowEvent;
33

4-
use crate::cef::input;
54
use crate::cef::input::InputState;
65
use crate::cef::internal::NotifyViewInfoChanged;
76
use crate::cef::ipc::{MessageType, SendMessage};
7+
use crate::cef::{CefEventHandler, input};
88

99
use super::CefContext;
1010

1111
pub(super) struct SingleThreadedCefContext {
12+
pub(super) event_handler: Box<dyn CefEventHandler>,
1213
pub(super) browser: Browser,
1314
pub(super) input_state: InputState,
1415
pub(super) instance_dir: std::path::PathBuf,
@@ -24,7 +25,8 @@ impl CefContext for SingleThreadedCefContext {
2425
}
2526

2627
fn notify_view_info_changed(&self) {
27-
self.browser.host().unwrap().notify_view_info_changed();
28+
let view_info = self.event_handler.view_info();
29+
self.browser.host().unwrap().notify_view_info_changed(&view_info);
2830
}
2931

3032
fn send_web_message(&self, message: Vec<u8>) {

desktop/src/cef/internal.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ mod browser_process_app;
22
mod browser_process_client;
33
mod browser_process_handler;
44
mod browser_process_life_span_handler;
5+
mod browser_process_load_handler;
56

67
mod render_process_app;
78
mod render_process_handler;
@@ -23,12 +24,15 @@ pub(super) use render_handler::RenderHandlerImpl;
2324
pub(super) use render_process_app::RenderProcessAppImpl;
2425
pub(super) use scheme_handler_factory::SchemeHandlerFactoryImpl;
2526

27+
use crate::cef::ViewInfo;
28+
2629
pub(super) trait NotifyViewInfoChanged {
27-
fn notify_view_info_changed(&self);
30+
fn notify_view_info_changed(&self, view_info: &ViewInfo);
2831
}
2932
impl<T: cef::ImplBrowserHost> NotifyViewInfoChanged for T {
30-
fn notify_view_info_changed(&self) {
33+
fn notify_view_info_changed(&self, view_info: &ViewInfo) {
3134
self.notify_screen_info_changed();
3235
self.was_resized();
36+
self.set_zoom_level(view_info.zoom());
3337
}
3438
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
use std::time::{Duration, Instant};
2+
3+
use cef::rc::{Rc, RcImpl};
4+
use cef::sys::{_cef_load_handler_t, cef_base_ref_counted_t, cef_load_handler_t};
5+
use cef::{CefString, ImplBrowser, ImplBrowserHost, ImplLoadHandler, WrapLoadHandler};
6+
7+
use crate::cef::CefEventHandler;
8+
9+
pub(crate) struct LoadHandlerImpl<H: CefEventHandler> {
10+
object: *mut RcImpl<cef_load_handler_t, Self>,
11+
event_handler: H,
12+
}
13+
impl<H: CefEventHandler> LoadHandlerImpl<H> {
14+
pub(crate) fn new(event_handler: H) -> Self {
15+
Self {
16+
object: std::ptr::null_mut(),
17+
event_handler,
18+
}
19+
}
20+
}
21+
22+
impl<H: CefEventHandler + Clone> ImplLoadHandler for LoadHandlerImpl<H> {
23+
fn on_loading_state_change(&self, browser: Option<&mut cef::Browser>, is_loading: ::std::os::raw::c_int, can_go_back: ::std::os::raw::c_int, can_go_forward: ::std::os::raw::c_int) {
24+
if let Some(browser) = browser
25+
&& is_loading == 0
26+
{
27+
let view_info = self.event_handler.view_info();
28+
browser.host().unwrap().set_zoom_level(view_info.zoom());
29+
}
30+
}
31+
32+
fn get_raw(&self) -> *mut _cef_load_handler_t {
33+
self.object.cast()
34+
}
35+
}
36+
37+
impl<H: CefEventHandler + Clone> Clone for LoadHandlerImpl<H> {
38+
fn clone(&self) -> Self {
39+
unsafe {
40+
let rc_impl = &mut *self.object;
41+
rc_impl.interface.add_ref();
42+
}
43+
Self {
44+
object: self.object,
45+
event_handler: self.event_handler.clone(),
46+
}
47+
}
48+
}
49+
impl<H: CefEventHandler> Rc for LoadHandlerImpl<H> {
50+
fn as_base(&self) -> &cef_base_ref_counted_t {
51+
unsafe {
52+
let base = &*self.object;
53+
std::mem::transmute(&base.cef_object)
54+
}
55+
}
56+
}
57+
impl<H: CefEventHandler + Clone> WrapLoadHandler for LoadHandlerImpl<H> {
58+
fn wrap_rc(&mut self, object: *mut RcImpl<_cef_load_handler_t, Self>) {
59+
self.object = object;
60+
}
61+
}

desktop/src/cef/internal/render_handler.rs

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use cef::rc::{Rc, RcImpl};
22
use cef::sys::{_cef_render_handler_t, cef_base_ref_counted_t};
3-
use cef::{Browser, ImplRenderHandler, PaintElementType, Rect, WrapRenderHandler};
3+
use cef::{Browser, ImplBrowser, ImplBrowserHost, ImplRenderHandler, PaintElementType, Rect, WrapRenderHandler};
44

55
use crate::cef::CefEventHandler;
66
use crate::render::FrameBufferRef;
@@ -25,32 +25,12 @@ impl<H: CefEventHandler> ImplRenderHandler for RenderHandlerImpl<H> {
2525
*rect = Rect {
2626
x: 0,
2727
y: 0,
28-
width: view_info.scaled_width() as i32,
29-
height: view_info.scaled_height() as i32,
28+
width: view_info.physical_width() as i32,
29+
height: view_info.physical_height() as i32,
3030
};
3131
}
3232
}
3333

34-
fn screen_info(&self, _browser: Option<&mut Browser>, screen_info: Option<&mut cef::ScreenInfo>) -> std::ffi::c_int {
35-
if let Some(screen_info) = screen_info {
36-
let view_info = self.event_handler.view_info();
37-
38-
screen_info.device_scale_factor = view_info.scale() as f32;
39-
40-
let rect = Rect {
41-
x: 0,
42-
y: 0,
43-
width: view_info.scaled_width() as i32,
44-
height: view_info.scaled_height() as i32,
45-
};
46-
screen_info.rect = rect.clone();
47-
screen_info.available_rect = rect;
48-
49-
return 1;
50-
}
51-
0
52-
}
53-
5434
fn on_paint(
5535
&self,
5636
_browser: Option<&mut Browser>,

0 commit comments

Comments
 (0)