From 54c436b14cb0ba5d2485f2ce8d7134c061776fb1 Mon Sep 17 00:00:00 2001 From: ShootingStarDragons Date: Sun, 6 Oct 2024 23:16:54 +0900 Subject: [PATCH] feat: handle base scale in base lib --- iced_layershell/src/event.rs | 15 +++++++++---- iced_layershell/src/multi_window.rs | 1 + iced_sessionlock/src/event.rs | 17 ++++++++++----- iced_sessionlock/src/multi_window.rs | 2 +- layershellev/src/events.rs | 19 ++++++++++++++--- layershellev/src/lib.rs | 32 +++++++++++++++++++++++++--- sessionlockev/examples/simplelock.rs | 3 ++- sessionlockev/src/events.rs | 32 ++++++++++++++++++++++------ sessionlockev/src/lib.rs | 31 +++++++++++++++++++++------ 9 files changed, 123 insertions(+), 29 deletions(-) diff --git a/iced_layershell/src/event.rs b/iced_layershell/src/event.rs index 031f96b..b177f0e 100644 --- a/iced_layershell/src/event.rs +++ b/iced_layershell/src/event.rs @@ -39,7 +39,10 @@ impl From> for IcedKeyState { #[derive(Debug, Clone)] pub enum WindowEvent { - ScaleChanged(u32), + ScaleChanged { + scale_int: u32, + scale_float: f64, + }, CursorEnter { x: f64, y: f64, @@ -186,9 +189,13 @@ impl From<&DispatchMessage> for IcedLayerEvent { - IcedLayerEvent::Window(WindowEvent::ScaleChanged(*scale)) - } + DispatchMessage::PreferredScale { + scale_int, + scale_float, + } => IcedLayerEvent::Window(WindowEvent::ScaleChanged { + scale_int: *scale_int, + scale_float: *scale_float, + }), DispatchMessage::KeyboardInput { event, diff --git a/iced_layershell/src/multi_window.rs b/iced_layershell/src/multi_window.rs index 22c25bb..ecf3ffc 100644 --- a/iced_layershell/src/multi_window.rs +++ b/iced_layershell/src/multi_window.rs @@ -257,6 +257,7 @@ where width, height, is_created, + .. } => { let Some(unit) = ev.get_mut_unit_with_id(sended_id.unwrap()) else { break 'outside; diff --git a/iced_sessionlock/src/event.rs b/iced_sessionlock/src/event.rs index 3ef5696..a9306c5 100644 --- a/iced_sessionlock/src/event.rs +++ b/iced_sessionlock/src/event.rs @@ -29,7 +29,10 @@ impl From> for IcedKeyState { #[derive(Debug, Clone)] pub enum WindowEvent { - ScaleChanged(u32), + ScaleChanged { + scale_int: u32, + scale_float: f64, + }, CursorEnter { x: f64, y: f64, @@ -114,7 +117,7 @@ impl From<(Option, IcedSessionLockEvent)> impl From<&DispatchMessage> for IcedSessionLockEvent { fn from(value: &DispatchMessage) -> Self { match value { - DispatchMessage::RequestRefresh { width, height } => { + DispatchMessage::RequestRefresh { width, height, .. } => { IcedSessionLockEvent::RequestRefresh { width: *width, height: *height, @@ -168,9 +171,13 @@ impl From<&DispatchMessage> for IcedSessionLockEvent y: *y, }) } - DispatchMessage::PrefredScale(scale) => { - IcedSessionLockEvent::Window(WindowEvent::ScaleChanged(*scale)) - } + DispatchMessage::PreferredScale { + scale_float, + scale_int, + } => IcedSessionLockEvent::Window(WindowEvent::ScaleChanged { + scale_int: *scale_int, + scale_float: *scale_float, + }), DispatchMessage::KeyboardInput { event, is_synthetic, diff --git a/iced_sessionlock/src/multi_window.rs b/iced_sessionlock/src/multi_window.rs index 694ad7c..73151bc 100644 --- a/iced_sessionlock/src/multi_window.rs +++ b/iced_sessionlock/src/multi_window.rs @@ -188,7 +188,7 @@ where SessionLockEvent::BindProvide(_, _) => {} SessionLockEvent::RequestMessages(message) => 'outside: { match message { - DispatchMessage::RequestRefresh { width, height } => { + DispatchMessage::RequestRefresh { width, height, .. } => { event_sender .start_send(MultiWindowIcedSessionLockEvent( id, diff --git a/layershellev/src/events.rs b/layershellev/src/events.rs index cef3b76..f8a90d5 100644 --- a/layershellev/src/events.rs +++ b/layershellev/src/events.rs @@ -240,8 +240,12 @@ pub(crate) enum DispatchMessageInner { width: u32, height: u32, is_created: bool, + scale_float: f64, + }, + PreferredScale { + scale_int: u32, + scale_float: f64, }, - PrefredScale(u32), XdgInfoChanged(XdgInfoChangedType), } @@ -320,9 +324,10 @@ pub enum DispatchMessage { width: u32, height: u32, is_created: bool, + scale_float: f64, }, /// fractal scale handle - PrefredScale(u32), + PreferredScale { scale_int: u32, scale_float: f64 }, } impl From for DispatchMessage { @@ -397,10 +402,12 @@ impl From for DispatchMessage { width, height, is_created, + scale_float, } => DispatchMessage::RequestRefresh { width, height, is_created, + scale_float, }, DispatchMessageInner::Axis { time, @@ -423,7 +430,13 @@ impl From for DispatchMessage { event, is_synthetic, }, - DispatchMessageInner::PrefredScale(scale) => DispatchMessage::PrefredScale(scale), + DispatchMessageInner::PreferredScale { + scale_int, + scale_float, + } => DispatchMessage::PreferredScale { + scale_int, + scale_float, + }, DispatchMessageInner::RefreshSurface { .. } => unimplemented!(), DispatchMessageInner::XdgInfoChanged(_) => unimplemented!(), } diff --git a/layershellev/src/lib.rs b/layershellev/src/lib.rs index da07aad..c4aa98c 100644 --- a/layershellev/src/lib.rs +++ b/layershellev/src/lib.rs @@ -186,6 +186,7 @@ use wayland_protocols_misc::zwp_virtual_keyboard_v1::client::{ zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1, }; +use std::f64; use std::time::Duration; use sctk::reexports::{ @@ -359,6 +360,8 @@ pub struct WindowStateUnit { wl_output: Option, binding: Option, becreated: bool, + + scale: u32, } impl WindowStateUnit { @@ -536,6 +539,14 @@ impl WindowStateUnit { self.wl_surface.damage(0, 0, width, height); self.wl_surface.commit(); } + + pub fn scale_u32(&self) -> u32 { + self.scale + } + + pub fn scale_float(&self) -> f64 { + self.scale as f64 / 120. + } } /// main state, store the main information @@ -1657,9 +1668,13 @@ impl Dispatch for WindowStat else { return; }; - state - .message - .push((Some(id), DispatchMessageInner::PrefredScale(scale))); + state.message.push(( + Some(id), + DispatchMessageInner::PreferredScale { + scale_int: scale, + scale_float: scale as f64 / 120., + }, + )); } } } @@ -1815,6 +1830,7 @@ impl WindowState { binding: None, becreated: false, wl_output: None, + scale: 120, }); } else { let displays = self.outputs.clone(); @@ -1870,6 +1886,7 @@ impl WindowState { binding: None, becreated: false, wl_output: Some(output_display.clone()), + scale: 120, }); } self.message.clear(); @@ -1996,6 +2013,7 @@ impl WindowState { width: *width, height: *height, is_created: self.units[index].becreated, + scale_float: self.units[index].scale_float(), }), &mut self, Some(*unit_index), @@ -2071,6 +2089,7 @@ impl WindowState { binding: None, becreated: false, wl_output: Some(output_display.clone()), + scale: 120, }); } _ => { @@ -2095,6 +2114,7 @@ impl WindowState { width: unit.size.0, height: unit.size.1, is_created: unit.becreated, + scale_float: unit.scale_float(), }, ), &mut self, @@ -2111,6 +2131,7 @@ impl WindowState { width: unit.size.0, height: unit.size.1, is_created: unit.becreated, + scale_float: unit.scale_float(), }, ), &mut self, @@ -2212,6 +2233,7 @@ impl WindowState { width: unit.size.0, height: unit.size.1, is_created: unit.becreated, + scale_float: unit.scale_float(), }, ), &mut self, @@ -2227,6 +2249,7 @@ impl WindowState { width: unit.size.0, height: unit.size.1, is_created: unit.becreated, + scale_float: unit.scale_float(), }), &mut self, Some(id), @@ -2346,6 +2369,7 @@ impl WindowState { becreated: true, wl_output: output.cloned(), binding: info, + scale: 120, }); } ReturnData::NewPopUp(( @@ -2398,6 +2422,8 @@ impl WindowState { becreated: true, wl_output: None, binding: info, + + scale: 120, }); } _ => {} diff --git a/sessionlockev/examples/simplelock.rs b/sessionlockev/examples/simplelock.rs index 8999e8d..5e648f9 100644 --- a/sessionlockev/examples/simplelock.rs +++ b/sessionlockev/examples/simplelock.rs @@ -44,8 +44,9 @@ fn main() { SessionLockEvent::RequestMessages(DispatchMessage::RequestRefresh { width, height, + scale_float, }) => { - println!("{width}, {height}"); + println!("{width}, {height}, {scale_float}"); ReturnData::None } SessionLockEvent::RequestMessages(DispatchMessage::MouseButton { .. }) => { diff --git a/sessionlockev/src/events.rs b/sessionlockev/src/events.rs index 083f9c1..80f4d28 100644 --- a/sessionlockev/src/events.rs +++ b/sessionlockev/src/events.rs @@ -173,8 +173,12 @@ pub(crate) enum DispatchMessageInner { RequestRefresh { width: u32, height: u32, + scale_float: f64, + }, + PreferredScale { + scale_float: f64, + scale_int: u32, }, - PrefredScale(u32), } /// This tell the DispatchMessage by dispatch @@ -259,9 +263,13 @@ pub enum DispatchMessage { RequestRefresh { width: u32, height: u32, + scale_float: f64, }, /// fractal scale handle - PrefredScale(u32), + PreferredScale { + scale_float: f64, + scale_int: u32, + }, } impl From for DispatchMessage { @@ -334,9 +342,15 @@ impl From for DispatchMessage { DispatchMessage::TouchCancel { id, x, y } } - DispatchMessageInner::RequestRefresh { width, height } => { - DispatchMessage::RequestRefresh { width, height } - } + DispatchMessageInner::RequestRefresh { + width, + height, + scale_float, + } => DispatchMessage::RequestRefresh { + width, + height, + scale_float, + }, DispatchMessageInner::Axis { time, horizontal, @@ -358,7 +372,13 @@ impl From for DispatchMessage { event, is_synthetic, }, - DispatchMessageInner::PrefredScale(scale) => DispatchMessage::PrefredScale(scale), + DispatchMessageInner::PreferredScale { + scale_float, + scale_int, + } => DispatchMessage::PreferredScale { + scale_float, + scale_int, + }, DispatchMessageInner::RefreshSurface { .. } => unimplemented!(), } } diff --git a/sessionlockev/src/lib.rs b/sessionlockev/src/lib.rs index 480a3cc..83006b0 100644 --- a/sessionlockev/src/lib.rs +++ b/sessionlockev/src/lib.rs @@ -306,6 +306,8 @@ pub struct WindowStateUnit { session_shell: ExtSessionLockSurfaceV1, fractional_scale: Option, binding: Option, + + scale: u32, } impl WindowStateUnit { @@ -376,6 +378,14 @@ impl WindowStateUnit { pub fn get_size(&self) -> (u32, u32) { self.size } + + pub fn scale_u32(&self) -> u32 { + self.scale + } + + pub fn scale_float(&self) -> f64 { + self.scale as f64 / 120. + } } #[derive(Debug)] @@ -1030,21 +1040,25 @@ impl Dispatch for WindowStat _qhandle: &QueueHandle, ) { if let wp_fractional_scale_v1::Event::PreferredScale { scale } = event { - let Some(id) = state + let Some(unit) = state .units - .iter() + .iter_mut() .find(|info| { info.fractional_scale .as_ref() .is_some_and(|fractional_scale| fractional_scale == proxy) }) - .map(|unit| unit.id) else { return; }; - state - .message - .push((Some(id), DispatchMessageInner::PrefredScale(scale))); + unit.scale = scale; + state.message.push(( + Some(unit.id), + DispatchMessageInner::PreferredScale { + scale_float: scale as f64 / 120., + scale_int: scale, + }, + )); } } } @@ -1131,6 +1145,7 @@ impl WindowState { session_shell: session_lock_surface, fractional_scale, binding: None, + scale: 120, }); } self.connection = Some(connection); @@ -1252,6 +1267,7 @@ impl WindowState { &DispatchMessage::RequestRefresh { width: *width, height: *height, + scale_float: self.units[index].scale_float(), }, ), &mut self, @@ -1291,6 +1307,7 @@ impl WindowState { session_shell: session_lock_surface, fractional_scale, binding: None, + scale: 120, }); } _ => { @@ -1397,6 +1414,7 @@ impl WindowState { &DispatchMessage::RequestRefresh { width: unit.size.0, height: unit.size.1, + scale_float: unit.scale_float() }, ), &mut self, @@ -1412,6 +1430,7 @@ impl WindowState { &DispatchMessage::RequestRefresh { width: unit.size.0, height: unit.size.1, + scale_float: unit.scale_float() }, ), &mut self,