From 2b86e9079e784323c1e45015b59b9e2f13bb8ff6 Mon Sep 17 00:00:00 2001 From: Kerfuffle <44031344+KerfuffleV2@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:00:52 -0700 Subject: [PATCH] Fix accumulated stop events (#623) * Change stop message channel from unbounded to bounded with size 1. * Clear out any stale stop messages before beginning a search operation. --- .../src/connect_things/connect_button_search.rs | 2 ++ .../src/connect_things/connect_button_stop.rs | 12 ++++++++++-- czkawka_gui/src/gui_structs/gui_data.rs | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/czkawka_gui/src/connect_things/connect_button_search.rs b/czkawka_gui/src/connect_things/connect_button_search.rs index bdbfd86..b06f694 100644 --- a/czkawka_gui/src/connect_things/connect_button_search.rs +++ b/czkawka_gui/src/connect_things/connect_button_search.rs @@ -155,6 +155,8 @@ pub fn connect_button_search( let glib_stop_sender = glib_stop_sender.clone(); let stop_receiver = stop_receiver.clone(); + // Consume any stale stop messages. + stop_receiver.try_iter().for_each(|_| ()); match to_notebook_main_enum(notebook_main.current_page().unwrap()) { NotebookMainEnum::Duplicate => { diff --git a/czkawka_gui/src/connect_things/connect_button_stop.rs b/czkawka_gui/src/connect_things/connect_button_stop.rs index 43c02c0..e60b264 100644 --- a/czkawka_gui/src/connect_things/connect_button_stop.rs +++ b/czkawka_gui/src/connect_things/connect_button_stop.rs @@ -1,22 +1,30 @@ +use crossbeam_channel::{Sender, TrySendError}; use gtk::prelude::*; use crate::gui_structs::gui_data::GuiData; use crate::help_functions::KEY_ENTER; +fn send_stop_message(stop_sender: &Sender<()>) { + stop_sender + .try_send(()) + .map_or_else(|e| if matches!(e, TrySendError::Full(_)) { Ok(()) } else { Err(e) }, |_| Ok(())) + .unwrap(); +} + pub fn connect_button_stop(gui_data: &GuiData) { let evk_button_stop_in_dialog = gui_data.progress_window.evk_button_stop_in_dialog.clone(); let stop_sender = gui_data.stop_sender.clone(); evk_button_stop_in_dialog.connect_key_released(move |_, _, key_code, _| { if key_code == KEY_ENTER { // Only accept enter key to stop search - stop_sender.send(()).unwrap(); + send_stop_message(&stop_sender); } }); let button_stop_in_dialog = gui_data.progress_window.button_stop_in_dialog.clone(); let stop_sender = gui_data.stop_sender.clone(); button_stop_in_dialog.connect_button_release_event(move |_, _e| { - stop_sender.send(()).unwrap(); + send_stop_message(&stop_sender); gtk::Inhibit(false) }); diff --git a/czkawka_gui/src/gui_structs/gui_data.rs b/czkawka_gui/src/gui_structs/gui_data.rs index 4c860cd..daaa22c 100644 --- a/czkawka_gui/src/gui_structs/gui_data.rs +++ b/czkawka_gui/src/gui_structs/gui_data.rs @@ -2,7 +2,7 @@ use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; -use crossbeam_channel::unbounded; +use crossbeam_channel::bounded; use gdk::gdk_pixbuf::Pixbuf; use gtk::prelude::*; use gtk::Builder; @@ -156,7 +156,7 @@ impl GuiData { scrolled_window_errors.show_all(); // Not sure why needed, but without it text view errors sometimes hide itself // Used for sending stop signal to thread - let (stop_sender, stop_receiver): (crossbeam_channel::Sender<()>, crossbeam_channel::Receiver<()>) = unbounded(); + let (stop_sender, stop_receiver): (crossbeam_channel::Sender<()>, crossbeam_channel::Receiver<()>) = bounded(1); Self { glade_src,