Rate limito popup

master
Pietro Brenna 2020-03-27 20:59:59 +01:00
parent 0626fab9d4
commit 5e3c20f39e
1 changed files with 39 additions and 11 deletions

View File

@ -1,3 +1,9 @@
use gdk::WindowExt;
use gtk::prelude::*;
use std::rc::Rc;
use std::sync::RwLock;
use std::time::{Duration, Instant};
#[derive(Eq, PartialEq, Debug, Copy, Clone)] #[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub enum PosizFinestra { pub enum PosizFinestra {
Su, Su,
@ -19,10 +25,15 @@ pub use StatoFull::*;
pub struct StatoFinestra { pub struct StatoFinestra {
posiz: PosizFinestra, posiz: PosizFinestra,
full: StatoFull, full: StatoFull,
last_toggle: Option<Instant>,
} }
impl StatoFinestra { impl StatoFinestra {
pub fn new_arc(p: PosizFinestra, f: StatoFull) -> Arc<RwLock<Self>> { pub fn new_arc(p: PosizFinestra, f: StatoFull) -> Rc<RwLock<Self>> {
Arc::new(RwLock::new(StatoFinestra { full: f, posiz: p })) Rc::new(RwLock::new(StatoFinestra {
full: f,
posiz: p,
last_toggle: None,
}))
} }
} }
pub trait OperazStato { pub trait OperazStato {
@ -30,8 +41,10 @@ pub trait OperazStato {
fn get_pos(&self) -> PosizFinestra; fn get_pos(&self) -> PosizFinestra;
fn set_full(&self, f: StatoFull); fn set_full(&self, f: StatoFull);
fn get_full(&self) -> StatoFull; fn get_full(&self) -> StatoFull;
fn set_last_toggle(&self, instant: Option<Instant>);
fn get_last_toggle(&self) -> Option<Instant>;
} }
impl OperazStato for Arc<RwLock<StatoFinestra>> { impl OperazStato for Rc<RwLock<StatoFinestra>> {
fn set_pos(&self, p: PosizFinestra) { fn set_pos(&self, p: PosizFinestra) {
if let Ok(mut w_lock) = self.write() { if let Ok(mut w_lock) = self.write() {
w_lock.posiz = p; w_lock.posiz = p;
@ -56,12 +69,27 @@ impl OperazStato for Arc<RwLock<StatoFinestra>> {
Sconosciuto Sconosciuto
} }
} }
fn get_last_toggle(&self) -> Option<Instant> {
if let Ok(r_lock) = self.read() {
r_lock.last_toggle
} else {
None
}
}
fn set_last_toggle(&self, instant: Option<Instant>) {
if let Ok(mut w_lock) = self.write() {
w_lock.last_toggle = instant;
}
}
} }
use gdk::WindowExt;
use gtk::prelude::*;
use std::sync::{Arc, RwLock};
pub fn tira_su(window: &gtk::ApplicationWindow, stato: &Arc<RwLock<StatoFinestra>>, ts: u32) { pub fn tira_su(window: &gtk::ApplicationWindow, stato: &Rc<RwLock<StatoFinestra>>, ts: u32) {
if let Some(instant) = stato.get_last_toggle() {
if instant.elapsed() < Duration::from_millis(300) {
return;
}
}
stato.set_last_toggle(Some(Instant::now()));
let new_pos = match stato.get_pos() { let new_pos = match stato.get_pos() {
Nascosta | Nascondendo => { Nascosta | Nascondendo => {
// Shameless copy from guake // Shameless copy from guake
@ -98,7 +126,7 @@ pub fn tira_su(window: &gtk::ApplicationWindow, stato: &Arc<RwLock<StatoFinestra
} }
} }
pub fn butta_giu(window: &gtk::ApplicationWindow, stato: &Arc<RwLock<StatoFinestra>>) { pub fn butta_giu(window: &gtk::ApplicationWindow, stato: &Rc<RwLock<StatoFinestra>>) {
stato.set_pos(Nascondendo); stato.set_pos(Nascondendo);
window.hide(); window.hide();
} }
@ -106,7 +134,7 @@ pub fn butta_giu(window: &gtk::ApplicationWindow, stato: &Arc<RwLock<StatoFinest
pub fn esegui_toggle( pub fn esegui_toggle(
window: &gtk::ApplicationWindow, window: &gtk::ApplicationWindow,
nb: &gtk::Notebook, nb: &gtk::Notebook,
stato: &Arc<RwLock<StatoFinestra>>, stato: &Rc<RwLock<StatoFinestra>>,
) { ) {
let ts = gtk::get_current_event_time(); let ts = gtk::get_current_event_time();
match stato.get_pos() { match stato.get_pos() {
@ -119,7 +147,7 @@ pub fn esegui_toggle(
} }
} }
pub fn focus_out(stato: &Arc<RwLock<StatoFinestra>>) -> gtk::Inhibit { pub fn focus_out(stato: &Rc<RwLock<StatoFinestra>>) -> gtk::Inhibit {
match stato.get_pos() { match stato.get_pos() {
Nascondendo => { Nascondendo => {
stato.set_pos(Nascosta); stato.set_pos(Nascosta);
@ -133,7 +161,7 @@ pub fn focus_out(stato: &Arc<RwLock<StatoFinestra>>) -> gtk::Inhibit {
pub fn focus_in( pub fn focus_in(
window: &gtk::ApplicationWindow, window: &gtk::ApplicationWindow,
stato: &Arc<RwLock<StatoFinestra>>, stato: &Rc<RwLock<StatoFinestra>>,
) -> gtk::Inhibit { ) -> gtk::Inhibit {
stato.set_pos(Su); stato.set_pos(Su);
let s = calc_w_h(window); let s = calc_w_h(window);