utils: Adding additional helpers

This commit is contained in:
Victoria Brekenfeld 2022-07-04 15:27:08 +02:00
parent 06d5989223
commit a088f7fd6e
4 changed files with 108 additions and 43 deletions

41
src/utils/ids.rs Normal file
View file

@ -0,0 +1,41 @@
// TODO: Remove once desktop is back
#![allow(unused)]
macro_rules! id_gen {
($func_name:ident, $id_name:ident, $ids_name:ident) => {
static $id_name: std::sync::atomic::AtomicUsize = std::sync::atomic::AtomicUsize::new(0);
lazy_static::lazy_static! {
static ref $ids_name: std::sync::Mutex<std::collections::HashSet<usize>> =
std::sync::Mutex::new(std::collections::HashSet::new());
}
fn $func_name() -> usize {
let mut ids = $ids_name.lock().unwrap();
if ids.len() == usize::MAX {
panic!("Out of ids");
}
let id = loop {
let new_id = $id_name.fetch_update(
std::sync::atomic::Ordering::SeqCst,
std::sync::atomic::Ordering::SeqCst,
|mut id| {
while ids.iter().any(|k| *k == id) {
id += 1;
}
id += 1;
Some(id)
},
);
if let Ok(id) = new_id {
break id;
}
};
ids.insert(id);
id
}
};
}
pub(crate) use id_gen;

6
src/utils/mod.rs Normal file
View file

@ -0,0 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
mod ids;
pub(crate) use self::ids::id_gen;
pub mod prelude;

61
src/utils/prelude.rs Normal file
View file

@ -0,0 +1,61 @@
use std::cell::RefCell;
use smithay::{
wayland::{
output::Output,
seat::Seat,
},
utils::{Rectangle, Transform, Logical},
};
use crate::{
input::ActiveOutput,
state::Common,
};
pub use crate::{
state::State,
};
pub trait OutputExt {
fn geometry(&self) -> Rectangle<i32, Logical>;
}
impl OutputExt for Output {
fn geometry(&self) -> Rectangle<i32, Logical> {
Rectangle::from_loc_and_size(
self.current_location(),
{
Transform::from(self.current_transform()).transform_size(
self.current_mode().map(|m| m.size).unwrap_or_else(|| (0,0).into())
).to_f64().to_logical(self.current_scale().fractional_scale()).to_i32_round()
},
)
}
}
pub fn active_output(seat: &Seat<State>, state: &Common) -> Output {
seat.user_data()
.get::<ActiveOutput>()
.map(|x| x.0.borrow().clone())
.unwrap_or_else(|| {
state
.shell
.outputs()
.next()
.cloned()
.expect("Backend has no outputs?")
})
}
pub fn set_active_output(seat: &Seat<State>, output: &Output) {
if !seat
.user_data()
.insert_if_missing(|| ActiveOutput(RefCell::new(output.clone())))
{
*seat
.user_data()
.get::<ActiveOutput>()
.unwrap()
.0
.borrow_mut() = output.clone();
}
}