mirror of
https://github.com/creating2morrow/neveko.git
synced 2025-03-11 17:06:26 +00:00
fix gui screen lock while in use
This commit is contained in:
parent
7544e3005c
commit
438b22838e
2 changed files with 44 additions and 14 deletions
|
@ -8,8 +8,6 @@ mod wrap_app;
|
||||||
/// key for fetching the login credential hash
|
/// key for fetching the login credential hash
|
||||||
pub const CREDENTIAL_KEY: &str = "NEVMES_GUI_KEY";
|
pub const CREDENTIAL_KEY: &str = "NEVMES_GUI_KEY";
|
||||||
/// TODO(c2m): configurable lock screen timeout
|
/// TODO(c2m): configurable lock screen timeout
|
||||||
/// , also the screen shouldn't lock if your actively
|
|
||||||
/// using it.
|
|
||||||
pub const LOCK_SCREEN_TIMEOUT_SECS: u64 = 60*5;
|
pub const LOCK_SCREEN_TIMEOUT_SECS: u64 = 60*5;
|
||||||
/// interval to search for credential on initial gui load
|
/// interval to search for credential on initial gui load
|
||||||
pub const CRED_CHECK_INTERVAL: u64 = 5;
|
pub const CRED_CHECK_INTERVAL: u64 = 5;
|
||||||
|
|
|
@ -4,7 +4,6 @@ use nevmes_core::*;
|
||||||
|
|
||||||
use std::sync::mpsc::{Receiver, Sender};
|
use std::sync::mpsc::{Receiver, Sender};
|
||||||
|
|
||||||
use crate::{CREDENTIAL_KEY, LOCK_SCREEN_TIMEOUT_SECS};
|
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -52,6 +51,7 @@ pub struct State {
|
||||||
home: crate::apps::HomeApp,
|
home: crate::apps::HomeApp,
|
||||||
address_book: crate::apps::AddressBookApp,
|
address_book: crate::apps::AddressBookApp,
|
||||||
lock_screen: crate::apps::LockScreenApp,
|
lock_screen: crate::apps::LockScreenApp,
|
||||||
|
lock_timer: u64,
|
||||||
login: crate::login::LoginApp,
|
login: crate::login::LoginApp,
|
||||||
mailbox: crate::apps::MailBoxApp,
|
mailbox: crate::apps::MailBoxApp,
|
||||||
selected_anchor: Anchor,
|
selected_anchor: Anchor,
|
||||||
|
@ -62,6 +62,8 @@ pub struct State {
|
||||||
is_screen_locked_rx: Receiver<bool>,
|
is_screen_locked_rx: Receiver<bool>,
|
||||||
is_cred_set_tx: Sender<bool>,
|
is_cred_set_tx: Sender<bool>,
|
||||||
is_cred_set_rx: Receiver<bool>,
|
is_cred_set_rx: Receiver<bool>,
|
||||||
|
lock_timer_tx: Sender<bool>,
|
||||||
|
lock_timer_rx: Receiver<bool>,
|
||||||
// end async notifications
|
// end async notifications
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -69,6 +71,7 @@ pub struct State {
|
||||||
impl Default for State {
|
impl Default for State {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
let (is_screen_locked_tx, is_screen_locked_rx) = std::sync::mpsc::channel();
|
let (is_screen_locked_tx, is_screen_locked_rx) = std::sync::mpsc::channel();
|
||||||
|
let (lock_timer_tx, lock_timer_rx) = std::sync::mpsc::channel();
|
||||||
let (is_cred_set_tx, is_cred_set_rx) = std::sync::mpsc::channel();
|
let (is_cred_set_tx, is_cred_set_rx) = std::sync::mpsc::channel();
|
||||||
Self {
|
Self {
|
||||||
home: Default::default(),
|
home: Default::default(),
|
||||||
|
@ -79,6 +82,9 @@ impl Default for State {
|
||||||
is_checking_cred: true,
|
is_checking_cred: true,
|
||||||
is_screen_locked: false,
|
is_screen_locked: false,
|
||||||
is_screen_locking: false,
|
is_screen_locking: false,
|
||||||
|
lock_timer: 0,
|
||||||
|
lock_timer_rx,
|
||||||
|
lock_timer_tx,
|
||||||
login: Default::default(),
|
login: Default::default(),
|
||||||
mailbox: Default::default(),
|
mailbox: Default::default(),
|
||||||
selected_anchor: Default::default(),
|
selected_anchor: Default::default(),
|
||||||
|
@ -96,7 +102,6 @@ impl Default for State {
|
||||||
/// Wraps many apps into one.
|
/// Wraps many apps into one.
|
||||||
pub struct WrapApp {
|
pub struct WrapApp {
|
||||||
state: State,
|
state: State,
|
||||||
is_active: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WrapApp {
|
impl WrapApp {
|
||||||
|
@ -104,7 +109,6 @@ impl WrapApp {
|
||||||
#[allow(unused_mut)]
|
#[allow(unused_mut)]
|
||||||
let mut slf = Self {
|
let mut slf = Self {
|
||||||
state: State::default(),
|
state: State::default(),
|
||||||
is_active: false,
|
|
||||||
};
|
};
|
||||||
slf
|
slf
|
||||||
}
|
}
|
||||||
|
@ -147,6 +151,10 @@ impl eframe::App for WrapApp {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
|
fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
|
||||||
|
// NOTE: just moving the mouse wont reset the lock screen timer
|
||||||
|
if ctx.is_using_pointer() {
|
||||||
|
self.state.lock_timer = 0;
|
||||||
|
}
|
||||||
if let Ok(cred_set) = self.state.is_cred_set_rx.try_recv() {
|
if let Ok(cred_set) = self.state.is_cred_set_rx.try_recv() {
|
||||||
self.state.is_cred_set = cred_set;
|
self.state.is_cred_set = cred_set;
|
||||||
}
|
}
|
||||||
|
@ -154,10 +162,15 @@ impl eframe::App for WrapApp {
|
||||||
self.state.is_screen_locked = lock;
|
self.state.is_screen_locked = lock;
|
||||||
if lock {
|
if lock {
|
||||||
let lock_screen = &mut self.state.lock_screen;
|
let lock_screen = &mut self.state.lock_screen;
|
||||||
lock_screen.set_lock();
|
if self.state.lock_timer >= crate::LOCK_SCREEN_TIMEOUT_SECS {
|
||||||
|
lock_screen.set_lock();
|
||||||
|
}
|
||||||
self.state.is_screen_locking = false;
|
self.state.is_screen_locking = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let Ok(lock_timer) = self.state.lock_timer_rx.try_recv() {
|
||||||
|
if lock_timer { self.state.lock_timer += 1 }
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
if ctx.input_mut(|i| i.consume_key(egui::Modifiers::NONE, egui::Key::F11)) {
|
if ctx.input_mut(|i| i.consume_key(egui::Modifiers::NONE, egui::Key::F11)) {
|
||||||
|
@ -178,11 +191,11 @@ impl eframe::App for WrapApp {
|
||||||
}
|
}
|
||||||
// screen lock logic
|
// screen lock logic
|
||||||
let app_initializing = self.state.app_init_lock;
|
let app_initializing = self.state.app_init_lock;
|
||||||
|
if app_initializing {
|
||||||
|
send_inc_lock_timer_req(self.state.lock_timer_tx.clone(), ctx.clone());
|
||||||
|
}
|
||||||
if (!self.state.is_screen_locking && self.state.is_cred_set) || app_initializing {
|
if (!self.state.is_screen_locking && self.state.is_cred_set) || app_initializing {
|
||||||
// don't lock while using the application
|
self.send_lock_refresh(self.state.is_screen_locked_tx.clone(), ctx.clone(), app_initializing);
|
||||||
if !self.is_active {
|
|
||||||
self.send_lock_refresh(self.state.is_screen_locked_tx.clone(), ctx.clone(), app_initializing);
|
|
||||||
}
|
|
||||||
self.state.is_screen_locking = true;
|
self.state.is_screen_locking = true;
|
||||||
}
|
}
|
||||||
self.show_selected_app(ctx, frame);
|
self.show_selected_app(ctx, frame);
|
||||||
|
@ -202,12 +215,11 @@ impl eframe::App for WrapApp {
|
||||||
|
|
||||||
impl WrapApp {
|
impl WrapApp {
|
||||||
fn show_selected_app(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
|
fn show_selected_app(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
|
||||||
self.is_active = ctx.is_using_pointer();
|
|
||||||
ctx.set_pixels_per_point(1.5);
|
ctx.set_pixels_per_point(1.5);
|
||||||
// initial cred check, is there a better way to do this?
|
// initial cred check, is there a better way to do this?
|
||||||
if !self.state.is_cred_set {
|
if !self.state.is_cred_set {
|
||||||
let s = db::Interface::open();
|
let s = db::Interface::open();
|
||||||
let r = db::Interface::read(&s.env, &s.handle, CREDENTIAL_KEY);
|
let r = db::Interface::read(&s.env, &s.handle, crate::CREDENTIAL_KEY);
|
||||||
if r != utils::empty_string() {
|
if r != utils::empty_string() {
|
||||||
self.state.is_cred_set = true;
|
self.state.is_cred_set = true;
|
||||||
self.state.is_checking_cred = false;
|
self.state.is_checking_cred = false;
|
||||||
|
@ -262,7 +274,9 @@ impl WrapApp {
|
||||||
fn send_lock_refresh(&mut self, tx: Sender<bool>, ctx: egui::Context, init: bool) {
|
fn send_lock_refresh(&mut self, tx: Sender<bool>, ctx: egui::Context, init: bool) {
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
log::debug!("locking screen");
|
log::debug!("locking screen");
|
||||||
if !init { tokio::time::sleep(std::time::Duration::from_secs(LOCK_SCREEN_TIMEOUT_SECS)).await; }
|
if !init {
|
||||||
|
tokio::time::sleep(std::time::Duration::from_secs(crate::LOCK_SCREEN_TIMEOUT_SECS)).await;
|
||||||
|
}
|
||||||
let _= tx.send(true);
|
let _= tx.send(true);
|
||||||
ctx.request_repaint();
|
ctx.request_repaint();
|
||||||
});
|
});
|
||||||
|
@ -286,7 +300,7 @@ impl WrapApp {
|
||||||
log::debug!("check for cred");
|
log::debug!("check for cred");
|
||||||
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
|
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
|
||||||
let s = db::Interface::open();
|
let s = db::Interface::open();
|
||||||
let r = db::Interface::read(&s.env, &s.handle, CREDENTIAL_KEY);
|
let r = db::Interface::read(&s.env, &s.handle, crate::CREDENTIAL_KEY);
|
||||||
if r == utils::empty_string() {
|
if r == utils::empty_string() {
|
||||||
log::debug!("credential not found");
|
log::debug!("credential not found");
|
||||||
let _= tx.send(false);
|
let _= tx.send(false);
|
||||||
|
@ -300,3 +314,21 @@ impl WrapApp {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the pointer goes 'active' (i.e. pushing a button, dragging
|
||||||
|
///
|
||||||
|
/// a slider, etc) reset it. Otherwise this function runs forever
|
||||||
|
///
|
||||||
|
/// incrementing by one every second. Once this timer matches the
|
||||||
|
///
|
||||||
|
/// `LOCK_SCREEN_TIMEOUT_SECS` constant the lock screen will trigger.
|
||||||
|
fn send_inc_lock_timer_req(tx: Sender<bool>, ctx: egui::Context) {
|
||||||
|
tokio::spawn(async move {
|
||||||
|
log::debug!("starting the lock screen timer");
|
||||||
|
loop {
|
||||||
|
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
||||||
|
let _= tx.send(true);
|
||||||
|
ctx.request_repaint();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue