@@ -8,6 +8,7 @@ use std::thread;
88use std:: time:: Duration ;
99use std:: time:: Instant ;
1010use winit:: application:: ApplicationHandler ;
11+ use winit:: dpi:: PhysicalSize ;
1112use winit:: event:: WindowEvent ;
1213use winit:: event_loop:: ActiveEventLoop ;
1314use winit:: event_loop:: ControlFlow ;
@@ -25,8 +26,9 @@ use crate::wrapper::{DesktopWrapper, NodeGraphExecutionResult, WgpuContext, seri
2526pub ( crate ) struct App {
2627 cef_context : Box < dyn cef:: CefContext > ,
2728 window : Option < Window > ,
29+ window_scale : f64 ,
2830 cef_schedule : Option < Instant > ,
29- cef_window_size_sender : Sender < cef:: WindowSize > ,
31+ cef_view_info_sender : Sender < cef:: ViewInfoUpdate > ,
3032 graphics_state : Option < GraphicsState > ,
3133 wgpu_context : WgpuContext ,
3234 app_event_receiver : Receiver < AppEvent > ,
@@ -44,7 +46,7 @@ pub(crate) struct App {
4446impl App {
4547 pub ( crate ) fn new (
4648 cef_context : Box < dyn cef:: CefContext > ,
47- window_size_sender : Sender < cef:: WindowSize > ,
49+ cef_view_info_sender : Sender < cef:: ViewInfoUpdate > ,
4850 wgpu_context : WgpuContext ,
4951 app_event_receiver : Receiver < AppEvent > ,
5052 app_event_scheduler : AppEventScheduler ,
@@ -66,9 +68,10 @@ impl App {
6668 Self {
6769 cef_context,
6870 window : None ,
71+ window_scale : 1.0 ,
6972 cef_schedule : Some ( Instant :: now ( ) ) ,
7073 graphics_state : None ,
71- cef_window_size_sender : window_size_sender ,
74+ cef_view_info_sender ,
7275 wgpu_context,
7376 app_event_receiver,
7477 app_event_scheduler,
@@ -147,19 +150,19 @@ impl App {
147150 }
148151 } ) ;
149152 }
150- DesktopFrontendMessage :: UpdateViewportBounds { x, y, width, height } => {
153+ DesktopFrontendMessage :: UpdateViewportPhysicalBounds { x, y, width, height } => {
151154 if let Some ( graphics_state) = & mut self . graphics_state
152155 && let Some ( window) = & self . window
153156 {
154157 let window_size = window. surface_size ( ) ;
155158
156- let viewport_offset_x = x / window_size. width as f32 ;
157- let viewport_offset_y = y / window_size. height as f32 ;
158- graphics_state. set_viewport_offset ( [ viewport_offset_x, viewport_offset_y] ) ;
159+ let viewport_offset_x = x / window_size. width as f64 ;
160+ let viewport_offset_y = y / window_size. height as f64 ;
161+ graphics_state. set_viewport_offset ( [ viewport_offset_x as f32 , viewport_offset_y as f32 ] ) ;
159162
160- let viewport_scale_x = if width != 0.0 { window_size. width as f32 / width } else { 1.0 } ;
161- let viewport_scale_y = if height != 0.0 { window_size. height as f32 / height } else { 1.0 } ;
162- graphics_state. set_viewport_scale ( [ viewport_scale_x, viewport_scale_y] ) ;
163+ let viewport_scale_x = if width != 0.0 { window_size. width as f64 / width } else { 1.0 } ;
164+ let viewport_scale_y = if height != 0.0 { window_size. height as f64 / height } else { 1.0 } ;
165+ graphics_state. set_viewport_scale ( [ viewport_scale_x as f32 , viewport_scale_y as f32 ] ) ;
163166 }
164167 }
165168 DesktopFrontendMessage :: UpdateOverlays ( scene) => {
@@ -352,14 +355,17 @@ impl App {
352355impl ApplicationHandler for App {
353356 fn can_create_surfaces ( & mut self , event_loop : & dyn ActiveEventLoop ) {
354357 let window = Window :: new ( event_loop, self . app_event_scheduler . clone ( ) ) ;
358+
359+ self . window_scale = window. scale_factor ( ) ;
360+ let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Scale ( self . window_scale ) ) ;
361+ self . cef_context . notify_view_info_changed ( ) ;
362+
355363 self . window = Some ( window) ;
356364
357365 let graphics_state = GraphicsState :: new ( self . window . as_ref ( ) . unwrap ( ) , self . wgpu_context . clone ( ) ) ;
358366
359367 self . graphics_state = Some ( graphics_state) ;
360368
361- tracing:: info!( "Winit window created and ready" ) ;
362-
363369 self . desktop_wrapper . init ( self . wgpu_context . clone ( ) ) ;
364370
365371 #[ cfg( target_os = "windows" ) ]
@@ -378,20 +384,28 @@ impl ApplicationHandler for App {
378384 }
379385
380386 fn window_event ( & mut self , event_loop : & dyn ActiveEventLoop , _window_id : WindowId , event : WindowEvent ) {
381- self . cef_context . handle_window_event ( & event) ;
387+ self . cef_context . handle_window_event ( & event, self . window_scale ) ;
382388
383389 match event {
384390 WindowEvent :: CloseRequested => {
385391 self . app_event_scheduler . schedule ( AppEvent :: CloseWindow ) ;
386392 }
387- WindowEvent :: SurfaceResized ( size) => {
388- let _ = self . cef_window_size_sender . send ( size. into ( ) ) ;
389- self . cef_context . notify_of_resize ( ) ;
393+ WindowEvent :: SurfaceResized ( PhysicalSize { width, height } ) => {
394+ let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Size {
395+ width : width as usize ,
396+ height : height as usize ,
397+ } ) ;
398+ self . cef_context . notify_view_info_changed ( ) ;
390399 if let Some ( window) = & self . window {
391400 let maximized = window. is_maximized ( ) ;
392401 self . app_event_scheduler . schedule ( AppEvent :: DesktopWrapperMessage ( DesktopWrapperMessage :: UpdateMaximized { maximized } ) ) ;
393402 }
394403 }
404+ WindowEvent :: ScaleFactorChanged { scale_factor, .. } => {
405+ self . window_scale = scale_factor;
406+ let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Scale ( self . window_scale ) ) ;
407+ self . cef_context . notify_view_info_changed ( ) ;
408+ }
395409 WindowEvent :: RedrawRequested => {
396410 let Some ( ref mut graphics_state) = self . graphics_state else { return } ;
397411 // Only rerender once we have a new UI texture to display
0 commit comments