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)]
|
#[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: >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() {
|
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: >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);
|
stato.set_pos(Nascondendo);
|
||||||
window.hide();
|
window.hide();
|
||||||
}
|
}
|
||||||
|
|
@ -106,7 +134,7 @@ pub fn butta_giu(window: >k::ApplicationWindow, stato: &Arc<RwLock<StatoFinest
|
||||||
pub fn esegui_toggle(
|
pub fn esegui_toggle(
|
||||||
window: >k::ApplicationWindow,
|
window: >k::ApplicationWindow,
|
||||||
nb: >k::Notebook,
|
nb: >k::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: >k::ApplicationWindow,
|
window: >k::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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue