75 lines
2.1 KiB
Rust
75 lines
2.1 KiB
Rust
use libmonado::{ClientState, Monado};
|
|
use log::{trace, warn};
|
|
|
|
use crate::{state::AppState, windowing::OverlayID};
|
|
|
|
pub(super) struct InputBlocker {
|
|
hovered_last_frame: bool,
|
|
}
|
|
|
|
impl InputBlocker {
|
|
pub const fn new() -> Self {
|
|
Self {
|
|
hovered_last_frame: false,
|
|
}
|
|
}
|
|
|
|
pub fn update(&mut self, state: &AppState, watch_id: OverlayID, monado: &mut Monado) {
|
|
if !state.session.config.block_game_input {
|
|
return;
|
|
}
|
|
|
|
let any_hovered = state.input_state.pointers.iter().any(|p| {
|
|
p.interaction.hovered_id.is_some_and(|id| {
|
|
id != watch_id || !state.session.config.block_game_input_ignore_watch
|
|
})
|
|
});
|
|
|
|
match (any_hovered, self.hovered_last_frame) {
|
|
(true, false) => {
|
|
trace!("Blocking input");
|
|
set_clients_io_active(monado, false);
|
|
}
|
|
(false, true) => {
|
|
trace!("Unblocking input");
|
|
set_clients_io_active(monado, true);
|
|
}
|
|
_ => {}
|
|
}
|
|
|
|
self.hovered_last_frame = any_hovered;
|
|
}
|
|
}
|
|
|
|
fn set_clients_io_active(monado: &mut Monado, active: bool) {
|
|
match monado.clients() {
|
|
Ok(clients) => {
|
|
for mut client in clients {
|
|
let name = match client.name() {
|
|
Ok(n) => n,
|
|
Err(e) => {
|
|
warn!("Failed to get client name: {e}");
|
|
continue;
|
|
}
|
|
};
|
|
|
|
let state = match client.state() {
|
|
Ok(s) => s,
|
|
Err(e) => {
|
|
warn!("Failed to get client state: {e}");
|
|
continue;
|
|
}
|
|
};
|
|
|
|
if name != "wlx-overlay-s"
|
|
&& state.contains(ClientState::ClientSessionVisible)
|
|
&& let Err(e) = client.set_io_active(active)
|
|
{
|
|
warn!("Failed to set io active for client: {e}");
|
|
}
|
|
}
|
|
}
|
|
Err(e) => warn!("Failed to get clients from Monado: {e}"),
|
|
}
|
|
}
|