@@ -5,7 +5,7 @@ use baseview::{
55 WindowScalePolicy ,
66} ;
77use copypasta:: ClipboardProvider ;
8- use egui:: { pos2, vec2, Pos2 , Rect , Rgba , ViewportCommand } ;
8+ use egui:: { pos2, vec2, Id , Pos2 , Rect , Rgba , ViewportCommand } ;
99use keyboard_types:: Modifiers ;
1010use raw_window_handle:: HasRawWindowHandle ;
1111
@@ -24,6 +24,14 @@ pub struct Queue<'a> {
2424 key_capture : & ' a mut KeyCapture ,
2525}
2626
27+ fn screen_cursor_pos_id ( ) -> Id {
28+ Id :: new ( "egui_baseview_screen_cursor_pos" )
29+ }
30+
31+ pub fn screen_cursor_pos ( ctx : & egui:: Context ) -> Option < egui:: Pos2 > {
32+ ctx. data ( |data| data. get_temp :: < egui:: Pos2 > ( screen_cursor_pos_id ( ) ) )
33+ }
34+
2735impl < ' a > Queue < ' a > {
2836 pub ( crate ) fn new (
2937 bg_color : & ' a mut Rgba ,
@@ -317,6 +325,23 @@ where
317325 self . egui_input . modifiers . shift = !( * modifiers & Modifiers :: SHIFT ) . is_empty ( ) ;
318326 self . egui_input . modifiers . command = !( * modifiers & Modifiers :: CONTROL ) . is_empty ( ) ;
319327 }
328+
329+ fn apply_window_resize ( & mut self , physical_size : PhySize , pixels_per_point : f32 ) {
330+ self . pixels_per_point = pixels_per_point;
331+ self . points_per_pixel = pixels_per_point. recip ( ) ;
332+ self . physical_size = physical_size;
333+
334+ let screen_rect = calculate_screen_rect ( self . physical_size , self . points_per_pixel ) ;
335+ self . egui_input . screen_rect = Some ( screen_rect) ;
336+
337+ if let Some ( viewport_info) = self . egui_input . viewports . get_mut ( & self . viewport_id ) {
338+ viewport_info. native_pixels_per_point = Some ( self . pixels_per_point ) ;
339+ viewport_info. inner_rect = Some ( screen_rect) ;
340+ }
341+
342+ // Schedule to repaint on the next frame.
343+ self . repaint_after = Some ( Instant :: now ( ) ) ;
344+ }
320345}
321346
322347impl < State , U > WindowHandler for EguiWindow < State , U >
@@ -367,10 +392,21 @@ where
367392 ViewportCommand :: Close => {
368393 window. close ( ) ;
369394 }
370- ViewportCommand :: InnerSize ( size) => window. resize ( baseview:: Size {
371- width : size. x . max ( 1.0 ) as f64 ,
372- height : size. y . max ( 1.0 ) as f64 ,
373- } ) ,
395+ ViewportCommand :: InnerSize ( size) => {
396+ let logical_size = size. max ( vec2 ( 1.0 , 1.0 ) ) ;
397+
398+ window. resize ( baseview:: Size {
399+ width : logical_size. x as f64 ,
400+ height : logical_size. y as f64 ,
401+ } ) ;
402+
403+ let physical_size = PhySize {
404+ width : ( logical_size. x * self . pixels_per_point ) . round ( ) as u32 ,
405+ height : ( logical_size. y * self . pixels_per_point ) . round ( ) as u32 ,
406+ } ;
407+
408+ self . apply_window_resize ( physical_size, self . pixels_per_point ) ;
409+ }
374410 _ => { }
375411 }
376412 }
@@ -451,13 +487,18 @@ where
451487 baseview:: Event :: Mouse ( event) => match event {
452488 baseview:: MouseEvent :: CursorMoved {
453489 position,
490+ screen_position,
454491 modifiers,
455492 } => {
456493 self . update_modifiers ( modifiers) ;
457494
458495 let pos = pos2 ( position. x as f32 , position. y as f32 ) ;
459496 self . pointer_pos_in_points = Some ( pos) ;
460497 self . egui_input . events . push ( egui:: Event :: PointerMoved ( pos) ) ;
498+
499+ let screen_pos = pos2 ( screen_position. x as f32 , screen_position. y as f32 ) ;
500+ self . egui_ctx
501+ . data_mut ( |data| data. insert_temp ( screen_cursor_pos_id ( ) , screen_pos) ) ;
461502 }
462503 baseview:: MouseEvent :: ButtonPressed { button, modifiers } => {
463504 self . update_modifiers ( modifiers) ;
@@ -522,6 +563,8 @@ where
522563 baseview:: MouseEvent :: CursorLeft => {
523564 self . pointer_pos_in_points = None ;
524565 self . egui_input . events . push ( egui:: Event :: PointerGone ) ;
566+ self . egui_ctx
567+ . data_mut ( |data| data. remove :: < egui:: Pos2 > ( screen_cursor_pos_id ( ) ) ) ;
525568 }
526569 _ => { }
527570 } ,
@@ -608,29 +651,12 @@ where
608651 }
609652 baseview:: Event :: Window ( event) => match event {
610653 baseview:: WindowEvent :: Resized ( window_info) => {
611- self . pixels_per_point = match self . scale_policy {
654+ let pixels_per_point = match self . scale_policy {
612655 WindowScalePolicy :: ScaleFactor ( scale) => scale,
613656 WindowScalePolicy :: SystemScaleFactor => window_info. scale ( ) ,
614657 } as f32 ;
615- self . points_per_pixel = self . pixels_per_point . recip ( ) ;
616-
617- self . physical_size = window_info. physical_size ( ) ;
618-
619- let screen_rect =
620- calculate_screen_rect ( self . physical_size , self . points_per_pixel ) ;
621-
622- self . egui_input . screen_rect = Some ( screen_rect) ;
623-
624- let viewport_info = self
625- . egui_input
626- . viewports
627- . get_mut ( & self . viewport_id )
628- . unwrap ( ) ;
629- viewport_info. native_pixels_per_point = Some ( self . pixels_per_point ) ;
630- viewport_info. inner_rect = Some ( screen_rect) ;
631658
632- // Schedule to repaint on the next frame.
633- self . repaint_after = Some ( Instant :: now ( ) ) ;
659+ self . apply_window_resize ( window_info. physical_size ( ) , pixels_per_point) ;
634660 }
635661 baseview:: WindowEvent :: Focused => {
636662 self . egui_input
0 commit comments