show-hide binding

This commit is contained in:
galister
2024-02-01 19:49:37 +01:00
parent 22f94671e2
commit 832e5a7ecb
7 changed files with 66 additions and 5 deletions

View File

@@ -50,12 +50,14 @@ where
overlays.insert(watch.state.id, watch); overlays.insert(watch.state.id, watch);
let mut keyboard = create_keyboard(&app); let mut keyboard = create_keyboard(&app);
keyboard.state.show_hide = true;
keyboard.state.want_visible = true; keyboard.state.want_visible = true;
overlays.insert(keyboard.state.id, keyboard); overlays.insert(keyboard.state.id, keyboard);
let mut first = true; let mut first = true;
for mut screen in screens { for mut screen in screens {
if first { if first {
screen.state.show_hide = true;
screen.state.want_visible = true; screen.state.want_visible = true;
first = false; first = false;
} }
@@ -94,6 +96,19 @@ where
pub fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut OverlayData<T>> { pub fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut OverlayData<T>> {
self.overlays.values_mut() self.overlays.values_mut()
} }
pub fn show_hide(&mut self) {
let any_shown = self
.overlays
.values()
.any(|o| o.state.show_hide && o.state.want_visible);
self.overlays.values_mut().for_each(|o| {
if o.state.show_hide {
o.state.want_visible = !any_shown;
}
})
}
} }
pub enum OverlaySelector { pub enum OverlaySelector {

View File

@@ -147,6 +147,15 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
input_source.update(&mut input_mngr, &mut system_mngr, &mut state); input_source.update(&mut input_mngr, &mut system_mngr, &mut state);
state.input_state.post_update(); state.input_state.post_update();
if state
.input_state
.pointers
.iter()
.any(|p| p.now.show_hide && !p.before.show_hide)
{
overlays.show_hide();
}
overlays overlays
.iter_mut() .iter_mut()
.for_each(|o| o.state.auto_movement(&mut state)); .for_each(|o| o.state.auto_movement(&mut state));

View File

@@ -1,3 +1,5 @@
use std::time::{Duration, Instant};
use glam::{bool, Affine3A, Quat, Vec3}; use glam::{bool, Affine3A, Quat, Vec3};
use openxr as xr; use openxr as xr;
@@ -6,6 +8,28 @@ use crate::{backend::input::Pointer, state::AppState};
use super::XrState; use super::XrState;
type XrSession = xr::Session<xr::Vulkan>; type XrSession = xr::Session<xr::Vulkan>;
static DOUBLE_CLICK_TIME: Duration = Duration::from_millis(500);
pub(super) struct DoubleClickCounter {
pub(super) last_click: Option<Instant>,
}
impl DoubleClickCounter {
pub(super) fn new() -> Self {
Self { last_click: None }
}
// submit a click. returns true if it should count as a double click
pub(super) fn click(&mut self) -> bool {
let now = Instant::now();
let double_click = match self.last_click {
Some(last_click) => now - last_click < DOUBLE_CLICK_TIME,
None => false,
};
self.last_click = if double_click { None } else { Some(now) };
double_click
}
}
pub(super) struct OpenXrInputSource { pub(super) struct OpenXrInputSource {
action_set: xr::ActionSet, action_set: xr::ActionSet,

View File

@@ -16,7 +16,7 @@ use crate::{
backend::{ backend::{
common::OverlayContainer, common::OverlayContainer,
input::interact, input::interact,
openxr::{lines::LinePool, overlay::OpenXrOverlayData}, openxr::{input::DoubleClickCounter, lines::LinePool, overlay::OpenXrOverlayData},
}, },
graphics::WlxGraphics, graphics::WlxGraphics,
state::AppState, state::AppState,
@@ -114,6 +114,8 @@ pub fn openxr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
let mut session_running = false; let mut session_running = false;
let mut event_storage = xr::EventDataBuffer::new(); let mut event_storage = xr::EventDataBuffer::new();
let mut show_hide_counter = DoubleClickCounter::new();
'main_loop: loop { 'main_loop: loop {
if !running.load(Ordering::Relaxed) { if !running.load(Ordering::Relaxed) {
log::warn!("Received shutdown signal."); log::warn!("Received shutdown signal.");
@@ -184,6 +186,17 @@ pub fn openxr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
input_source.update(&xr_state, &mut app_state); input_source.update(&xr_state, &mut app_state);
app_state.input_state.post_update(); app_state.input_state.post_update();
if app_state
.input_state
.pointers
.iter()
.any(|p| p.now.show_hide && !p.before.show_hide)
{
if show_hide_counter.click() {
overlays.show_hide();
}
}
let (_, views) = xr_state let (_, views) = xr_state
.session .session
.locate_views( .locate_views(

View File

@@ -114,7 +114,6 @@ where
OverlayData { OverlayData {
state: OverlayState { state: OverlayState {
name: Arc::from("kbd"), name: Arc::from("kbd"),
show_hide: true,
size: (size.x as _, size.y as _), size: (size.x as _, size.y as _),
grabbable: true, grabbable: true,
spawn_scale: width, spawn_scale: width,

View File

@@ -334,7 +334,6 @@ where
name: output.name.clone(), name: output.name.clone(),
size, size,
want_visible: session.show_screens.iter().any(|s| s == &*output.name), want_visible: session.show_screens.iter().any(|s| s == &*output.name),
show_hide: true,
grabbable: true, grabbable: true,
spawn_scale: 1.5 * session.config.desktop_view_scale, spawn_scale: 1.5 * session.config.desktop_view_scale,
spawn_point: vec3a(0., 0.5, -1.), spawn_point: vec3a(0., 0.5, -1.),

View File

@@ -98,7 +98,8 @@ where
app.tasks.enqueue(TaskType::Overlay( app.tasks.enqueue(TaskType::Overlay(
OverlaySelector::Name("kbd".into()), OverlaySelector::Name("kbd".into()),
Box::new(|_app, o| { Box::new(|_app, o| {
o.want_visible = !o.want_visible; o.show_hide = !o.show_hide;
o.want_visible = o.show_hide;
}), }),
)); ));
} else { } else {
@@ -144,7 +145,8 @@ where
app.tasks.enqueue(TaskType::Overlay( app.tasks.enqueue(TaskType::Overlay(
OverlaySelector::Id(scr_idx), OverlaySelector::Id(scr_idx),
Box::new(|_app, o| { Box::new(|_app, o| {
o.want_visible = !o.want_visible; o.show_hide = !o.show_hide;
o.want_visible = o.show_hide;
}), }),
)); ));
} else { } else {