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)]
pub enum PosizFinestra {
Su,
@ -19,10 +25,15 @@ pub use StatoFull::*;
pub struct StatoFinestra {
posiz: PosizFinestra,
full: StatoFull,
last_toggle: Option<Instant>,
}
impl StatoFinestra {
pub fn new_arc(p: PosizFinestra, f: StatoFull) -> Arc<RwLock<Self>> {
Arc::new(RwLock::new(StatoFinestra { full: f, posiz: p }))
pub fn new_arc(p: PosizFinestra, f: StatoFull) -> Rc<RwLock<Self>> {
Rc::new(RwLock::new(StatoFinestra {
full: f,
posiz: p,
last_toggle: None,
}))
}
}
pub trait OperazStato {
@ -30,8 +41,10 @@ pub trait OperazStato {
fn get_pos(&self) -> PosizFinestra;
fn set_full(&self, f: 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) {
if let Ok(mut w_lock) = self.write() {
w_lock.posiz = p;
@ -56,12 +69,27 @@ impl OperazStato for Arc<RwLock<StatoFinestra>> {
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() {
Nascosta | Nascondendo => {
// 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);
window.hide();
}
@ -106,7 +134,7 @@ pub fn butta_giu(window: &gtk::ApplicationWindow, stato: &Arc<RwLock<StatoFinest
pub fn esegui_toggle(
window: &gtk::ApplicationWindow,
nb: &gtk::Notebook,
stato: &Arc<RwLock<StatoFinestra>>,
stato: &Rc<RwLock<StatoFinestra>>,
) {
let ts = gtk::get_current_event_time();
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() {
Nascondendo => {
stato.set_pos(Nascosta);
@ -133,7 +161,7 @@ pub fn focus_out(stato: &Arc<RwLock<StatoFinestra>>) -> gtk::Inhibit {
pub fn focus_in(
window: &gtk::ApplicationWindow,
stato: &Arc<RwLock<StatoFinestra>>,
stato: &Rc<RwLock<StatoFinestra>>,
) -> gtk::Inhibit {
stato.set_pos(Su);
let s = calc_w_h(window);