Rate limito popup
parent
0626fab9d4
commit
5e3c20f39e
|
|
@ -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: >k::ApplicationWindow, stato: &Arc<RwLock<StatoFinestra>>, ts: u32) {
|
||||
pub fn tira_su(window: >k::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: >k::ApplicationWindow, stato: &Arc<RwLock<StatoFinestra
|
|||
}
|
||||
}
|
||||
|
||||
pub fn butta_giu(window: >k::ApplicationWindow, stato: &Arc<RwLock<StatoFinestra>>) {
|
||||
pub fn butta_giu(window: >k::ApplicationWindow, stato: &Rc<RwLock<StatoFinestra>>) {
|
||||
stato.set_pos(Nascondendo);
|
||||
window.hide();
|
||||
}
|
||||
|
|
@ -106,7 +134,7 @@ pub fn butta_giu(window: >k::ApplicationWindow, stato: &Arc<RwLock<StatoFinest
|
|||
pub fn esegui_toggle(
|
||||
window: >k::ApplicationWindow,
|
||||
nb: >k::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: >k::ApplicationWindow,
|
||||
stato: &Arc<RwLock<StatoFinestra>>,
|
||||
stato: &Rc<RwLock<StatoFinestra>>,
|
||||
) -> gtk::Inhibit {
|
||||
stato.set_pos(Su);
|
||||
let s = calc_w_h(window);
|
||||
|
|
|
|||
Loading…
Reference in New Issue