diff --git a/src/input/mod.rs b/src/input/mod.rs index 327f23ef..65baa2b7 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -23,7 +23,7 @@ use crate::{ }, SeatExt, Trigger, }, - utils::{prelude::*, quirks::workspace_overview_is_open}, + utils::{float::NextDown, prelude::*, quirks::workspace_overview_is_open}, wayland::{ handlers::screencopy::SessionHolder, protocols::screencopy::{BufferConstraints, CursorSession}, @@ -2207,32 +2207,3 @@ fn mapped_output_for_device<'a, D: Device + 'static>( }; map_to_output.or_else(|| shell.builtin_output()) } - -// FIXME: When f64::next_down reaches stable rust, use that instead -trait NextDown { - fn next_lower(self) -> Self; -} - -impl NextDown for f64 { - fn next_lower(self) -> Self { - // We must use strictly integer arithmetic to prevent denormals from - // flushing to zero after an arithmetic operation on some platforms. - const NEG_TINY_BITS: u64 = 0x8000_0000_0000_0001; // Smallest (in magnitude) negative f64. - const CLEAR_SIGN_MASK: u64 = 0x7fff_ffff_ffff_ffff; - - let bits = self.to_bits(); - if self.is_nan() || bits == Self::NEG_INFINITY.to_bits() { - return self; - } - - let abs = bits & CLEAR_SIGN_MASK; - let next_bits = if abs == 0 { - NEG_TINY_BITS - } else if bits == abs { - bits - 1 - } else { - bits + 1 - }; - Self::from_bits(next_bits) - } -} diff --git a/src/utils/float.rs b/src/utils/float.rs new file mode 100644 index 00000000..042332c6 --- /dev/null +++ b/src/utils/float.rs @@ -0,0 +1,28 @@ +// FIXME: When f64::next_down reaches stable rust, use that instead +pub trait NextDown { + fn next_lower(self) -> Self; +} + +impl NextDown for f64 { + fn next_lower(self) -> Self { + // We must use strictly integer arithmetic to prevent denormals from + // flushing to zero after an arithmetic operation on some platforms. + const NEG_TINY_BITS: u64 = 0x8000_0000_0000_0001; // Smallest (in magnitude) negative f64. + const CLEAR_SIGN_MASK: u64 = 0x7fff_ffff_ffff_ffff; + + let bits = self.to_bits(); + if self.is_nan() || bits == Self::NEG_INFINITY.to_bits() { + return self; + } + + let abs = bits & CLEAR_SIGN_MASK; + let next_bits = if abs == 0 { + NEG_TINY_BITS + } else if bits == abs { + bits - 1 + } else { + bits + 1 + }; + Self::from_bits(next_bits) + } +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs index ac1df019..a90ae986 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -3,6 +3,7 @@ pub mod env; mod ids; pub(crate) use self::ids::id_gen; +pub mod float; pub mod geometry; pub mod iced; pub mod prelude;