diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/handlers/mod.rs | 16 | ||||
| -rw-r--r-- | src/niri.rs | 15 | ||||
| -rw-r--r-- | src/utils/mod.rs | 10 |
3 files changed, 26 insertions, 15 deletions
diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 0a4ce334..3fccfae7 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -27,6 +27,7 @@ use smithay::wayland::dmabuf::{DmabufGlobal, DmabufHandler, DmabufState, ImportN use smithay::wayland::drm_lease::{ DrmLease, DrmLeaseBuilder, DrmLeaseHandler, DrmLeaseRequest, DrmLeaseState, LeaseRejected, }; +use smithay::wayland::fractional_scale::FractionalScaleHandler; use smithay::wayland::idle_inhibit::IdleInhibitHandler; use smithay::wayland::idle_notify::{IdleNotifierHandler, IdleNotifierState}; use smithay::wayland::input_method::{InputMethodHandler, PopupSurface}; @@ -53,12 +54,12 @@ use smithay::wayland::xdg_activation::{ }; use smithay::{ delegate_cursor_shape, delegate_data_control, delegate_data_device, delegate_dmabuf, - delegate_drm_lease, delegate_idle_inhibit, delegate_idle_notify, delegate_input_method_manager, - delegate_output, delegate_pointer_constraints, delegate_pointer_gestures, - delegate_presentation, delegate_primary_selection, delegate_relative_pointer, delegate_seat, - delegate_security_context, delegate_session_lock, delegate_tablet_manager, - delegate_text_input_manager, delegate_viewporter, delegate_virtual_keyboard_manager, - delegate_xdg_activation, + delegate_drm_lease, delegate_fractional_scale, delegate_idle_inhibit, delegate_idle_notify, + delegate_input_method_manager, delegate_output, delegate_pointer_constraints, + delegate_pointer_gestures, delegate_presentation, delegate_primary_selection, + delegate_relative_pointer, delegate_seat, delegate_security_context, delegate_session_lock, + delegate_tablet_manager, delegate_text_input_manager, delegate_viewporter, + delegate_virtual_keyboard_manager, delegate_xdg_activation, }; use crate::niri::{ClientState, State}; @@ -539,3 +540,6 @@ impl XdgActivationHandler for State { } } delegate_xdg_activation!(State); + +impl FractionalScaleHandler for State {} +delegate_fractional_scale!(State); diff --git a/src/niri.rs b/src/niri.rs index e7bab37d..b4f3a23a 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -66,6 +66,7 @@ use smithay::wayland::compositor::{ }; use smithay::wayland::cursor_shape::CursorShapeManagerState; use smithay::wayland::dmabuf::DmabufState; +use smithay::wayland::fractional_scale::FractionalScaleManagerState; use smithay::wayland::idle_inhibit::IdleInhibitManagerState; use smithay::wayland::idle_notify::IdleNotifierState; use smithay::wayland::input_method::{InputMethodManagerState, InputMethodSeat}; @@ -200,6 +201,7 @@ pub struct Niri { pub shm_state: ShmState, pub output_manager_state: OutputManagerState, pub dmabuf_state: DmabufState, + pub fractional_scale_manager_state: FractionalScaleManagerState, pub seat_state: SeatState<State>, pub tablet_state: TabletManagerState, pub text_input_state: TextInputManagerState, @@ -1051,7 +1053,7 @@ impl State { let resolution = output.current_mode().unwrap().size; guess_monitor_scale(size_mm, resolution) }); - let scale = scale.clamp(1., 10.).ceil() as i32; + let scale = scale.clamp(1., 10.); let mut transform = config .map(|c| ipc_transform_to_smithay(c.transform)) @@ -1061,13 +1063,13 @@ impl State { transform = Transform::Flipped180; } - if output.current_scale().integer_scale() != scale + if output.current_scale().fractional_scale() != scale || output.current_transform() != transform { output.change_current_state( None, Some(transform), - Some(output::Scale::Integer(scale)), + Some(output::Scale::Fractional(scale)), None, ); self.niri.ipc_outputs_changed = true; @@ -1325,6 +1327,8 @@ impl Niri { let output_manager_state = OutputManagerState::new_with_xdg_output::<State>(&display_handle); let dmabuf_state = DmabufState::new(); + let fractional_scale_manager_state = + FractionalScaleManagerState::new::<State>(&display_handle); let mut seat_state = SeatState::new(); let tablet_state = TabletManagerState::new::<State>(&display_handle); let pointer_gestures_state = PointerGesturesState::new::<State>(&display_handle); @@ -1513,6 +1517,7 @@ impl Niri { shm_state, output_manager_state, dmabuf_state, + fractional_scale_manager_state, seat_state, tablet_state, pointer_gestures_state, @@ -1731,7 +1736,7 @@ impl Niri { let resolution = output.current_mode().unwrap().size; guess_monitor_scale(size_mm, resolution) }); - let scale = scale.clamp(1., 10.).ceil() as i32; + let scale = scale.clamp(1., 10.); let mut transform = c .map(|c| ipc_transform_to_smithay(c.transform)) .unwrap_or(Transform::Normal); @@ -1745,7 +1750,7 @@ impl Niri { output.change_current_state( None, Some(transform), - Some(output::Scale::Integer(scale)), + Some(output::Scale::Fractional(scale)), None, ); diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 807244fa..3c6a36e0 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -96,13 +96,15 @@ pub fn to_physical_precise_round<N: Coordinate>(scale: f64, logical: impl Coordi } pub fn output_size(output: &Output) -> Size<i32, Logical> { - let output_scale = output.current_scale().integer_scale(); + let output_scale = output.current_scale().fractional_scale(); let output_transform = output.current_transform(); let output_mode = output.current_mode().unwrap(); - output_transform - .transform_size(output_mode.size) - .to_logical(output_scale) + // Like in LayerMap::arrange(). + // + // FIXME: return fractional logical size. + let logical_size = output_mode.size.to_f64().to_logical(output_scale); + output_transform.transform_size(logical_size.to_i32_round()) } pub fn logical_output(output: &Output) -> niri_ipc::LogicalOutput { |
